安全路透社
当前位置:安全路透社 > 网络转载 > 正文

Bypass UAC的一个实例分析

* 本文原创作者:zzz66686

1. 引言

关于Bypass UAC这个主题,早已有了很多很成熟的方法,但普遍是以demo的形式出现,让大家参考学习的。在本文中,笔者拿出一个运用bypassUAC技术的病毒实例Cerber进行分析,通过逆向分析该实例让各位读者能够对bypass UAC的完整执行过程有一个正确的认识。

Cerber是一款著名的勒索软件,如果对勒索软件有过一些研究,那一定听说过这款勒索软件。此外,本文可以作为www.freebuf.com/sectool/95661.html 的补充,该文只提到了一个工具的使用,而本文则深入讨论了Cerber中用到的Bypass UAC的技术细节。

2. 整体概述

Cerber勒索软件有多种运行模式,在启动时传递不同参数会进入不同的模式,但本文并不对Cerber勒索软件本身进行分析。如果启动默认模式,即以无命令行参数启动Cerber勒索软件,那么其执行流程是这样子的:

QQ截图20160824165309.png

其中,dropper是拿到的样本;launcher隐藏在dropper内的另一个执行体,dropper会在内存中直接加载launcher。此后,launcher会检测当前执行体的所在路径,若不在其指定位置,则将其复制到指定位置即%APPDATA%\Roaming,然后重新加载运行自身;若已在其指定位置,则进行bypass UAC以管理员权限重新加载自身。最后,样本会开始其恶意行为,如加密用户文件等。

至于UAC的严格定义,可以参考msdn。这里仅仅摘抄下度娘:用户帐户控制(User Account Control, UAC)是Windows Vista的一个重要的新增安全功能。它可以防止恶意软件获取特权,就算用户是以管理员帐户登录也可以起到保护作用。简言之,可以把UAC理解为下图内容:

image002.png

本文的研究内容即为Cerber是如何静默地过掉该提示,并以管理员身份运行自身。也就是研究第一幅图中的Bypass UAC的环节。

3. 详细分析

受限于篇幅原因,本文就不介绍bypass UAC之前的内容。按照第二章整体概述的说明,应该可以很快的找到bypass UAC的起始位置,这里直接开始分析其bypass UAC的过程。首先,在%SystemRoot%\system32目录下寻找一个Windows白名单程序。这里所谓的Windows白名单程序特指有UAC权限且不触发UAC对话框的系统程序:

image003.png

其查找过程是通过FindFirstFile实现的,获取文件之后取其后缀名,与.exe比较

image004.png

在笔者的调试环境中,最终会找到AdapterTroubleshooter.exe这个可执行文件:

image005.png

第二步,获取AdapterTroubleshooter.exe的manifest资源文件,方法如下:

image006.png

进而在获取的manifest中查找是否有autoElevate标签,并判断其标签内容是否为true;然后查找是否有requestedExecutionLevel标签,判断其标签的level属性是否为requireAdministrator。

image007.pngimage008.png

样本找到的AdapterTroubleshooter.exe显然满足以上条件,顺利进入下一步。如果不满足会继续第一步的查找过程,找到一个新的可执行程序。

第三步,遍历AdapterTroubleshooter.exe的导入表,找到一个可以被劫持的dll。其判断是否可被劫持的方法是调用ZwOpenSection函数,判断其返回值是否成功。如果ZwOpenSection返回成功,则该dll不可作为劫持dll;反之,则可劫持。

image009.png

相关函数的作用以在上图中标出。下图展示了调用ZwOpenSection函数判断是否可以劫持的逻辑流程。

image010.png

在笔者的测试机中,Cerber发现了d3d9.dll可以被劫持。

第四步,将d3d9.dll复制到临时的目录中,并在结尾处追加一个新的段,可以用PEiD查看:

image011.png

其追加内容如图所示:

image012.png

此外,d3d9.dll的入口点也被修改:

image013.png

由图可见,原入口点被挂钩,直接跳到新添加的段中执行,原有代码不会再执行。

第五步,创建并挂起explorer.exe,向该进程写入Cerber完整执行体,执行参数和小段shellcode,并通过hook原有代码的方式执行shellcode,shellcode调用Cerber执行体中的文件复制函数,并将参数传给该函数。

image014.png

在explorer中申请空间,然后3个WriteProcessMemory函数分别写入Cerber执行体,参数和shellcode:

image015.png

上图中的注释已经写明本次调用WriteProcessMemory写入的内容。

第六步,在explorer.exe进程中可以看到写入的shellcode内容:B8 00 10 30 00 50 B8 E1 55 2E 00 FF D0 C3,如下图:

image018.png

其中,0×301000是执行WriteProcesMemory之前确定的,其他的几个字节是固定的。

explorer.exe的作用就是通过IFileOperation的COM对象将d3d9.dll和AdapterTroubleshooter.exe复制到system32目录,并启动AdapterTroubleshooter.exe,使被劫持的d3d9.dll被加载。

image019.png

用COM对象进行复制操作的原因是为了避免因为复制文件到关键目录而弹出UAC提示。

第六步,在d3d9.dll的执行过程中,可以看到之前增加的段作用:通过d3d9.dll加载时的参数,获取d3d9.dll的基址,然后通过该基址查找新增加段的位置,最后调用WinExec函数。

image020.png

上图为获取d3d9.dll的基址。新增加段的前8个字节分别为WinExec和ExitProcess函数的地址,如下图:

image021.png

最后,调用WinExec并将字符串参数传入:

image022.png

注意,在此前的步骤中,Cerber已将自己重命名为PnPutil.exe,希望读者不要误会这个奇怪的名字。至此,Cerber就已经bypass UAC了。此后还有一些清理工作,如果读者有兴趣的话,可以继续分析,本文的分析就到此为止了。

4. 小结

本文展示了一种较为流行的bypass UAC方法,并以恶意软件Cerber为实例,逆向分析了其bypass UAC的每一步细节,该方法也确实有不错的实际效果。笔者忠心希望本文能给读者一点启发和帮助,但由于笔者知识有限,才疏学浅,文中不当或错误之处还请各位读者包容和指正。最后,还希望本文仅作为技术讨论,切勿用于非法目的。

* 本文原创作者:zzz66686

未经允许不得转载:安全路透社 » Bypass UAC的一个实例分析

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册