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隧道工具之一。DNScat2支持加密、通过预共享密钥进行身份验证、多个同时会话、类似于ssh的隧道、命令shell以及最流行的DNS查询类型(TXT、MX、CNAME、A、AAAA)。客户端用C语言编写,服务器用Ruby编写。
我最近完成了dnscat2 C客户端所有功能的PowerShell客户端实现,可在此处获取,并添加了一些额外的PowerShell特定功能。PowerShell在现实世界的攻击者和渗透测试员中都非常常见,因为它功能丰富、用途广泛,且内置于大多数Windows系统中。在本博客文章中,我们将探讨如何使用dnscat2-powershell脚本。
尽管dnscat2设计为通过互联网上的DNS服务器传输,它也可以直接将DNS请求发送到dnscat2服务器,这对测试很有用。本博客文章仅展示使用本地连接的示例,但您可以在此处阅读如何设置权威服务器。
安装配置
|
|
使用“—no-cache”选项是PowerShell客户端正常工作所必需的,因为nslookup命令使用顺序的DNS事务ID值,这些值最初不是随机的。
要使用dnscat2-Powershell,需要一台安装了PowerShell 2.0或更高版本的Windows机器。可以通过下载脚本并运行以下命令来加载dnscat2功能:
|
|
或者,您可以将以下命令粘贴到PowerShell中以启用dnscat2-powershell功能:
|
|
功能加载后,运行以下命令启动dnscat2-powershell服务器:
|
|
Start-Dnscat2是dnscat2-powershell中使用的主要函数名称,允许客户端与服务器建立命令会话。从服务器,您现在可以指导客户端执行不同的操作。以下视频展示了这一过程:
[视频演示链接]
如果您不想使用命令会话,可以使用Start-Dnscat2的-Exec、-ExecPS或-Console参数。
PowerShell特性
dnscat2-powershell命令会话中添加了额外的PowerShell相关功能。例如,您可以通过键入以下命令模拟交互式PowerShell会话:
|
|
您还可以将-ExecPS开关传递给Start-Dnscat2以启用此功能。客户端将从服务器接收输入,将其传递给Invoke-Expression,并返回输出。变量在客户端的整个生命周期中保持不变。这允许使用诸如PowerSploit之类的强大PowerShell工具。
可以通过键入以下命令通过DNS将脚本加载到客户端内存中:
|
|
文件的十六进制表示将放入$var变量中。从那里,十六进制可以转换为字符串并作为PowerShell函数加载。类似地,键入以下命令:
|
|
将下载存储在$var中的字节数组,并将其写入/tmp/var。目前,这两个功能是新的且有错误,对于较小的脚本更可靠。
在下面的视频中,展示了模拟的PowerShell会话,以及如何通过DNS加载其他PowerShell脚本。示例脚本是Get-Keystrokes,是Powersploit的一部分。
[视频演示链接]
加密
默认情况下,所有流量都是加密的。可以通过将-NoEncryption传递给Start-Dnscat2并在服务器上使用以下命令选项来关闭加密:
|
|
没有加密时,所有dnscat2数据包只是十六进制编码,使得了解dnscat2协议的人可以相当容易地重新组装数据。
可以通过在客户端将密码传递给-PreSharedSecret,在服务器上使用–c选项来使用预共享密钥进行身份验证,以防止中间人攻击。
隧道
Dnscat2支持类似于SSH本地端口转发的隧道。dnscat2服务器侦听本地端口,任何到该端口的连接都通过DNS隧道转发,dnscat2客户端将连接转发到另一台主机上的端口。
一个方便的场景是当dnscat2客户端在具有SSH服务器的内部网络上时。通过设置从服务器上的端口到内部网络上SSH服务器的隧道,您可以通过DNS实现交互式SSH会话。下面的视频展示了如何完成此操作:
[视频演示链接]
规避通用签名检测
有许多方法可以检测DNS隧道。检查出站DNS查询的查询长度、监控特定主机的DNS查询频率以及检查特定的不常见查询类型是一些示例。
可以通过使用Start-Dnscat2的-Delay和-MaxRandomDelay在客户端发送的每个请求之间添加静态或随机延迟。可以通过在命令会话中键入以下命令来更改延迟:
|
|
这可以帮助避免使用基于频率分析的系统检测。对于DNS隧道来说,使用DNS查询的最大长度以更快地传输数据是有用的。然而,合法用户发送最大长度DNS查询的频率有多高?可以基于使用查询的精确最大长度的查询编写签名。如果您想更隐蔽,可以使用-MaxPacketSize参数缩短最大请求大小。
许多DNS隧道将使用TXT、CNAME或MX查询,因为处理它们的响应简单且响应长度长。这些不是最常见的查询类型,因此IDS可能会对这些查询的高频率发出警报。A和AAAA查询更常见,因此使用它们可能有助于您绕过IDS检测。Start-Dnscat2的-LookupTypes参数可用于将有效查询类型列表传递给客户端。客户端将从此列表中随机选择查询类型用于其发送的每个DNS查询。
使用所有这三个选项使得为dnscat2编写良好的签名稍微复杂一些。下面的视频展示了所有这些选项的组合,以及修改选项如何显著影响数据传输速度。
[视频演示链接]
结论
通过DNS隧道传输通信具有一些实际优势。主要是在即使具有最极端出站流量过滤的环境中提供shell。主要的缺点是通过互联网的DNS服务器转发所有流量所涉及的慢速。现在有了PowerShell版本的dnscat2客户端,渗透测试员可以轻松地使用基于DNS的C2以及熟悉的PowerShell工具。