[!NOTE] 原仓库此前使用了不正确的许可证,遗漏了对 DeceptIQ 创始人 @Rad9800 的署名,其 TamperingSyscalls 仓库以 MIT 许可证发布。他的工作已在课程模块(Tampered Syscalls Via Hardware BreakPoints)中获得署名,也已反映在我们的公开第三方许可证页面上。
在意识到这一疏漏后,我们立即更正了原仓库,并在当天就联系 Rad 为这一疏忽道歉。尽管我们尽力纠正这一无意中的错误,但他没有回复,并阻断了进一步的沟通。五个月后,我们收到了 DMCA 下架通知,导致原仓库被删除。
遗憾的是,这一出于恶意的升级让我们没有切实可行的途径解决此事,因此我们在补正许可证和署名后重新上传了该仓库。
该实现利用了 Maldev Academy 课程近期更新中涵盖的两项技术:
Tampered Syscalls Via Hardware BreakPoints:用于绕过用户态 Hook,同时伪造所调用系统调用的参数。
Ghostly Hollowing:介于进程镂空与进程幽灵化之间的一种混合技术。
实现中调用的所有系统调用均通过 TAMPER_SYSCALL 宏发起。该宏调用 StoreTamperedSyscallParms 函数以:
NtQuerySecurityObject 系统调用桩(即诱饵系统调用)中 syscall 指令的地址,并在该地址设置硬件断点。调用 TAMPER_SYSCALL 宏时,TAMPER_SYSCALL 会用 NULL 值伪造所调用系统调用的前四个参数,然后调用 NtQuerySecurityObject 系统调用,触发之前安装的断点。
我们通过将诱饵系统调用(NtQuerySecurityObject)的 SSN 替换为真实被调用系统调用(例如 ZwAllocateVirtualMemory 的 SSN)来处理引发的异常,然后将伪造的参数替换为真实参数。这些步骤在 ExceptionHandlerCallbackRoutine VEH 函数中执行。
获取 PE 载荷: 该实现从磁盘获取 PE 载荷(mimikatz.exe)。在理想情况下,你应该对载荷进行加密,并将其存储在资源节中。
在磁盘上创建一个空文件: 在 $env:TMP 目录中创建一个临时文件(.tmp)。该文件之后将被 PE 载荷覆盖。
从临时文件创建幽灵节: 通过调用 ZwCreateSection 从处于待删除状态的 .tmp 文件创建一个节,随后关闭文件句柄并从磁盘删除该文件,从而创建幽灵节。
创建远程进程: 使用 CreateProcess WinAPI 创建一个远程进程,并将幽灵节映射到该进程。
修补 ImageBaseAddress: 修补 PEB 结构中的 ImageBaseAddress 元素,使其指向已映射的幽灵节,并通过线程劫持执行 PE 载荷的入口点。
衷心感谢 hasherezade 发布 Ghostly Hollowing 以及她所有其他有趣的注入技术。