NotebookNomad/autonomous-ctf-agent
GitHub: NotebookNomad/autonomous-ctf-agent
该项目是一个运行于 Apple Silicon 的自动化渗透测试环境,利用 LLM 驱动 Kali 容器中的安全工具集来完成 CTF 靶机与本地漏洞应用的攻防练习。
Stars: 0 | Forks: 0
# 适用于 Apple Silicon 的 autonomous-ctf-agent
一个用于练习靶机的自动化渗透测试环境 —— **Hack The Box**,
**TryHackMe**,以及像 **OWASP Juice Shop** 这样的本地漏洞容器。
[Claude Code](https://claude.com/claude-code) 作为 agent,通过运行在 Kali 容器内的 MCP server 驱动
[HexStrike-AI](https://github.com/0x4m4/hexstrike-ai) 工具集(150+ 安全工具)。
## 工作原理
```
Claude Code ──(MCP over stdio / docker exec)──► Kali container ("agent")
(the agent) └─ hexstrike MCP server (:8888)
└─ nmap, nuclei, sqlmap, metasploit, …
```
该容器是**工具后端**(一台服务器),而不是 agent。推理逻辑在 Claude Code 中进行,由 [`CLAUDE.md`](./CLAUDE.md) 和 `.mcp.json` 配置(后者负责将 Claude 连接到容器)。
该 agent 镜像通过 `./Dockerfile` 在本地构建,绝不会从 registry 拉取。
## 环境要求
- **仅限 Apple Silicon (ARM64)。** 该镜像构建于 `--platform=linux/arm64` 并
为 arm64 编译 Go/Rust 工具。
- Docker Desktop
- 对于远程靶场:HTB / TryHackMe 的 OpenVPN 配置文件 (`.ovpn`)
## 两种运行方式
该 agent 支持两种连接模式。
### A) 远程 VPN 靶场 — HTB / TryHackMe
这些目标位于各平台专属的 OpenVPN 连接之后。将平台的 `.ovpn` 文件放入
`./vpn/`,然后使用指向该文件的 `VPN_CONFIG` 启动 agent —— 容器会自行建立隧道,并在隧道就绪后才启动服务:
```
docker compose build
VPN_CONFIG=/vpn/htb.ovpn docker compose up -d # or thm.ovpn
curl http://localhost:8888/health # "healthy" once ready
```
- 若要切换平台,只需将 `VPN_CONFIG` 指向另一个文件并重新运行 `up -d`。
- 如果你的 `.ovpn` 需要用户名/密码,请将其放入 `./vpn/` 下的文件中,并设置
`VPN_AUTH=/vpn/creds.txt`(第 1 行 = 用户名,第 2 行 = 密码)。
- 默认开启**默认拒绝的出站防火墙**(`EGRESS_FIREWALL=on`),因此容器
只能访问隧道、VPN server endpoint 以及本地的 `labnet` 子网 —— 绝不会访问公共互联网。此规则在 `tun0` 连接后、服务启动前应用。详见下文的
[网络隔离](#network-isolation)。
### B) 本地漏洞容器 — Juice Shop 等
它们作为独立容器与 agent 运行在共享的 Docker 网络(`labnet`)上 —— **无需
VPN**。通过其 profile 启动其中一个;agent 会通过 service name 访问它:
```
docker compose --profile juiceshop up -d # starts the agent + Juice Shop
# agent 现在通过 http://juiceshop:3000 到达目标
```
(在此模式下请保持 `VPN_CONFIG` 未设置 —— 即本地模式。从你的 Mac 上访问 `http://localhost:3000` 同样有效。)
## 测试你自己的漏洞容器
任何容器镜像都可以作为本地靶机。有两种方式:
**快捷、临时** —— 将一个现有的/其他容器附加到 agent 的网络中,并通过名称访问它:
```
docker run -d --name dvwa --network autonomous-ctf-agent_labnet vulnerables/web-dvwa
# agent 通过 http://dvwa 到达目标(端口取决于镜像,例如 :80)
```
该网络命名为 `_labnet`,其中 `` 是 `docker-compose.yml` 中的项目名称。默认情况下,它是 `autonomous-ctf-agent_labnet`
(可通过 `docker network ls` 确认)。
**可复现** —— 将其作为 profile 添加到 `docker-compose.yml` 中(见下文),这样只需一条命令即可启动,并且对任何克隆你仓库的人来说都有据可查。
## 创建你自己的靶机 profile
在 `docker-compose.yml` 中添加一个服务,将其置于 `labnet` 中,并为其添加 `profiles:` 标签,使其仅在需要时启动。示例 —— WebGoat:
```
webgoat:
image: webgoat/webgoat
container_name: webgoat
profiles: ["webgoat", "targets"] # start with --profile webgoat
ports:
- "127.0.0.1:8080:8080" # optional: browse from the Mac
restart: unless-stopped
networks:
- labnet
```
然后:
```
docker compose --profile webgoat up -d # agent + WebGoat; reach it at http://webgoat:8080
```
提示:
- 共享的 `targets` 标签允许你同时启动多个靶机:`docker compose --profile targets up -d`。
- agent 在 `labnet` 上通过 **service name** 找到靶机(利用 Docker 的 DNS),因此请使用镜像实际监听的端口 —— agent 访问它无需进行主机端口发布。
- 如果你发布了端口,请将本地靶机绑定到 `127.0.0.1`,以免它们暴露在你的局域网(LAN)上。
## 网络隔离
默认情况下,该 agent 容器**无法访问公共互联网。** 在 hexstrike server 启动前会安装一个默认拒绝的出站防火墙(`EGRESS_FIREWALL=on`,由两种模式下的 `entrypoint.sh` 强制执行),它仅允许出站流量访问:
- **loopback**(包括 Docker 位于 `127.0.0.11` 的内置 DNS),
- **本地 `labnet` 子网** —— 你的本地靶机容器,以及
- 在 VPN 模式下,**`tun0` 隧道**以及维持其运行所需的 **VPN server endpoint(s)**。
其他所有流量 —— 互联网以及 Docker host 背后的局域网 —— 都会被丢弃(IPv4 和 IPv6)。
该防火墙是**故障关闭(fail-closed)**的:如果无法安装规则(例如缺少 `NET_ADMIN`),容器将拒绝启动,而不是在出站端口开放的状态下运行。这意味着该容器只能访问靶场靶机,以及在 VPN 模式下访问 VPN —— 互联网上的任何东西都无法访问。
- 如果需要,可以通过 `LOCAL_ALLOW_NETS="10.20.0.0/16 …"` 添加额外允许的 CIDR。
- `EGRESS_FIREWALL=off` 会禁用防火墙并开放完整的互联网出站访问 —— 仅用于有意进行的调试。请注意,该镜像在**构建**时(即 `docker build`,与运行时分开)仍会从互联网拉取工具;防火墙仅管控运行中的容器。
## 范围与授权
本项目仅针对**经过授权的、故意设置漏洞的练习系统** —— 你被授权攻击的 HTB / TryHackMe
靶机,以及你自己运行的本地漏洞容器。
切勿将其指向你不拥有或未被明确允许测试的系统。`CLAUDE.md` 包含了完整的交战规则。
标签:AI智能体, CISA项目, DLL 劫持, Docker容器, StruQ, XXE攻击, 大语言模型, 插件系统, 攻击面发现, 版权保护, 网络调试, 自动化, 请求拦截