用AI构建自动化渗透测试流程:小团队的Red Team方案
分类:AI安全、渗透测试、自动化、红队
写在前面
渗透测试是检验安全防护效果的重要手段,但专业渗透测试服务价格不菲,基层单位往往几年才做一次。随着 AI 工具的成熟,我尝试搭建了一套半自动化的渗透测试流程,在授权范围内定期自测,发现了很多平时忽略的安全问题。本文分享方案设计。
声明:本文所有内容仅适用于已获授权的安全测试。未经授权的渗透测试是违法行为。
一、为什么需要自动化渗透测试
传统渗透测试的局限
- 成本高:一次专业渗透测试通常 3-10 万元
- 频率低:因为贵,通常一年做一次甚至更久
- 覆盖面有限:人工测试时间内能覆盖的范围有限
- 依赖个人能力:不同测试人员水平差异大
AI辅助的优势
- 成本低:API 调用费用可忽略
- 频率高:可以每周甚至每天跑
- 覆盖面广:AI 可以同时处理大量目标
- 标准化:每次测试流程一致,结果可对比
二、自动化渗透测试框架架构
┌────────────────────────────────────────────────────┐
│ 渗透测试编排引擎 │
│ │
│ ┌─────────┐ ┌──────────┐ ┌─────────┐ │
│ │ 信息收集 │ ->│ 漏洞发现 │ ->│ 漏洞验证 │ │
│ │ (Recon) │ │ (Scan) │ │ (Exploit)│ │
│ └─────────┘ └──────────┘ └─────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────┐ │
│ │ AI 分析与决策层 │ │
│ │ - 结果研判 │ │
│ │ - 下一步建议 │ │
│ │ - 误报过滤 │ │
│ │ - 报告生成 │ │
│ └─────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────┘
三、阶段一:智能信息收集
3.1 多维度信息收集
python
class ReconPhase:
"""信息收集阶段"""
def __init__(self, target_scope: Dict):
self.scope = target_scope # 授权范围
self.results = {}
def run(self) -> Dict:
"""执行信息收集"""
self.results = {
"domains": self._enumerate_domains(),
"subdomains": self._enumerate_subdomains(),
"ports": self._port_scan(),
"services": self._service_detection(),
"web_apps": self._web_app_fingerprint(),
"technologies": self._tech_stack_detection(),
}
# AI 汇总分析
return self._ai_summarize()
def _enumerate_subdomains(self) -> List[str]:
"""子域名枚举"""
import subprocess
# 使用 subfinder 等工具
result = subprocess.run(
["subfinder", "-d", self.scope["domain"], "-silent"],
capture_output=True, text=True
)
subdomains = result.stdout.strip().split("\n")
# 验证存活的子域名
alive = []
for sub in subdomains:
if self._is_alive(sub):
alive.append(sub)
return alive
def _port_scan(self) -> List[Dict]:
"""端口扫描"""
import subprocess
result = subprocess.run(
["nmap", "-sS", "-sV", "--top-ports", "1000",
"-oX", "-", self.scope["ip_range"]],
capture_output=True, text=True
)
return parse_nmap_xml(result.stdout)
3.2 AI辅助信息汇总
python
def _ai_summarize(self) -> Dict:
"""AI汇总分析信息收集结果"""
prompt = f"""
你是一名渗透测试工程师,正在分析信息收集阶段的结果。
目标范围:{json.dumps(self.scope, ensure_ascii=False)}
收集到的信息:
{json.dumps(self.results, ensure_ascii=False, indent=2)}
请分析:
1. **攻击面评估**
- 暴露的服务清单
- 每个服务的风险等级
- 可能存在的攻击路径
2. **高价值目标**
- 哪些系统最可能存在漏洞
- 哪些系统一旦被攻破影响最大
- 建议优先测试的目标
3. **下一步行动建议**
- 对每个高价值目标,建议用什么方法测试
- 需要补充收集的信息
- 可能的安全控制绕过点
4. **风险评估**
- 整体攻击面评分(1-10)
- 最紧急的 3 个安全问题
"""
return call_llm(prompt)
四、阶段二:漏洞发现
4.1 自动化漏洞扫描
python
class VulnerabilityScan:
"""漏洞扫描阶段"""
def __init__(self, recon_results: Dict):
self.targets = recon_results
def run(self) -> List[Dict]:
vulnerabilities = []
for target in self.targets["web_apps"]:
# Web 应用扫描
vulns = self._web_scan(target)
vulnerabilities.extend(vulns)
for service in self.targets["services"]:
# 服务漏洞扫描
vulns = self._service_scan(service)
vulnerabilities.extend(vulns)
# AI 去重和误报过滤
return self._ai_filter_false_positives(vulnerabilities)
def _web_scan(self, target: Dict) -> List[Dict]:
"""Web应用漏洞扫描"""
import subprocess
# 使用 nuclei 进行模板扫描
result = subprocess.run(
["nuclei", "-u", target["url"],
"-t", "cves/", "-t", "vulnerabilities/",
"-json", "-silent"],
capture_output=True, text=True
)
vulns = []
for line in result.stdout.strip().split("\n"):
if line:
vulns.append(parse_nuclei_json(line))
return vulns
def _ai_filter_false_positives(self, vulns: List[Dict]) -> List[Dict]:
"""AI过滤误报"""
prompt = f"""
你是一名渗透测试专家。以下是自动化扫描发现的安全漏洞,请判断哪些是真实漏洞,哪些可能是误报。
发现的漏洞:
{json.dumps(vulns, ensure_ascii=False, indent=2)}
请对每个漏洞评估:
1. 真实性:真实漏洞/可能误报/确定误报
2. 理由:为什么这么判断
3. 验证建议:如何确认这个漏洞是真实的
4. 优先级:高/中/低
只保留"真实漏洞"和"可能误报"的条目,去掉"确定误报"的。
"""
result = call_llm(prompt)
return result
五、阶段三:漏洞验证(PoC生成)
python
def ai_generate_poc(vulnerability: Dict, target: Dict) -> Dict:
"""
AI辅助生成漏洞验证方案
"""
prompt = f"""
你是一名渗透测试工程师。需要验证以下漏洞是否真实存在。
漏洞信息:
{json.dumps(vulnerability, ensure_ascii=False, indent=2)}
目标信息:
{json.dumps(target, ensure_ascii=False, indent=2)}
请生成一个安全的验证方案:
1. **验证方法**
- 具体的验证步骤
- 需要使用的工具
- 预期的验证结果
2. **安全验证命令**
- 只使用无害的验证方式(如时间盲注的sleep、DNSLog等)
- 不要执行破坏性操作
- 不要尝试获取敏感数据
3. **验证脚本**
- 生成一个Python验证脚本
- 脚本应包含超时和错误处理
- 输出清晰的验证结果
4. **风险评估**
- 验证过程对目标的影响
- 需要注意的事项
"""
return call_llm(prompt)
实际验证脚本示例
python
def verify_sqli(target_url: str, param: str) -> Dict:
"""验证SQL注入漏洞(无害方式)"""
import requests
import time
results = {"vulnerable": False, "evidence": []}
# 时间盲注验证:使用 SLEEP 函数
# 正常请求
start = time.time()
requests.get(f"{target_url}?{param}=1")
normal_time = time.time() - start
# 注入 SLEEP
start = time.time()
requests.get(f"{target_url}?{param}=1' AND SLEEP(5)--")
inject_time = time.time() - start
if inject_time - normal_time > 4:
results["vulnerable"] = True
results["evidence"].append(
f"时间差异:正常{normal_time:.2f}s vs 注入{inject_time:.2f}s"
)
return results
六、阶段四:AI生成测试报告
python
def generate_pentest_report(
scope: Dict,
recon: Dict,
vulnerabilities: List[Dict],
verified: List[Dict],
) -> str:
"""生成渗透测试报告"""
prompt = f"""
你是一名渗透测试报告撰写专家。请根据以下测试结果,生成一份正式的渗透测试报告。
=== 测试范围 ===
{json.dumps(scope, ensure_ascii=False, indent=2)}
=== 信息收集结果 ===
{json.dumps(recon, ensure_ascii=False, indent=2)}
=== 发现的漏洞 ===
{json.dumps(vulnerabilities, ensure_ascii=False, indent=2)}
=== 已验证的漏洞 ===
{json.dumps(verified, ensure_ascii=False, indent=2)}
报告结构:
1. **执行摘要**
- 测试时间、范围、方法
- 总体安全评估
- 关键发现(管理层关注的内容)
2. **测试详情**
- 信息收集结果
- 发现的漏洞清单(表格形式)
- 每个漏洞的详细描述
3. **漏洞详情**(对每个已验证漏洞)
- 漏洞名称和编号
- 风险等级
- 影响描述
- 复现步骤
- 修复建议
- 参考链接
4. **安全建议**
- 短期修复(1周内)
- 中期改进(1个月内)
- 长期规划(3个月内)
5. **附录**
- 工具清单
- 测试时间线
"""
return call_llm(prompt)
七、安全与合规
必须遵守的红线
- 书面授权:所有测试必须有书面授权,明确范围和时间窗口
- 不得破坏:不执行任何可能导致服务中断的操作
- 不得窃取数据:不下载、不查看真实业务数据
- 及时清理:测试结束后清理所有测试痕迹
- 结果保密:测试报告仅限安全团队和管理层查看
AI 使用的限制
python
# AI 安全策略:禁止生成的内容
PROHIBITED_ACTIONS = [
"生成恶意软件",
"生成持久化后门",
"执行数据窃取",
"执行拒绝服务攻击",
"绕过法律授权范围",
"攻击非授权目标",
]
def safety_check(ai_output: str) -> bool:
"""检查AI输出是否违反安全策略"""
for prohibited in PROHIBITED_ACTIONS:
if prohibited in ai_output.lower():
return False
return True
八、实际效果
我在单位内网用这套流程做了3轮自测:
| 轮次 | 发现漏洞数 | 已验证 | 修复完成 | 新发现类型 |
|---|---|---|---|---|
| 第1轮 | 23 | 15 | 15 | 弱口令、信息泄露、过时组件 |
| 第2轮 | 12 | 8 | 8 | 配置不当、缺失安全头 |
| 第3轮 | 5 | 3 | 3 | 逻辑漏洞、权限提升 |
关键收获:第1轮发现的15个真实漏洞中,有6个是传统漏扫工具没报但 AI 分析判断存在的。包括一个暴露了内部网络拓扑的调试接口和一个允许未授权访问的管理页面。
九、结语
自动化渗透测试不是要替代专业渗透测试团队,而是作为日常安全自查的补充。它的价值在于"高频、低成本、广覆盖"------能在专业测试的间隔期内持续发现问题。
对于基层单位,一套自动化渗透测试流程的成本几乎为零(开源工具 + 少量 API 费用),但发现的问题可能比几年一次的专业测试更有价值,因为它能及时发现新暴露的风险。