
简介WebCrack是一款采用Python编写的Web后台弱口令与万能密码批量检测工具主要面向安全测试人员、渗透测试学习者和运维工程师只需将后台登录地址导入工具即可自动完成弱口令、万能密码等常见登录缺陷的批量探测替代人工反复尝试显著提升检测效率与覆盖率。压缩包内含十三个文件核心代码为八个Python脚本分别承担配置管理、字典生成、多线程任务调度、响应解析、日志记录等职责另有文本说明文档、示意图片与使用说明文档整体大小仅113KB轻量易部署。工具在持续迭代中优化了表单识别与核心判断逻辑具备多重校验机制以降低误报支持随机用户代理、随机X-Forwarded-For与随机客户端IP能基于域名动态生成字典也可自定义爆破规则并对万能密码漏洞做专项检测。已有1601人下载学习适合希望深入理解弱口令检测原理、练习Python安全工具开发及开展内网安全评估的读者。1. WebCrack 是什么一张后台地址列表能省掉一整晚的重复手工弱口令测试接到一个授权范围内的安全测试项目目标清单里躺着一百多个后台管理地址从老牌 OA 到自研系统都有。逐个打开、填账号密码、点登录、看结果这套动作重复一百遍累不说还容易漏。WebCrack 这类 web 后台弱口令批量检测工具就是来终结这个过程的把后台地址导入工具它自动识别登录表单批量重放弱口令字典把命中结果按 URL 整理成报告。它解决的不是高深漏洞挖掘而是弱口令检测里最枯燥也最容易出错的重复劳动。适合接手这类任务的渗透测试工程师、做内部系统巡检的运维与安全同学以及需要在交付报告里给出弱口令证据的测评人员。工具做得再顺也只解决了“批量发请求”这一层真正决定结果价值的是接下来要讲的登录页识别、判定策略和人工复核流程。2. 弱口令检测的原理登录页识别、口令重放与结果判定是怎样串起来的2.1 先判断目标是不是登录页指纹识别与动态渲染问题输入是后台地址清单第一步是确认“这个地址是不是一个可以测弱口令的登录页”。常见做法是发一个 GET 请求拿到 HTML 后做三类判断命中两类才判定为登录页判断维度匹配特征说明URL 关键词login、signin、admin、manage、auth地址本身带倾向性命中即加分HTML 表单特征input typepassword、form的 action有密码框是登录页的硬指标页面文本特征用户名、密码、登录、验证码、忘记密码针对纯前端渲染页面的补充判断这个环节决定整个任务的覆盖率因为后续所有口令重放只在被识别为登录页的地址上执行。如果你导入的地址清单一半是后台首页、一半是静态页面工具会把不是登录页的地址直接跳过跑完才知道覆盖范围其实缩水了。这里有个常见的翻车点现代系统大量使用 Vue、React 单页应用HTML 里只有 div 没有表单密码框是 JavaScript 渲染出来的静态抓取拿不到任何 input 元素。第一次跑这种目标结果就是“全部跳过、零成交”。碰这种站点要么打开工具的无头浏览器渲染模式要么在导入地址之前人工把这类站点的登录接口地址一起标进去。清单质量在很大程度上决定了跑出来的结果质量这个结论在弱口令检测方向几乎是通用的。2.2 “万能密码”的本质与弱口令字典的组织方式标题里“万能密码”这个词容易让人误解成某种后门。实际在 WebCrack 这类工具里它指预置口令集中那一类“几乎不用调优就普遍命中”的口令典型包括三类厂商默认口令、空口令与通用口令、高频弱口令。厂商默认口令是最有价值的一类。很多老系统交付时就是 admin/123456、admin/admin888、system/system运维接手之后根本没改。空口令和通用口令数量少但命中率稳定像是 guest 账号空密码、test/test 这类。高频弱口令则是 admin/1、admin/123456、admin123 这种出现频率极高的组合。这些口令被组织成一个专门针对“后台登录页”的小字典排在普通弱口令字典之前优先跑。它背后的逻辑不是暴力破解而是对“系统默认口令保留习惯”的把握。传统暴力破解拼算力弱口令检测拼的是口令对不对路。与其拿一整套百万级字典全量重放不如先用几十条高概率口令把所有地址过一遍把能进的先拿下来。这也是 WebCrack 这类工具在命名上强调“万能密码”的原因——本质上是一套高价值预置口令集而不是什么神秘后门。字典的组织方式直接影响检测效率。我一般会按目标类型拆成几份通用后台一份、OA 系统一份、路由器与网络设备一份、CMS 系统一份。拆开之后每条口令都对应一类真实场景而不是把所有口令混在一起。网上找一份“弱口令字典下载”页面很容易难的是自己加工去掉因为编码问题出现的乱码口令、去掉重复项、按目标类型重新分堆。这一步骤做完后面批量检测的命中率差别会非常明显。2.3 结果判定的三种策略状态码、跳转与页面特征口令重放之后判定“这次登录到底成没成功”是整个工具最容易误报的地方。HTTP 200 不等于登录成功因为很多后台登录失败时也返回 200只是在页面里提示“用户名或密码错误”。按可靠度从低到高排常见策略是下面三种。判定策略判定依据可靠性开销状态码粗判登录请求返回 200 且不含错误关键词低误报高最小跳转细判登录成功后 302 到 index/main失败停在当前页中较小登录后二次确认登录成功后再请求一个只有登录态可见的页面高接近零误报多一到两次请求第三种策略我一般必开识别登录页的同时把登录成功后的跳转目标一并解析出来口令重放完成后拿命中结果去请求这个跳转地址返回 200 或包含特定用户名才算当真命中。这个环节不能省省掉之后你导出的命中结果给同事复核时会大面积翻车很多人拿着假命中去复测发现口令根本登不进去工具的信用分就崩了。2.4 请求重放与并发模型每个地址、每条口令如何流过工具对一个识别为登录页的目标工具内部跑的是一条流水线先 GET 一次登录页拿 Cookie解析出登录表单的 action 地址和参数名然后按顺序从字典取口令构造 POST 请求每个请求带上同一个 Cookie记录响应状态。一个地址跑完再跑下一个地址。参数名解析是自动的但碰上参数名不标准的情况比如密码字段叫 pwd、口令字段叫 passwd、Token 带随机值工具会标记该地址为“结构异常”并跳过。这种地址数量通常不多但积累起来会隐蔽地吃掉覆盖率。我的习惯是跑完一次之后把“跳过/异常”列表导出单独看一眼里面往往藏着几个重要后台。并发模型大多是线程池加延迟控制。线程数决定同一时间有多少个 HTTP 连接在工作延迟决定每两个请求之间的间隔。这两个参数是后面遭遇 IP 封控时最先要动的旋钮具体调到什么值见第三章。3. 把 WebCrack 落到本地跑一次批量检测准备、配置、命令与结果验证3.1 动工前的状态准备授权清单、地址列表与字典加工动手之前先把三样东西准备好。第一样是明确的测试授权这一点没有可商量余地工具跑起来的动静是明晃晃的批量登录尝试只拿自己有权限的目标来测。第二样是后台地址列表一行一个 URL保存为 urls.txt。第三样是口令字典先跑内置默认口令集再按目标类型替换成对应字典。地址列表的来源通常是资产测绘结果或前一步信息收集的产出。不管来源是什么建议导入前先做一次去重和格式整理URL 统一成http(s)://host:port/path/login这种完整格式去掉结尾斜杠避免同一后台以三种写法出现被当成三个目标重复跑。这一步用 Excel 或者写个小脚本都行成本很低但直接影响目标计数的准确性。字典加工这里多说一句。下载回来的弱口令字典一般是个几百 KB 的 txt直接全量灌进去跑会很惨。第一去掉只有一两个字符的行第二去掉同一口令的大小写重复第三去掉明显是示例或注释的行。加工完的字典控制在几百条到几千条级别跑一轮时间可接受命中率也保得住。弱口令字典的关键不在大了在于每一类的口令都对齐目标类型。3.2 最小配置与最小命令先把一个地址跑通工具启动一般长这样webcrack --urls urls.txt --dict dict.txt --output result.csv这是最小可用命令。推荐把超时、线程、延迟、判定策略都写进配置文件命令会变成webcrack --config config.yaml配置文件示例http: timeout: 10 # 单请求超时秒数超过就按请求失败处理 threads: 20 # 并发线程数决定整体跑速也被安全设备盯着 delay_ms: 200 # 同一目标相邻请求间隔单位毫秒 retries: 1 # 请求失败后的重试次数 target: login_keywords: [login, signin, admin, manage] check_after_login: true # 是否做登录后二次确认 exclude_status_code: [404, 403, 502] dict: force_order: true # 先跑预置高概率口令再跑字典剩余部分 max_per_target: 2000 # 单目标最多尝试口令数防止跑偏参数拆开看timeout 设太短慢的旧系统会大量误报超时设太长整个扫描会被少数慢站点拖成通宵。threads 和 delay_ms 是同一组旋钮并发越高延迟越小整体越快但越容易被封反之则慢而稳。check_after_login 打开后能显著降低误报代价是每个命中结果都要多发一两个请求量级翻倍。max_per_target 是安全阀没有它一份大字典遇到一个慢系统会让你整个任务等一个目标。先跑通一个地址的验证动作是webcrack --urls urls.txt --dict dict.txt --output result.csv --limit-test 1--limit-test 1 只跑清单里第一个目标确认输出文件字段完整、目标能被识别、不会一上来就报错。一个地址能稳定跑通再放全量。提示首次使用建议在配置文件里把线程设为 5、延迟设为 500跑通流程再说提速避免一上来就引发封控而误判工具问题。3.3 批量并发与限速参数既要速度也要给安全设备留面子全量跑的时候第一关注的是命中率和速度的平衡。按我的经验线程数和延迟的合理起步值是 threads10、delay_ms300跑一轮看结果。没有被封的迹象再把线程提到 20、把延迟降到 200。反过来如果一开始就批量超时第一反应不要加大超时值而要怀疑 IP 被限流了先减线程。不同目标对并发敏感度差异大自建系统基本不设防50 线程也能跑上了 WAF 或堡垒机的核心系统可能 5 线程跑几分钟就被拦。所以我会把目标按域名或 IP 段拆成几批生产环境和测试环境分开跑重要目标用保守参数边缘目标用激进参数。加快速度的手段不只有拉高线程把 URL 列表按响应速度排序、把超时从 10 秒压到 6 秒效果往往更明显。批量跑完的产物是一份 CSV一般包含目标 URL、识别的登录接口地址、命中的用户名与口令、判定依据。这里特别提醒CSV 里标着“成功”的结果只代表工具判定成功不等于登录成功。第 3.4 节给出复核方法。3.4 结果的二次确认浏览器手测三条再谈汇报拿到 result.csv 之后按以下顺序做复核这是最不能省的一步。第一浏览器的隐身窗口手动访问命中的登录地址用 CSV 里的用户名和口令实际操作一次登录。第二登录成功的再点进一两个只有登录后可见的菜单确认不是只进入了欢迎页。第三把结果分两类可复现命中与疑似误报疑似误报的统一在最终报告里标注为“待人工确认”。这一步看起来原始但它能兜住工具判定逻辑的所有误差。工具跑出来的东西只能作为线索人工复现才是结论。尤其在需要出正式报告的时候漏掉这一步等于把工具的误报直接写进交付物里后面客户随手一测就会对整份报告的质量产生怀疑。4. WebCrack 避坑指南识别失败、IP 封控、字典失灵的排查思路4.1 登录页识别失败单页应用与异步渲染现象导入几百个地址跑了 20 分钟输出文件里全是 skip一个可测目标都没有。原因目标页面是 Vue、React 单页应用密码框是 JavaScript 渲染出来的静态 HTML 里根本没有 input 标记。工具用静态 HTML 做指纹判断自然全部判定为非登录页。解决打开无头浏览器渲染模式如果工具不支持把这个目标对应的登录接口地址比如 /api/auth/login人工找出来新增到地址列表里因为识别逻辑通常能识别带“login”关键字的接口地址。核心思路是让工具的输入更靠近登录逻辑本身而不只是登录页门面。处理这类目标没有捷径第一次跑完之后把“跳过”清单拉出来逐个看一遍比反复调参数更有用。4.2 批量超时与 IP 封控不是网络坏了是流量特征太明显现象前三分之一目标跑得一切正常从某个时间点开始请求全部超时线程数、超时时间怎么调都没用。原因批量口令重放本身就是高度特征化的流量同一源 IP 短时间向大量登录接口发起 POST触发了安全设备或云厂商的限流策略。这不是网络故障是被盯上了。解决先把线程降到 5、延迟提到 500 毫秒再切到目标清单里没有跑过的下一批地址继续。单一 IP 的封控通常有固定时长需要做的就是停下来等一段时间再换一批目标跑。如果任务允许拆分就按域名把地址表切成多份分成多个时段执行。这是被限流之后的常规解法不是玄学。4.3 字典的两种失灵命中率为零和单目标跑一整晚现象 A跑完几百个目标命中率是 0。原因往往是字典和后台类型对不上比如拿通用后台字典去跑网络设备平台。解决先确认目标系统的类型替换成对应的默认口令字典或先只跑内置的高概率口令部分看是否有基础命中。现象 B单目标尝试了几千条口令还没结束整体进度被少数老系统拖死。原因字典太大且没有单目标上限加上老系统响应慢每个请求都要等好几秒。解决设置 max_per_target 参数绝大多数后台用两三百条口令就能覆盖。如果自动分析出登录带动态 Token手动把这个目标从自动模式里摘出来因为它每请求一次 Token 就失效重放根本没有意义再强的字典也白搭。4.4 误报率居高不下判定逻辑太宽松的结果复核量淹没在假命中里现象结果文件里几十条“成功”人工一条条去试十条有八条登不进去。原因判定条件只看 HTTP 状态码 200没有做登录后特征确认。很多异步接口登录失败也返回 200但响应体里实际是“密码错误”。解决开启 check_after_login 二次确认把跳转目标和“登录成功后可见页面”纳入判定条件。要再降误报就把 CSV 里那些“登录后仍跳回登录页”的结果人工删掉并检查该目标的登录判定规则是否与该系统实际行为匹配。误报多的时候不要急着怀疑工具坏了先把判定策略收紧一档再跑一轮。5. 让 WebCrack 跑成一个常态化流程定时巡检与结果治理半自动化的意义不在于替代人工而在于把“每个季度全量查一遍弱口令”变成一个低门槛的固定动作。我会把工具调用包在一个脚本里脚本负责三件事拉取最新的目标地址清单、执行检测、把输出的 CSV 与上一次运行结果做对比只输出新增的命中项。#!/bin/bash TARGET_FILE./urls/$(date %Y%m%d)_targets.txt RESULT_FILE./results/$(date %Y%m%d)_result.csv PREV_FILE./results/$(date -d yesterday %Y%m%d)_result.csv webcrack --urls $TARGET_FILE --dict ./dict/admin_top300.txt -o $RESULT_FILE if [ -f $PREV_FILE ]; then diff (cut -d, -f1-3 $PREV_FILE | sort) (cut -d, -f1-3 $RESULT_FILE | sort) \ | grep ^ | cut -c3- ./results/new_hits.txt else cp $RESULT_FILE $PREV_FILE echo 首轮跑完无对比基线 fi脚本逻辑不复杂TARGET_FILE 按日期生成保证每次跑最新清单RESULT_FILE 按日期留存历史结果随时可回溯diff 对比只是示例级的字段简化正式使用时按 CSV 的实际列名对齐按用户名加目标 URL 两个字段做唯一键。注意 macOS 的 date 语法和 Linux 有差异date -d yesterday在 macOS 上不生效需要换成date -v-1d。对比之后新命中的结果才会进入人工复核环节上一次已经确认过的弱口令如果已经修复也不会重复出现在眼前干扰判断。定期巡检中有一件事值得养成习惯每次跑完把结果里“真实命中”的口令补充回字典的分类文件。比如这次在某类 ERP 系统上命中了 admin/123qwe就把它追加进对应分类字典。这样查一次字典就复习一次工具会越用越顺手。最后说一个个人坚持的收尾习惯批量检测工具跑完后不直接拿结果去做任何正式汇报而是在浏览器里手动复核前三条命中确认工具判定逻辑没有漂移。工具的输出是线索人工复现是结论。批量检测这类工具的靠谱程度不取决于功能列表多长而取决于你有没有在设计流程时就想清楚“工具的误报由谁来兜住”。把人工复核步骤固化在流程里检测结果才真正可信。希望帮到你。本文还有配套的精品资源点击获取