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绕过, 自动化渗透测试, 请求拦截, 逆向工具