封面图
📚 Termux 无 Root 学习开发系列
✅ 阶段一:环境搭建与终端基础(01-05)
✅ 阶段二:编程开发环境(06-09)
✅ 阶段三:网络与远程操作(10-12)
✅ 阶段四:Termux:API 与自动化(13-14)
✅ 阶段五:proot-distro 完整 Linux(15-17)
✅ 阶段六:AI 与 AIGC 实战(18-20)
▸ 阶段七:安全工具实战(21-23)
✓ 21 信息收集与端口扫描
✓ 22 sqlmap 注入测试与 hydra 爆破
• 23 密码哈希破解与取证工具 ← 本篇
阶段八至九共 5 篇,后续持续更新
上一篇用 sqlmap 从数据库导出了密码哈希,用 hydra 撞出了明文密码。但当你拿到的是一串 5f4dcc3b5aa765d61d8327deb882cf99 这样的 MD5 哈希时,hydra 无能为力——它只能撞在线登录接口,不能反向破解哈希。本篇学习离线哈希破解(hashcat + John the Ripper)和数字取证工具(binwalk + foremost + exiftool),完成从"在线攻击"到"离线分析"的能力闭环。
目录
§1 哈希破解基础:从明文到哈希
§2 hashcat:GPU 加速破解与手机限制
§3 John the Ripper:CPU 哈希破解实战
§4 binwalk:固件与隐藏数据分析
§5 foremost 与 strings:文件雕刻与字符串提取
§6 exiftool:元数据与隐藏信息
§7 综合实战:CTF 取证全流程
§8 网络抓包分析(受限环境)

§1 哈希破解基础:从明文到哈希

密码存储的安全演进经历了三个阶段:明文存储(最早期)、加密存储(可逆)、哈希存储(不可逆)。现代系统几乎都采用哈希存储——注册时将密码通过哈希函数转换为定长字符串存入数据库,登录时比对哈希值而非明文。

哈希的核心特性是"单向":从明文算哈希很容易(毫秒级),但从哈希反推明文只能靠"爆破"——逐一尝试候选密码,算出哈希后比对。因此哈希破解的速度取决于两个因素:候选密码数量(字典大小)和哈希计算速度(硬件性能)。

常见哈希算法对照
算法 输出长度 安全等级 典型场景
MD5 128 bit (32 hex) 低 旧系统、文件校验
SHA-1 160 bit (40 hex) 中低 Git、旧 TLS 证书
SHA-256 256 bit (64 hex) 中 区块链、现代系统
bcrypt 184 bit (动态) 高 现代 Web 应用
Argon2 动态 极高 密码竞赛冠军

关键区别在于"加盐"和"迭代次数"。MD5 和 SHA-1 是纯哈希函数,不加盐、不迭代——相同输入永远产生相同输出,可以预计算彩虹表一次性破解。bcrypt 和 Argon2 是"慢哈希",内置盐值和可调迭代次数(cost factor),每次计算需要毫秒级甚至秒级,让爆破成本成千倍增加。

Bash
# 用 Python 生成不同算法的哈希
python3 -c "import hashlib;print(hashlib.md5(b'password').hexdigest())"
# 输出:5f4dcc3b5aa765d61d8327deb882cf99
python3 -c "import hashlib;print(hashlib.sha256(b'password').hexdigest())"
# 输出:5e884898da28047151d0e56f8dc6292773603d0d6aabbddc...(64位)
💡 小贴士
识别哈希类型是破解的第一步。32 位十六进制字符几乎一定是 MD5;40 位是 SHA-1;64 位是 SHA-256;以 $2a$ 开头是 bcrypt;以 $argon2 开头是 Argon2。hashcat 和 John the Ripper 都有自动识别功能,但手动识别能帮你选择正确的破解参数。

§2 hashcat:GPU 加速破解与手机限制

hashcat 是世界上最快的密码恢复工具,号称利用 GPU 算力可达到每秒数百亿次哈希计算。当前最新版本为 v7.1.1(2026年8月发布),支持 300+ 种哈希算法和 5 种攻击模式。但它在手机上有严重限制。

⚠️ 手机限制说明
hashcat 依赖 OpenCL 或 CUDA 进行 GPU 计算,不支持纯 CPU 模式。手机 GPU 的 OpenCL 支持因设备而异——高通 Adreno 有一定支持,ARM Mali 多数不兼容。即使能编译运行,手机 GPU 的算力远低于桌面显卡,MD5 破解速度可能只有每秒几万次(桌面显卡可达每秒数百亿次)。本节以理论学习和参数理解为主,实际破解推荐用 John the Ripper(§3)。

安装尝试(实验性质)

Bash
1
2
3
4
5
6
7
8
# 尝试在 proot Ubuntu 中安装 hashcat
apt install -y hashcat
# 验证安装
hashcat --version
# 检测 GPU/OpenCL 设备
hashcat -I
# 若无 GPU 设备输出,则无法运行 GPU 模式

hashcat 核心参数与攻击模式

即使无法在手机上实际运行,理解 hashcat 的参数体系对安全评估至关重要——在桌面环境或云服务器上同样适用:

五种攻击模式
模式 代号 说明
字典攻击 -a 0 用字典文件逐一尝试
组合攻击 -a 1 两个字典的笛卡尔积
掩码攻击 -a 3 按字符模式穷举生成
混合-字典+掩码 -a 6 字典词+掩码后缀
混合-掩码+字典 -a 7 掩码前缀+字典词
Bash
1
2
3
4
5
6
7
8
# 字典攻击 MD5 哈希
hashcat -m 0 -a 0 hash.txt rockyou.txt
# 掩码攻击:4小写字母+2数字(如 abcd12)
hashcat -m 0 -a 3 hash.txt "?l?l?l?l?d?d"
# SHA-256 哈希(-m 1400)
hashcat -m 1400 -a 0 hash.txt rockyou.txt
# bcrypt 哈希(-m 3200,速度极慢)
hashcat -m 3200 -a 0 hash.txt rockyou.txt

掩码占位符:?l 小写字母(a-z)、?u 大写字母(A-Z)、?d 数字(0-9)、?s 特殊字符、?a 全部字符。掩码攻击本质是"按规则穷举",4位纯数字PIN只有1万种组合,瞬间完成。

常见哈希类型编号
编号 哈希类型 GPU 速度参考
-m 0 MD5 极快(~100 GH/s)
-m 100 SHA-1 快(~50 GH/s)
-m 1400 SHA-256 中(~20 GH/s)
-m 3200 bcrypt 极慢(~50 KH/s)
💡 小贴士
GPU 速度参考列基于 RTX 4090 桌面显卡。手机 GPU 的算力大约低 3-4 个数量级——MD5 每秒可能只有几万次。这也是为什么 hashcat 在手机上不实用的根本原因。但在桌面或云环境(AWS p3 实例),hashcat 是无可替代的王者。理解其参数体系在职业安全评估中是必备知识。

§3 John the Ripper:CPU 哈希破解实战

John the Ripper(JtR)是 hashcat 的 CPU 替代方案。它不需要 GPU,纯靠 CPU 多线程并行计算,虽然速度远低于 GPU 版的 hashcat,但在手机上实际可用。推荐使用 bleeding-jumbo 分支(社区增强版,基于 1.9.0-jumbo-1,已有数千次提交),支持 300+ 种哈希格式。

安装与编译

Bash
1
2
3
4
5
6
7
8
# proot Ubuntu 中直接安装
apt install -y john
# 或从源码编译最新版(推荐)
git clone https://github.com/openwall/john.git
cd john/src
./configure && make -j4
# 验证安装
john --list=formats | head -20

基本破解流程

JtR 的典型流程:准备哈希文件 → 自动识别格式 → 字典攻击 → 查看结果:

Bash
1
2
3
4
5
6
7
8
9
10
# 创建测试哈希文件
echo "5f4dcc3b5aa765d61d8327deb882cf99" > hash.txt
# 自动识别格式 + 字典攻击
john --wordlist=rockyou.txt hash.txt
# 指定格式(避免误识别)
john --format=Raw-MD5 --wordlist=rockyou.txt hash.txt
# 查看已破解的结果
john --show hash.txt

JtR 会自动尝试识别哈希格式。如果识别错误(比如把 MD5 当成了其他格式),用 --format= 手动指定。--show 显示已破解的凭据,格式为 用户名:密码。

哈希提取工具

JtR jumbo 版自带一系列哈希提取工具,能从各种文件格式中提取哈希:

工具 用途
zip2john 从加密 ZIP 文件提取密码哈希
rar2john 从加密 RAR 文件提取密码哈希
pdf2john 从加密 PDF 文件提取密码哈希
ssh2john 从 SSH 私钥提取密码哈希
office2john 从 Office 文档提取密码哈希
Bash
1
2
3
4
5
# 破解加密 ZIP 文件密码
zip2john secret.zip > zip_hash.txt
john --wordlist=rockyou.txt zip_hash.txt
# 破解 SSH 私钥密码
ssh2john id_rsa > ssh_hash.txt && john ssh_hash.txt

增量模式与规则

字典跑完没命中时,JtR 的增量模式(incremental)可以按字符组合穷举,相当于 hashcat 的掩码攻击。但纯 CPU 跑增量模式非常慢,只适合短密码(6 位以下):

Bash
# 增量模式(穷举,指定最长4位)
john --incremental --max-length=4 hash.txt
# 使用规则变换字典(首字母大写+末尾加数字)
john --wordlist=rockyou.txt --rules=Wordlist hash.txt
💡 小贴士
JtR 的规则引擎是其最大优势。一条规则如 Az"[0-9]" 会在每个字典词末尾追加 0-9,把 10 万词的字典扩展为 100 万条候选——比手写 100 万行的字典文件高效得多。规则语法虽简,但组合后威力巨大,是 CTF 比赛中的常用技巧。

§4 binwalk:固件与隐藏数据分析

binwalk 是逆向工程和固件分析的利器,能扫描二进制文件中嵌入的文件头、压缩流、加密数据等。当前最新版 v3.1.0 已用 Rust 重写,性能大幅提升。它能识别固件镜像中隐藏的内核、文件系统、配置文件等——CTF 比赛中"图片里藏了个 ZIP"这类隐写题,binwalk 是首选工具。

安装与基本用法

Bash
1
2
3
4
5
6
7
# proot Ubuntu 安装 binwalk v3
apt install -y binwalk
# 扫描文件中的嵌入数据
binwalk firmware.bin
# 提取所有识别到的嵌入文件
binwalk -e firmware.bin

分析输出解读

binwalk 扫描后会输出一个表格,列出文件中每个识别到的数据块的偏移量、类型和描述:

Text
1
2
3
4
5
DECIMAL     HEX       DESCRIPTION
------------------------------------------------------------------
0           0x0        PNG image header
1024        0x400      gzip compressed data
4096        0x1000     SquashFS filesystem

上面的输出表示:文件开头是一张 PNG 图片(正常外观),但在 1024 字节处隐藏了一段 gzip 压缩数据,在 4096 字节处嵌入了完整的 SquashFS 文件系统。-e 参数会自动提取这些嵌入数据到 _firmware.bin.extracted/ 目录。

熵分析

binwalk 的熵分析功能(-E)能检测文件中的加密或高压缩区域——熵值接近 1.0 的区域要么是加密数据,要么是高度压缩的数据:

Bash
# 熵分析(输出 ASCII 图表)
binwalk -E suspicious_file.bin
# 递归提取(提取后再扫描提取出的文件)
binwalk -eM firmware.bin
💡 小贴士
binwalk 的 v3 用 Rust 重写后扫描速度比旧 Python 版快 10 倍以上,但提取功能(-e)仍依赖系统工具(unzip、gunzip、unsquashfs 等)。proot Ubuntu 中安装 apt install -y squashfs-tools unzip gzip 确保提取功能完整。CTF 中常见套路:一张 PNG 图片用 binwalk 扫描发现内嵌 ZIP,提取后发现 ZIP 里有加密的 flag.txt,再用 John the Ripper 的 zip2john 破解——这就是工具链的联动。

§5 foremost 与 strings:文件雕刻与字符串提取

binwalk 靠文件头签名识别嵌入文件,而 foremost 用"文件雕刻"技术——即使文件头已被损坏或删除,它仍能根据文件内部结构特征恢复文件。这在恢复误删文件、分析磁盘镜像时非常有用。

foremost 文件雕刻

Bash
1
2
3
4
5
# 安装 foremost
apt install -y foremost
# 从磁盘镜像恢复所有图片和文档
foremost -t all -i disk.img -o output/
# 只恢复 PDF 和 ZIP 文件
foremost -t pdf,zip -i disk.img -o output/

-t 指定文件类型(all/pdf/zip/jpg/png/gif/doc/xlsx 等),-i 输入文件,-o 输出目录。foremost 会按文件类型在输出目录中创建子目录,每个恢复的文件自动编号。

strings 字符串提取

strings 是最简单但最常用的取证工具——从二进制文件中提取所有可读字符串(连续 4+ 个 ASCII 可打印字符)。在分析 APK、可执行文件、固件时,strings 能快速暴露内部路径、API 密钥、URL、调试信息等:

Bash
1
2
3
4
5
6
7
# 提取所有可读字符串
strings app.apk | head -50
# 搜索 URL(API 端点泄露)
strings app.apk | grep -E "https?://"
# 搜索 API 密钥模式
strings app.apk | grep -iE "(api_key|token|secret|password)"

file 命令:文件类型识别

file 命令通过检查文件的"魔数"(magic number)来识别真实文件类型,不依赖扩展名。这在取证中至关重要——攻击者常把可执行文件改名为 .jpg 来绕过检测:

Bash
file mystery_file
# 输出:mystery_file: ELF 64-bit LSB executable, ARM aarch64
# 批量识别目录下所有文件
file *
💡 小贴士
strings + grep 是安全审计的黄金组合。在分析一个未知的 APK 或可执行文件时,先用 strings file | grep -iE "(http|api|key|token|password|secret)" 快速扫描,往往能发现开发者留下的硬编码凭据、内部 API 端点、调试路径等敏感信息。这种"懒人审计"在实际渗透测试中命中率极高。

§6 exiftool:元数据与隐藏信息

ExifTool(v13.59,2026年5月发布)是元数据提取的事实标准。手机拍的照片、单反导出的 JPEG、甚至是 PDF 文档,都携带大量元数据——拍摄时间、GPS 坐标、设备型号、软件版本等。在隐私保护和安全取证中,这些信息可能暴露拍摄者的精确位置和设备指纹。

基本用法

Bash
1
2
3
4
5
6
7
# 安装 exiftool
apt install -y exiftool
# 查看照片所有元数据
exiftool photo.jpg
# 只提取 GPS 信息
exiftool -n -gpslatitude -gpslongitude photo.jpg

GPS 坐标提取实战

许多手机拍照默认记录 GPS 坐标。提取后在地图上定位就能看到拍摄精确位置:

Bash
1
2
3
4
5
6
7
8
# 提取 GPS 坐标(-n 输出十进制格式)
exiftool -n -gpslatitude -gpslongitude photo.jpg
# 输出示例:
# GPS Latitude : 39.904200
# GPS Longitude: 116.407400
# 在浏览器中打开 Google Maps
echo "https://maps.google.com/?q=39.9042,116.4074"

清除元数据保护隐私

Bash
# 删除所有元数据(保留图片本身)
exiftool -all= photo.jpg
# 只删除 GPS 信息
exiftool -gps:all= photo.jpg
💡 小贴士
社交媒体平台(微信、微博等)会在上传时自动剥离 EXIF 元数据,但通过邮件附件、云盘分享、即时通讯软件原图传输的图片仍可能携带完整 GPS 信息。发图前用 exiftool -all= photo.jpg 清除元数据是最简单的隐私保护措施。注意:清除后原文件会被覆盖,exiftool 会自动备份原始文件为 photo.jpg_original。

§7 综合实战:CTF 取证全流程

CTF(Capture The Flag)比赛中的取证题通常是一个神秘文件——可能是一张图片、一个固件镜像、一个加密压缩包。目标是找到隐藏在其中的 flag 字符串。下面模拟一个典型的取证解题流程:

取证流程六步法
步骤 工具 目标
1. 识别 file 确认文件真实类型
2. 扫描 binwalk 发现嵌入数据
3. 提取 binwalk -e / foremost 提取隐藏文件
4. 破解 john 破解加密文件密码
5. 搜索 strings + grep 搜索 flag 字符串
6. 验证 exiftool 检查元数据残留线索
Bash
1
2
3
4
5
6
7
8
9
10
11
12
# 步骤1:识别文件类型
file challenge.png
# challenge.png: PNG image data, 1920 x 1080
# 步骤2:扫描嵌入数据
binwalk challenge.png
# 发现 1024 字节处有 ZIP 数据
# 步骤3:提取嵌入文件
binwalk -e challenge.png
# 进入提取目录,发现 secret.zip
# 步骤4:破解 ZIP 密码
zip2john secret.zip > hash.txt && john --wordlist=rockyou.txt hash.txt
Bash
1
2
3
4
5
# 步骤5:搜索 flag
strings flag.txt | grep -i "flag{"
# 步骤6:检查原图 EXIF 是否有额外线索
exiftool challenge.png | grep -i "comment"
💡 小贴士
CTF 取证题的 flag 常藏在意想不到的地方:图片 EXIF 的 Comment 字段、音频频谱图中、PDF 的元数据中、固件的配置文件里。养成"每个工具都跑一遍"的习惯——file 确认类型、binwalk 扫嵌入、strings 搜关键词、exiftool 查元数据。CTFtime.org 上有全球赛事日历和往届 writeup,是学习取证工具链最佳途径。

§8 网络抓包分析(受限环境)

网络抓包是安全分析的另一大方向。在 Termux 无 root 环境下,实时抓包功能严重受限——tcpdump 需要 root 权限访问网卡接口,tshark(Wireshark CLI)同样如此。但分析已有的 pcap 文件完全可行。

tshark:分析 pcap 文件

Bash
1
2
3
4
5
6
7
# 安装 tshark(proot Ubuntu)
apt install -y tshark
# 统计协议分布
tshark -r capture.pcap -q -z io,phs
# 提取所有 HTTP 请求 URL
tshark -r capture.pcap -Y "http.request" -T fields -e http.host -e http.request.uri

Python 深度分析

用 Python 的 scapy 库可以更灵活地解析 pcap 文件——自定义过滤、统计分析、协议提取:

Python
1
2
3
4
5
6
7
8
9
10
11
from scapy.all import rdpcap, TCP
# 读取 pcap 文件
packets = rdpcap("capture.pcap")
# 统计 IP 地址访问频率
ips = {}
for pkt in packets:
    if pkt.haslayer("IP"):
        ip = pkt["IP"].src
        ips[ip] = ips.get(ip, 0) + 1
for ip, cnt in sorted(ips.items(), key=lambda x: -x[1])[:10]:
    print(f"{ip}:{cnt}")
⚠️ 注意
在 Termux 无 root 环境下无法实时抓包,但可以从电脑导出 pcap 文件用 tshark 分析。另外,如果上一篇文章中搭建了 DVWA 靶机,可以在 DVWA 的命令注入模块中用 tcpdump 抓包(因为 DVWA 运行在 proot Ubuntu 中,有 root 权限),生成 pcap 文件后再用 tshark 或 Python 分析。
💡 小贴士
本篇是阶段七安全工具实战的收官篇。从第21篇的信息收集(nmap/masscan),到第22篇的漏洞利用(sqlmap/hydra),到本篇的离线破解与取证(John/binwalk/exiftool),覆盖了渗透测试从侦察到取证的完整链条。记住:安全工具的学习不是为了攻击他人,而是为了理解攻击者的思路,从而更好地防护自己的系统。

分级练习

🟢 基础级
1. 在 proot Ubuntu 中安装 John the Ripper,用 john --list=formats 查看支持的哈希格式,统计有多少种。
2. 用 Python 生成 password 的 MD5 哈希,存入文件,用 JtR + rockyou.txt 破解。
3. 用 exiftool 查看一张手机拍摄的照片,提取 GPS 坐标并在 Google Maps 上定位。
🟡 进阶级
4. 创建一个加密 ZIP 文件,用 zip2john 提取哈希后用 JtR 破解密码。
5. 用 binwalk 扫描一个 APK 文件,查看其中嵌入了哪些数据类型,用 -e 提取并浏览提取结果。
6. 用 strings 分析一个 APK 文件,搜索其中的 URL 和 API 密钥模式,记录发现。
🔴 挑战级
7. 制作一个 CTF 取证挑战:在一张 PNG 图片中嵌入一个加密 ZIP 文件(含 flag.txt),写出完整的解题 writeup(file → binwalk → zip2john → john → strings)。
8. 用 Python + scapy 编写脚本,读取 pcap 文件并统计 Top 10 IP 地址、Top 10 目标端口、HTTP 请求 URL 列表。
9. 对比 hashcat v7.1.1 和 JtR 的哈希破解速度:生成 100 个常见密码的 MD5 哈希,分别用两个工具破解(若 hashcat 可运行),对比耗时。

知识回顾

hashcat v7.1.1 John the Ripper MD5/SHA-256/bcrypt 字典攻击 掩码攻击 增量模式 zip2john binwalk v3.1.0 foremost strings exiftool v13.59 GPS 提取 文件雕刻 tshark CTF 取证流程
下一篇预告
24 Gitea 私有 Git 服务器与静态站托管
安全工具实战阶段完结!下一篇进入阶段八:自托管服务。在手机上用 Gitea 搭建私有 Git 代码托管平台,配合 Caddy 或 Nginx 反向代理,实现代码仓库管理、Issue 追踪、CI/CD 触发。从安全攻防转向运维自托管——在 Termux 上构建你自己的"GitHub + 个人站点"。