MSRC下载对应系统版本和CVE编号的Security Only,提取文件
expand -F:* update.msu C:<target_dir>
cd <target_dir>
expand -F:* update.cab C:<target_dir>
搜索machine.inf
文件,根据漏洞公告,确定漏洞信息
通过.ServiceInstall
确认patch后的文件,再结合binbiff
分析,定位漏洞
另外一种定位补丁文件的方法,通过Process Monitor
https://wazehell.io/2019/05/22/cve-2019-0708-technical-analysis-rdp-rce/
RDP链接顺序
wireshark抓包分析,前三个为tcp/ip握手包,
RDP有TPKT协议封装,右击未识别的数据解码为TPKT。
解密Wireshark TLS加密
使用mimikatz获得pfx文件, 在RDP服务器上运行。
privilege::debug
crypto::capi crypto::certificates -systemstore:CERT_SYSTEM_STORE_LOCAL_MACHINE -store:"Remote Desktop" /export
使用openssl获得pem文件, 密码为mimikatz
openssl pkcs12 -in yourdumed.pfx -out mykey.pem -nodes
Wireshark加载pem文件
POC分析
给patch的放下断点一层一层分析,要触发patch需要IcaFindChannelByName
返回值为true
函数的功能通过信道名在循环链表中找到信道。
下断点调试
bp termdd!IcaBindVirtualChannels+0x170 "dps poi(rcx+0x98) L5;.echo\"----------\";dps rcx+0x98 L5;.
发现一直通过MS_T120
查找通道
被查找通道来自RDP请求MSC initial Create request
MS_T120通道何时创建
会发现IcaCreateChannel
函数,
函数逻辑:
bp termdd!IcaAllocateChannel+37 "db rsi L10;.printf\"alloca address:%p\",@rax;.echo \" \";"
IcaFindChannelByName
通过名字找通道,不存在这个通道就通过IcaCreateChannel
创建
ExAllocatePoolWithTag创建空间,然后初始化
IcaFindVcBind返回虚拟通道ID
IcaBindChannel将通道绑定到指定通道ID
信道偏移0xa8指向下一个循环链表,-0x10为名字。
-0x8为id
MS_T120通道会在RDP申请时创建并绑定在0x1f通道号上面,
bp termdd!IcaAllocateChannel+142 "db rsi L10;.echo\"--id--\";db r8 L10;!pool rcx;" bp termdd!IcaBindVirtualChannels+19E "db r8 L10;!pool rcx"
在发送MSC initial Create request
请求时IcaBindVirtualChannels
会遍历信道名称,如果要有MS_T120
通
第二次绑定信道将0x1f写为0x3
释放触发漏洞 IcaDereferenceChannel函数
bp termdd!IcaDereferenceChannel+82 ".echo\"-----\n\";dps rdi" bp termdd!IcaAllocateChannel+37 "db rsi L10;.printf\"alloca address:%p\",@rax;.echo \" \";gc;"
两次释放一个内存
第一次将内存释放
第二次再次被释放引发错误。
何时由什么创建MS_T120 根据栈回溯,查模块信息可知,ICAAPI为ICA接口,rdpwsx是RDP扩展模块。