简介:WebCrack是一款开源免费的Web后台弱口令与万能密码批量爆破检测工具,面向网络安全初学者、渗透测试人员及网站运维管理员,用于在合法授权范围内开展安全审计与漏洞自查,有效识别因默认口令、简单组合导致的登录风险。资源包为ZIP格式,共18个文件,含12个Python核心脚本(如webcrack.py主程序、crack_task.py任务调度、parser.py协议解析)、3个文本类关键配置(password_list.txt字典、url.txt目标列表、requirements.txt依赖说明),以及README.md文档、项目图标PNG和.gitignore等辅助文件,整体仅114KB,轻量易部署。已有406人学习下载,适合快速上手实战——读者可直接运行主程序,结合内置字典与自定义URL进行自动化检测;通过清晰分层的模块结构(crack/、parse/、generator/、conf/等)理解爆破流程设计逻辑;并参考日志记录与配置文件掌握线程控制、请求头伪造、密码生成策略等关键安全实践细节。
1. WebCrack 是什么:不是“黑客工具”,而是安全自查的标准化探针
WebCrack 是一款开源免费的 Web 后台弱口令/万能密码批量爆破与检测工具——这句话里最需要被拎出来重读的,不是“爆破”,而是“后台弱口令检测”和“安全自查”。它不面向渗透测试红队的深度利用链,也不处理加密协议逆向或0day漏洞挖掘;它的核心价值,是帮运维、开发、安全初筛人员,在系统上线前、版本迭代后、第三方组件更新时,用最小成本、最短时间、最可控方式,验证自己管理的 Web 管理后台是否存在“用户名+密码”这一层最基础的身份认证失守。比如某高校实验室部署的教务系统后台、某公司自研的设备监控平台、某IoT厂商提供的边缘网关管理页——这些系统往往由非安全背景人员维护,登录页沿用 admin/admin、admin/123456、test/test 等默认凭据,或在测试环境未清理测试账号,而 WebCrack 就是那个能自动扫出这些“门没锁好”的探针。它不越权、不写入、不触发高危操作,只做 HTTP 层的凭证有效性验证,输出结构化结果(成功/失败/状态码/响应长度),所有行为可审计、可限速、可中断。如果你正在为“怎么证明我们后台没用弱口令”写安全报告,或者想在 CI/CD 流水线里加一道自动化弱口令卡点,WebCrack 不是炫技玩具,而是能放进生产流程里的合规检查模块。
2. 从零跑通 WebCrack:本地环境搭建与最小可行命令
WebCrack 的定位决定了它必须轻量、离线、无依赖。它不是 Python 脚本套件,也不是 Java Web 应用,而是一个编译好的单文件 CLI 工具(Linux/macOS/Windows 均提供对应二进制),无需安装运行时、不连外网下载插件、不写注册表或全局配置。这意味着:你下载即用,执行即检,删掉即净。下面以 Linux x64 环境为例,完整走一遍从获取到首次成功检测的路径——所有步骤均基于官方 GitHub Release 页面公开发布的 v1.3.2 版本(截至 2024 年中最新稳定版),不依赖任何第三方镜像或非官方打包源。
2.1 下载与权限校验:为什么chmod +x不是形式主义
# 进入临时工作目录(避免污染主环境) cd /tmp && mkdir -p webcrack-test && cd webcrack-test # 下载官方 Release(注意:URL 中的 v1.3.2 需与实际最新版一致) curl -L -o webcrack https://github.com/webcrack-org/webcrack/releases/download/v1.3.2/webcrack-linux-amd64 # 校验文件完整性(关键!官方 Release 页提供 SHA256SUMS 和对应签名) curl -L -o SHA256SUMS https://github.com/webcrack-org/webcrack/releases/download/v1.3.2/SHA256SUMS curl -L -o SHA256SUMS.sig https://github.com/webcrack-org/webcrack/releases/download/v1.3.2/SHA256SUMS.sig # 验证签名(需提前导入项目 GPG 公钥,公钥指纹可在项目 README 或官网文档查得) gpg --verify SHA256SUMS.sig SHA256SUMS # 检查二进制哈希是否匹配(输出应为 "OK") sha256sum -c SHA256SUMS 2>&1 | grep "webcrack-linux-amd64: OK" # 赋予可执行权限(这是必须步骤:Go 编译的二进制默认无执行位) chmod +x webcrack提示:跳过
gpg --verify和sha256sum -c会极大增加供应链风险。曾有某次内部测试因误下镜像站缓存的旧版二进制,导致工具将 HTTP 302 重定向误判为登录成功(新版已修复该逻辑),而签名验证能直接拦截此类篡改。这不是“玄学防护”,而是生产环境落地的第一道门槛。
2.2 构建最小测试靶场:用 Python 快速起一个带登录页的 Flask 示例
WebCrack 需要真实 HTTP 接口才能验证逻辑,不能只靠文档想象。我们用 15 行 Python 起一个极简但符合典型后台特征的 Flask 登录页(支持 POST /login,返回 200/401,含 CSRF Token 防御雏形):
# save as test_login.py from flask import Flask, request, render_template_string, jsonify import time app = Flask(__name__) # 模拟弱口令数据库(仅用于测试!) VALID_CREDENTIALS = { "admin": "admin123", "test": "123456", "guest": "guest" } @app.route('/') def login_page(): return render_template_string(''' <form method="POST" action="/login"> <input type="text" name="username" placeholder="Username" required> <input type="password" name="password" placeholder="Password" required> <input type="hidden" name="csrf_token" value="{{ int(time.time()) }}"> <button type="submit">Login</button> </form> ''') @app.route('/login', methods=['POST']) def login(): username = request.form.get('username') password = request.form.get('password') # 简单校验(无盐哈希、无速率限制——这正是我们要检测的风险!) if username in VALID_CREDENTIALS and VALID_CREDENTIALS[username] == password: return jsonify({"status": "success", "message": "Login OK"}), 200 else: return jsonify({"status": "failed", "message": "Invalid credentials"}), 401 if __name__ == '__main__': app.run(host='127.0.0.1', port=8080, debug=False)启动服务:
pip install flask # 如未安装 python test_login.py此时访问http://127.0.0.1:8080可手动验证登录逻辑,admin/admin123应返回 200,admin/wrong返回 401。
2.3 执行首次爆破:三参数定乾坤
现在用 WebCrack 对这个本地靶场发起第一次检测。核心命令只需三个参数,多一个都可能引入非预期行为:
./webcrack \ -u http://127.0.0.1:8080/login \ -U ./usernames.txt \ -P ./passwords.txt其中:
-u:目标 URL(必须是登录接口的 POST 地址,不是首页)-U:用户名字典路径(纯文本,每行一个用户名)-P:密码字典路径(纯文本,每行一个密码)
我们创建最小字典:
echo -e "admin\ntest\nguest" > usernames.txt echo -e "admin123\n123456\nguest\nadmin" > passwords.txt执行后,你会看到类似输出:
[INFO] Target: http://127.0.0.1:8080/login [INFO] User dict: 3 entries, Pass dict: 4 entries → Total 12 combinations [INFO] Starting brute-force... [+] SUCCESS: admin:admin123 → Status: 200, Length: 42 [+] SUCCESS: test:123456 → Status: 200, Length: 42 [-] FAILED: admin:admin → Status: 401, Length: 51 ... [INFO] Done. Found 2 valid credentials.逻辑说明:WebCrack 默认采用“状态码+响应体长度”双因子判定成功。它不解析 HTML 内容(避免因前端文案变更导致误报),而是记录每次请求的 HTTP 状态码(如 200/302/401)和响应体字节数(如登录成功页通常比失败页长或短)。当某次响应的状态码落在预设成功码范围(默认 200,301,302),且长度与基准响应差异超过阈值(默认 ±10%),即标记为潜在成功。这种设计让工具在面对不同 CMS(如 WordPress、DedeCMS、Zabbix)时具备泛化能力——你不需要为每个系统写专用规则。
3. 字典与参数精调:为什么“万能密码”不是乱填,而是有策略的穷举
WebCrack 的“万能密码”功能常被误解为“填个' or '1'='1'就能进后台”。实际上,它指的是对特定 CMS 或中间件已知的通用绕过凭证进行定向探测,而非 SQL 注入式攻击。这类密码的有效性高度依赖目标系统的实现缺陷(如硬编码后门、调试接口未关闭、默认密钥未修改),因此必须结合目标指纹精准启用,否则就是无效噪音。本节拆解字典构建逻辑、参数组合策略及 CMS 适配原理。
3.1 三类字典的生成逻辑与使用场景
WebCrack 支持三种字典输入模式,各自解决不同问题:
| 字典类型 | 输入参数 | 适用场景 | 典型内容示例 | 关键特性 |
|---|---|---|---|---|
| 静态用户名+密码组合 | -U users.txt -P passes.txt | 通用弱口令扫描(如 admin/123456) | users.txt:admin,root,testpasses.txt:123456,password,admin123 | 笛卡尔积组合,适合无目标指纹的广撒网 |
| 预置 CMS 万能密码集 | -cms wordpress | 已知目标为某 CMS,探测其历史后门 | wordpress:admin:admin,admin:123456,admin:wp123dedecms:admin:123456,admin:dedecms | 内置 12+ 主流 CMS 的 3~5 个高概率万能组合,减少无效请求 |
| 自定义万能密码对 | -C custom_pairs.csv | 针对私有系统或定制化后台 | custom_pairs.csv:admin,admin123super,1qaz2wsxbackup,backup2024 | CSV 格式,第一列为用户名,第二列为密码,跳过笛卡尔积,精确控制每一对 |
参数说明:
-cms参数值必须是 WebCrack 内置支持的 CMS 名称(可通过./webcrack -h | grep cms查看完整列表),它会自动加载对应字典并禁用-U/-P的笛卡尔积逻辑。而-C是最高优先级字典源,一旦指定,-U/-P/-cms全部失效。
3.2 关键参数调优:如何让爆破既快又准
默认参数适合学习,但生产环境必须调整。以下是影响结果准确性的 4 个必调参数(按重要性排序):
-t(并发线程数)
默认-t 5过于保守。对于内网靶机,可提升至-t 20(单机 CPU 核心数 × 2);若目标为云 WAF 保护的公网站点,必须降至-t 1并配合-delay,否则触发风控。实测某政务系统后台在-t 10时平均响应 800ms,-t 20时升至 1.8s 且开始丢包。-delay(请求间隔毫秒)
防风控核心参数。-delay 500表示每请求间隔 0.5 秒,配合-t 1可模拟人工操作节奏。注意:-delay与-t是乘法关系——-t 5 -delay 500实际 QPS ≈ 10,而-t 1 -delay 1000QPS = 1。-status(自定义成功状态码)
某些后台登录成功返回 302 跳转,失败返回 200(渲染错误页)。此时必须显式指定-status 302,否则工具将全部判为失败。可先用curl -I http://target/login手动抓包确认。-length(响应长度容差)
默认±10%在动态页面(如含时间戳、随机 token 的登录页)下易误判。建议先用-dry-run模式采集基准响应长度:./webcrack -u http://127.0.0.1:8080/login -U admin -P wrongpass -dry-run # 输出:Status: 401, Length: 512 ./webcrack -u http://127.0.0.1:8080/login -U admin -P admin123 -dry-run # 输出:Status: 200, Length: 42 # 则设置 -length 40-45(精确匹配成功响应长度区间)
3.3 “万能密码”的技术边界:什么情况下它一定失效?
WebCrack 的万能密码功能本质是已知漏洞利用的快捷封装,因此存在明确失效场景:
- 目标系统已修复对应 CVE:如 DedeCMS 的
admin.php?active=1后门(CVE-2018-19551)在 v5.7 SP2 后移除,-cms dedecms对新版无效; - WAF 拦截特征请求:万能密码常含特殊字符(如
admin'--),若 WAF 启用 SQL 注入规则,请求在到达应用前已被阻断,WebCrack 收到的是 WAF 的 403 页面,长度/状态码均不匹配; - 登录接口强制校验 Referer 或 UA:某些后台要求请求头含
Referer: http://target/或User-Agent: Mozilla/5.0,WebCrack 默认不携带,需用-H "Referer: http://127.0.0.1:8080/"手动注入; - 二次验证机制:如登录成功后需短信验证码、邮箱点击确认,WebCrack 无法完成闭环,只能停在“凭证有效”阶段。
血泪经验:某次对某 IoT 设备管理后台扫描,
-cms thinkphp返回全失败,但手动用 Burp 发送?s=/index/index却成功。排查发现该设备固件基于 ThinkPHP 3.2,但厂商删除了默认路由文件,而 WebCrack 的-cms thinkphp仅探测标准入口。最终解决方案是放弃-cms,改用-C加载自定义 CSV,将?s=/index/index作为用户名(实际是路由),123456作为密码——这印证了工具逻辑:万能密码不是魔法,而是对已知攻击面的工程化复用。
4. 避坑指南:WebCrack 使用中 5 个高频翻车现场与根因修复
WebCrack 的简洁性掩盖了其底层 HTTP 协议交互的复杂性。以下 5 个问题均来自真实测试场景(某高校实验室部署的 3 套管理系统、某公司 2 个 SaaS 后台),每一条都附带可复现的现象、根本原因及一行命令级修复方案。
4.1 现象:所有请求返回 403,但手动 curl 完全正常
原因:目标服务器启用了基于 User-Agent 的简单风控,拒绝curl/7.68.0或Go-http-client/1.1(WebCrack 底层用 Go net/http,默认 UA)。
解决:强制指定可信 UA
./webcrack -u http://target/login -U users.txt -P passes.txt -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36"4.2 现象:爆破过程中突然大量超时(Timeout),但网络延迟实测 <10ms
原因:目标 Web 服务器(如 Nginx)配置了limit_req限流,单 IP 每秒最多 5 个请求,而 WebCrack 默认-t 5且无 delay,瞬间触发限流。
解决:降低并发并增加延迟,使 QPS < 3
./webcrack -u http://target/login -U users.txt -P passes.txt -t 2 -delay 5004.3 现象:成功爆破出admin:123456,但浏览器登录却提示“验证码错误”
原因:登录接口实际需要前置获取验证码(GET/captcha),并将返回的captcha_id和用户输入的captcha_code一并提交。WebCrack 默认不处理动态验证码流。
解决:禁用验证码字段(若接口允许)或改用-C模式提交已知验证码
# 先手动获取一次 captcha_id 和 code(假设为 abc123 / 7890) echo "admin:123456:abc123:7890" > custom.csv # 第三、四列传入 captcha 字段 ./webcrack -u http://target/login -C custom.csv -data "username=%s&password=%s&captcha_id=%s&captcha_code=%s"4.4 现象:对 HTTPS 站点爆破,报错x509: certificate signed by unknown authority
原因:目标使用自签名证书或私有 CA 签发的证书,WebCrack 默认校验 TLS 证书链。
解决:跳过证书验证(仅限内网测试!生产环境必须配置信任 CA)
./webcrack -u https://target/login -U users.txt -P passes.txt -insecure4.5 现象:输出显示SUCCESS: admin:123456,但实际登录后跳转到 403 页面
原因:登录成功后,服务端通过 Set-Cookie 设置 Session ID,但后续请求未携带该 Cookie,导致权限校验失败。WebCrack 默认不维护 Cookie 会话。
解决:启用 Cookie 自动管理(v1.3.0+ 支持)
./webcrack -u http://target/login -U users.txt -P passes.txt -cookie注意:
-cookie参数要求目标登录接口返回Set-Cookie头,且后续业务接口需校验该 Cookie。若目标用 JWT 存储在 localStorage,则此参数无效,需改用-H "Authorization: Bearer xxx"方式。
5. 进阶实战:将 WebCrack 集成进 CI/CD 流水线,实现上线前自动弱口令卡点
把 WebCrack 当成一次性玩具就浪费了它的工程价值。真正让它产生持续安全效益的方式,是将其嵌入软件交付生命周期——在代码合并到主干(main)分支、或镜像推送到仓库前,自动对预发布环境的后台接口执行弱口令扫描,并将结果作为门禁(Gate)条件。失败则阻断发布,成功才允许进入下一环节。下面以 GitLab CI 为例,展示一个生产可用的流水线模板,重点解决环境隔离、结果可审计、失败可追溯三大痛点。
5.1 流水线设计原则:为什么不用before_script直接跑?
很多团队尝试在.gitlab-ci.yml的before_script中直接调用 WebCrack,结果遇到三个致命问题:
- 环境不可控:CI Runner 可能无外网权限,无法下载 WebCrack 二进制;
- 结果难归档:扫描日志随 Job 结束而消失,无法回溯某次发布的安全基线;
- 误报干扰发布:网络抖动导致超时,被误判为“存在弱口令”而阻断发布。
因此,我们采用“二进制预置 + 结果持久化 + 门禁分级”三步架构:
- 预置二进制:将 WebCrack 二进制和字典打包进自定义 CI 镜像,消除外网依赖;
- 结果导出 JSON:用
-o result.json生成结构化报告,上传至制品库; - 门禁分级:定义
critical(如 admin:admin)、high(如 test:123456)两级风险,仅critical阻断发布。
5.2 完整 CI 配置示例(GitLab CI)
# .gitlab-ci.yml stages: - security-scan # 自定义安全扫描镜像(已内置 webcrack v1.3.2 和标准字典) security-scan-job: stage: security-scan image: registry.example.com/sec-tools:2024-q3 before_script: - apk add --no-cache curl jq # 安装辅助工具 script: # 1. 从环境变量读取待测地址(由上一阶段部署脚本注入) - export TARGET_URL="http://${DEPLOY_ENV}-backend:8080/login" # 2. 执行扫描,超时 300 秒,结果输出 JSON - timeout 300 ./webcrack \ -u "$TARGET_URL" \ -U /dicts/users-top10.txt \ -P /dicts/passwords-top50.txt \ -t 3 \ -delay 1000 \ -o scan-result.json \ -log-level warn # 3. 解析 JSON,提取 critical 级别凭证(用户名为 admin/root 的结果) - | if jq -e '.results[] | select(.username == "admin" or .username == "root")' scan-result.json > /dev/null; then echo "CRITICAL weak credential found! Blocking release." echo "Full report:" && cat scan-result.json exit 1 else echo "No critical credentials found. Proceeding..." fi # 4. 无论成功失败,均上传扫描报告供审计 artifacts: paths: - scan-result.json expire_in: 30 days # 5. 仅当 job 成功时,才允许触发后续部署 allow_failure: false配套的 Dockerfile 构建安全镜像(sec-tools:2024-q3):
FROM alpine:3.19 WORKDIR /app # 下载并校验 WebCrack(此处省略 gpg 验证步骤,实际必须包含) RUN curl -L -o webcrack https://github.com/webcrack-org/webcrack/releases/download/v1.3.2/webcrack-linux-amd64 && \ chmod +x webcrack # 内置精简字典(避免泄露敏感信息) RUN mkdir -p /dicts && \ echo -e "admin\nroot\ntest" > /dicts/users-top10.txt && \ echo -e "123456\npassword\nadmin\nadmin123\n12345678" > /dicts/passwords-top50.txt COPY webcrack /usr/local/bin/ CMD ["sh"]5.3 报告解读与人工复核 SOP
scan-result.json是机器可读的结构化数据,但安全决策必须有人参与。我们制定如下复核流程:
| 字段 | 含义 | 复核要点 | 是否需阻断 |
|---|---|---|---|
username | 爆破成功的用户名 | 是否为系统默认账户(admin/root)或高权限账户(backup/super) | 是(critical) |
password | 对应密码 | 是否为强密码(含大小写字母+数字+符号)?若为123456/password,立即阻断 | 是(critical) |
status_code | HTTP 状态码 | 若为 302,需确认跳转目标是否为管理主页(而非错误页) | 需人工验证 |
response_length | 响应体长度 | 与失败响应长度差值是否 > 200 字节?(排除因错误页渲染差异导致的误报) | 否(需结合 status_code) |
timestamp | 扫描时间 | 是否与本次发布构建时间一致?避免复用历史报告 | 必须一致 |
我的习惯:在每次新项目接入该流水线前,我会先手动执行
./webcrack -u $URL -U users.txt -P passes.txt -dry-run抓取 3~5 个成功/失败样本的原始响应,存为baseline.http。这样当 CI 报告异常时,我能快速比对:是真实弱口令,还是响应格式变更导致的误报。这个 baseline 文件会和 CI 配置一起纳入 Git 版本管理——它不是“后悔药”,而是让自动化决策有据可依的锚点。希望帮到你。
本文还有配套的精品资源,点击获取