euriconicacio/pwnloop
GitHub: euriconicacio/pwnloop
为 Claude Code 打造的自主渗透测试实战循环框架,将容器化 Kali 环境与自演化的攻击方法论结合,实现从侦察到报告的全流程自动化。
Stars: 0 | Forks: 0
```
dP
88
88d888b. dP dP dP 88d888b. 88 .d8888b. .d8888b. 88d888b.
88' `88 88 88 88 88' `88 88 88' `88 88' `88 88' `88
88. .88 88.88b.88' 88 88 88 88. .88 88. .88 88. .88
88Y888P' 8888P Y8P dP dP dP `88888P' `88888P' 88Y888P'
88 88
dP dP
v1.0 by Eurico Nicacio (h3llh0und)
autonomous lab-machine engagement loop
```
一个为 Claude Code 设计的自主实验室机器实战套件:一个一次性的 Kali
容器,一个驱动它的 skill,以及一个 slash 命令,能将“这是一个
IP”转化为完整的侦察 → 建立据点 → 提权 → 清理 → 报告流程,
并且你可以实时观看整个过程。
```
> /pwnloop 10.129.50.240 cap
[recon] 3 ports — 21 vsftpd 3.0.3, 22 OpenSSH 8.2p1, 80 Gunicorn
[web] /capture → 302 /data/1 — sequential id, no ownership check
[web] /data/0 belongs to another user. IDOR confirmed
[analysis] pcap holds a cleartext FTP login
[foothold] password reused on SSH
user.txt — <32-hex-flag>
[privesc] cap_setuid on /usr/bin/python3.8
root.txt — <32-hex-flag>
[cleanup] 1 artifact removed, verified
```
## 目录
- [循环工程](#loop-engineering)
- [环境要求](#requirements)
- [安装说明](#install)
- [VPN](#vpn)
- [运行一次实战](#running-an-engagement)
- [产出内容](#what-you-get)
- [命令参考](#command-reference)
- [清理策略](#cleanup-policy)
- [容器内部包含什么](#what-is-in-the-container)
- [Skill](#the-skill)
- [本项目不包含什么](#what-this-is-not)
- [平台规则](#platform-rules)
- [故障排除](#troubleshooting)
## 循环工程
Agent 就是一个循环:观察、决策、行动、验证、重复。在实践中,大多数
Agent 的失败并不是模型失败——而是**循环**失败。循环
无法终止,或者过早终止。它重新推导已知的信息,因为
什么都没被记录下来。它在同样的三个想法之间循环,因为
没有任何记录表明某个想法已经被排除。它基于推断的
状态而非观察到的状态进行行动。
因此,`skills/pwnloop/SKILL.md` 并不是作为 prompt 编写的。它是作为一种
控制结构编写的,其中的每一条规则都是为了让循环收敛:
| 循环属性 | 如何执行 |
|---|---|
| **状态** | `FINDINGS.md` 是一个只能追加的账本,实战目录保存着每一个 artifact。循环读取它自己的状态而不是重建状态,并且运行过程能在 context 重置后存活。 |
| **终止** | 运行在获取两个 flag **外加** 验证清理 **外加** 编写报告和 write-up 后结束——而不是在 `root.txt` 时结束。不明确的结束条件是 Agent 提前三步停止的原因。 |
| **发散防护** | 任何在约 15 分钟内未产生具体 artifact 的线索都会被标记为 `PARKED`,然后循环继续进行。如果没有这个规则,Agent 会在最*有趣*的线索上花费一个小时,而不是在最高效的线索上。 |
| **循环预防** | 状态格是 `LEAD → CONFIRMED / PARKED / DEAD`。`DEAD` 携带了它被排除的原因,这正是阻止循环在下一轮中重新测试它的关键。 |
| **基于事实的不变量** | 没有证据文件就没有发现。这是让循环在观察到的状态而非合理的状态上运行的规则——这是整个文档中价值最高的单一约束。 |
| **并发** | 全端口、UDP 和 Web 扫描同时运行而不是按顺序运行,因此实际时间受限于最慢的分支,而不是它们的总和。 |
| **升级条件** | 只有四个条件会将控制权交还给人类:VPN 断开,目标不可达超过 5 分钟,范围问题,或者三轮扫描没有新线索。其他的所有情况都由循环决定。宽泛的升级标准是“自主”退化为聊天会话的原因。 |
第二个循环是围绕第一个循环的循环。每次实战在结束前都需要
改变方法论:一个可推广的模式会被附加到 [`memory/patterns.md`](memory/patterns.md) 中——下一场
实战会在开始前读取它——缺失的工具会变成一个 package,一种
技术会变成参考章节,一个错误会变成一条规则。该文件
特意保持简短,不包含机器细节、凭据和 flag;
只有当针对不同机器的运行可以依据它采取行动时,一个条目才能获得其存在的位置。
两台机器产生了六个这样的改变——`sshpass` 和 `tshark`(在需要凭据
重用和 pcap 分析时缺失),`bsdextrautils`(它的缺失会静默地
破坏 `searchsploit -m`),预设的 git 身份(没有它,`git commit-tree`
会拒绝执行,这会完全阻止基于 plumbing 的漏洞利用),`sed -i` 无法
编辑绑定挂载的 `/etc/hosts` 这一事实,以及产生了第二台机器 root 权限的
`os.path.join` 包含漏洞。
这就是这个仓库的实际主张。不是说 Agent 可以解决一台实验室
机器——那只是一个演示。主张是每次运行时循环都会变得更好,
因为运行被要求写回到它里面。
## 环境要求
- **Docker** — OrbStack、Docker Desktop 或 Colima。镜像是为
宿主机的原生架构构建的;在 Apple Silicon 上它是 arm64,没有模拟。
- **Claude Code** — skill 和 slash 命令被链接到 `~/.claude/`。
- **来自您实验室平台的 VPN 配置文件**(`.ovpn`)。
宿主机本身不会安装任何东西。所有的攻击工具和
VPN 连接都存在于容器内部。
### 为什么使用容器
macOS 是一个糟糕的攻击工具宿主:大部分工具链是 Linux 专属的,
有用的构建是 Debian package,并且实验室 VPN 连接会重写您的
宿主机路由表。容器获得了 `NET_ADMIN` 和 `/dev/net/tun`,因此
OpenVPN 在其内部运行,并且实验室网络永远不会触及宿主机。销毁
容器,实战工具的每一个痕迹都会随之消失。
## 安装说明
```
git clone ~/pwnloop
cd ~/pwnloop
./install.sh
```
`install.sh` 将 `skills/pwnloop` 符号链接到 `~/.claude/skills/`,将
`commands/pwnloop.md` 符号链接到 `~/.claude/commands/`,然后构建并启动
容器。使用 `./install.sh --no-build` 仅进行链接。
**然后信任该目录一次——此步骤不是可选的:**
```
cd ~/pwnloop && claude # accept the trust dialog, then exit
```
在您执行此操作之前,Claude Code 会忽略 `.claude/settings.json` 并对每一个命令
提示授予权限,这使得自主运行无法使用。
如果您跳过了此步骤,将会看到此警告:
```
Ignoring N permissions.allow entries from .claude/settings.json:
this workspace has not been trusted.
```
验证整个设置:
```
./bin/pwnloop status
```
## VPN
VPN 在**容器内部**运行。您的 Mac 的路由表永远不会
被触及,关闭笔记本的其他连接对其没有影响。
### 连接
从您的平台下载 OpenVPN 配置文件(在 HTB 上:*Connect to HTB* →
*Machines* → *OpenVPN* → 下载 `.ovpn`),然后:
```
cp ~/Downloads/lab_yourname.ovpn ~/pwnloop/vpn/
~/pwnloop/bin/pwnloop vpn lab_yourname.ovpn
```
配置文件必须在 `~/pwnloop/vpn/` 内部——该目录以
只读方式挂载到容器中的 `/vpn`,并且它被 gitignore 忽略。
### 验证
```
~/pwnloop/bin/pwnloop vpn-status
```
正常工作的连接会在日志中显示一个位于实验室范围内的 `tun0` 地址和
`Initialization Sequence Completed`:
```
3: tun0: mtu 1500 ...
inet 10.10.14.205/23 brd 10.10.15.255 scope global tun0
--- last log ---
... Initialization Sequence Completed
```
该 `tun0` 地址是您的攻击者 IP——reverse shell 必须回调到它。
Agent 会自动读取它;只有在您手动运行 payload 时才需要它。
### 断开连接
```
~/pwnloop/bin/pwnloop vpn-stop
```
### 切换服务器或配置文件
首先停止当前连接——两个 OpenVPN 进程会争夺
路由表:
```
~/pwnloop/bin/pwnloop vpn-stop
cp ~/Downloads/lab_other-server.ovpn ~/pwnloop/vpn/
~/pwnloop/bin/pwnloop vpn lab_other-server.ovpn
```
### 重要:VPN 随容器一起消亡
`pwnloop down`,`pwnloop build` 随后重新创建容器,或 Docker 重启
都会终止连接。之后请重新连接:
```
~/pwnloop/bin/pwnloop down && ~/pwnloop/bin/pwnloop up
~/pwnloop/bin/pwnloop vpn lab_yourname.ovpn
```
## 运行一次实战
在平台上生成机器,然后:
```
cd ~/pwnloop && claude
> /pwnloop 10.129.50.240 cap
```
Agent 验证 VPN 和可达性,创建
`engagements/cap/`,并在各个阶段之间不间断地工作。它
一旦读取到每个 flag,就会在聊天中宣布它,因此您可以将其粘贴到
平台中,而无需等待运行完成。
要观看运行过程而不是查看记录,请在另一个窗口中 tail 账本——
如果您正在向观众演示,这也是应该投影的内容:
```
tail -f ~/pwnloop/engagements/cap/FINDINGS.md
```
它只会在以下情况返回给您:VPN 断开,目标不可达超过
五分钟(机器可能需要重置),一个真正的范围问题,或者
三轮完整的枚举循环都没有新线索。
## 产出内容
```
engagements//
FINDINGS.md append-only ledger, updated live — findings, evidence, status
REPORT.md defender-facing: chain, impact, remediation, earliest break point
WRITEUP.md teaching-facing: the narrative, including the leads that failed
scans/ raw tool output, one file per run
loot/ credentials, hashes, keys, downloaded artifacts
www/ payloads staged for delivery to the target
flags.local.md every flag captured, across all machines — gitignored
```
`engagements/`、`flags.local.md` 和 `vpn/` 被 gitignored,必须保持
这样。Flag 的值永远不会进入版本控制。
仓库中有两个目录是*由*实战编写的,而不是*为*它们
准备的:[`memory/patterns.md`](memory/patterns.md),这是下一次运行首先读取的跨实战模式
文件,以及 [`writeups/`](writeups/),这是经过脱敏步骤的、可直接发布的
副本。
`REPORT.md` 和 `WRITEUP.md` 是刻意分开的文档。报告
面向防御者进行论证:什么损坏了,成本是多少,修复什么,以及哪个
单一控制措施能最早切断链条。Write-up 教导
读者:机器是如何被攻破的,以及——这是大多数 write-up 遗漏的部分——哪些线索是
死胡同以及为什么。将它们合并对两种受众都不利。
```
~/pwnloop/bin/pwnloop flags # all captured flags, newest engagement last
```
## 命令参考
```
pwnloop build rebuild the image
pwnloop up create/start the container
pwnloop down stop and remove the container (kills the VPN)
pwnloop sh interactive shell inside the container
pwnloop x '' run one command inside the container
pwnloop vpn start OpenVPN inside the container
pwnloop vpn-status tun0 address and last OpenVPN log lines
pwnloop vpn-stop stop the VPN
pwnloop status image, container, tooling and VPN summary
pwnloop flags show locally captured flags
pwnloop banner print the startup banner
```
## 清理策略
Agent 将其创建的内容——web shell、植入的 SSH 密钥、账户和
仓库、暂存目录——作为标准的最终步骤移除,然后验证每次
移除并将其记录在报告中。您无需提出要求。
它**不会**触及日志或审计记录。实战在其中的痕迹
是防御者的证据,也是使这项练习有意义的一部分。
如果必须保留某个 artifact(移除它会破坏机器,或者您想要
重新运行攻击链),Agent 会明确说明并给出稍后
移除它的确切命令。
## 容器内部包含什么
`nmap`、`masscan`、`ffuf`、`feroxbuster`、`gobuster`、`nikto`、`whatweb`、
`wfuzz`、`sqlmap`、`wpscan`、`netexec`、`smbclient`、`smbmap`、`enum4linux-ng`、
`impacket-scripts`、`evil-winrm`、`certipy`、`bloodhound-python`、`ldap-utils`、
`krb5-user`、`hydra`、`john`、`hashcat`、`cewl`、`responder`、`sshpass`、`swaks`、
`searchsploit`、`git-dumper`、`ldapdomaindump`、`tshark`、`tcpdump`、`binwalk`、
`exiftool`、`gdb`、`pwntools`、`proxychains4`、`chisel`、SecLists 和未
压缩的 rockyou,以及暂存在
`/opt/static` 下的 `linpeas` / `winPEAS` / `pspy`,以便交付给目标。
添加工具:编辑 `docker/packages.txt`,然后运行 `pwnloop build`。没有
为您的架构提供构建的 package 会被记录到镜像内部的
`/opt/skipped-packages.txt` 中,而不是使构建失败——重建后检查
它。
## Skill
`skills/pwnloop/SKILL.md` 定义了操作契约:范围检查、
自主规则、flag 处理、发现账本格式、实战循环,
以及清理和结束步骤。方法论存在于 `references/` 中,按需
加载而不是一次性全部加载:
| 文件 | 涵盖内容 |
|------|--------|
| `recon.md` | 分层扫描、vhost/hostname 处理、端口分流 |
| `web.md` | fuzzing 策略、LFI/SSTI/upload/SQLi/deserialization |
| `api.md` | REST/GraphQL 发现、JWT 攻击、IDOR、race condition、SSRF |
| `source-review.md` | 阅读恢复的源代码:历史记录中的机密、sink、授权漏洞 |
| `cracking.md` | 哈希识别、john/hashcat 格式、spraying 策略 |
| `services.md` | 基于端口的 playbook:SMB、FTP、SNMP、LDAP、NFS、SQL、Redis、WinRM |
| `foothold.md` | reverse shell、TTY 升级、双向文件传输 |
| `artifacts.md` | 挖掘下载的文件——pcap、归档、git 历史记录、密钥材料 |
| `privesc-linux.md` | sudo、SUID、capabilities、cron 和定时器、容器逃逸 |
| `privesc-windows.md` | token 特权、服务、凭据搜寻 |
| `ad.md` | AS-REP roasting、Kerberoast、ACL 滥用、DCSync、ADCS |
| `pivoting.md` | chisel、SSH 隧道、proxychains |
| `reporting.md` | 链条优先、面向防御者的报告结构 |
| `writeup.md` | 可发布的 write-up 结构和脱敏规则 |
对自主性至关重要的设计选择:**绝不在阶段之间停止**,
**并行化扫描而不是等待**,**将任何线索的时间限制在约 分钟**,
然后将其搁置,并且**每一个发现都需要一个证据文件**。如果没有
时间限制,Agent 会把一个小时花在一个看起来很有希望的死胡同上;如果没有
证据规则,它会报告它仅仅是推断出来的东西。
## 本项目不包含什么
范围纪律是保持其有用的原因,因此这些排除项是
刻意的,而不是待定的:
- **没有命令与控制、EDR 规避或恶意软件开发。** 实验室机器
不需要它们,并且包含它们的仓库是一种不同类型的
工件,具有不同的义务集合。
- **没有钓鱼或社会工程基础设施。** 实验室机器
的另一端没有人类。
- **没有移动、区块链或云提供商评估。** 不同的目标、
不同的工具,与单主机实战没有共享的循环。
- **没有 write-up 查找。** 在运行中途获取其他人的解决方案会
提高完成率,并破坏唯一被演示的东西。如果循环
找不到路径,那才是有趣的结果。
- **没有日志或审计篡改。** 清理移除操作者的 artifact,
除此之外什么都没有——参见 [清理策略](#cleanup-policy)。
其他 Claude Code 安全仓库很好地涵盖了其中几个方面,并且
广度大得多;`pwnloop` 刻意将一个工作流程做透彻,而不是
浅尝辄止地涵盖三十个。
## 平台规则
此仓库包含工具和方法论,不包含解决方案,并且发布
它不违反任何平台规则。您用它生成的内容是另一回事——
特别是在 Hack The Box 上:
- 解决方案、write-up 和直播**仅在内容确认已
retired 后才被允许**。禁止分享您如何解决活动的
Machines、Challenges、Sherlocks 或 Pro Labs。
- "Expired" 不等于 "retired"。过期的机器只是停止计入
季节积分,可能仍然处于活动状态——在您发布任何关于它的
内容之前明确检查其状态。
- 无论目标状态如何,flag 永远不可分享。它们被写入
`flags.local.md` 和实战目录,两者均被 gitignored;脱敏是
发布步骤,因此本地副本保持完整。
使用此工具时,请遵守您指向的任何平台的
服务条款,并仅针对您被授权测试的目标。
## 故障排除
| 症状 | 原因 | 修复 |
|---------|-------|-----|
| 每个命令都有权限提示 | 工作区未被信任 | `cd ~/pwnloop && claude`,在对话框中接受 |
| 重建后 `tun0: down` | VPN 位于容器中 | 再次运行 `pwnloop vpn ` |
| 目标不可达,VPN 已启动 | 机器未生成或已过期 | 在平台上重新生成它 |
| Web 应用对一切返回 302 | vhost 限制 | 将 hostname 添加到容器的 `/etc/hosts`,然后 fuzz `Host:` 获取更多信息 |
| Reverse shell 从未连接 | payload 指向容器 IP | 使用 `tun0` 地址:`pwnloop x "ip -4 addr show tun0"` |
| `sed -i` 在 `/etc/hosts` 上失败 | 绑定挂载的文件无法重命名 | 追加而不是原地编辑 |
| 缺少工具 | 不在 `packages.txt` 中,或者您的架构没有构建 | 添加它并运行 `pwnloop build`;检查 `/opt/skipped-packages.txt` |
## 将实战数据排除在仓库之外
`install.sh` 链接了 `hooks/pre-commit`,如果提交包含
flag 形式的字符串、`engagements/` 或 `vpn/` 下的路径、私钥材料
或攻击者 VPN 地址,它将拒绝提交。`.gitignore` 是第一道防线,
这是第二道防线,因为现实的失败是维护者将实战
输出粘贴到参考文件中——而不是外人。
```
git commit --no-verify # bypass, when you are deliberately adding a placeholder
```
在 GitHub 方面,启用 **secret scanning with push protection**(对
公共仓库免费)。它捕获 hook 不知道的 token 形式的机密;
hook 捕获 GitHub 不识别为机密的 flag 和实验室凭据。它们涵盖了问题的不同部分。
## 许可证
MIT — 参见 [LICENSE](LICENSE)。
标签:Cutter, Docker容器, LLM代理, Web报告查看器, 人工智能, 实时处理, 密码管理, 攻击面发现, 用户模式Hook绕过, 自动化渗透测试, 请求拦截, 逆向工具