Hagrid29/PELoader
GitHub: Hagrid29/PELoader
一个集成了多种 shellcode 注入技术的 PE 加载器,用于在 Windows 环境下隐蔽执行加密的 PE 文件。
Stars: 449 | Forks: 65
# PELoader
PELoader 实现了多种 shellcode 注入技术,并使用 [libpeconv](https://github.com/hasherezade/libpeconv) 库来加载加密的 PE 文件,而不是将 shellcode 注入到远程线程中。
已实现以下技术:
- Module Stomping (LoadLibrary)
- Module Stomping (NtMapViewOfSection) ([PoC](https://github.com/hasherezade/module_overloading))
- Transacted Hollowing ([PoC](https://github.com/hasherezade/transacted_hollowing))
- Ghostly Hollowing ([PoC](https://github.com/hasherezade/transacted_hollowing#ghostly-hollowing))
- Herpaderply Hollowing([PoC](https://github.com/Hagrid29/herpaderply_hollowing))
- NtMapViewOfSection (RWX-RW-RX)
- NtAllocateVirtualMemory (RW-RX)
致谢:我的大部分工作基于 @hasherezade 的 [PoC](https://github.com/hasherezade/) 脚本。
## 测试
PELoader 在安装了 Cortex XDR / SentinalOne / Windows Defender / CrowdStrike 的 Windows 10 上进行了测试,其中 Windows Defender / CrowdStrike 检测到了 Transacted Hollowing 技术。每种技术的特征使用 @forrest-orr 的内存扫描工具 [Moneta](https://github.com/forrest-orr/moneta) 进行了测试。
**Module Stomping (LoadLibrary)**
调用 LoadLibrary 加载合法的 DLL。用 payload 覆盖 DLL。
优点
- payload 以 MEM_IMAGE 形式映射,对于 EXE 或 DLL 看起来是合法的
- 伪装成合法的 DLL
- 节以原始访问权限映射(无 RWX)

**Module Stomping (NtMapViewOfSection)**
调用 NtCreateSection 为合法的 DLL 创建文件映射对象 (PAGE_READONLY),并调用 NtMapViewOfSection 将其映射到当前进程。用 payload 覆盖该 DLL。
优点
- payload 以 MEM_IMAGE 形式映射,对于 EXE 或 DLL 看起来是合法的
- 伪装成合法的 DLL
- 节以原始访问权限映射(无 RWX)
- 未连接到模块列表(对 Module32First/Module32Next 不可见)
缺点
- 未连接到模块列表(在下方 Moneta 的扫描结果中检查 "Missing PEB module")

参考 @hasherezade 的 [PoC](https://github.com/hasherezade/module_overloading)。
**Transacted Hollowing**
Process Hollowing 和 Process Doppelgänging 的混合体。在 NTFS 事务中创建“不可见”文件并将 payload 写入该文件。将节映射到当前进程并执行。
优点
- Payload 以 MEM_IMAGE 形式映射
- 节以原始访问权限映射(无 RWX)
- 不需要虚拟文件存在
缺点
- 如果存在 TxF 活动监控则会被检测到

**Ghostly Hollowing**
Process Hollowing 和 Process Ghosting 的混合体。创建处于删除待定状态的文件并将 payload 写入该文件。将节映射到当前进程并执行。
优点
- Payload 以 MEM_IMAGE 形式映射
- 节以原始访问权限映射(无 RWX)
- 避免“System Idle Process”没有任何映像路径(进程幽灵化的 IOC)
缺点
- 在磁盘上创建了虚拟文件
参考 @hasherezade 的 [PoC](https://github.com/hasherezade/transacted_hollowing)。
**NtMapViewOfSection (RWX-RW-RX)**
调用 NtCreateSection 创建内存节 (RWX)。调用 NtMapViewOfSection 将视图映射到当前进程 (RWX)。调用 VirtualProtect 将保护属性更改为 RW。将 shellcode 复制到映射的节。将保护属性更改为 RX 并执行。
优点
- Payload 以 MEM_MAPPED 形式映射,以避免恶意软件中常见的 MEM_PRIVATE
缺点
- 在初始阶段将内存页设置为 RWX 保护
- 具有 RX 保护的异常映射 EXE 内存

**NtAllocateVirtualMemory (RW-RX)**
调用 NtAllocateVirtualMemory 分配内存 (RW)。将 shellcode 复制到内存。将保护属性更改为 RX 并执行。
优点
- 避免 RWX 内存页
缺点
- 将 shellcode 分段到具有私有类型 MEM_PRIVATE 的内存页
- 具有 RX 保护的异常私有 EXE 内存

## 用法
**AES 加密 Payload**
使用 [pe_to_shellcode](https://github.com/hasherezade/pe_to_shellcode) 将 PE 文件转换为 shellcode,并使用 PELoader 进行加密
```
cmd> .\pe2shc.exe mimikatz.exe
Reading module from: mimikatz.exe
[WARNING] This is a console application! The recommended subsystem is GUI.
[+] Saved as: mimikatz.shc.exe
cmd> set hagrid=enc mimikatz.shc.exe
cmd> .\PELoader.exe
argument: enc mimikatz.shc.exe
Encrypting File
```
**PE 执行**
将参数设置为环境变量 "hagrid" 并执行 PELoader
```
cmd> set hagrid=cdll mimikatz.shc.exe.enc
cmd> .\PELoader.exe version
argument: cdll mimikatz.shc.exe.enc
Classic DLL Hollowing
[*] target dll: C:\WINDOWS\system32\aadtb.dll
[*] implant dll: mimikatz.shc.exe.enc
[*] Loading the DLL (using LoadLibary, classic DLL hollowing)...
[*] Overwriting the mapping
[*] Module Overloading finished...
[*] Executing Implant's Entry Point: 7ff8cf9d7578
[*] Executing Implant as EXE
.#####. mimikatz 2.2.0 (x64) #19041 Aug 10 2021 17:19:53
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > https://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > https://pingcastle.com / https://mysmartlogon.com ***/
mimikatz(commandline) # version
mimikatz 2.2.0 (arch x64)
Windows NT 10.0 build 19043 (arch x64)
msvc 150030729 207
mimikatz #
```
## 改进
- @forrest-orr 在这篇[文章](https://www.forrest-orr.net/post/masking-malicious-memory-artifacts-part-iii-bypassing-defensive-scanners)中对 shellcode 植入的变体进行了详细比较
- @dglenx 将该概念移至远程进程注入,并在这篇[文章](https://www.secforce.com/blog/dll-hollowing-a-deep-dive-into-a-stealthier-memory-allocation-variant/)中提出了几种解决 IOC 的方法
## 参考
* https://github.com/hasherezade/libpeconv
* https://github.com/hasherezade/module_overloading
* https://github.com/hasherezade/transacted_hollowing
* https://www.forrest-orr.net/post/masking-malicious-memory-artifacts-part-iii-bypassing-defensive-scanners
* https://www.secforce.com/blog/dll-hollowing-a-deep-dive-into-a-stealthier-memory-allocation-variant/
标签:Conpot, DLL劫持, DLL注入, DNS 反向解析, EDR绕过, Ghostly Hollowing, Herpaderping, libpeconv, NtMapViewOfSection, OpenAI, PE加载器, Shellcode注入, SSH蜜罐, Transacted Hollowing, Windows安全, 中高交互蜜罐, 免杀技术, 内存扫描, 内存欺骗, 内存规避, 安全测试, 恶意软件开发, 攻击性安全, 暴力破解检测, 流量审计, 端点可见性, 进程注入, 进程镂空, 道德黑客, 高交互蜜罐