TrollDump
- 使用 setwindowshook 将 x64 托管 DLL 注入 x64 托管/非托管进程(进程必须具有 GUI,因为我们需要获取其窗口句柄)
- 在这里,作为 TROLL(恶搞),我们注入到隐藏窗口的 taskmgr 进程中,以 不被检测 的方式执行 lsass dump(请参阅下方的“测试用例”部分)
- 注入器 DLL 与被注入的 DLL 是同一个 DLL,因此无需额外的 DLL
- 目标进程的完整性级别必须与注入器进程相同或更低
致谢(项目的升级/重写)
原始项目:https://github.com/enkomio/ManagedInjector
- 将代码移植为可注入 64 位二进制程序 ---> 原始项目只允许将 DLL 注入 32 位二进制程序
- 移除了 IPC 逻辑,因为它过于繁重
- 创建了样板代码,让你可以直接在 RunOnRemoteProcess() 函数中运行你的 payload,取代之前复杂曲折的方式
- 项目仍然使用 DLLExport 来让 .NET DLL 导出函数
编译
- 下载项目,并按 X64、Release 编译解决方案
- 无需外部依赖
用法
> Requires High Integrity depending on use case
> [System.Reflection.Assembly]::LoadFrom("C:\Users\public\TrollDump.dll")
> [TrollDump.ForFun]::Main("C:\windows\system32\taskmgr.exe")
- 在这个 POC 中,我们执行 lsass dump;你可以通过修改 RunOnRemoteProcess() 函数并重新编译,来运行任何你想要的“DLL 导出函数逻辑”。
- 如前所述,该代码是 DLL 注入的样板代码,之后你想做什么都可以方便地用 C# 托管代码编写。
测试用例
- Win 2019 build 17763.737,带有最新的 Windows Defender 补丁
- 其他杀毒软件(未具名)
- DLL 注入正常工作
- 显然,lsass dump 是否成功取决于杀毒软件是否允许 taskmgr 转储 lsass
- 未在任何 EDR 上测试 -> 我怀疑 DLL 注入在特定 EDR 上仍然有效
OPSEC
- DLL 必须落在磁盘上,因此应该进行混淆
- DLL 只应用于执行注入,实际 payload 绝不应嵌入 DLL 中,而应进行反射加载
- 显然,将 CLR 注入非托管进程很可疑,但又能怎样!
- setwindowshook 虽然是经典技术,但通常与键盘记录(keylogging)联系在一起,而我们的用例并非如此
- 你可以对想注入的任何 GUI 进程发挥极大的创意(如果以系统身份运行,还可以注入 dwm.exe)
愿望清单 - 这个项目是在周末完成的,我没有时间/打算去实现以下内容:
- 注入无 GUI 的进程
- 目前 setwindowshook 使用 WH_CALLWNDPROC,你可以将其修改为使用 WH_GETMESSAGE,但目标进程必须运行消息循环(GetMessage())
- 如果你能找到实现了消息循环的非 GUI 二进制程序(我怀疑不太可能),那么你也可以注入无 GUI 的二进制程序
- GUI 进程通常都会运行 GetMessage()
- 完全反射加载且无需落盘
- 基于 setwindowshook,似乎 DLL 必须落盘?
- 我尝试使用 C# 委托传递函数指针来运行,而不是使用导出的 DLL 函数,但没有成功(这是针对本地进程的经典 C# 键盘记录技术,但我们做的是远程进程)
- 你可以结合其他技术试试,我认为这是可行的
- 即使我们当前进程是 Medium,taskmgr 也会自动以 High Integrity 启动(所以从技术上讲,如果我们向它注入 DLL,就是一种 UAC 绕过)
- 根据 WIN API 返回结果,注入似乎正常工作
- 然而,taskmgr 未能调用导出的函数
免责声明
仅应出于教育目的使用!