PacketWhisper - 使用DNS查询与文本隐写术隐秘传输数据并摆脱归因,无需攻击者控制的域名服务器或域名;绕过DLP/MLS设备;突破数据与DNS域名服务器白名单控制。将任何文件类型(例如可执行文件、Office文档、Zip压缩包、图像)转换为完全限定域名(FQDN)列表,并通过DNS查询传输数据。简单但极其有效。
(更新于2020年5月27日:是的,我将在2020年夏季将我所有的Github项目迁移到Python3。)
Joe Gervais (TryCatchHCF)
传统DNS外泄依赖以下方法之一:DNS隧道;将数据隐藏在DNS查询字段中;或将经过编码/加密的载荷分解后用作DNS查询中的子域名。所有这些方法都要求攻击者控制一个域和/或相关的DNS名称服务器来接收数据,这会导致归因。这些方法也容易受到DNS名称服务器黑名单(常见)和白名单(越来越常见)的影响。另一个问题是DFIR分析师熟悉这些方法,SIEM系统通常会检测到它们并发出警报。
PacketWhisper克服了这些限制。
如果数据可以使用目标自身白名单中的DNS服务器进行传输,而通信系统之间从未直接相互连接或连接到共同的端点,那会怎样?即使网络边界采用数据白名单来阻止数据外泄,又该如何?
为了实现这一切,PacketWhisper将DNS查询与文本隐写术结合在一起。借助Cloakify工具集,它将载荷转换为FQDN字符串列表。然后,PacketWhisper使用该FQDN列表生成顺序的DNS查询,将载荷跨越(或内部)网络边界传输,数据以明文方式隐藏,且两个系统之间从未直接相互连接或连接到共同的端点。PacketWhisper使用的密码提供了多层次的欺骗手段,以避免触发警报并误导分析尝试。
要接收数据,您需要捕获包含DNS查询的网络流量,使用任何对您最方便的方法。(有关捕获点的示例,请参阅下面的“捕获PCAP文件”。)然后将捕获的PCAP文件加载到PacketWhisper中(在您方便的任何系统上运行),该工具会从文件中提取载荷并将其去Cloakify还原为原始形式。
DNS是一种颇具吸引力的协议,因为尽管它是一种相对较慢的数据传输方式,但即使是在最敏感的网络中,DNS几乎总是允许跨越网络边界。
重要提示:我们使用DNS查询来传输数据,而不是成功的DNS解析。PacketWhisper从未需要成功解析其任何DNS查询。事实上,PacketWhisper甚至不查看DNS响应。这扩展了我们的用例,并强调了我们从来不需要控制我们正在查询的域,也从来不需要控制处理DNS请求的DNS名称服务器。
因此,使用PacketWhisper,我们将一个看起来像这样的载荷:
转换为像这样的FQDN列表:
然后PacketWhisper将其转换为在网络流量中显示为这样的DNS查询:
您可以在DNS解析路径的任意位置将其捕获为PCAP文件,然后将该PCAP加载到您的本地PacketWhisper副本中以恢复载荷:
请参阅我Packet Hacking Village演讲中DEF CON 26的幻灯片(包含在项目中)。幻灯片介绍了DNS外泄的背景、基于文本的隐写术/Cloakify工具集,以及PacketWhisper如何将它们结合起来形成一种数据传输方法。我特意制作了这些幻灯片使其独立可用,因此背景和信息应该是完整的。不过您也可以观看我的DC26 Packet Hacking Village演讲视频,其中提供了额外的背景信息。
我在项目中包含了一个示例PCAP文件(巧妙命名为"sample.pcap"),其中包含每种密码的单独载荷。当然,它们可以是任何文件类型,但在此我只是将文本文件传输到了PCAP中。将其加载到PacketWhisper中试试吧!
要在您自己的环境中快速测试,请从虚拟机运行PacketWhisper,然后在主机系统上通过虚拟机的网络接口进行数据包捕获的同时发送一个文件。之后您可以将PCAP文件加载到任何方便的PacketWhisper实例中以解码该文件。请记住,这不是一个快速的传输。较小的文件和耐心是您的朋友。
问题:“为什么不使用Scapy或dnspython工具集?”
答案:我讨厌操作工具中存在项目依赖。我尽可能保持我的项目原子化、自包含,以最大限度地提高可靠性,尤其是在客户端,我可能无法控制环境或只拥有最小权限。通过PacketWhisper的构建方式,我只需将项目打包并解压到目标主机,即可在受限的shell主机上运行它。
问题:“为什么PacketWhisper不是Cloakify工具集的一个分支项目?”
答案:同上。我们只需要Cloakify功能中非常特定的一个子集,而将所有其他内容添加到PacketWhisper只会导致目录混乱,并包含PacketWhisper无法使用的工具/密码。由于我是这两个项目的所有者,我保证会同步两者之间的任何更改。
$ python packetWhisper.py
基于FQDN的密码包含三类:
唯一随机子域名FQDN
推荐用于大多数用例的密码模式
这些是FQDN,其子域名中包含随机化元素。这有助于防止DNS缓存,同时允许我们在DNS查询路径上可能存在的NAT网络设备之外传输数据。由于发送系统的IP地址在NAT设备之外不可见,密码生成的子域名包含唯一的标签元素,以帮助我们在数据包捕获中识别PacketWhisper载荷。
这些密码模仿了各种依赖复杂子域名来标识会话、用户、缓存内容等的服务的格式。这种方法有助于PacketWhisper的DNS查询与网络中的其他流量融为一体。
子域名的第一部分实际上是密码列表中的一个字符串。子域名的其余部分是随机化的,以使每个FQDN唯一,从而防止DNS缓存过早地关闭DNS查询路径。然后我们添加域名。我们以这种方式构建FQDN,使其看起来像选定域名的常见FQDN,以便更好地融入任何网络上看到的正常Web流量。
唯一重复FQDN
旨在与网络上的所有其他DNS查询区分开来,但没有任何随机化。这意味着DNS缓存可能干扰,但作为一个额外的好处,即使是在最大的多客户端pcap集合中,您的DNS查询也易于找到。这是因为这些FQDN是奇怪的端点,例如电影《八度空间》中虚构的Yoyodyne推进系统里的“Johns”(红色Lectroid外星人)列表。
常见网站FQDN
这些是由常见网站URL构建的FQDN。
注意:由于大多数环境在边界处启用了NAT(移除了客户端IP地址的可见性),该模式通常仅用于连接到同一本地/24网络的系统之间的数据传输(例如,您最喜欢的咖啡店的访客WiFi)。
由于常见网站密码只有源IP地址作为将其查询与网络上所有其他类似DNS查询区分开来的手段,PacketWhisper会在载荷的开始和结束处传输一个唯一的“敲门序列”DNS查询,这有助于我们稍后从pcap文件中识别出发送主机。
FQDN示例:www.github.com
选择密码后,PacketWhisper会根据所需密码将载荷编码(Cloakify)为FQDN字符串列表。然后它会顺序生成DNS请求,将数据沿着DNS解析路径发送。PacketWhisper会在每个DNS查询之间添加一个小延迟,这有助于防止DNS请求乱序。
这里的关键元素当然是能够捕获包含PacketWhisper生成的DNS查询的网络流量。有很多选择,因为您只需要在DNS查询路径上的某个位置具有可见性。
捕获点示例:
发挥您的想象力。DNS解析路径上的任何设备都是一个选项,包括墙壁显示屏。“等等,什么?”
注意:VPN连接会阻断主机与VPN出口节点之间的可见性。如果您正在传输的客户端有活动的VPN连接,除非您能在VPN出口节点的上游进行捕获,否则您将无法看到任何DNS查询。即使在同一系统上捕获也会失败。由于你们中许多人可能正在使用VPN,如果您想测试PacketWhisper,请尝试从托管的虚拟机(VM)传输,并在主机系统上捕获虚拟机网络接口上的流量。
一旦您捕获了pcap文件,通过在一台安装了tcpdump(包含在Linux和MacOS中)或WinDump(Windows)的系统上运行PacketWhisper来恢复载荷。PacketWhisper会询问您使用了哪种密码,然后从pcap中提取载荷,最后使用匹配的密码解码提取出的载荷。
重要提示:在同一PCAP中,每个使用的密码只能传输一个载荷。包含多个使用相同密码的载荷的PCAP会导致问题。例如,我提供的'example.pcap'文件包含5个载荷,每个对应当前可用的操作密码之一。如果其中一个载荷使用了与另一个相同的密码,PacketWhisper将无法提取其中任何一个。简单的解决方法是拆分PCAP文件(这就是PacketWhisper传输代码在开始和结束传输时打印UTC日期时间的原因)。我正在研究允许使用相同密码的多个载荷,解决方案已经就位,我只是需要抽空实现它。
请确保您的PCAP文件是真正的PCAP格式。如果您使用tcpdump或WinDump捕获文件,则没问题。然而,Wireshark提供了多种“另存为...”选项来保存Wireshark流量,其中只有一种实际上兼容tcpdump/PCAP。我正在改进错误报告,以便尽早捕获错误。
不是一个安全的加密方案。PacketWhisper不是一个安全的加密方案。它容易受到频率分析攻击。使用“唯一随机子域名FQDN”类别的密码来增加熵并帮助削弱频率分析攻击。如果需要载荷保密,请确保在使用PacketWhisper处理之前对载荷进行加密。
不是一个高带宽的传输方法。PacketWhisper依赖于DNS查询,后者是基于UDP的,这意味着请求的交付顺序(甚至成功交付)无法保证。默认情况下,PacketWhisper在每个DNS查询之间添加一个小延迟(半秒)。您可以安全地以约每分钟120字节(每小时7.2K)的速度传输载荷。这是基于原始载荷的大小,而不是Cloakify后的输出文件。您可以选择查询之间无延迟,这可以显著加快传输速度,但会增加网络噪音和载荷损坏的风险。
坦白说,如果您有其他非DNS的数据传输方式可用,您可以直接使用主要的Cloakify工具集项目将文件隐藏在明处(例如将载荷转换为包含经纬度坐标的PokemonGo怪物列表),并使用FTP/HTTP等提供的高带宽。当其他协议被阻止时,DNS非常有用,但始终要意识到您的选择。
DNS就是DNS。不同的操作系统有不同的DNS缓存策略等。网络可能宕机、隔离等。PacketWhisper包含一个快速手动检查,以查看它是否可以解析常见的FQDN,但DNS通常是一个混乱的事情。记住老IT故障排除口头禅:“总是DNS的问题。”
请参阅我Packet Hacking Village演讲中DEF CON 26的幻灯片(包含在项目中)。缓解策略在演讲结尾部分有所介绍。在所有事情中,“深度防御”是您的朋友,尤其是因为DNS解析路径跨越了组织控制之外的大量区域。
我将添加MDNS和LLMNR本地网络DNS广播模式。这些模式旨在用于连接到同一本地网络的系统,并将消除捕获设备在WiFi数据包捕获时访问混杂模式的需要。(这些协议将流量发送到主机网络上的x.y.z.255,向同一本地网络上的所有其他系统广播流量。)
我还会添加更多密码,但对于日常需求,当前的密码集合已经足够。您会从中获得很好的效果。
我还在研究允许在单个PCAP文件中包含使用相同密码的多个载荷。解决方案已经原型化,但它会使PCAP提取工作流对用户更不友好。从操作角度看,这可能得不偿失。我总是更喜欢更干净的操作功能,而不是瑞士军刀般的复杂性。