前置知识: 网络安全

隐写术工具命令

2 min入门

隐写术工具命令:图片与音频隐写及提取(steghide/zsteg/binwalk)、隐写检测思路与 CTF 实战流程

Steghide 隐写工具

基本写法:嵌入数据到图像 steghide embed -cf <载体文件> -ef <隐藏文件>

# 将 secret.txt 嵌入到图片中
steghide embed -cf image.jpg -ef secret.txt

基本写法:使用密码嵌入 steghide embed -cf <载体文件> -ef <隐藏文件> -p <密码>

# 使用指定密码嵌入数据
steghide embed -cf image.jpg -ef secret.txt -p mypassword

基本写法:提取隐藏数据 steghide extract -sf <载体文件>

# 从图片中提取隐藏数据
steghide extract -sf image.jpg

基本写法:使用密码提取 steghide extract -sf <载体文件> -p <密码>

# 使用密码提取隐藏数据
steghide extract -sf image.jpg -p mypassword

基本写法:查看隐藏信息 steghide info <载体文件>

# 查看载体文件是否包含隐藏数据
steghide info image.jpg

基本写法:嵌入时压缩数据 steghide embed -cf <载体文件> -ef <隐藏文件> -z <级别>

# 使用最高压缩级别嵌入数据
steghide embed -cf image.jpg -ef secret.txt -z 9

stegseek 爆破工具

基本写法:使用字典爆破 stegseek --seed <载体文件> <字典文件>

# 使用字典爆破 steghide 密码
stegseek --seed image.jpg rockyou.txt

基本写法:爆破并提取 stegseek --seed <载体文件> <字典文件> -xf <输出文件>

# 爆破成功后提取到指定文件
stegseek --seed image.jpg rockyou.txt -xf extracted.txt

基本写法:无字典暴力破解 stegseek --seed <载体文件> --crack

# 不使用字典直接暴力破解
stegseek --seed image.jpg --crack

基本写法:指定线程数 stegseek --seed <载体文件> <字典文件> -t <线程数>

# 使用 8 线程加速爆破
stegseek --seed image.jpg rockyou.txt -t 8

基本写法:查看爆破进度 stegseek --seed <载体文件> <字典文件> -v

# 显示详细爆破进度
stegseek --seed image.jpg rockyou.txt -v

zsteg PNG/BMP 分析

基本写法:分析 PNG 隐写 zsteg <PNG文件>

# 自动分析 PNG 文件中的隐藏数据
zsteg image.png

基本写法:分析指定通道 zsteg -a <PNG文件>

# 分析所有通道的隐藏数据
zsteg -a image.png

基本写法:提取 LSB 数据 zsteg -e "b1,rgb,lsb,xy" <PNG文件>

# 提取 LSB 编码的隐藏数据
zsteg -e "b1,rgb,lsb,xy" image.png

基本写法:仅检查特定通道 zsteg -c "rgb" <PNG文件>

# 仅检查 RGB 通道
zsteg -c "rgb" image.png

基本写法:输出原始数据 zsteg -E "b1,rgb,lsb,xy" <PNG文件> > <输出文件>

# 提取隐藏数据并保存到文件
zsteg -E "b1,rgb,lsb,xy" image.png > extracted.bin

binwalk 固件分析

基本写法:扫描文件中的嵌入数据 binwalk <文件>

# 扫描文件中嵌入的文件签名
binwalk firmware.bin

基本写法:提取嵌入文件 binwalk -e <文件>

# 自动提取文件中的嵌入数据
binwalk -e firmware.bin

基本写法:递归提取 binwalk -eM <文件>

# 递归提取所有嵌套的嵌入文件
binwalk -eM firmware.bin

基本写法:指定提取目录 binwalk -e -C <目录> <文件>

# 指定提取输出目录
binwalk -e -C /tmp/extracted firmware.bin

基本写法:搜索指定签名 binwalk -R "<签名>" <文件>

# 搜索指定的文件签名
binwalk -R "PK" firmware.bin

基本写法:显示熵分析 binwalk -E <文件>

# 显示文件熵分析图(检测加密数据)
binwalk -E firmware.bin

foremost 文件恢复

基本写法:恢复删除的文件 foremost -i <输入文件> -o <输出目录>

# 从镜像文件恢复已删除文件
foremost -i disk.img -o /tmp/recovered

基本写法:指定文件类型 foremost -t <类型> -i <输入文件> -o <输出目录>

# 仅恢复图片与文档文件
foremost -t jpg,png,pdf,doc -i disk.img -o /tmp/recovered

基本写法:从设备恢复 foremost -i /dev/sda1 -o <输出目录>

# 从分区设备恢复文件
sudo foremost -i /dev/sda1 -o /tmp/recovered

基本写法:详细模式恢复 foremost -v -i <输入文件> -o <输出目录>

# 详细模式显示恢复进度
foremost -v -i disk.img -o /tmp/recovered

基本写法:指定配置文件 foremost -c <配置文件> -i <输入文件>

# 使用自定义规则文件恢复
foremost -c /etc/foremost.conf -i disk.img

exiftool 元数据分析

基本写法:查看 EXIF 信息 exiftool <图片文件>

# 查看图片所有 EXIF 元数据
exiftool image.jpg

基本写法:提取 GPS 信息 exiftool -gps* <图片文件>

# 提取图片中的 GPS 位置信息
exiftool -gps* image.jpg

基本写法:删除所有元数据 exiftool -all= <图片文件>

# 删除图片所有元数据保护隐私
exiftool -all= image.jpg

基本写法:批量删除元数据 exiftool -all= -r <目录>

# 递归删除目录下所有图片元数据
exiftool -all= -r /path/to/images/

基本写法:查看注释字段 exiftool -comment -description <图片文件>

# 查看图片注释字段是否含隐藏信息
exiftool -comment -description image.jpg

基本写法:写入隐藏信息 exiftool -comment="<隐藏信息>" <图片文件>

# 在 EXIF 注释字段写入信息
exiftool -comment="hidden message" image.jpg

##音频隐写分析

基本写法:使用 sonic-visualiser 分析 sonic-visualiser <音频文件>

# 使用 sonic-visualiser 分析音频频谱
sonic-visualise audio.wav

基本写法:提取音频 LSB python3 -c "import wave; w=wave.open('<文件>'); print(w.readframes(w.getnframes()))"

# Python 提取音频数据用于分析
python3 -c "import wave; w=wave.open('audio.wav'); data=w.readframes(w.getnframes()); print(data[:100])"

基本写法:使用 stegolsb 嵌入 python3 -m stegolsb -h

# 使用 stegolsb 在音频中嵌入数据
python3 -m stegolsb LSBAudioSteg -i audio.wav -s secret.txt -o output.wav -n 2

基本写法:频谱图分析 sox <音频文件> -n spectrogram

# 生成音频频谱图分析隐藏信息
sox audio.wav -n spectrogram -o spectrogram.png

基本写法:提取音频元数据 exiftool <音频文件>

# 查看音频文件元数据
exiftool audio.mp3

文本隐写工具

基本写法:零宽字符隐写 python3 -c "print('text' + chr(0x200b) + 'hidden')"

# 使用零宽字符隐藏信息
python3 -c "print('正常文本' + chr(0x200b) + chr(0x200c) + '隐藏信息')"

基本写法:Snow 空格隐写 snow -C -m "<消息>" -p <密码> <输入文件> <输出文件>

# 使用 snow 在文本末尾空格中隐藏信息
snow -C -m "secret message" input.txt output.txt

基本写法:Snow 提取信息 snow -C -p <密码> <文件>

# 从文本中提取 snow 隐藏的信息
snow -C -p password output.txt

基本写法:Base64 隐藏 echo "<消息>" | base64

# 使用 Base64 编码隐藏文本信息
echo "hidden message" | base64

基本写法:Unicode 转义隐藏 python3 -c "print('\\u4f60\\u597d')"

# 使用 Unicode 转义隐藏文本
python3 -c "print('显示文本\\u200b隐藏文本')"

隐写检测工具

基本写法:使用 stegdetect 检测 stegdetect <图片文件>

# 检测 JPEG 文件中的隐写
stegdetect image.jpg

基本写法:指定敏感度 stegdetect -t <级别> <图片文件>

# 设置检测敏感度(1-3)
stegdetect -t 3 image.jpg

基本写法:批量检测 stegdetect *.jpg

# 批量检测目录中的所有 JPEG 文件
stegdetect *.jpg

基本写法:使用 stegexpose 检测 python3 stegexpose.py <图片>

# 使用 stegexpose 检测图片隐写
python3 stegexpose.py image.png

基本写法:文件熵分析 python3 -c "import math; data=open('<文件>','rb').read(); print(-sum(data.count(b)/len(data)*math.log2(data.count(b)/len(data)) for b in set(data) if data.count(b)))"

# 计算文件熵值检测是否含加密数据
python3 -c "import math; data=open('image.jpg','rb').read(); ent=-sum(data.count(bytes([b]))/len(data)*math.log2(data.count(bytes([b]))/len(data)) for b in range(256) if data.count(bytes([b]))); print(f'熵值: {ent:.2f}')"

文件指纹与对比

基本写法:计算图片哈希 md5sum <图片文件>

# 计算 MD5 哈希用于对比
md5sum image.jpg

基本写法:对比原图与隐写图 diff <原图哈希> <新图哈希>

# 对比文件大小与哈希
ls -la original.jpg stego.jpg
md5sum original.jpg stego.jpg

基本写法:查看文件大小差异 stat -c "%s %n" <文件1> <文件2>

# 对比两个文件大小
stat -c "%s %n" original.jpg stego.jpg

基本写法:十六进制对比 xxd <文件1> > /tmp/hex1; xxd <文件2> > /tmp/hex2; diff /tmp/hex1 /tmp/hex2

# 十六进制对比两个文件差异
xxd original.jpg > /tmp/hex1.txt
xxd stego.jpg > /tmp/hex2.txt
diff /tmp/hex1.txt /tmp/hex2.txt | head

基本写法:像素差异分析 python3 -c "from PIL import Image; img1=Image.open('<文件1>'); img2=Image.open('<文件2>'); print(img1.size, img2.size)"

# Python 对比图片像素差异
python3 -c "
from PIL import Image
img1=Image.open('original.jpg')
img2=Image.open('stego.jpg')
diff=sum(1 for p1,p2 in zip(img1.getdata(),img2.getdata()) if p1!=p2)
print(f'差异像素数: {diff}')
"