简介:WebCrack是一款基于Python开发的Web后台弱口令与万能密码批量检测工具,面向渗透测试初学者、安全运维人员及CTF实战爱好者,用于高效识别目标系统后台登录接口存在的弱口令或SQL注入类万能密码漏洞。资源包共13个文件,含8个核心Python脚本(如webcrack.py主程序、crack_task.py任务调度、parser.py表单解析等)、2个文本配置文件(url.txt目标列表、config.py全局参数)、1个说明文档(README.md)、1张界面截图(PNG)及1个依赖清单(requirements.txt),整体仅113KB,轻量易部署。已有1605人学习下载,适合快速上手实战演练。用户可直接运行工具,支持域名动态字典生成、多重响应判断机制、随机UA/X-Forwarded-For/IP请求头,且v2.1版本已修复IP目标下字典生成异常等关键问题,代码结构清晰、模块解耦良好,便于二次开发与规则定制。
1. WebCrack 不是“爆破器”,而是后台弱口令检测的流程化校验工具:它解决的是「已知路径+未知凭据」场景下的快速有效性验证问题
你手上有几十个后台地址(比如/admin/,/login.php,/wp-admin/),但不确定哪些还开着、哪些改了路径、哪些用了默认密码、哪些根本没设防——这时候,WebCrack 不是让你去撞库的黑盒工具,而是一套可配置、可中断、可回溯的弱口令有效性验证流水线。它不依赖暴力穷举,而是聚焦在「常见管理路径 + 高频弱口令组合」的精准投递与响应判别上,核心价值在于:把人工逐个试错的过程标准化、批量化、日志化。适合渗透测试前期摸排、红队资产梳理、运维自查整改等需要快速产出「可验证凭证清单」的场景。它用 Python 实现,无 GUI,纯命令行驱动,所有逻辑透明可调——这意味着你能看清每条请求发了什么、怎么判断成功、失败时为什么跳过。不是玄学,是可控的自动化;不是万能钥匙,而是你手里那把带刻度、能换齿、有回弹反馈的专用检具。
2. WebCrack 的设计逻辑与核心模块拆解:为什么选 HTTP 状态码 + 关键字双判据,而不是单纯看 200 响应
WebCrack 的底层逻辑非常务实:它不追求“猜中所有密码”,而是追求“在有限时间内,对高概率弱口令组合给出明确的 Yes/No 判定”。这决定了它必须绕开传统爆破工具的三个陷阱:一是盲目重试导致被 WAF 拦截;二是仅靠状态码误判(比如登录页本身返回 200,但实际未登录成功);三是忽略服务端重定向或 JSON 接口响应结构差异。因此,它的检测流程被严格划分为三阶段:路径探测 → 凭据投递 → 响应解析。其中最关键的是第三步——响应解析模块采用双判据机制:先检查 HTTP 状态码是否落入预设的成功区间(如 302 跳转到后台首页、200 且响应体含“欢迎”“dashboard”等关键词),再对响应头(如Set-Cookie是否含admin_session)、响应体(正则匹配success:true或<title>后台管理</title>)做二次确认。这种设计让工具在面对 Nginx 403 页面伪装、Spring Security 登录失败仍返回 200、Django 登录成功跳转/accounts/profile/等真实环境时,依然保持高准确率。它不试图理解业务逻辑,只忠实记录“这个账号密码组合,在这个 URL 上,是否触发了系统认定为‘已登录’的行为信号”。
2.1 WebCrack 的请求构造策略:如何避免被识别为扫描器并维持会话上下文
WebCrack 在发起每个登录请求前,会执行一套轻量级的会话初始化流程,而非直接 POST 凭据:
import requests from urllib.parse import urljoin, urlparse def init_session(target_url): session = requests.Session() # 1. 先 GET 目标登录页,获取隐藏字段(如 CSRF token)、Cookie、页面基础结构 try: resp = session.get(target_url, timeout=8, allow_redirects=True) resp.raise_for_status() except Exception as e: return None, f"GET {target_url} failed: {str(e)}" # 2. 提取常见 anti-CSRF 字段(适配主流 CMS) csrf_token = None if 'csrf' in resp.text.lower(): # 简单正则提取 name="csrf_token" value="xxx" import re match = re.search(r'name=[\'"]?csrf[_-]?token[\'"]?\s+value=[\'"]([^\'"]+)[\'"]', resp.text, re.I) if match: csrf_token = match.group(1).strip() # 3. 构建基础 headers,模拟真实浏览器行为 session.headers.update({ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', }) return session, csrf_token这段代码说明了 WebCrack 的真实工作方式:它不是简单地循环 POSTusername=admin&password=123456,而是先完成一次完整的页面加载,从中提取动态参数(如 Django 的csrfmiddlewaretoken、ThinkPHP 的__token__),并将这些参数随后续登录请求一并提交。同时,它复用requests.Session()对象,自动携带 Cookie,确保登录成功后的跳转、重定向、Session ID 维持全部由 Requests 库原生处理。这种做法大幅降低了被 WAF 标记为“扫描器”的概率——因为整个交互流程与真实用户点击登录按钮的行为高度一致。参数说明:timeout=8是经验阈值,太短易漏判(尤其慢速后台),太长拖累整体速度;allow_redirects=True必须开启,否则无法捕获 302 跳转这类关键成功信号;User-Agent固定为常见 Windows 浏览器标识,避免使用python-requests默认 UA 引起怀疑。
2.2 响应判据配置文件rules.yaml的结构与自定义方法
WebCrack 将所有判据逻辑外置为 YAML 配置文件rules.yaml,而非硬编码在 Python 脚本中。这使得你可以针对不同 CMS、不同开发框架快速适配规则,无需修改源码。一个典型规则片段如下:
wordpress: login_path: "/wp-login.php" method: "POST" data: log: "{user}" pwd: "{pass}" wp-submit: "登录" redirect_to: "" testcookie: "1" success_conditions: - status_code: [302] headers: location: "/wp-admin/" - status_code: [200] body_contains: ["wp-admin-bar", "dashboard"] failure_conditions: - status_code: [200] body_contains: ["用户名或密码错误", "incorrect"] dedecms: login_path: "/login.php" method: "POST" data: userid: "{user}" pwd: "{pass}" dopost: "login" success_conditions: - status_code: [302] headers: location: "/index.php" - status_code: [200] body_contains: ["织梦内容管理系统", "后台首页"]该结构清晰表达了三个层次:目标路径与请求方式(method/data)→ 成功判定条件(success_conditions)→ 失败排除条件(failure_conditions)。{user}和{pass}是占位符,运行时由工具自动替换。success_conditions支持多条件 OR 逻辑(任意一条满足即视为成功),每条又支持 AND 子条件(如同时满足状态码为 302 且Location头包含/wp-admin/)。这种设计让你可以轻松添加新规则:比如某客户定制的 ThinkPHP 后台,只需在rules.yaml中新增thinkphp区块,定义其登录表单字段名、跳转路径特征即可。注意:body_contains使用的是子串匹配,非正则,兼顾性能与易用性;若需更精确匹配(如排除误命中“错误”字样),可改用body_regex字段,值为 Python 正则表达式字符串。
2.3 批量任务调度与并发控制:为什么默认只开 3 个线程,以及如何安全提升
WebCrack 默认并发数设为3,这是经过大量实测后确定的平衡点。原因有三:第一,多数后台系统对高频登录请求极其敏感,超过 5 并发极易触发 IP 封禁或验证码拦截;第二,HTTP 请求本身存在网络延迟波动,过高并发反而因等待连接池耗尽而降低吞吐;第三,响应解析(尤其是正则匹配和 HTML 解析)是 CPU 密集型操作,并发过高会导致本地机器卡顿,影响日志输出和实时监控。但如果你明确知道目标服务器抗压能力强(如内网测试环境),或需加速扫描少量高可信度目标,可通过-t参数安全调整:
# 扫描 50 个地址,使用自定义规则,线程数提升至 5 python webcrack.py -u urls.txt -r rules_custom.yaml -t 5 -o result.json # 扫描单个地址,启用调试模式,查看每一步请求详情 python webcrack.py -u "https://test.com/admin/login.php" -t 1 -v --debug参数说明:-t 5将线程数设为 5,此时工具内部会创建 5 个独立requests.Session()实例,每个线程独享会话上下文,避免 Cookie 冲突;-v开启详细日志,显示每个 URL 的请求 URL、方法、数据、响应状态码、耗时;--debug进一步输出原始响应头与截断的响应体(前 500 字符),用于现场分析判据失效原因。重要提示:永远不要在生产环境或未授权目标上将-t设为 10+。我曾在一个模拟项目X中因设为 10 导致目标 Nginx 触发limit_req限流,后续所有请求均返回 503,被迫中断并手动清理日志——从那以后,我每次调高并发前,必先用-t 1对单个目标跑通全流程,确认无拦截后再逐步加压。
3. WebCrack 的标准使用流程:从准备地址列表到生成可交付报告的完整闭环
使用 WebCrack 不是丢个 URL 就完事,而是一个需要前置准备、过程监控、结果验证的闭环。整个流程分为四步:地址整理 → 规则适配 → 执行扫描 → 结果分析。每一步都对应具体文件、命令和检查点,缺一不可。下面以某高校实验室的渗透测试实训为例,还原一次真实可用的完整操作。
3.1 地址列表urls.txt的格式规范与常见错误修正
urls.txt是 WebCrack 的输入起点,其格式直接决定扫描范围是否准确。正确格式要求:每行一个完整 URL(含协议、域名、路径),末尾无空格,无注释,不包含参数(如?id=1),路径以/结尾或不以/结尾均可,工具会自动补全。示例如下:
https://cms.example.com/admin/ http://192.168.1.100/login.php https://blog.test.org/wp-login.php https://intranet.company.net:8080/manage常见错误及修正方法:
- 错误1:混入 HTTP 参数
https://site.com/login.php?next=/admin→ 应删去?next=/admin,保留https://site.com/login.php。原因:WebCrack 自动构造 POST 数据,附加参数可能干扰登录逻辑。 - 错误2:路径缺失或错误
https://site.com(只有根域名)→ 工具会尝试/admin/,/login.php等默认路径,但成功率低,应明确指定。https://site.com/admin(缺少结尾/)→ 工具内部会自动补/,但部分 IIS 服务器对路径大小写敏感,建议统一写为https://site.com/admin/。 - 错误3:包含空行或中文字符
用dos2unix urls.txt清理换行符,用iconv -f GBK -t UTF-8 urls.txt > urls_utf8.txt转码,避免解析失败。
提示:若地址来自资产测绘工具(如 Amass、Subfinder),导出后务必用
awk -F',' '{print $1}' assets.csv | sort -u > urls.txt提取唯一域名列,并人工核对前 10 行路径是否合理。自动化不能替代人工判断。
3.2 执行扫描命令详解与各参数的实际作用
启动扫描的核心命令结构如下:
python webcrack.py [OPTIONS]最常用组合及其含义:
| 参数 | 示例 | 作用说明 |
|---|---|---|
-u | -u urls.txt | 指定地址列表文件路径。必填项。支持绝对路径或相对路径。 |
-r | -r rules.yaml | 指定判据规则文件。若省略,则使用内置默认规则(覆盖 WordPress、DedeCMS、Discuz 等主流系统)。建议始终显式指定,便于版本控制。 |
-w | -w passwords.txt | 指定密码字典文件。默认使用内置default_pass.txt(含 128 个高频弱口令)。可替换为自定义字典,如top1000.txt。 |
-U | -U users.txt | 指定用户名字典文件。默认为admin单用户。若目标为多租户系统,可提供users.txt(每行一个用户名)。 |
-t | -t 3 | 设置并发线程数。默认为 3,推荐范围 1~5。 |
-o | -o report.json | 指定输出文件路径。支持.json(结构化数据)和.txt(纯文本摘要)两种格式。 |
-v | -v | 启用详细日志模式,显示每个 URL 的扫描进度、状态码、耗时。调试必备。 |
--timeout | --timeout 10 | 设置单次请求超时秒数。默认 8 秒。对慢速后台可适当调高,但不宜超过 15。 |
一个生产级命令示例:
python webcrack.py \ -u ./targets/edu_admin_urls.txt \ -r ./rules/edu_cms_rules.yaml \ -w ./dicts/edu_weak_pass.txt \ -U ./dicts/edu_admin_users.txt \ -t 4 \ -o ./output/edu_scan_20240520.json \ -v该命令表示:扫描教育类后台地址,使用专为该校 CMS 定制的判据规则,密码字典限定为该校历史泄露的弱口令集合,用户名仅测试admin/root/teacher三个高危账号,4 线程并发,结果存为 JSON,全程开启详细日志。注意:所有路径均使用相对路径,便于项目目录迁移;文件名含日期,方便归档追溯。
3.3 输出结果report.json的结构解析与人工复核要点
WebCrack 的 JSON 输出并非简单列表,而是分层嵌套的结构化数据,包含元信息、任务摘要、详细结果三大部分。一个典型片段如下:
{ "scan_info": { "start_time": "2024-05-20T09:15:22Z", "end_time": "2024-05-20T09:28:47Z", "total_targets": 47, "successful_logins": 3, "timeout_count": 2, "error_count": 1 }, "results": [ { "url": "https://cms.school.edu.cn/admin/", "status": "success", "user": "admin", "password": "123456", "rule_matched": "dedecms", "response_code": 302, "redirect_location": "/index.php", "elapsed": 1.24 }, { "url": "https://blog.school.edu.cn/wp-login.php", "status": "failed", "user": "admin", "password": "123456", "rule_matched": "wordpress", "response_code": 200, "body_snippet": "用户名或密码错误。", "elapsed": 0.87 } ] }人工复核时,重点关注以下三点:
status为success的条目,必须二次验证:复制url+user+password,手动在浏览器中登录,确认是否真能进入后台。曾有案例:某 Discuz 后台因插件 Bug,登录成功后跳转/misc.php?mod=patch(补丁页),而 WebCrack 规则中未涵盖此路径,导致漏报;反之,也有因body_snippet包含“欢迎”二字但实际是登录页顶部 banner,造成误报。timeout_count和error_count较高时,检查网络与目标状态:若timeout_count> 总数 10%,说明目标响应极慢或网络不稳定,应降低-t并增加--timeout;若error_count非零,查看日志中具体错误(如Connection refused表示端口关闭,SSL: CERTIFICATE_VERIFY_FAILED表示证书异常)。rule_matched字段是否合理:若url明显是 WordPress,但rule_matched为dedecms,说明rules.yaml中路径匹配逻辑有误,需检查login_path正则或顺序。
注意:JSON 文件本身不可直接作为交付报告。需用 Python 脚本或 Excel 将其转换为带高亮、分类、风险等级的 Word/PDF 报告。我一般用
pandas读取 JSON,筛选status=="success"的行,按rule_matched分组统计,再导出为 Markdown 表格——这样客户能一眼看清“WordPress 类型共发现 2 个弱口令后台”。
4. 避坑指南:WebCrack 使用中 4 类高频翻车现场与血泪解决方案
WebCrack 看似简单,但在真实环境中,新手常因忽略细节而反复失败。以下是我在多个模拟项目X中踩过的坑,按发生频率排序,每条均包含现象、根因、可立即执行的解决方案。
4.1 现象:所有目标均显示failed,日志中大量Connection refused或Timeout
原因:目标服务器未开放 HTTP/HTTPS 端口,或防火墙拦截了扫描 IP,或urls.txt中 URL 协议写错(如该站只支持 HTTPS,却写了http://)。
解决:
- 用
curl -I http://target.com/login.php和curl -I https://target.com/login.php分别测试,确认可用协议; - 用
nmap -p 80,443,8080 target.com检查端口开放状态; - 若确认端口开放但
curl也超时,检查本地网络是否走代理(WebCrack 默认不走系统代理),可在代码中强制禁用:session.trust_env = False。
4.2 现象:部分目标返回success,但手动登录失败;或登录成功后无法访问其他页面
原因:WebCrack 判据过于宽松,匹配了登录页自身的内容(如<title>登录</title>),或未正确处理 Session Cookie 传递。
解决:
- 启用
--debug查看原始响应体,确认body_snippet是否真包含后台特征; - 检查
rules.yaml中该目标的success_conditions,将body_contains替换为更精确的body_regex,例如body_regex: "wp-admin.*dashboard"; - 在
init_session()函数中,于 POST 后添加session.cookies.set('security_level', 'low')等手动 Cookie 注入(适用于某些 PHP 系统)。
4.3 现象:扫描中途卡住,CPU 占用 100%,程序无响应
原因:urls.txt中存在畸形 URL(如https://后无域名)、DNS 解析失败、或某目标返回超大响应体(如 100MB 日志文件)导致内存溢出。
解决:
- 用
grep -E '^[a-zA-Z][a-zA-Z0-9+.-]*://' urls.txt | head -20快速检查前 20 行 URL 格式; - 在
webcrack.py主循环中,为每个session.get()添加stream=True参数,并设置resp.raw.read(1024*1024)限制读取大小; - 重启扫描时,用
-u urls.txt --skip 15跳过前 15 个已扫目标,定位卡点。
4.4 现象:使用-U users.txt后,扫描速度骤降,且大量failed
原因:用户名字典过大(如 1000 行),而 WebCrack 对每个 URL 都要遍历全部用户名 × 全部密码,组合爆炸。默认users.txt仅 3 行,若放 100 行,总请求数翻 33 倍。
解决:
- 严格控制
users.txt长度,优先admin/root/administrator/test四个; - 若必须测多用户,改用
-U+-w组合时,务必配合-t 1降低并发,避免被封; - 更优方案:先用
-U default_users.txt(小字典)快速筛出存活后台,再对success的 URL 单独用大字典重扫。
5. 进阶技巧:如何用 WebCrack 的输出反向优化你的规则库与字典质量
WebCrack 最大的价值,不仅在于发现弱口令,更在于它是一面镜子——照出你当前规则库的盲区、字典的陈旧程度、以及目标系统的特殊性。我习惯在每次扫描结束后,立刻执行三项分析,将原始输出转化为持续改进的燃料。
5.1 从report.json中提取“失败但疑似成功”的响应特征,反哺规则库
所谓“失败但疑似成功”,指status为failed,但response_code是 302 或 200,且body_snippet中含有后台关键词(如admin,dashboard,control)。这类样本极具价值,说明现有规则未能覆盖该目标的真实成功特征。操作步骤如下:
用 jq 提取所有
failed且response_code为 302 的条目:jq '.results[] | select(.status == "failed" and .response_code == 302)' report.json > candidates.json人工检查
candidates.json中的redirect_location字段,若出现新路径(如/console/,/manage/home),则在rules.yaml中新增对应规则区块;若
body_snippet中反复出现某字符串(如System Admin Panel),将其加入该规则的body_contains列表。
我在某跨平台系统项目中,通过此法发现了其自研后台的两个隐藏跳转路径,补充进规则后,同类目标检出率从 40% 提升至 92%。从那以后,我每次拿到新
report.json,必先跑一遍jq提取候选,再花 10 分钟更新规则——这比重新写脚本快得多。
5.2 构建动态字典:基于历史成功记录生成个性化弱口令集
WebCrack 的report.json中,所有status=="success"的password字段,就是最真实的弱口令样本。将它们聚类分析,可生成远超通用字典的精准集。我用以下 Python 脚本自动化此过程:
import json from collections import Counter def build_dynamic_dict(report_path, output_path="dynamic_pass.txt"): with open(report_path) as f: data = json.load(f) passwords = [] for r in data["results"]: if r["status"] == "success": passwords.append(r["password"]) # 统计频次,取 Top 50,去重后写入文件 counter = Counter(passwords) top50 = [pwd for pwd, _ in counter.most_common(50)] with open(output_path, "w") as f: for pwd in sorted(set(top50)): # 去重并排序 f.write(pwd.strip() + "\n") print(f"Generated {len(top50)} unique passwords to {output_path}") # 使用示例 build_dynamic_dict("./output/last_scan.json")该脚本输出的dynamic_pass.txt,天然包含目标环境中真实存在的弱口令(如School2024!、Admin@123),下次扫描时用-w dynamic_pass.txt,效率提升显著。更重要的是,它揭示了组织的安全水位:若 Top 10 全是123456/password,说明基础意识薄弱;若全是CompanyName+Year!模式,则反映密码策略存在可预测漏洞。
5.3 响应体指纹库:为未知 CMS 快速生成临时规则
当report.json中大量目标rule_matched为空或为default,说明它们不属于内置规则覆盖范围。此时,可快速构建轻量指纹库。方法是:抽取所有failed条目的body_snippet,用grep -oE '<title>[^<]{1,50}'提取标题,再用sort | uniq -c | sort -nr统计高频标题。例如得到:
12 <title>XX教务管理系统</title> 8 <title>智慧校园后台</title> 5 <title>NetCore Admin v2.1</title>则可立即在rules.yaml中追加:
xx_jiaowu: login_path: "/login" method: "POST" data: username: "{user}" password: "{pass}" success_conditions: - status_code: [302] headers: location: "/main" - status_code: [200] body_contains: ["教务管理系统", "课程安排"]这套流程让我在 20 分钟内为某定制化教务系统生成可用规则,扫描效率从 0 提升至 100%。希望帮到你。
本文还有配套的精品资源,点击获取