1. 项目概述为什么密码是渗透测试的“敲门砖”在安全圈子里混了十几年我见过太多因为密码问题而“翻车”的案例。无论是企业内网被轻易攻破还是个人数据泄露密码往往是那条最脆弱、却又最关键的防线。今天我们不谈那些高深莫测的零日漏洞就聊聊渗透测试中最基础、最核心也最容易被忽视的一环——密码及其破解。你可能觉得密码破解是老生常谈无非就是暴力、字典、撞库。但我要告诉你从零基础到真正精通这中间隔着无数个“为什么”和“原来如此”。一个成熟的渗透测试工程师对密码的理解绝不仅仅是跑几个工具那么简单他需要理解密码背后的逻辑、用户的习惯、系统的防护机制以及如何在合法授权的范围内高效、精准地找到突破口。这篇文章就是为你梳理这条从入门到精通的路径。我们会从最基础的密码存储与传输原理讲起逐步深入到主流的破解方法、工具实战再到高级技巧和防御对抗。无论你是刚接触安全的新手想了解如何安全地测试自己的密码强度还是有一定经验的从业者希望系统性地查漏补缺构建自己的密码破解知识体系这篇文章都值得你收藏并反复实践。记住我们的目标不是教你如何做坏事而是通过理解攻击者的思路更好地构筑防御。知己知彼百战不殆。2. 密码学基础与存储机制解析在动手破解之前我们必须先搞清楚对手是谁以及它住在哪里。密码本身只是一串字符但系统如何处理这串字符决定了我们破解的难度和方向。跳过原理直接上工具就像蒙着眼睛拆炸弹既危险又低效。2.1 密码的“生前身后”从明文到哈希当你输入密码“123456”并点击登录时这个密码在系统中经历了怎样的旅程绝大多数现代系统都不会直接存储你的密码原文。想象一下如果数据库里明文存着所有人的密码一旦数据库泄露后果将是灾难性的。因此系统会使用一种叫做“哈希”Hash的函数对你的密码进行不可逆的变换。哈希函数就像一个单向的绞肉机。你把“123456”这块肉放进去它吐出来一串固定长度的、看似乱码的字符串比如“e10adc3949ba59abbe56e057f20f883e”这是MD5哈希的结果。这个过程是单向的你几乎无法从这串乱码反推出原来的“123456”。下次你登录时系统会把你输入的密码再次进行同样的哈希计算然后比对计算结果和数据库里存储的哈希值是否一致。一致就让你通过。这里就引出了破解的第一个关键点我们破解的目标通常不是密码明文本身而是它的哈希值。我们通过各种方法尝试找到一个字符串使其哈希值与目标哈希值相同。这个字符串可能就是原始密码。注意这里说的“不可逆”在数学上是严格的但在实际攻击中我们可以通过庞大的计算和巧妙的策略来“碰撞”出原始值或一个等效值这就是破解工作的核心。2.2 常见哈希算法与识别不同的系统可能使用不同的哈希算法。识别目标哈希值的类型是选择正确破解方法的第一步。以下是一些最常见的算法及其特征哈希算法输出长度位/字符常见前缀/特征典型应用场景MD5128位 / 32个十六进制字符无固定前缀字符串由0-9, a-f组成老旧系统、文件校验、部分Web应用SHA-1160位 / 40个十六进制字符无固定前缀字符串由0-9, a-f组成Git版本控制、一些过时的安全协议SHA-256256位 / 64个十六进制字符无固定前缀字符串由0-9, a-f组成现代Linux系统用户密码/etc/shadow、区块链bcrypt60个字符通常以$2a$,$2b$,$2y$开头非常安全的密码存储常用于现代Web框架如Django, FlaskNTLM/NTLMv232个十六进制字符NTLM哈希是32位无固定前缀Windows系统本地密码哈希、早期SMB认证如何识别看长度和字符集32位十六进制很可能是MD540位可能是SHA-164位可能是SHA-256。看前缀像$2a$10$...这种格式基本可以确定是bcrypt。$6$开头通常是SHA-512用于Linux shadow文件。使用工具在Kali Linux中hash-identifier命令可以辅助识别。但工具不是万能的结合上下文如从Windows系统提取的哈希很可能是NTLM判断更可靠。2.3 “加盐”技术让破解难度倍增如果只是简单哈希攻击者可以事先计算好海量常用密码的哈希值做成一个巨大的“彩虹表”。破解时直接查表即可速度极快。为了对抗这种“查表攻击”聪明的系统设计者引入了“盐”Salt。“盐”是一段随机生成的字符串在计算密码哈希之前将它和密码拼接起来再一起进行哈希运算。这个“盐”值会明文存储在哈希值旁边。例如密码mypassword随机盐s0m3r4nd0ms4lt拼接后mypasswords0m3r4nd0ms4lt存储的哈希hash(mypasswords0m3r4nd0ms4lt)数据库中存储的最终格式$盐值$哈希值例如在Linux中$6$s0m3r4nd0ms4lt$H45hV4lu3...“加盐”的威力在于即使两个用户使用了相同的密码由于他们的“盐”不同最终的哈希值也完全不同。这使得彩虹表完全失效攻击者必须为每个目标单独进行破解计算成本呈指数级上升。在渗透测试中遇到加了盐的哈希你需要做好打持久战的准备或者寻找其他突破口。3. 主流密码破解方法深度剖析了解了密码的存储形式我们就可以针对性地选择“武器”了。密码破解方法主要分为以下几大类它们并非互斥在实际测试中常常组合使用。3.1 暴力破解最原始的力量暴力破解Brute-force Attack的原理非常简单尝试所有可能的字符组合直到找到正确的那个。比如如果你知道密码是6位纯数字那么从000000到999999最多尝试100万次即可。适用场景密码长度很短6位。字符集很小如纯数字、纯小写字母。作为其他方法无效后的最后尝试。优缺点分析优点理论上只要时间足够可以破解任何密码。缺点随着密码长度和字符集的增加尝试次数呈几何级数增长变得完全不现实。一个8位包含大小写字母、数字、符号的密码其组合数是一个天文数字。实操心得在实战中纯粹的暴力破解很少作为首选。它更像是一种“底线思维”——当所有聪明的方法都失效时如果目标密码策略极弱可以设定一个较小的字符集和长度范围如4-6位数字字母进行尝试。工具如hashcat或John the Ripper都支持暴力破解模式。3.2 字典攻击基于人类行为模式的智慧字典攻击Dictionary Attack是效率最高、最常用的方法。它基于一个核心假设人类是懒惰且可预测的。人们倾向于使用容易记忆的单词、短语、日期及其简单变体作为密码。字典Wordlist是什么字典就是一个包含大量潜在密码的文本文件每行一个。一个高质量的字典是成功的关键。字典来源包括通用弱口令字典如rockyou.txt史上著名泄露密码合集、weakpass_2a等包含123456,password,qwerty等全球常用弱密码。行业特定字典针对目标公司业务、产品名称、行业术语生成的字典。目标个人信息字典通过信息收集OSINT获取的目标姓名、生日、宠物名、电话号码、公司名等组合生成的定制化字典。规则生成字典基于基础单词通过预定义规则如首字母大写、尾部加数字、字符替换a-动态生成变体。工具实战使用Crunch生成定制字典假设我们对目标进行信息收集后发现他可能使用“公司名年份”的格式。公司缩写是“ABC”年份可能在2010-2025之间。# 使用 crunch 生成一个字典 crunch 7 7 -t ABC -o custom_dict.txt # 解释生成长度7的密码模式是“ABC”四位数字输出到文件。 # 这会生成 ABC2010, ABC2011 ... ABC2025 等密码。然后我们可以用这个custom_dict.txt去攻击目标的哈希。注意事项字典攻击的成功率高度依赖于字典的质量和目标用户的密码习惯。在渗透测试中花时间制作一个精良的、贴合目标的字典往往比盲目跑一个几十GB的大字典更有效。3.3 彩虹表攻击时间与空间的权衡彩虹表Rainbow Table是一种“空间换时间”的预计算攻击。它针对无盐哈希。攻击者事先为特定的哈希算法如MD5和字符集计算并存储好“明文-哈希值”的对应关系表。攻击时直接查表即可获得明文速度极快。工作原理简化版预计算阶段对海量可能的明文计算哈希但并非全部存储那样表太大而是通过一种叫做“减少函数”的技术存储哈希链的起点和终点。查表阶段拿到目标哈希后在彩虹表中查找。如果找到就可以通过链还原出对应的明文。为什么“加盐”能防御彩虹表因为盐是随机的。预计算的彩虹表是针对“密码-哈希”的。而加盐后实际计算的是“密码盐-哈希”。每个用户都有不同的盐这意味着攻击者需要为每个盐值单独预计算一张彩虹表这在实际中是不可能的。当前适用性随着存储成本下降和计算能力提升以及“加盐”的普及纯粹的彩虹表攻击在针对现代系统时已逐渐式微。但对于一些遗留系统、嵌入式设备或特定场景如破解无盐的Windows LM Hash历史遗留问题它仍有价值。3.4 组合攻击与规则攻击提升字典的杀伤力这是字典攻击的威力加强版也是专业渗透测试人员最常用的技巧。组合攻击Combination Attack将字典中的单词两两组合。例如字典里有sun,shine组合攻击会尝试sunshine,shinesun。hashcat的-a 1模式即为此功能。规则攻击Rule-Based Attack这是最强大的手段之一。它允许你对字典中的每个单词应用一系列变换规则动态生成大量变体。这完美模拟了人类在基础单词上添加简单修饰的习惯。John the Ripper 规则示例 John默认带有强大的规则集/etc/john/john.conf或~/.john/john.conf。一条规则可能长这样# 将单词首字母大写然后在末尾添加两位数字00-99 c $[0-9] $[0-9]如果基础字典单词是password应用此规则会生成Password00,Password01, ...Password99。hashcat 规则实战 假设我们有一个基础字典base.txt内容为sun love我们创建一个规则文件my.rule内容为c $1 $2 $3 # c: 首字母大写 # $1: 在末尾添加数字1 # $2: 在末尾添加数字2 # $3: 在末尾添加数字3 (注意这里$1,$2,$3是字面字符不是变量。更复杂的规则需要更严谨的语法)更实用的规则可能是使用内建的best64.rulehashcat -m 0 target_hash.txt base.txt -r /usr/share/hashcat/rules/best64.rule这条命令会用best64.rule这个包含64条常见变换的规则集对base.txt里的每个单词进行变形后攻击。我的经验在拿到一个新目标的哈希时我通常会先用一个较小的优质字典如rockyou.txt配合best64.rule或d3ad0ne.rule这类强力规则集跑一遍。这能快速捡漏那些使用了常见单词简单变体的密码成功率非常高。4. 实战工具链详解与操作指南理论说得再多不如动手一试。下面我们以 Kali Linux 环境为例深入讲解两大神器John the Ripper和hashcat的使用并拓展到网络服务密码的破解。4.1 离线破解双雄John the Ripper vs. hashcat两者都是离线密码破解的王者但侧重点不同。John the Ripper灵活快速的“瑞士军刀”John 设计精巧开箱即用特别擅长破解Unix/Linux的密码哈希/etc/shadow。它默认就集成了很多智能破解模式。基本语法john [选项] [密码文件]破解Linux shadow文件# 首先需要将 /etc/passwd 和 /etc/shadow 合并以便John获取用户名信息 unshadow /etc/passwd /etc/shadow combined.txt # 使用默认顺序先单破解模式再字典再增量进行破解 john combined.txt # 查看已破解的密码 john --show combined.txt指定字典和规则john --wordlist/usr/share/wordlists/rockyou.txt --rulesBest64 target_hashes.txt恢复会话John支持中断后继续。john --restorehashcat依托硬件的“性能怪兽”hashcat 的最大优势是能充分利用CPU和GPU尤其是GPU进行高速计算支持几乎所有的哈希算法模式极其丰富。基本语法hashcat -m [哈希类型编号] -a [攻击模式编号] [目标哈希文件] [字典/掩码]关键参数解释-m 0: 破解MD5哈希。-m 1000: 破解NTLM哈希Windows。-m 1800: 破解SHA-512 (Unix)。-a 0: 字典攻击。-a 3: 掩码攻击一种更智能的暴力破解。-a 6: 字典掩码组合攻击字典在前掩码在后。-a 7: 掩码字典组合攻击掩码在前字典在后。实战示例示例1字典攻击破解MD5hashcat -m 0 -a 0 target_md5.txt /usr/share/wordlists/rockyou.txt示例2掩码攻击破解已知格式的密码已知密码是8位前两位是大写字母后六位是数字如AB123456。hashcat -m 0 -a 3 target_md5.txt ?u?u?d?d?d?d?d?d # ?u 代表一个大写字母?d 代表一个数字示例3字典规则攻击hashcat -m 1000 -a 0 target_ntlm.txt dict.txt -r /usr/share/hashcat/rules/best64.rule查看结果hashcat -m 0 target_md5.txt --show选择建议新手、快速测试、破解Linux密码优先用 John配置简单。追求极致性能、有GPU、破解复杂哈希或需要精细控制攻击模式必选 hashcat。4.2 在线密码破解针对网络服务离线破解针对的是哈希文件。而当我们需要直接攻击一个在线的登录接口时如SSH、FTP、Web表单就需要在线破解工具。Hydra在线破解的“多面手”Hydra 支持数十种协议是进行在线暴力/字典攻击的标杆工具。基本语法hydra -l [用户名] -P [密码字典] [服务://服务器地址] [选项]实战示例攻击SSH服务hydra -l root -P /usr/share/wordlists/rockyou.txt ssh://192.168.1.100 # -l 指定单个用户名-L 可以指定用户名字典文件 # -p 指定单个密码-P 指定密码字典文件攻击HTTP POST表单登录假设登录页面为/login.php用户名参数为user密码参数为pass失败提示包含Login failedhydra -l admin -P passlist.txt 192.168.1.100 http-post-form /login.php:user^USER^pass^PASS^:Login failed # ^USER^ 和 ^PASS^ 是Hydra的占位符会被字典内容替换。 # 冒号分隔的三部分分别是路径、POST数据串、失败标识。重要注意事项合法性绝对不要在未获得明确授权的情况下对任何系统进行在线密码爆破这是违法的。谨慎使用在线爆破会产生大量登录失败日志极易触发账户锁定、IP封禁或入侵检测系统IDS警报。速率限制使用-t任务数、-w等待时间参数控制并发和延迟避免把服务打挂或触发防护。hydra -l user -P dict.txt -t 4 -w 10 ssh://target.com # 使用4个并行任务每次尝试后等待10秒Medusa另一个可靠的选择Medusa 与 Hydra 功能类似设计上更模块化在某些协议上可能更稳定。medusa -h 192.168.1.100 -u root -P /path/to/passwords.txt -M ssh4.3 密码提取与获取破解的前提巧妇难为无米之炊。在离线破解之前你必须先拿到密码哈希。这本身就是渗透测试中极具技巧性的环节。从Linux系统提取哈希直接读取在获得root权限后可以直接查看/etc/shadow文件。利用漏洞例如通过脏牛Dirty COW等本地提权漏洞获取root权限后读取。内存转储使用mimipenguin等工具尝试从当前登录会话的内存中提取明文密码或哈希成功率依赖环境。从Windows系统提取哈希SAM文件Windows的本地密码哈希存储在C:\Windows\System32\config\SAM文件中但系统运行时被锁定。可以通过离线挂载磁盘或使用卷影副本Volume Shadow Copy来获取。工具提取Mimikatz神器中的神器。在已获取管理员权限的系统上可以直接从内存中提取登录用户的明文密码、NTLM哈希、Kerberos票据等。# 在Mimikatz交互式命令行中 privilege::debug # 提升权限 sekurlsa::logonpasswords # 抓取内存中的密码和哈希secretsdump.py(Impacket套件)远程或本地从SAM、LSA Secrets中提取哈希。python3 secretsdump.py LOCAL -sam SAM.bak -system SYSTEM.bak # 或者远程Dump需要凭证 python3 secretsdump.py DOMAIN/USER:PASSWORDTARGET_IP从网络流量中捕获哈希LLMNR/NBT-NS毒化在内部网络中攻击者可以伪装成文件服务器等诱使受害者发送其NTLMv2哈希。使用Responder工具。SMB中继攻击在特定条件下可以将捕获的哈希中继到其他机器进行认证从而获得访问权限。嗅探明文协议对于FTP、Telnet、HTTP Basic Auth等使用明文传输密码的协议直接使用Wireshark等嗅探工具抓包即可获取。重要提示所有这些提取操作都必须在获得明确授权、在可控的测试环境中进行。未经授权获取他人系统哈希是严重的违法行为。5. 专项场景破解与高级技巧掌握了核心方法和工具我们来看看在一些特定场景下如何灵活运用并探讨一些提升效率的高级思路。5.1 破解WPA/WPA2 Wi-Fi握手包破解Wi-Fi密码是很多人入门安全的第一课。其核心是捕获客户端与路由器之间的“四次握手”包然后对握手包中的哈希进行离线字典攻击。完整流程启用监听模式将无线网卡置于监听模式监听周围的无线流量。airmon-ng start wlan0 # 网卡名称可能是 wlan0, wlp2s0 等使用 ifconfig 或 iwconfig 查看 # 启动后通常会变成 wlan0mon扫描目标网络使用airodump-ng扫描找到目标Wi-Fi的BSSIDMAC地址和信道CH。airodump-ng wlan0mon锁定目标并捕获握手包针对目标网络开始捕获数据包等待有客户端连接或重连时捕获握手包。airodump-ng -c 6 --bssid 00:11:22:33:44:55 -w capture wlan0mon # -c 指定信道--bssid 指定目标路由器MAC-w 指定输出文件前缀主动请求握手可选如果一直没客户端连接可以使用aireplay-ng发送解除认证包迫使已连接的客户端重连从而捕获握手。aireplay-ng -0 2 -a 00:11:22:33:44:55 -c AA:BB:CC:DD:EE:FF wlan0mon # -0 表示解除认证攻击2是发送次数-a 是AP MAC-c 是客户端MAC使用hashcat破解捕获到的握手包通常为.cap文件包含了可用于破解的哈希。使用hcxpcapngtool工具将其转换为hashcat可识别的格式.hc22000然后用强大的字典进行攻击。# 转换格式 hcxpcapngtool -o hash.hc22000 capture-01.cap # 使用hashcat破解 hashcat -m 22000 hash.hc22000 /usr/share/wordlists/rockyou.txt # -m 22000 对应 WPA/WPA2 PMKID/EAPOL 哈希模式成功率关键完全依赖于密码字典是否包含目标密码。对于复杂密码几乎不可能破解。此方法仅适用于测试弱密码Wi-Fi或获得授权后的安全评估。5.2 处理加密压缩文件ZIP/RAR忘记压缩包密码是常见问题。破解原理同样是离线攻击压缩包头中的密码验证哈希。使用fcrackzip破解ZIP# 字典攻击 fcrackzip -v -D -p /usr/share/wordlists/rockyou.txt -u encrypted.zip # -v 详细输出-D 字典模式-p 指定字典-u 验证破解的密码重要 # 掩码攻击已知部分密码结构 fcrackzip -v -c aA1! -l 5-8 -u encrypted.zip # -c 指定字符集a:小写, A:大写, 1:数字, !:符号-l 指定密码长度范围使用John the Ripper破解RAR 需要先将RAR文件转换为John能识别的哈希格式。# 1. 使用 rar2john 提取哈希 rar2john encrypted.rar rar_hash.txt # 2. 使用john破解 john --wordlistrockyou.txt rar_hash.txt注意事项对于现代高版本的ZIP如AES-256加密或RAR5格式破解速度会非常慢强度等同于破解一个强密码的哈希。5.3 制作高质量定制化字典通用字典虽好但针对性强的高质量字典才是“杀手锏”。制作流程如下信息收集OSINT公司官网、产品名、标语。目标人员在社交媒体如LinkedIn, 微博上的信息姓名、昵称、生日、纪念日、宠物名、毕业学校、兴趣爱好。通过theHarvester,sherlock等工具收集用户名、邮箱。使用工具生成基础字典CUPP交互式生成基于个人信息的字典。python3 cupp.py -iCeWL爬取指定网站将网页中的单词生成字典。cewl -d 3 -m 5 -w company_words.txt https://target-company.com # -d 爬取深度-m 单词最小长度-w 输出文件使用hashcat工具链进行组合与规则扩展使用combinator将两个字典组合# 将first.txt和second.txt的单词两两组合 hashcat --stdout -a 1 first.txt second.txt combined_dict.txt**使用--force如果需要运行上述命令。使用hashcat-utils中的rli去重排序# 合并多个字典并去重排序 cat dict1.txt dict2.txt | sort -u final_dict.txt # 或者使用rli ./rli final_dict.txt dict1.txt dict2.txt应用规则生成最终字典将基础字典用规则跑一遍生成变体。hashcat --stdout -a 0 base_words.txt -r best64.rule | sort -u final_attack_dict.txt我的经验对于一个企业内部的渗透测试我花在制作字典上的时间可能占整个密码破解环节的70%。一个融合了公司名、产品代号、当年年份、季度缩写如Q1以及常见弱密码变体的字典其命中率远高于通用的巨型字典。5.4 利用已知密码进行“撞库”攻击“撞库”在渗透测试中有其特定应用。如果你从一个系统中获取了一些密码或哈希可以尝试这些凭证是否在其他系统上复用。密码复用测试将获取到的明文密码整理成字典用于攻击目标网络的其他服务如SSH, Web后台, 数据库。哈希传递攻击在Windows域环境中如果你获得了某个用户的NTLM哈希即使不知道明文密码也可以直接使用这个哈希进行认证攻击其他机器。这利用了NTLM协议的设计特性。工具Impacket套件中的psexec.py,smbexec.py。python3 psexec.py -hashes LMHASH:NTHASH DOMAIN/USERTARGET_IP # 如果LM Hash未知可以用冒号代替: :NTHASH防御意义这种攻击方式揭示了强制使用不同密码、启用多因素认证MFA以及及时监控异常登录行为的重要性。6. 防御视角与安全建议作为一名渗透测试者我们破解密码的目的是为了证明其脆弱性从而推动更安全的实践。从防御角度看以下几点至关重要6.1 强密码策略与用户教育长度优于复杂度要求密码最少12-15位这比要求包含大小写数字符号但只有8位要安全得多。长密码短语如correct-horse-battery-staple比短复杂密码如Pssw0rd!更易记且更难破解。禁用常见弱密码系统应内置或可配置弱密码字典在用户设置时进行拒绝。定期轮换谨慎对待传统的90天强制改密策略已被NIST等机构质疑因为它可能导致用户使用有规律的弱密码如Password2024!,Password2025!。更推荐在怀疑泄露时强制更改并持续监控威胁情报。用户教育培训用户识别钓鱼网站避免在不同站点使用相同密码。6.2 安全的密码存储与传输必须加盐哈希使用bcrypt、Argon2、PBKDF2等自适应哈希算法。这些算法不仅加盐还通过迭代次数工作因子人为增加计算成本使得大规模破解变得异常缓慢。传输必须加密使用TLS/SSLHTTPS等加密通道传输密码杜绝明文传输。前端哈希意义有限在客户端如JavaScript对密码进行哈希后再传输可以防止原始密码在传输中被嗅探但服务器端仍需进行安全的加盐哈希。这不能替代HTTPS。6.3 多因素认证与行为监控强制执行MFA这是防止密码泄露后导致账户失陷的最有效手段。即使密码被破解攻击者没有第二因素手机验证码、硬件密钥、生物特征也无法登录。实施智能登录策略检测异常登录地点、时间、设备。对多次失败登录进行账户锁定或引入CAPTCHA验证。使用Web应用防火墙WAF识别和拦截自动化爆破工具的攻击模式。定期进行渗透测试与红队演练主动发现自身系统中的弱密码和认证缺陷模拟真实攻击者的“撞库”、爆破等行为检验防御措施的有效性。6.4 系统层面的加固限制哈希提取确保系统文件如/etc/shadow, SAM的权限最小化防止非授权访问。使用LAPS等解决方案对于Windows域环境中的本地管理员账户使用微软的本地管理员密码解决方案LAPS确保每台机器的本地管理员密码不同且定期自动更改防止横向移动。禁用过时且不安全的认证协议如LAN Manager (LM)、NTLMv1强制使用NTLMv2或Kerberos。密码安全是一场永无止境的攻防战。作为防守方绝不能抱有侥幸心理认为用户会自觉设置强密码或系统默认配置就是安全的。通过理解攻击者如何思考和操作我们才能构建起真正有效的、纵深防御的认证体系。而作为一名渗透测试人员你的价值就在于用攻击者的技术帮助客户提前发现并修复这些致命的弱点。