剖析XP版永恒之蓝中的一个Bug_作家

永恒之蓝破绽刚出来时,我可以顺遂搞定Windows 7,但在攻击Windows XP时我一直没有乐成。我实验了种种补丁和Service Pack的组合,但行使程序要么无法乐成,要么会导致系统蓝屏。那时我没有深入...

永恒之蓝破绽刚出来时,我可以顺遂搞定Windows 7,但在攻击Windows XP时我一直没有乐成。我实验了种种补丁和Service Pack的组合,但行使程序要么无法乐成,要么会导致系统蓝屏。那时我没有深入研究,由于FuzzBunch(NSA泄露工具集)还有待探索许多点。直到有一天,我在互联网上找到了一个Windows XP节点,我想实验一下FuzzBunch。令人惊讶的是,在第一次实验时,破绽行使竟然乐成了。那么问题来了,为什么在我的“实验”环境中,破绽行使无法乐成,而现实环境中却可以?这里先揭晓谜底:在单核/多核/PAE CPU上NT/HAL的实现有所区别,因此导致FuzzBunch的XP系统攻击载荷无法在单核环境中使用。 0x01 多条行使链人人需要知道一点,EternalBlue(永恒之蓝)有多个版本。网上已经有人详细剖析了Windows 7内核的行使原理,我和JennaMagius以及sleepya_也研究过若何将其移植到Windows 10系统上。然而对于Windows XP而言,FuzzBunch包罗一个完全差别的行使链,不能使用完全相同的基本原语(好比该系统中并不存在SMB2以及SrvNet.sys)。我在DerbyCon 8.0演讲中深入讨论过这方面内容(参考演示文稿及演讲视频)。在Windows XP上,KPCR(Kernel Processor Control Region)启动处置器为静态结构,为了执行shellcode,我们需要笼罩KPRCB.PROCESSOR_POWER_STATE.IdleFunction的值。 0x02 载荷事情方式事实证明,破绽行使在实验环境中没有问题,出现问题的是FuzzBunch的攻击载荷。ring 0 shellcode主要会执行如下几个步骤:1、使用现在已弃用的 KdVersionBlock技巧获得nt及hal地址;2、剖析行使历程中需要用到的一些函数指针,如hal!HalInitializeProcessor;3、恢复在破绽行使历程中被损坏的KPCR/KPRCB启动处置器结构体;4、运行DoublePulsar,行使SMB服务安装后门;5、恢复正常状态执行流程(nt!PopProcessorIdle)。单核分支异常在IdleFunction分支以及+0x170进入shellcode处(经由XOR/Base64 shellcode解码器初始处置之后)设置硬件断点(hardware breakpoint)后,我们可以看到搭载多核处置器主机的执行分支与单核主机有所差别。kd> ba w 1 ffdffc50 "ba e 1 poi(ffdffc50)+0x170;g;"多核主机上能找到指向hal!HalInitializeProcessor的一个函数指针。该函数可能用来清算处于半损坏状态的KPRCB。单核主机上并没有找到hal!HalInitializeProcessor,sub_547返回的是NULL。攻击载荷无法继续运行,会尽可能将自身置零来清算现场,并且会设置ROP链来释放某些内存,恢复执行流程。注重:shellcode乐成执行后,也会在首次安装DoublePulsar后执行此操作。 0x03 泉源剖析shellcode函数sub_547无法在单核CPU主机上准确找到hal!HalInitializeProcessor的地址,因此会强制终止整个载荷执行历程。我们需要逆向剖析shellcode函数,找到攻击载荷失败的确切缘故原由。这里内核shellcode中存在一个问题,没有考虑到Windows XP上所有可用的差别类型的NT内核可执行文件。更详细一点,多核处置器版的NT程序(好比ntkrnlamp.exe)可以正常事情,而单核版的(如ntoskrnl.exe)会出现问题。同样,halmacpi.dll与halacpi.dll之间也存在类似情形。NT迷局sub_547所执行的第一个操作是获取NT程序所使用的HAL导入函数。 攻击载荷首先会读取NT程序中0x1040偏移地址来查找HAL函数。在多核主机的Windows XP系统中,读取这个偏移地址能到达预期效果,shellcode能准确找到hal!HalQueryRealTimeClock函数:然而在单核主机上,程序中并没有HAL导入表,使用的是字符表:一最先我以为这应该是问题的根本缘故原由,但现实上这只是一个幌子,由于这里存在修正码(correction code)的问题。shellcode会检查0x1040处的值是否是位于HAL范围内的一个地址。若是不满足条件,则会将该值减去0xc40,然后以0x40增量值在HAL范围内最先搜索相关地址,直到搜索地址再次到达0x1040为止。最终,单核版载荷会找到一个HAL函数,即hal!HalCalibratePerformanceCounter:现在一切操作都没有问题,可以看到Equation Group(方程式组织)在能够检测差别类型的XP NT程序。HAL可变字节表现在shellcode已经找到了HAL中的一个函数,会实验定位hal!HalInitializeProcessor。shellcode内置了一张表(位于0x5e7偏移处),表中包罗1字节的长度字段,随后为预期的字节序列。shellcode会递增最最先发现的HAL函数地址,将新函数的前0x20字节与表中字节举行对比。我们可以在多核版的HAL中找到待定位的5字节数据:

  • 发表于 2021-04-22 00:34
  • 阅读 ( 310 )
  • 分类:互联网

0 条评论

请先 登录 后评论
QQ963
QQ963

660 篇文章

你可能感兴趣的文章

相关问题