作者:0x7F@知道创宇404实验室
1
前言
Windows7 x64 sp1
,开发环境为:MinGW-x64(gcc-8.1.0) + Python3.6
。2
后门植入和优化
taskhostsvc.exe
的程序进行完成,该程序通过计划任务设置随主机启动运行。taskhostsvc.exe
启动后通过创建互斥体保证只有一个实例在运行,然后每秒从进程中搜索 MsBuild.exe
进程(Microsoft Build Engine),找到后通过读取 MsBuild.exe
的内存,从命令行参数中获取构建项目的目录路径;InventoryManager.cs
源码文件,并使用包含有恶意代码的源码文件进行替换,等待 MsBuild.exe
编译完成,最后再还原该文件,完成后门的植入;如下图:MsBuild.exe
运行到最终替换源码文件,这中间的执行时间可能影响后门植入的成功率。MSBuild.exe
启动过程中会去优先加载指定目录的 dll,如下:"load-not-found-dll"
的路径下,就可以实现 dll 劫持,执行我们的恶意代码,原文作者根据这种方式编写代码进行了演示。相比于 taskhostsvc.exe
,使用这种方式就不需要额外的进程来进行监控了,并且 dll 在程序执行前加载、在程序执行后释放,这个时间点也很适合用于对程序进行控制和清理。3
dll劫持概要
-
应用程序加载的目录 -
系统目录,使用 GetSystemDirectory 获取该路径 -
16 位系统目录 -
Windows 目录,使用 GetWindowsDirectory 获取该路径 -
当前目录 -
PATH 环境变量中列出的目录
默认情况下 HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession ManagerSafeDllSearchMode
处于开启状态;如果手动设置为 0,关闭该安全选项,搜索顺序为:在以上顺序基础上,将5.当前目录
修改至2.系统目录
的位置,其他顺移。
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerKnownDLLs
由于 dll 迭代更新可能出现不兼容的问题,微软提出 dll 重定向解决方案,以便应用程序可以自定义选择加载 dll
微软在 dll 这一块所做的安全加固详情可以参考:https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-security
4
dll函数转发
当 dll 的导出函数比较少时,我们可以按照正常的 dll 开发流程,逐个定义函数名称,然后在函数内部使用
LoadLibrary()
函数调用原 dll 的对应函数完成功能,如下:当 dll 的导出函数太多时,我们就不能手动转发了,使用模块定义(.def)文件编写导出函数的信息,由链接器自动实现函数转发,细节可以参考 https://docs.microsoft.com/en-us/cpp/build/reference/module-definition-dot-def-files?view=msvc-160。
version.dll
的恶意 dll:在 test.c
文件中编写恶意代码插入到 DllMain
的执行流程中,并在 test.def
中编写函数转发规则:gcc -Wall -shared test.c test.def -o version.dll
.def
文件中我们将原始的文件命名为 version_origin.dll
,当应用程序运行时将加载我们恶意的 version.dll
,当调用函数时,将由恶意的 version.dll
进行函数转发:something.exe => version.dll (malware) => version_origin.dll
部分 dll 导出函数没有导出名称,只有导出序号,Gcc 和 Tcc 不支持按序号导出的函数转发,读者遇到的话可以使用 VisualStdio
除了上文使用模块定义文件来实现函数转发,还可以使用
pragma
来实现,这一块细节可以参考 https://docs.microsoft.com/en-us/cpp/preprocessor/comment-c-cpp?view=msvc-160,同样以 version.dll
为例,函数转发的源码如下:不过 pragma
关键词只有 Microsoft 编译器提供。
5
路径劫持
DllMain
中,这样在加载 dll 时便可以触发代码,或者添加到指定函数中,精确劫持程序流程,这取决于实际的场景。到这里我们的恶意 dll 就已经准备就绪了。有些应用程序使用了自定义 dll,这个 dll 是该应用程序特有的,只会被该程序加载和使用。该 dll 可能放置在应用程序同目录下,或者 PATH 环境变量中,或者特定目录通过
LoadLibrary([路径])
来加载。user32.dll
),但是公共 dll 一般都会提前被其他进程加载,当新的应用程序需要加载时,将直接从内存进行加载和调用,如果我们使用恶意 dll 替换了公共 dll,需要通过重启才能生效。msvcrt.dll
,恶意 dll 在加载时输出应用程序路径,重启后可以看到:1.替换系统dll,可以用普通用户修改文件为拥有者,然后再设置读写权限,就可以修改和替换文件了
2.不能劫持ntdll.dll / kernel32.dll
等非常底层的 dll,因为这些 dll 实现了程序装载、函数转发等功能
6
dll重定向劫持
kernel32.dll
和 msvcrt.dll
,除了上文公共 dll 劫持,还有其他更好的办法吗?HKLMSoftwareMicrosoftWindows NTCurrentVersionImage File Execution Options
添加 DevOverrideEnable (DWORD)
字段并设置为 1,来开启该功能,重启后生效。AppName.exe.local
的目录,应用程序启动时将优先从该目录下加载 dll 文件。HelloWorld
的 C 程序,生成恶意的 msvcrt.dll
进行演示,目录结构为:.
├── test.exe.local
│?? ├── msvcrt.dll
│?? └── msvcrt_origin.dll
├── helloworld.c
└── test.exe
还可以使用 manifest 配置文件(xml文件),优先级高于
.local
,详细可以参考 https://docs.microsoft.com/en-us/windows/win32/sbscs/application-manifests,构建目录结构如下:.
├── helloworld.c
├── msvcrt_origin.dll
├── msvcrt.dll
├── msvcrt.dll.manifest
├── test.exe
└── test.exe.manifest
7
Tcc劫持实现
Tcc 0.9.27
版本,结合逆向分析可以确定 tcc.exe
依赖了同目录下的 libtcc.dll
文件,直接替换该 dll 文件即可。libtcc.dll
,并将原始文件重命名为 libtcc_origin.dll
,运行演示如下:backdoor
。8
Gcc劫持实现
kernel32.dll
和 msvcrt.dll
,那么这里我们劫持 msvcrt.dll
文件,使用 dll 重定向的方法让 Gcc 加载恶意 dll 文件。gcc.exe.local
文件夹,并将 msvcrt.dll / msvcrt_origin.dll
放在文件夹下,如下:9
总结
10
References
https://www.crowdstrike.com/blog/sunspot-malware-technical-analysis/
https://www.a12d404.net/ranting/2021/01/17/msbuild-backdoor.html
https://en.wikipedia.org/wiki/2020_United_States_federal_government_data_breach
https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order
https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-redirection
https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-security
https://docs.microsoft.com/en-us/cpp/build/reference/module-definition-dot-def-files?view=msvc-160
https://docs.microsoft.com/en-us/cpp/preprocessor/comment-c-cpp?view=msvc-160
https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-redirection
https://docs.microsoft.com/en-us/windows/win32/sbscs/application-manifests
https://www.exploit-db.com/docs/english/13140-api-interception-via-dll-redirection.pdf
https://github.com/erocarrera/pefile
https://github.com/tothi/dll-hijack-by-proxying
https://stackoverflow.com/questions/37252457/is-there-a-way-to-make-windows-7-x64-load-ntdll-dll-from-local-directory-not-sy
往 期 热 门
(点击图片跳转)
震惊!安全圈某知名大佬竟被人制成表情包!
一个ZoomEye查询搜尽BazarLoader C2
Golang的字符编码与regexp
觉得不错点个“在看”哦
原文始发于微信公众号(白帽子):dll 劫持和应用
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论