Wireshark RDP 资源
作者:Sec-Labs | 发布时间:
项目地址
https://github.com/awakecoding/wireshark-rdp
Wireshark RDP 资源
寻找一种在 Wireshark 中捕获和检查 RDP 流量的方法?你来对地方了!
SSLKEYLOGFILE
许多应用程序,包括浏览器,支持使用 SSLKEYLOGFILE 环境变量和指向 TLS 预主密钥转储的文本文件路径。这种格式 受 Wireshark 支持,不需要导出服务器私钥。
要配置 Wireshark 使用特定的 TLS 密钥日志文件,打开首选项对话框(编辑 -> 首选项),在协议下的TLS部分中导航,然后更改(Pre)-Master-Secret log filename字段:

SChannel
这种技术涉及连接到 lsass.exe,以便从 SChannel 转储 TLS 预主密钥到 Wireshark 支持的 SSLKEYLOGFILE 格式中。这绝对是最简单的方法,因此完全值得尝试,但应仅在可以禁用安全功能的测试环境中使用。
使用一个已提权的 PowerShell 终端,按照以下说明进行操作:
禁用 LSA 扩展保护,然后重新启动机器:
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa' -Name 'RunAsPPL' -Value 0
安装 PSDetour:
Install-Module -Name PSDetour -Scope AllUsers -Force
运行 tls-lsa-dump.ps1:
.\tls-lsa-dump.ps1
默认情况下,脚本将使用 C:\Windows\Temp\tls-lsa.log 作为 SSLKEYLOGFILE。确保 Wireshark 正确配置以使用它,然后捕获第一个 RDP 连接以查看是否起作用!
Wireshark问题
以为就这样结束了?还没那么快!
RDP流量显示为'TPKT Continuation'
Wireshark默认将TCP/3389与TPKT解析器关联起来,这适用于在TLS握手之前发生的X.224连接请求/确认数据包。
由于某种原因,TPKT解析器经常无法将TLS数据包传递给TLS解析器,导致'TPKT Continuation'问题。当出现这种情况时,右键单击其中一个RDP数据包,然后选择解码为...:

在Wireshark的解码为..对话框中,将默认或当前解析器更改为TLS,然后点击确定:

通过强制整个TCP连接使用TLS解析器,X.224数据包将显示为'忽略的未知记录',但现在您应该能够看到TLS握手,希望能够看到一些解密的RDP数据包!

为了更清晰地查看RDP流量而无需显示TCP和TLS数据包,请将"rdp"添加到当前的Wireshark过滤器中。

降噪处理
一些RDP功能可能会使数据包捕获变得混乱且更难分析,一些Windows功能可能会创建不必要的背景噪音,需要更高级的过滤才能仅保留相关流量。
RDP UDP传输
除非您打算处理RDP UDP协议本身,否则强烈建议禁用RDP UDP以获取单个干净的RDP TCP连接:
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services\Client' -Name 'fClientDisableUDP' -Value 1
即使在防火墙中阻止了RDP UDP流量,仍会从主要的RDP TCP连接中获取一些来自RDP多传输扩展的噪音。
带宽自动检测
在RDP连接的开始阶段,带宽自动检测非常吵闹 - 不惜一切代价禁用它在您的.RDP文件中:
connection type:i:6
networkautodetect:i:0
bandwidthautodetect:i:0
网络自动检测是连接类型 7(自动检测),带宽自动检测将在此时生效。这就是为什么通过设置明确的网络类型(6代表局域网)并禁用网络和带宽自动检测来完全禁用该功能的最佳方法。如果您感到困惑,您并不孤单。
批量数据压缩
RDP的批量数据压缩在大多数情况下都很好,但如果您想检查数据包,则需要禁用压缩。在您的.RDP文件中添加compression:i:0来禁用压缩:
compression:i:0
Windows SmartScreen
如果您同时检查RDP连接和HTTP流量(例如Azure AD、Azure虚拟桌面、RD Gateway等),则可以通过禁用SmartScreen来消除一些背景噪音:
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\System' -Name 'EnableSmartScreen' -Type DWORD -Value 0
不要忘记关闭未使用的浏览器,这样Windows应该会安静下来!
FreeRDP
最新版本的FreeRDP接受SSKEYLOGFILE作为命令行参数:
/tls:secrets-file:</path/to/freerdp-tls.keys>
建议从源代码构建FreeRDP,因为Linux发行版中的预编译版本可能不具备此选项。
IronRDP
IronRDP桌面客户端接受SSKEYLOGFILE环境变量:
$Env:SSLKEYLOGFILE="C:\path\to\ironrdp-tls.keys"
IronRDP目前仍在积极开发中,因此请经常检查更新!
确保您已经正确设置了Wireshark,使用RDP客户端使用的TLS预主密钥文件来捕获流量。开始捕获,启动连接,然后停止捕获。应用一个简单的过滤器,例如tcp.port == 3389,然后右键单击任何RDP数据包,选择Follow -> TCP Stream:

现在,Wireshark应该只显示一个带有解密的TLS流量的RDP TCP连接,并且所有不相关的流量都被删除。使用File -> Export Specified Packets..导出过滤后的捕获。在导出对话框中,选择Displayed而不是Captured,并将捕获保存为新的pcapng格式,而不是旧的pcap格式(非常重要!)。
接下来,使用File -> Export TLS Session Keys导出第二个文件,使用与.pcapng文件名相匹配的.keys扩展名,以便您可以轻松地记住哪些文件配对(rdp-test.pcapng + rdp-test.keys)。
$CaptureName = "rdp-test" # 更改此处
$Env:PATH += ";$Env:ProgramFiles\Wireshark"
& editcap --inject-secrets "tls,${CaptureName}.keys" "${CaptureName}.pcapng" "${CaptureName}-tls.pcapng"
@("${CaptureName}.pcapng", "${CaptureName}.keys") | Remove-Item
Move-Item "${CaptureName}-tls.pcapng" "${CaptureName}.pcapng"
最后一步是将TLS会话密钥嵌入到pcapng文件中,以便可以轻松地与未显式配置Wireshark加载特定TLS预主密钥文件的其他人共享。关闭Wireshark,然后打开PowerShell,并切换到包含文件的目录。
使用以下代码片段调用editcap命令行工具将TLS会话密钥嵌入到捕获文件中,并仅保留可与其他人轻松共享的最终捕获文件: