打造一款适合自己的扫描工具(二)
字数 1167 2025-08-06 20:12:36
基于mitmproxy的被动式漏洞扫描工具开发指南
0x01 概述
本教学文档详细讲解如何利用mitmproxy结合Python开发一款被动式漏洞扫描工具。该工具能够拦截HTTP/HTTPS请求,自动检测URL中的参数并进行漏洞探测。
0x02 核心组件与原理
2.1 mitmproxy简介
mitmproxy是一组强大的HTTP/HTTPS代理工具,具有以下特性:
- 支持HTTP/1、HTTP/2和WebSockets协议
- 提供SSL/TLS拦截能力
- 可实时修改请求和响应
- 支持流量记录和重放
- 提供Python API进行脚本化操作
核心工具包括:
mitmproxy:交互式控制台界面mitmweb:基于Web的界面mitmdump:命令行版本(本教程主要使用)
2.2 被动扫描原理
- 通过mitmproxy拦截所有经过代理的HTTP/HTTPS请求
- 提取请求中的URL和参数
- 将参数值替换为测试payload
- 发送修改后的请求并分析响应
- 根据响应内容判断是否存在漏洞
0x03 环境准备
3.1 安装mitmproxy
# Linux/macOS
pip3 install mitmproxy
# Windows
pip3 install mitmproxy
3.2 证书配置
- 访问
http://mitm.it/下载对应操作系统的证书 - 将证书导入浏览器和系统信任库
- 配置浏览器使用mitmproxy代理(默认端口8080)
0x04 核心代码实现
4.1 基础拦截模块
from mitmproxy import ctx
def request(flow):
"""拦截HTTP请求的基本函数"""
request = flow.request
info = ctx.log.info
info(request.url) # 打印请求URL
运行脚本:
mitmdump -s script.py
4.2 URL参数提取与替换
import re
def request(flow):
request = flow.request
url = request.url
# 使用正则替换参数值
modified_url = re.sub("(?<==)([^&]*)", "xxxxxxx", url)
print(modified_url)
4.3 漏洞检测模块
4.3.1 POC文件格式
POC以JSON格式存储,示例:
{
"name": "XSS注入漏洞",
"payload": "\"><ScRiPt>alert(98760);</ScRiPt>",
"res": "(\\S)ScRiPt(\\S)alert(\\S){2}98760(\\S){5}ScRiPt(\\S)"
}
字段说明:
name: 漏洞名称payload: 测试用的攻击载荷res: 用于检测响应中是否包含漏洞特征的正则表达式
4.3.2 扫描函数实现
import requests
import re
import json
import os
def scan(url):
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0",
}
# 遍历POC目录
pathDir = os.listdir('../plug/vul/')
for allDir in pathDir:
p = os.path.join('../plug/vul/' + allDir)
try:
with open(p, 'rt', encoding='utf-8') as f:
json_data = json.load(f)
# 替换参数值为payload
modified_url = re.sub("(?<==)([^&]*)", json_data['payload'], url)
# 发送请求
response = requests.get(modified_url, headers=header)
# 检测响应
if re.search(json_data['res'], response.text):
print('[+] 存在漏洞:' + json_data['name'])
print(modified_url)
# 记录结果
with open('../result/report.txt', 'at') as f:
f.writelines(modified_url + '\n')
except Exception as e:
pass
4.4 多线程优化
import threading
def request(flow):
request = flow.request
url = request.url
mutex = threading.Lock()
for i in range(2): # 创建2个线程
t = threading.Thread(target=scan, args=(url, mutex))
t.start()
def scan(url, t):
t.acquire()
# ... 扫描逻辑同上 ...
t.release()
0x05 工具使用与扩展
5.1 运行方式
mitmdump -s scan_script.py
5.2 自定义配置
- 修改代理端口:
mitmdump -s scan_script.py -p 8888
- 透明代理模式(Linux/macOS):
mitmdump -s scan_script.py --mode transparent
5.3 扩展建议
- 增加POC库:在
../plug/vul/目录下添加更多漏洞的POC文件 - 支持POST请求:扩展脚本以处理POST请求和表单数据
- 结果可视化:将结果输出到数据库或Web界面
- 性能优化:使用连接池、异步请求等技术提高扫描速度
- 与主动扫描结合:将被动发现的URL作为主动扫描的输入
0x06 安全注意事项
- 仅在授权测试的环境中使用该工具
- 注意测试payload可能对目标系统造成的影响
- 避免在生产环境进行高强度扫描
- 遵守当地法律法规
0x07 总结
通过本教程,我们实现了一个基于mitmproxy的被动式漏洞扫描工具,具备以下功能:
- HTTP/HTTPS流量拦截
- URL参数自动提取和替换
- 基于POC的漏洞检测
- 多线程扫描支持
- 结果记录功能
开发者可以根据实际需求扩展和完善该工具,打造适合自己工作流程的自动化安全测试工具。