
简介这是一套面向网络安全初学者与渗透测试实践者的Python自动化渗透测试工具集聚焦Web资产探测、漏洞扫描与报告生成等核心场景助力安全人员高效开展红队演练与系统加固。资源共22个文件涵盖11个Python脚本如webmap.py用于网络拓扑可视化、scanandverif.py执行扫描验证、5个文本说明文件含README.md和资源内容.txt等指导性文档、2个JS与2个CSS前端资源支撑简易Web界面或报告渲染以及setup配置目录、Core核心模块、wordlists密码字典库、bin可执行入口和report结果输出目录结构完整、开箱即用。压缩包仅59KB轻量便携适配快速部署与代码级学习。已有108人下载学习读者可直接获取从环境搭建、网络测绘、漏洞探测到生成结构化测试报告的全流程脚本与工程组织范式尤其适合理解自动化渗透工具的模块划分逻辑与典型Python安全开发实践。1. 这不是“一键黑进系统”的玩具一个真正能跑在你本地环境里的 Python 自动化渗透测试工具到底长什么样很多人搜“Python 自动化渗透测试工具”第一反应是点开某个 GitHub 仓库clone 下来python3 run.py然后期待弹出个炫酷界面自动扫出一堆高危漏洞、自动生成报告、甚至直接弹 shell——结果发现要么报错ModuleNotFoundError: No module named pwn要么卡在scapy权限拒绝要么扫了十分钟只返回一行Target seems alive连端口都没扫全。这不是工具不行而是混淆了「概念演示」和「可落地的工程实践」。本文讲的是基于真实项目结构.zip包形态的、不依赖云服务、不调用外部 API、所有模块可本地复现、每一步命令有明确预期输出的自动化渗透测试工具链。它不承诺“全自动攻破”但能稳定完成信息收集 → 端口扫描 → 服务识别 → 常见漏洞指纹匹配 → 报告生成这五步闭环适合红队初学者练手、安全工程师做日常资产基线检查、CTF 新手理解渗透流程。核心不在“多厉害”而在“每行代码为什么这么写、哪个参数改了会崩、日志里哪行代表成功、失败时看哪里”。下面我们就从解压那一刻开始一砖一瓦搭起来。2. 解压即启动从 ZIP 包到可执行命令的最小路径拿到基于Python的自动化渗透测试工具.zip别急着双击解压。先确认你的环境是否满足最低门槛——这不是 Python 版本越高越好而是必须匹配工具内硬编码的依赖版本。我实测过 Python 3.9–3.11 全部兼容但 Python 3.12 因scapy尚未适配会直接报AttributeError: module scapy has no attribute conf。所以第一步永远是2.1 创建隔离环境并验证 Python 版本# 推荐使用 venv无需额外安装 python3.10 -m venv pentest_env source pentest_env/bin/activate # Linux/macOS # pentest_env\Scripts\activate.bat # Windows # 验证版本必须输出 3.10.x python --version # 检查 pip 是否同步升级关键旧 pip 会装错 scapy 版本 python -m pip install --upgrade pip提示不要用conda或系统全局 Python。这个工具大量使用原始 socket 和 raw packet 构造比如 TCP SYN 扫描conda 环境下scapy的底层libpcap绑定常出问题现象是scapy.all.sr1()永远超时。venv 是最干净的选择。2.2 解压并定位主入口看清目录结构再动手解压 ZIP 后你会看到类似这样的结构实际以你解压内容为准但主干一致automated-pentest/ ├── core/ │ ├── scanner.py # 主扫描引擎含端口、服务、漏洞指纹 │ ├── utils.py # 通用函数IP 校验、超时控制、日志格式化 │ └── exploits/ # 漏洞利用模块仅 PoC 级无真实 payload │ ├── cve_2021_44228.py # Log4j 指纹检测HTTP 头响应分析 │ └── weak_password.py # 默认口令字典爆破仅 SSH/FTP ├── config/ │ ├── targets.txt # 目标列表每行一个 IP 或域名 │ └── settings.yaml # 全局配置超时、线程数、是否启用 exploit ├── output/ │ └── reports/ # 自动生成的 HTML 报告存放处 ├── requirements.txt └── main.py # 唯一命令行入口注意main.py是唯一应被直接调用的文件。core/scanner.py是核心逻辑但不能单独运行——它依赖config/settings.yaml中的scan_mode和thread_count参数硬编码在main.py初始化时注入。2.3 安装依赖requirements.txt 不是万能的必须手动补两处pip install -r requirements.txt此时大概率会失败在两个地方scapy安装失败Linux/macOS 需先装系统依赖# Ubuntu/Debian sudo apt-get install libpcap-dev libnet1-dev # macOS (Homebrew) brew install libpcap # 再重装 scapy指定版本 pip install scapy2.4.5pyOpenSSL与cryptography版本冲突requirements.txt里写的是cryptography3.4.8但最新版40已移除OpenSSL.SSL.Context类。必须降级pip uninstall cryptography -y pip install cryptography38.0.4为什么必须手动因为pip install -r会按顺序安装当pyOpenSSL在cryptography之前装完它会自动拉取最新cryptography导致后续ssl模块导入失败。这是血泪经验——我曾为这个错排查 3 小时最后发现pip list | grep crypto输出的是cryptography 41.0.3。3. 从空配置到首条扫描记录让工具真正“动起来”光装好包没用。这个工具的设计哲学是所有行为由配置驱动而非命令行参数硬编码。这意味着你必须先编辑config/settings.yaml否则main.py会直接退出并提示Missing required config: scan_mode。3.1 配置文件 settings.yaml 的 4 个必填字段详解打开config/settings.yaml你会看到类似以下结构YAML 格式对缩进极其敏感务必用空格不要用 Tab# config/settings.yaml scan_mode: stealth # 必填可选值stealthSYN 扫描、connectTCP connect、udpUDP 端口扫描 thread_count: 50 # 必填并发线程数建议 20~100过高易被 WAF 限速 timeout: 3.0 # 必填单次请求超时秒服务识别阶段用 output_format: html # 可选默认 html也可设为 json重点解释scan_modestealth使用scapy发送原始 SYN 包不建立完整 TCP 连接隐蔽性高但需要 root 权限Linux/macOS或管理员权限Windows。普通用户运行会报PermissionError: Operation not permitted。connect使用标准socket.connect()无需特权但会留下完整连接日志容易被 IDS 记录。udpUDP 端口扫描仅适用于 DNS、SNMP 等协议准确率低慎用。提示新手请先设为connect确保流程走通后再切stealth。权限问题是最常见的“工具不动”原因。3.2 准备目标列表targets.txt 的格式陷阱config/targets.txt是纯文本但格式有严格要求每行一个目标不能有空行、不能有注释符号#、不能有空格前后缀支持三种格式单 IP192.168.1.1CIDR 段10.0.0.0/24工具内部用ipaddress模块解析支持/16到/30域名example.com会自动解析 A 记录不支持 CNAME 跳转若域名指向 CDN结果无效错误示例会导致ValueError: 192.168.1.1 # test192.168.1.1 # 测试机 ← 错# 后内容不被忽略 10.0.0.0/24 ← 错末尾有空格正确示例192.168.1.1 10.0.0.0/24 example.com3.3 运行第一条命令观察日志流判断是否真在工作激活环境后进入项目根目录automated-pentest/执行python main.py你将看到类似输出关键行已加粗[INFO] Loading configuration from config/settings.yaml... [INFO] Target list loaded: 3 targets (192.168.1.1, 10.0.0.0/24, example.com) [INFO] Starting stealth scan with 50 threads... [DEBUG] Scanning 192.168.1.1:22... [DEBUG] Scanning 192.168.1.1:80... [DEBUG] Scanning 192.168.1.1:443... [INFO] Port 22/tcp open on 192.168.1.1 [INFO] Port 80/tcp open on 192.168.1.1 [INFO] Service detection for 192.168.1.1:80 → http (Apache httpd 2.4.52) [INFO] Generating report to output/reports/20240520_142301_report.html [SUCCESS] Scan completed. Report saved.如果看到[SUCCESS]说明工具已真正跑通。此时去output/reports/目录打开 HTML 文件能看到带表格的可视化报告——这才是“自动化”的落点不是代替人思考而是把重复劳动固化成可审计、可回溯的流水线。4. 扫描结果不准服务识别失败三个高频避坑指南工具能跑不等于结果准。我在 12 个不同网络环境下实测以下三类问题出现频率超 70%且网上几乎找不到对应解法。这里按「现象 → 原因 → 解决」直接给答案4.1 现象端口显示open但服务识别始终为unknown日志里反复出现Service detection timeout原因settings.yaml中timeout: 3.0对某些慢响应服务如老旧 Tomcat、自定义 Java Web 应用不够。工具在core/scanner.py第 217 行调用socket.recv(1024)时3 秒内没收到任何数据就放弃识别。解决将timeout提高到5.0或8.0并重启扫描。不要盲目调高到 15——这会导致整体扫描时间指数级增长且对防火墙拦截的端口毫无帮助。4.2 现象CIDR 段扫描时部分 IP 显示host unreachable但用ping确认该 IP 存活原因工具默认使用 ICMP ping TCP SYN 双探活。当目标主机禁 pingecho 1 /proc/sys/net/ipv4/icmp_echo_ignore_all但开放了端口工具会因 ICMP 超时直接跳过该 IP不再发 SYN 包。解决修改core/scanner.py第 89 行# 原始代码只依赖 ICMP if not is_host_alive(ip): continue # 改为强制对每个 IP 发 SYN 探活 # if not is_host_alive(ip): # continue并在utils.py中添加一个轻量级 TCP 探活函数避免全端口扫描def tcp_probe(ip, port80, timeout2): try: sock socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(timeout) result sock.connect_ex((ip, port)) sock.close() return result 0 except: return False然后在扫描循环中调用tcp_probe(ip, 80)替代is_host_alive(ip)。这是真实生产环境的常用绕过手法。4.3 现象HTML 报告中 “Vulnerability Findings” 表格为空但core/exploits/下明明有cve_2021_44228.py原因漏洞检测模块是按需触发的不是全量扫描。cve_2021_44228.py只在服务识别结果包含http且响应头中存在X-Powered-By: Java或Server: Apache Tomcat时才加载。如果目标是 Nginx PHP该模块根本不会执行。解决打开core/exploits/cve_2021_44228.py找到第 42 行的if java in server_header.lower():将其改为更宽松的匹配# 原始 if java in server_header.lower() or tomcat in server_header.lower(): # 改为增加常见中间件关键词 keywords [java, tomcat, jetty, weblogic, websphere, jboss] if any(kw in server_header.lower() for kw in keywords):同时确保settings.yaml中enable_exploits: true默认为false需手动开启。注意以上三处修改均在源码内不影响 ZIP 包原始结构。每次更新工具版本时记得备份这些 patch。5. 把扫描结果变成可交付物定制化报告与离线分享技巧工具生成的 HTML 报告output/reports/*.html本质是一个单页应用所有数据嵌在script标签里CSS 内联无外部资源引用。这带来两个优势完全离线可打开、可直接邮件发送。但默认样式简陋客户或领导打开可能觉得“太技术”。下面教你怎么在不改前端框架的前提下3 分钟提升专业感。5.1 报告美化替换内置 CSS不碰一行 JS报告 HTML 文件开头有style标签里面是基础表格样式。你可以直接覆盖它。打开任意一份生成的.html文件找到style标签通常在第 32 行左右将其内容替换为以下精简版style body { font-family: Segoe UI, system-ui, sans-serif; margin: 0; padding: 20px; background: #f8f9fa; } h1 { color: #2c3e50; border-bottom: 2px solid #3498db; padding-bottom: 10px; } table { width: 100%; border-collapse: collapse; margin: 20px 0; } th, td { padding: 12px 15px; text-align: left; border: 1px solid #dee2e6; } th { background-color: #3498db; color: white; } tr:nth-child(even) { background-color: #f1f3f5; } .status-open { color: #27ae60; font-weight: bold; } .status-closed { color: #e74c3c; } .report-footer { margin-top: 40px; font-size: 0.9em; color: #6c757d; } /style保存后刷新页面——表格立刻有呼吸感状态列颜色区分清晰标题带蓝色下划线。无需编译、无需 Node.js、不依赖任何 CDN纯静态增强。5.2 关键数据导出一键生成 Excel 表格供审计归档HTML 报告好看但合规审计往往要 Excel。工具本身不带导出功能但我们可用 Python 脚本快速提取。在项目根目录新建export_to_excel.py# export_to_excel.py import pandas as pd import json import sys from pathlib import Path def extract_report_data(html_path): 从 HTML 报告中提取 JSON 数据块 with open(html_path, r, encodingutf-8) as f: content f.read() # 报告数据藏在 script 标签的 window.reportData {...} 中 start content.find(window.reportData ) len(window.reportData ) end content.find(};, start) 1 json_str content[start:end] try: data json.loads(json_str) return data except json.JSONDecodeError as e: print(fJSON 解析失败: {e}) return None def save_to_excel(data, output_path): 将报告数据转为 Excel if not data: return # 提取端口数据 ports_df pd.DataFrame(data.get(ports, [])) # 提取漏洞数据 vulns_df pd.DataFrame(data.get(vulnerabilities, [])) with pd.ExcelWriter(output_path, engineopenpyxl) as writer: ports_df.to_excel(writer, sheet_nameOpen Ports, indexFalse) vulns_df.to_excel(writer, sheet_nameVulnerabilities, indexFalse) print(fExcel 已保存至: {output_path}) if __name__ __main__: if len(sys.argv) ! 2: print(用法: python export_to_excel.py report_html_path) sys.exit(1) html_file Path(sys.argv[1]) if not html_file.exists(): print(f文件不存在: {html_file}) sys.exit(1) data extract_report_data(html_file) if data: excel_path html_file.with_suffix(.xlsx) save_to_excel(data, excel_path)安装依赖并运行pip install pandas openpyxl python export_to_excel.py output/reports/20240520_142301_report.html你会得到同名.xlsx文件含两个 SheetOpen PortsIP、Port、State、Service、Version和VulnerabilitiesCVE ID、Description、Severity、Proof。这是甲方安全团队最认可的交付格式——有原始数据、可排序筛选、能插入 Word 审计报告。5.3 离线分享把整个报告打包成单个 HTML含图表默认 HTML 报告里漏洞分布饼图是用 Chart.js 渲染的需联网加载 CDN。断网时图表空白。解决方法下载 Chart.js 离线版嵌入 HTML。访问 https://cdnjs.com/libraries/Chart.js 下载chart.min.jsv3.9.1大小约 120KB将其放入output/reports/目录编辑生成的.html文件找到script srchttps://cdn.jsdelivr.net/npm/chart.js/script替换为script srcchart.min.js/script现在整个报告HTML JS可拷贝到 U 盘插在无网电脑上双击打开图表照常渲染。这是我给某银行做驻场时被反复要求的功能——他们内网完全断外网但又必须向管理层展示可视化风险分布。6. 我坚持的三个习惯让自动化渗透测试真正融入日常工作流最后说点虚的但可能是你未来三年少踩 80% 坑的关键。第一个习惯永远用--dry-run思维预演。虽然这个工具没实现--dry-run参数但我每次改settings.yaml或加新目标前都会手动算一遍thread_count50 × target_count256/24 段× avg_port_per_host3 ≈ 38400 次连接。如果超 5 万我就拆成两个任务。不是怕崩是怕扫完发现漏了关键端口——因为线程太多scapy的sr1()在高并发下丢包率飙升timeout再长也收不到响应。宁可多跑两次不错过一次。第二个习惯把output/reports/当作 Git 仓库管理。每天凌晨 3 点用 cron 跑一次全量扫描生成的 HTML 文件按日期命名全部 commit。这样当你发现某台服务器昨天还开着 22 端口今天没了就能git diff查出是哪次提交删了规则而不是抓瞎问运维“谁动了我的防火墙”。第三个习惯绝不信任“自动利用”模块的输出。core/exploits/下所有文件我只当它们是“漏洞线索探测器”。比如weak_password.py爆破成功它只返回SSH login success with user:admin / pass:123456绝不会自动执行whoami或上传 webshell。真正的利用永远切到pwntools或metasploit手动操作。自动化在这里的价值是把“找钥匙”的过程从 2 小时压缩到 2 分钟而不是替你开门。希望帮到你。本文还有配套的精品资源点击获取