背景
黑掉Windows 7已经没什么挑战了,我这一次打算重新回顾一下那个针对Windows XP永恒之蓝漏洞的漏洞利用代码,之前这份Exploit就没成功过,而且我尝试了各种版本的补丁和服务包,但这份漏洞利用代码要么无法工作,要么就让设备蓝屏。因此我打算继续研究一下,因为FuzzBunch有太多没有被挖掘出来的“潜力”了。
但是在一次针对其他Windows XP设备的渗透测试过程中,我本来对FuzzBunch没抱希望的,但可怕的是,它竟然能用…
所以我问自己,为什么它能用到外界的Windows XP设备上,却没办法在我的实验环境中使用呢?(长话短说:因为单核/多核/PAE CPU中的NT/HAL存在差别,导致FuzzBunch的XP Payload在单核设备上会终止运行。)
多个漏洞利用链
请记住,永恒之蓝有很多个版本。但是FuzzBunch针对Windows XP的漏洞利用链却和针对其他版本的Exploit有着很大区别,具体请参考DerbyCon 8.0的相关资料:【幻灯片】【视频】。
Payload方法论
原来,漏洞利用代码根本没问题,有问题的是FuzzBunch的Payload。
主要阶段的Shellcode执行的是下列活动:
1.利用KdVersionBlock技术获取&nt和&hal;
2.解析某些必要的函数指针,比如说hal!HalInitializeProcessor;
3.恢复Boot处理器KPCR/KPRCB,因为它会在漏洞利用过程中崩溃;
4.运行DoublePulsar,在SMB服务中植入后门;
5.将nt!PopProcessorIdle的运行状态恢复到正常状态。
单核分支异常
在IdleFunction上设置多个硬件断点,并向Shellcode中设置偏移量+0×170,我们会发现多核设备安装分支的情况跟单核设备的不同。
kd>ba w 1 ffdffc50 "ba e 1 poi(ffdffc50)+0x170;g;"
多核设备会要求获取一个指向hal!HalInitializeProcessor的函数指针。
这个函数估计是用来清理KPRCB的半崩溃状态的。
单核设备无法找到hal!HalInitializeProcessor,sub_547会返回NULL值。Payload将无法继续运行,然后通过数据清零来进行自毁,并且会设置ROP链来释放某些内存,恢复执行流程。
根本原因分析
sub_547这个Shellcode函数无法在单核CPU主机上找到hal!HalInitializeProcessor的地址,从而导致Payload的执行过程被强制终止。因此我们需要对这个Shellcode函数进行逆向分析,找到导致攻击Payload运行失败的根本原因。
这里的内核Shellcode存在一个问题,即没有考虑到Windows XP上所有可用的不同类型的NT内核可执行文件。比如说,多核设备的NT程序(例如ntkrnlamp.exe)可以正常工作,但单核设备(例如ntoskrnl.exe)就会出现问题。除此之外,halmacpi.dll和halacpi.dll也存在类似的问题。
NT疑惑
sub_547要做的第一件事就是获取NT程序所使用的HAL导入函数。Payload首先会读取NT程序中的0×1040偏移量来查找HAL函数。
在多核Windows XP设备中,读取这个偏移地址可以让Shellcode找到正确的hal!HalQueryRealTimeClock函数:
但是在单核设备上是没有HAL导入表的,只有一个字符串表:
一开始我以为自己找到了问题的根源,但其实不然,因为这里有一个修正码问题。Shellcode会检查偏移量0×1040的值是否位于HAL范围内。如果条件不满足,则会减去0xc40,然后以0×40作为增量值在HAL地址范围内进行搜索,直到搜索地址再次到达0×1040为止。
最终,单核设备上的Payload会找到一个HAL函数,即hal!HalCalibratePerformanceCounter:
题外话:方程式组织(国际著名黑客组织)在判断不同XP NT类型上做得非常优秀!
HAL可变字节表
Shellcode在找到了HAL函数之后,会尝试定位hal!HalInitializeProcessor。Shellcode中内置的表(位于0x5e7偏移量)包含了一个长度为1字节的域,后面可以跟一段字节序列。接下来,Shellcode会以在增量0×20字节遍历搜索新的HAL函数地址。
下面是多核版本HAL中找到的5个字节目标数据:
但是,单核版本的HAL函数差异就很大:
这里有一个类似的mov指令,但它并不是movzx指令。因为这个函数中并不包含这个字节序列,因此代码无法找到这个目标函数。
总结
大家都知道,在不同版本的Windows系统中,想通过搜索字节序列来识别函数并不是一件容易的事情。从这个漏洞中,我们至少应该学到一点,即各位Exploit开发者在设计漏洞利用代码时必须要考虑周全,注意NTOSKRNL和HAL在单核/多核/PAE架构上存在的差异。
这也是Eternal系列漏洞的一个分析样例,全球的网络组织可能会重复使用相同的漏洞利用代码或Payload,但他们也会使用不同的方法来开发Exploit。如果一种方法无法成功,也可以通过漏洞利用代码的多样化特点最终完成他们的攻击任务。
猜你还喜欢
- 08-04最全的webshell提权资料
- 09-16Linux后门整理合集
- 09-24Windows内网渗透提权的几个实用命令
- 09-10实战Linux下三种不同方式的提权技巧
- 08-03内网渗透:利用WMI代替psexec(WMIEXEC.vbs)
- 02-13ADB配置提权漏洞(CVE-2017-13212)原理与利用分析
- 11-16星外虚拟主机跨web目录文件读取技巧
- 06-05基于bro的计算机入侵取证实战分析
- 09-21渗透技巧——Windows单条日志的删除
- 08-03详解Filezilla提权
- 最新文章
- 随机文章
-
- 关于CMSMS中SQL注入漏洞的复现与分析与利用
- 浅谈字体反爬虫的一些思路
- 记对OpenSNS的一次代码审计
- 一次CMS源码审计与漏洞发现
- Kubolt :可用于扫描开放Kubernetes集群的实用工具
- 首例发生在巴西的仿冒WannaCry恶意软件
- Beef-XSS+Sunny-Ngrok实现内网穿透
- MuddyWater APT组织使用的多阶段后门POWERSTATS V3
- Buhtrap黑客组织最新0day漏洞分析
- 挖洞经验丨有上传文件的文件名处发现的时间延迟注入漏洞
- 利用DNS隧道构建隐蔽C&C信道
- PTF:一款多模块渗透测试框架
- 未授权访问漏洞总结
- APT之迂回渗透
- 看我如何用SHerlock跨社交网络查找你的用户名
- SneakyEXE:一款嵌入式UAC绕过工具
- 关于安全体系中WAF的探讨
- 利用Linux文本操作命令ed进行提权
- ARP欺骗绕过Android TV BOX分析
- JShielder:一款自动化Linux服务器安全增强工具
- 热门文章
-
- 八年专业安全团队承接渗透入侵维护服务
- Emlog黑客站模板“Milw0rm”发布
- Stuxnet纪录片-零日 Zero.Days (2016)【中文字幕】
- SQLMAP的注入命令以及使用方法
- 白帽故事汇:网络安全战士从来不是「男生」的专利
- 编辑器漏洞手册
- web安全之如何全面发现系统后台
- 常见Web源码泄露总结
- 深入理解JAVA反序列化漏洞
- cmseasy前台无需登录直接获取敏感数据的SQL注入(有POC证明)
- 网站后台登陆万能密码
- 黑麒麟2016渗透培训系列教程
- 破解emlog收费模板“Begin”
- 那些强悍的PHP一句话后门
- Android平台渗透测试套件zANTI v2.5发布(含详细说明)
- 渗透工具BackTrack与KaliLinux全套视频教程
- Python列为黑客应该学的四种编程语言之一 初学者该怎么学
- CVE-2017-11882漏洞复现和利用
- 恶意程序报告在线查询工具
- 利用Thinkphp 5缓存漏洞实现前台Getshell
- 文章标签
-