乐于分享
好东西不私藏

给 AI 渗透助手装上"安全带"——不锁油门,只锁刹车 | AI Agent 在渗透测试场景下既能放手测试,又不会脱库、删库、留后门

给 AI 渗透助手装上"安全带"——不锁油门,只锁刹车 | AI Agent 在渗透测试场景下既能放手测试,又不会脱库、删库、留后门

文章来源:夜组安全

Skill介绍

给 AI 渗透助手装上"安全带"——不锁油门,只锁刹车

Skill + Hook 双层约束系统,让 Claude Code / AI Agent 在渗透测试场景下既能放手测试,又不会脱库、删库、留后门

📖 这个项目解决什么问题

🛡️ Pentest Guard让 AI 帮你做渗透测试时,你会遇到两类痛点:

痛点
表现
后果
😇 AI 太"乖"
"对不起,我不能帮你执行 sqlmap"
正常测试都做不了
😈 AI 太"野"
sqlmap --dump-all
 直接拖库 / rm -rf 清日志
一个 token 进去踩缝纫机

Pentest Guard 的答案:只锁刹车,不锁油门

  • ✅ AI 可以放手做侦察、扫描、PoC、利用链构造——测试思路不被限制
  • ✅ 正常渗透工具(sqlmap、nmap、ffuf、nuclei)全放行
  • ✅ sqlmap --dump --start 1 --stop 3 合规取证放行
  • ✅ localhost / 测试表 / Docker 操作自动 bypass
  • 🛑 脱库、删库、留后门、横向 → 暂停 + 询问用户
  • 🛑 fork bomb、mkfs、dd 覆写 → 硬阻断
  • 🔓 用户拥有最终决定权:明确授权后 -- user-confirmed 一律放行

⏱️ 30 秒看懂

# 你说:测下这个接口👤 你:帮我跑 sqlmap 测 https://target.com/api/search# strict 模式:常规扫描放行🤖 AI:sqlmap -u "https://target.com/api/search" --batch --level 3       ✓ 发现 keyword 参数存在时间盲注# 你说:拖 users 表👤 你:那拖一下 users 表# Hook 触发 PAUSE,AI 不会直接拖库🤖 AI:⏸️ 红线提示:全量 dump 触发数据外带红线。       合规替代:         1. 加 --start 1 --stop 3 限 3 条样本         2. 或仅取 version() 证明能拖       你确认要全量 dump 吗?# 你说:那就 3 条样本吧👤 你:先取 3 条样本看看🤖 AI:sqlmap -u "..." --dump -T users --start 1 --stop 3       ✓ 取得 3 条样本(已脱敏),未尝试全量 dump# 你说:必须全量(你拥有最终决定权)👤 你:必须全量 dump,我授权🤖 AI:sqlmap -u "..." --dump -T users -- user-confirmed       ✓ Hook 放行(用户明确授权)

📚 术语速查(新手先看这里)

术语
含义
Skill
Claude Code 的能力包,本质是一份 Markdown 规则文件,AI 加载后按规则行事
Hook
在 AI 工具调用前/后执行的脚本,类似 Git hooks。本项目用 PreToolUse hook
strict / redteam / off
三档严格度,控制 hook 拦截范围
PAUSE
Hook 给 AI 的暂停信号(exit 2 + 提示),AI 看到后必须询问用户
HARD-BLOCKED
Hook 的硬阻断信号,仅用于 fork bomb / mkfs 等不可逆操作
bypass marker
命令中的标记字符串(如 -- user-confirmed),命中即放行
垃圾洞
误报率极高的低质量发现(CORS、安全头缺失等),默认不报

🏗️ 工作原理:三层防御架构

📌 若下图不显示:GitHub 主页原生支持 Mermaid,但 VS Code / Typora / 部分博客平台需插件。可下滑查看 ASCII 备份图。

三层各自负责什么

实现
角色
失效后果
🥇 Skill
SKILL.md
 教 AI 行为
教育者:让 AI 自觉暂停
AI 可能"忘记"规则
🥈 Hook
pentest-guard-hook.py
 执行层拦截
兜底者:AI 忘了也拦得住
安全网失效
🥉 用户
-- user-confirmed
 标记
最终决定权
用户被剥夺授权能力

三层缺一不可:Skill 让 AI 大多数时候自觉暂停,Hook 在 AI 遗忘时兜底,用户始终掌握最终决定权。

模式对比

模式
适用场景
拦截范围
🔒 strict(默认)
SRC / 众测 / Bug bounty
破坏性 SQL + 横向 + 持久化 + 高速扫描
⚔️ redteam
红队 / HVV / 已授权内测
仅破坏性 SQL + 拖库 + DoS + 生产钓鱼
💤 off
本地实验 / 自有靶机
完全关闭

📊 行为矩阵

一眼看懂什么放行、什么暂停、什么硬阻断。

操作
🔒 strict
⚔️ redteam
-- user-confirmed
sqlmap --batch --level 3
sqlmap --dump --start 1 --stop 3
(合规取证)
sqlmap --dump
(全量拖库)
⏸️
⏸️
nmap -sV target.com
nmap --top-ports 1000
(高速全段)
⏸️
DROP TABLE users
⏸️
⏸️
mysqldump -A
⏸️
⏸️
crackmapexec smb 10.0.0.0/24
⏸️
mimikatz.exe
⏸️
:(){ :|:& };
(fork bomb)
🛑
🛑
mkfs.ext4 /dev/sda
🛑
🛑
curl http://127.0.0.1:8080
docker run alpine ...

图例:✅ 放行 · ⏸️ PAUSE 暂停询问 · 🛑 HARD-BLOCKED 硬阻断

🎯 精准边界(v2 新增:避免误伤正常渗透)

早期版本把 PoC 包数、Webshell 上传、弱口令爆破一刀切卡死,导致正常渗透都做不了。 v2 按"PoC 性质"而非"统一阈值"分级,更贴近实战。

PoC 包数分级

PoC 类型
上限
例子
探测型 PoC
≤ 20 包
XSS 弹窗、SSRF DNSLog、未授权访问探测
副作用取证
≤ 3 次
RCE 执行 whoami、SQLi 取 version()
破坏型 PoC
🚫 永远不做
DROP / DELETE / 写文件

Webshell 上传规则

场景
是否允许
上传 <?php system($_GET['cmd']); ?> 验证文件上传漏洞
用完即删(验证完立刻删掉 webshell 文件)
✅(推荐)
挂黑页 / 留攻击者标语
🚫
改名隐藏作持久化(如 .config.php.swp
🚫
写计划任务 / 反弹 shell / 自动加载
🚫
混淆型后门(base64_decode + eval)
🚫(Hook 硬拦)

弱口令爆破规则

场景
是否允许
常见弱口令小字典(≤20 组,如 admin/admin、root/root)
限速 ≤1 req/s(不触发 WAF / 锁定)
仅针对自己控制或授权的账号
大字典(rockyou.txt 等)
🚫
多线程 / 高并发(hydra -t 64、burp intruder 50 threads)
🚫(Hook 硬拦)
触发账号锁定后继续尝试
🚫
爆破他人真实账号(非自演)
🚫

🎯 使用方式

命令速查

命令
作用
/pentest-guard
加载完整规则
/pentest-guard status
查看当前模式 + Hook 状态
/pentest-guard mode strict
切换至 strict(SRC 默认)
/pentest-guard mode redteam
切换至 redteam(红队授权)
/pentest-guard mode off
完全关闭
/pentest-guard check
对当前命令做红线自检
/pentest-guard report
审查待提交 finding
/pentest-guard refresh
重读速查卡(长会话防遗忘)
/pentest-guard confirm
单次授权刚才被 PAUSE 的操作

用户授权标记(按强度递增)

标记
适用场景
强度
-- sandbox-only
本地测试环境
-- user-controlled test environment
测试环境
-- local-test
localhost 操作
-- authorized-redteam
红队授权场景
⭐⭐
-- user-confirmed用户明确授权的任何操作⭐⭐⭐

-- user-confirmed 是最终逃生口:任何操作只要带这个标记都会放行,包括 fork bomb、DROP TABLE、sqlmap --dump。用户承担全部责任。

💬 真实对话示例

示例 1:众测项目,AI 主动暂停

👤 用户:帮我跑 sqlmap 拖这个站的 users 表🤖 AI:红线提示:全量 dump 触发数据外带红线。合规替代方案:  1. 加 --start 1 --stop 3 限 3 条样本取证  2. 或仅取 version() / current_database() 证明能拖你确认要全量 dump 吗?确认的话我加 -- user-confirmed 执行。👤 用户:那就先取 3 条样本看看吧🤖 AI:(合规取证直接放行)sqlmap -u "https://target.com/api/search?keyword=test" \  --dump -T users --start 1 --stop 3✓ 取得 3 条样本(已脱敏)✓ 数据库版本:MySQL 5.7.34✓ 表存在 admin 用户(用户名前缀 ad****)未尝试全量 dump。

示例 2:红队 HVV,切换模式

👤 用户:切换到红队模式🤖 AI:要求确认授权依据(合同 / HVV 项目 / safe-harbor 条款)。👤 用户:合同号 HVV-2024-0823,已授权完整后渗透🤖 AI:(写入模式文件 = redteam)已切换。下列工具现在直接放行:  - crackmapexec / psexec / wmiexec(横向)  - mimikatz / secretsdump(凭据,非 -just-dc)  - masscan / nmap 高速扫描但以下仍会 PAUSE:  - DROP / DELETE / TRUNCATE  - sqlmap --dump 无 --stop👤 用户:拿 mimikatz 抓下本机凭据🤖 AI:(redteam 模式直接放行,无需 user-confirmed)mimikatz.exe "privilege::debug""sekurlsa::logonpasswords""exit"

示例 3:误报抑制

👤 用户:扫完了,看看有哪些漏洞🤖 AI:(自动加载 /pentest-guard)扫描结果按红线清单过滤:❌ 不报(垃圾洞):  - CORS 配置宽松(无 PoC 数据外带证明)  - X-Frame-Options 缺失  - Server: nginx 版本号暴露⚠️ 待验证:  - /admin 路径未授权访问(需 PoC 证明越权)  - search 接口时间盲注(需 3 包差分证明)✓ 已证明(可写报告):  - /api/user/{id} IDOR(A 账号可读 B 账号订单,附 3 次复现)

更多示例见 examples/usage-scenarios.md

🚫 垃圾洞清单(误报抑制)

AI 会把所有"现象"都报成漏洞,让审核员淹没在低质量 finding 里。Pentest Guard 主动过滤。

以下类型绝对不报(除非附带完整 PoC + 已证明影响):

类型
为什么是垃圾洞
CORS 配置
配置宽松 ≠ 实际可窃取数据
HTTP 安全头缺失
防御建议,不是漏洞
版本号 / Server banner
信息暴露 ≠ 可利用
Self-XSS
只能弹自己,无影响
Sourcemap 泄露
调试信息,链不上具体危害
SSL/TLS 常规警告
配置问题,非漏洞
Rate limiting 缺失
防御建议
开放重定向(无链式利用)
单点无影响

工具获取

https://github.com/aalhea/pentest-guards-skills/tree/main

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并致歉。祝愿每一位读者生活愉快!

本公号发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!

推荐阅读

*Linux 文件系统性能深度对比:ext4 vs XFS vs Btrfs 选型指南

*一款无需编译的Java静态应用程序安全测试 (SAST) 工具 | AI 辅助审计

*图形化未授权访问漏洞扫描器,支持检测 40+种 常见服务的未授权漏洞