sockbroad(host,WREDIR,ELEC,election("A" * 410)) # -> Zing it! (between
~60->410)
#sockbroad(host,WREDIR,ELEC,election("A" * 54)) #Safe
print "Happy St-Valentine Bitches\nMSFT found that one loooooooong time ago...."
这里有几个地方需要说明一下:
1、Python 脚本语音是以空格来对齐的,并且空格位置处相当于高级语音的“{}”,在编辑
时最好不要用Tab 制表符,至少不要Tab制表符和空格混用。
2、我把原始的138端口改为了 13800,有的计算机可能NetBios服务是开着的,138端口被
系统占用,事实上我们只是需要向远程计算机发包,并非一定要通过本机的138 端口
3、原始代码中,是“"A"*410”,事实上实际测试中发现,只要超过55就会导致远程计算机
蓝屏,不一定非得要410个 A,当然可能构造堆溢出之后的执行代码例外。
漏洞演示的方法
当修改后的 Python 代码编译通过(事实上 Python 是一种解析执行语言)时,我对
Win2003 的虚拟机网络部分设置为Bridge(桥接),如图 1所示:

然后我将虚拟机的网络设置在 192.168.100.*的网段内,因为我也是这个局域网。通过
运行了一个搜索局域网内主机的小程序,这个小程序的原理就是通过向指定网段内所有主机
的 137端口发 NetBios数据包,因为137端口的主要作用是在局域网中提供计算机的名字或
IP 地址查询服务,在安装了 NetBIOS 协议后,该端口会自动处于开放状态,我就能够查到
在这个范围内运行的主机。并且按照POC 的命令要求以“命令+本地 IP+远程IP+远程主机用
户名+远程主机域名”方式进行填写,除了AD域名以外,其它的数据我们都能从局域网检测
的小工具中获得.
果然,当我按下回车的时候,装有WinServer2003的虚拟机“如愿以偿”地蓝掉了,效
果如图 所示:
假设说,虚拟机是我们的服务器的话,这么做肯定就是导致局域网的 DDOS,如果渗透
广泛的话后果将不堪设想。另外有说法XP以及Win7等都有类似的问题,不过这个由于时间
有限没有证实,只是我看到在导致漏洞的代码上,XP 和2003倒是很相识。
漏洞原因的说明
该漏洞触发的代码,通过异构 NetBios 数据包中的应用层部分,特别在最后的部分
“Server Name”,构造了一个错误的Buffer,使得堆溢出。
NetBios 数据包结构如图 4 所示:

造成溢出的Microsoft Windows Browser Protocol结构如图 5所示:

在 POC 中的注释中提到,由于 Mrxsmb.sys 驱动不正确处理用户提交的“BROWSER
ELECTION”请求,攻击者提交恶意请求可触发缓冲区溢出。同时也指明了错误位置:函数
BowserWriteErrorLogEntry。有关函数mrxsmb!BowserWriteErrorLogEntry的代码详细分析
见附件记事本文档。
通过分析,事实上最早的导致隐含的错误的因素来自函数:IoAllocateErrorLogEntry,
其 WDK的描述文档如下:
PVOID
IoAllocateErrorLogEntry(
IN PVOID IoObject,
IN UCHAR EntrySize
)
{
//省略部分代码…
return (IopAllocateErrorLogEntry(
deviceObject,
driverObject,
EntrySize));
}
函数最终调用了IopAllocateErrorLogEntry,而IopAllocateErrorLogEntry的描
述文档开头有段:
PVOID
IopAllocateErrorLogEntry(
IN PDEVICE_OBJECT deviceObject,
IN PDRIVER_OBJECT driverObject,
IN UCHAR EntrySize
)
{
//……
if (EntrySize < sizeof(IO_ERROR_LOG_PACKET) ||
EntrySize > ERROR_LOG_MAXIMUM_SIZE) { |