漏洞历史
2010年,攻击伊朗核工厂的漏洞利用工具就是“震网一代”,它因此被公认为世界上首个网络“超级破坏性武器”。
2011年,“震网二代”蠕虫病毒出现,因为他会在临时目录下生成名为~DQ的随机文件,也被称作Duqu。
2017年6月14日,微软在补丁中修补了一个快捷方式漏洞,也就是CVE-2017-8464漏洞,公告称此漏洞被国家背景的网络攻击所使用。该漏洞的原理同2010年美国和以色列入侵并破坏伊朗核设施的震网行动中所使用的穿透核设施隔离网络的漏洞(CVE-2010-2568)非常类似,对能源、交通、金融等基础设施隔离网极具杀伤力,所以CVE-2017-8464漏洞也被称为震网三代。
它可以很容易的被黑客利用来攻击基础设施、存放关键资料的核心隔离系统等。当存在漏洞的电脑被插上保存有漏洞文件的U盘时,不需要格外操作,漏洞攻击程序就可以执行并完全控制用户的电脑系统。
分析环境
采取双机调试的方法,被调试机使用Windows 7版本虚拟机,在硬件选项中添加串行端口,并命名为\.\pipe\com_1,在I/O模式中勾选轮询时主动放弃。调试机使用Windows 10版本物理机,在桌面创建windbg(x86)版本快捷方式,并在属性的目标后添加-b -k com:pipe,port=\.\pipe\com_1,resets=0。
poc采用网上已经有的test.lnk和a.dll文件,将a.dll文件放到C盘目录下,进行漏洞利用。(建议桌面只剩一个test.lnk,避免加载其它快捷方式干扰调试)。
总体调试
首先使用!process 0 0找到explorer.exe的PROCESS
断到指定进程环境下.process -i -r -p 883802e8`
再下断点bp kernel32!LoadLibraryW
键入g命令继续运行,在被调试机中刷新桌面,windbg断下,显示如下内容:
kernel32!LoadLibraryW:
001b:765cf142 8bff mov edi,edi
接下来键入k查看栈回溯。
看到SHELL32!CShellLink::_LoadFromFile,猜测是从这个函数开始解析lnk文件的。使用lm v m shell32命令查看得到shell32.dll的在漏洞机中的路径:
然后就可以拿出来有漏洞的文件啦,我们接下来一边动态调试一边静态分析。
分步调试
首先在关键函数处下断点
bp SHELL32!CShellLink::_LoadFromStream
bp shell32!CShellLink::_LoadIDList
bp shell32!CShellLink::_DecodeSpecialFolder
bp shell32!TranslateAliasWithEvent
bp shell32!ReparseRelativeIDList
bp shell32!DisplayNameOfAsString
bp shell32!ReparseRelativeIDList+0xd5
bp shell32!CControlPanelFolder::_GetTemporaryAppIdForApplet
bp shell32!CControlPanelFolder::ParseDisplayName
bp shell32!CControlPanelFolder::_GetPidlFromAppletId
bp CControlPanelFolder::_GetAppletPathForTemporaryAppId
bp shell32!CPL_LoadCPLModule
首先是断到CShellLink::_LoadFromStream处,根据ida分析,我们可以知道它对lnk文件进行了一些必要的格式检查。
接下来断到CShellLink::_LoadIDList,是把ItemID[0]+ItemID[1]+ItemID[2]加载到this->0n188,我们执行到该函数结束(gu)查看this->0n188处可以看到加载的东西(db poi(ebx+0n188))。
接下来单步步过直到!CShellLink::_LoadFromStream+0x28读取extra_data数据,我们执行到此处查看this->0n228,可以看到将我们构造的extra_data数据加载进来(db poi(ebx+0n228))。
CShellLink::_DecodeSpecialFolder 解析SpecialFolderDataBlock,在过程中会使用A000000B和A0000005判断是否是specialfolder,我们可以查看一下
使用db poi(esi+0E4h)查看specialfolder
然后会用 Specialfolder ID 和 the offset 0x28在IDList找Item ID。
在SHCloneSpecialIDList中使用Specialfolder ID 0x03
d esp+8 l1
函数返回的是一个指向Control Panel的ITEMIDList结构的指针。
TranslateAliasWithEvent(根据0x28找id)
第一个参数是this->0n188处就是刚才加载的IDList,第二个参数是指向一块存放 ItemID[0]和ItemID[1]的内存。
在TranslateAliasWithEvent+0x86,然后调用ILFibChirld找到item[2]。
bp shell32!ReparseRelativeIDList
db ecx
使用偏移量找到C:\a.dll
bp shell32!DisplayNameOfAsString
db poi(esp+8),查看第二个参数
该函数使用SHBindToFolderIDListParent 给定以文件夹形式指定的Shell命名空间项目,以及相对于该文件夹的项目标识符列表,此函数绑定到命名空间项目的父项,并有选择地返回指向项目标识符列表的最终组件的指针。
bp shell32!CControlPanelFolder::_GetTemporaryAppIdForApplet
该函数把路径写进s_dsaTemporaryAppId。
一直返回到shell32!ReparseRelativeIDList+0xd5。完成对内存中前两项与恶意dll文件的绑定。
db poi(ebp-18)
bp shell32!CControlPanelFolder::ParseDisplayName
该函数是调用动态对象的虚表函数来实现的,可以看出a.dll此时已经成为一个临时对象。
bp CControlPanelFolder::_GetAppletPathForTemporaryAppId获取dll str
使用临时对象获取dll str
执行完毕后
db esp-98c
接着以此为参数调用shell32!CPL_LoadCPLModule函数
完成恶意dll文件的加载
发表评论
您还未登录,请先登录。
登录