关于 performing-steganography-detection
这是一份面向调查人员和安全分析人员的隐写检测流程,用于检查图像、音频和视频中的隐藏数据。流程结合元数据检查、自动化工具、LSB 分析及报告整理。
主要功能
- 01检查媒体元数据异常
- 02使用工具扫描嵌入数据
- 03分析图像的 LSB
- 04检查音频和视频隐写迹象
- 05整理检测结果报告
适用场景
- 01调查媒体文件中的隐蔽通信
- 02检查图片上传中的数据外传迹象
- 03分析恶意软件下载的图像
- 04检查音频文件中的隐藏文档
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill performing-steganography-detection安装后在 Claude Code 中输入/performing-steganography-detection确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEreferences/api-reference.mdscripts/agent.py详细介绍
执行隐写术检测
何时使用
- 当怀疑图像、音频或视频文件中隐藏了隐蔽数据时
- 在涉及疑似通过媒体文件进行数据外泄的调查期间
- 用于分析间谍活动或内部威胁调查中的文件
- 当标准文件分析发现媒体文件属性异常时
- 用于检测使用隐写技术的通信渠道
前提条件
- 用于分析的 StegDetect、zsteg、stegsolve、binwalk
- 用于尝试提取的 steghide、OpenStego
- 用于元数据分析的 ExifTool
- 带有 Pillow、numpy 的 Python,用于自定义分析
- 理解常见隐写技术(LSB、DCT、扩频)
- 用于比较和统计分析的样本文件
工作流
步骤 1:初始文件评估和元数据分析
# Install steganography detection tools
sudo apt-get install steghide stegsnow
pip install zsteg
pip install stegoveritas
gem install zsteg # Ruby-based tool for PNG/BMP
# Examine file metadata for anomalies
exiftool /cases/case-2024-001/media/suspect_image.jpg | tee /cases/case-2024-001/analysis/metadata.txt
# Check for unusual file size (larger than expected for resolution/format)
identify -verbose /cases/case-2024-001/media/suspect_image.jpg | head -30
# Verify file type matches extension
file /cases/case-2024-001/media/suspect_image.jpg
# Confirm JPEG signature vs actual content
# Check for appended data after file footer
python3 << 'PYEOF'
import os
filepath = '/cases/case-2024-001/media/suspect_image.jpg'
filesize = os.path.getsize(filepath)
with open(filepath, 'rb') as f:
data = f.read()
# JPEG files end with FF D9
jpeg_end = data.rfind(b'\xff\xd9')
if jpeg_end > 0:
trailing_bytes = filesize - jpeg_end - 2
if trailing_bytes > 0:
print(f"WARNING: {trailing_bytes} bytes of data after JPEG end marker!")
print(f" File size: {filesize} bytes")
print(f" JPEG data: {jpeg_end + 2} bytes")
print(f" Hidden data: {trailing_bytes} bytes")
# Extract trailing data
with open('/cases/case-2024-001/analysis/trailing_data.bin', 'wb') as out:
out.write(data[jpeg_end + 2:])
else:
print("No trailing data detected after JPEG end marker")
# Check for embedded ZIP/RAR archives
zip_offset = data.find(b'PK\x03\x04')
rar_offset = data.find(b'Rar!\x1a\x07')
if zip_offset > 0:
print(f"ZIP archive found at offset {zip_offset}")
if rar_offset > 0:
print(f"RAR archive found at offset {rar_offset}")
PYEOF
步骤 2:运行自动化隐写分析工具
# Use binwalk to detect embedded files and data
binwalk /cases/case-2024-001/media/suspect_image.jpg | tee /cases/case-2024-001/analysis/binwalk_scan.txt
# Extract embedded files
binwalk --extract --directory /cases/case-2024-001/analysis/binwalk_extracted/ \
/cases/case-2024-001/media/suspect_image.jpg
# Use zsteg for PNG and BMP analysis (LSB detection)
zsteg /cases/case-2024-001/media/suspect_image.png | tee /cases/case-2024-001/analysis/zsteg_results.txt
# zsteg with all checks
zsteg -a /cases/case-2024-001/media/suspect_image.png
# Use stegoveritas for comprehensive analysis
stegoveritas /cases/case-2024-001/media/suspect_image.jpg \
-out /cases/case-2024-001/analysis/stegoveritas/
# Stegoveritas performs:
# - Metadata extraction
# - LSB analysis (multiple bit planes)
# - Color map analysis
# - Trailing data detection
# - Embedded file extraction
# - Image transformation analysis
# Use steghide for JPEG/BMP/WAV/AU extraction attempts
# Try with empty password
steghide extract -sf /cases/case-2024-001/media/suspect_image.jpg -p "" \
-xf /cases/case-2024-001/analysis/steghide_extract.bin 2>&1
# Try with common passwords
for pwd in password secret hidden stego test 123456 admin; do
result=$(steghide extract -sf /cases/case-2024-001/media/suspect_image.jpg \
-p "$pwd" -xf "/cases/case-2024-001/analysis/steghide_$pwd.bin" 2>&1)
if echo "$result" | grep -q "extracted"; then
echo "SUCCESS with password: $pwd"
fi
done
步骤 3:执行 LSB(最低有效位)分析
# Custom LSB analysis with Python
python3 << 'PYEOF'
from PIL import Image
import numpy as np
img = Image.open('/cases/case-2024-001/media/suspect_image.png')
pixels = np.array(img)
# Extract LSB from each color channel
for channel, name in enumerate(['Red', 'Green', 'Blue']):
if channel >= pixels.shape[2]:
break
lsb_data = pixels[:, :, channel] & 1
# Count distribution (should be ~50/50 for natural images)
zeros = np.sum(lsb_data == 0)
ones = np.sum(lsb_data == 1)
total = zeros + ones
ratio = ones / total
print(f"{name} channel LSB: 0s={zeros} ({zeros/total*100:.1f}%), 1s={ones} ({ones/total*100:.1f}%)")
if abs(ratio - 0.5) < 0.01:
print(f" NEUTRAL - Close to random (could be stego or natural)")
elif ratio > 0.55 or ratio < 0.45:
print(f" ANOMALY - Significant deviation from expected distribution")
# Extract LSB data as bytes
lsb_bits = (pixels[:, :, 0] & 1).flatten()
lsb_bytes = np.packbits(lsb_bits)
# Check if extracted data has structure
with open('/cases/case-2024-001/analysis/lsb_extracted.bin', 'wb') as f:
f.write(lsb_bytes.tobytes())
# Check for known file signatures in extracted data
import struct
header = bytes(lsb_bytes[:16])
print(f"\nLSB extracted header (hex): {header.hex()}")
if header[:4] == b'PK\x03\x04':
print(" DETECTED: ZIP archive in LSB data!")
elif header[:3] == b'GIF':
print(" DETECTED: GIF image in LSB data!")
elif header[:4] == b'\x89PNG':
print(" DETECTED: PNG image in LSB data!")
elif header[:2] == b'\xff\xd8':
print(" DETECTED: JPEG image in LSB data!")
# Generate LSB visualization
lsb_img = Image.fromarray((lsb_data * 255).astype(np.uint8))
lsb_img.save('/cases/case-2024-001/analysis/lsb_visualization.png')
print("\nLSB visualization saved to lsb_visualization.png")
PYEOF
步骤 4:分析音频和视频隐写术
# Spectral analysis of audio files
python3 << 'PYEOF'
import wave
import numpy as np
# Analyze WAV file for audio steganography
with wave.open('/cases/case-2024-001/media/suspect_audio.wav', 'r') as wav:
frames = wav.readframes(wav.getnframes())
samples = np.frombuffer(frames, dtype=np.int16)
# LSB analysis of audio samples
lsb = samples & 1
zeros = np.sum(lsb == 0)
ones = np.sum(lsb == 1)
total = len(lsb)
print(f"Audio LSB Analysis:")
print(f" Samples: {total}")
print(f" LSB 0s: {zeros} ({zeros/total*100:.1f}%)")
print(f" LSB 1s: {ones} ({ones/total*100:.1f}%)")
# Extract LSB data
lsb_bytes = np.packbits(lsb)
with open('/cases/case-2024-001/analysis/audio_lsb.bin', 'wb') as f:
f.write(lsb_bytes.tobytes())
# Chi-square test for randomness
from scipy import stats
chi2, p_value = stats.chisquare([zeros, ones])
print(f" Chi-square: {chi2:.4f}, p-value: {p_value:.4f}")
if p_value < 0.05:
print(f" ANOMALY: LSB distribution is not random (potential stego)")
PYEOF
# Use steghide on audio files
steghide info /cases/case-2024-001/media/suspect_audio.wav
# Analyze with sonic-visualiser or audacity for spectral anomalies
# (Check spectrogram for hidden images encoded in frequency domain)
步骤 5:生成隐写分析报告
# Compile findings
python3 << 'PYEOF'
import os, json
report = {
"case": "2024-001",
"files_analyzed": [],
"findings": []
}
analysis_dir = '/cases/case-2024-001/analysis/'
for f in os.listdir(analysis_dir):
if f.endswith('.txt'):
with open(os.path.join(analysis_dir, f)) as fh:
content = fh.read()
if 'DETECTED' in content or 'SUCCESS' in content or 'WARNING' in content:
report["findings"].append({
"source": f,
"content": content[:500]
})
with open('/cases/case-2024-001/analysis/steg_report.json', 'w') as f:
json.dump(report, f, indent=2)
print("Steganalysis report generated")
print(f"Total findings: {len(report['findings'])}")
PYEOF
关键概念
| 概念 | 描述 |
|---|---|
| LSB(最低有效位) | 将数据嵌入像素或样本值的最低阶位中 |
| DCT 隐写术 | 将数据隐藏在 JPEG 离散余弦变换系数中 |
| 扩频 | 将隐藏数据分布到整个载波信号中 |
| 隐写分析 | 检测隐藏信息是否存在的科学 |
| 卡方攻击 | 检测非随机 LSB 分布的统计检验 |
| 载体介质 | 用于承载隐藏数据的原始文件(图像、音频、视频) |
| 隐写介质 | 嵌入隐藏数据后得到的文件 |
| 容量 | 在不产生可见失真的情况下可隐藏的最大数据量 |
工具与系统
| 工具 | 用途 |
|---|---|
| steghide | 在 JPEG、BMP、WAV、AU 文件中嵌入/提取数据 |
| zsteg | 检测 PNG 和 BMP 文件中的 LSB 隐写术 |
| binwalk | 检测二进制文件中嵌入的文件和数据 |
| stegoveritas | 具有多种检测方法的综合隐写分析工具 |
| StegSolve | 用于图像位平面和滤镜分析的 Java GUI 工具 |
| OpenStego | 开源隐写和水印工具 |
| ExifTool | 媒体文件的元数据提取和分析 |
| stegseek | 用于 JPEG 隐写提取的快速 steghide 密码破解工具 |
常见场景
场景 1:隐蔽通信调查 检查嫌疑人通过消息平台交换的图像,对所有 PNG/BMP 文件运行 stegoveritas 和 zsteg,使用已知密码尝试对 JPEG 文件进行 steghide 提取,分析 LSB 分布的统计异常,提取并解码任何隐藏消息。
场景 2:通过图像上传进行数据外泄 监控上传到云服务的图像是否存在异常文件大小,将图像元数据与预期的相机/设备配置文件进行比较,运行 binwalk 以检测嵌入的归档文件,分析 JPEG 量化表以寻找 steghide 特征,提取并检查任何隐藏载荷。
场景 3:恶意软件命令与控制 分析恶意软件下载的图像中是否包含嵌入命令,检查文件结束标记之后是否追加了数据,检查 DNS 查询响应中 TXT 记录内的 base64 编码数据,分析 PNG IDAT 块是否存在异常的压缩数据大小。
场景 4:通过音频文件进行知识产权盗窃 分析音频文件中是否通过 LSB 嵌入了文档,检查频谱图以寻找隐藏在频域中的视觉模式,将音频文件大小与比特率和时长对应的预期大小进行比较,提取并分析任何隐藏数据载荷。
输出格式
Steganalysis Summary:
Files Analyzed: 45 (32 images, 8 audio, 5 video)
Detection Results:
suspect_image_03.png:
zsteg: Text detected in R channel LSB
Content: "Meet at location B, Tuesday 1400"
Method: LSB embedding in Red channel
suspect_photo_17.jpg:
steghide: Data extracted with password "secret123"
Hidden file: confidential_report.pdf (234 KB)
Method: DCT coefficient modification
profile_pic.png:
binwalk: ZIP archive embedded at offset 45678
Contents: 3 spreadsheet files with financial data
Method: Data appended after PNG IEND marker
recording_05.wav:
LSB analysis: Non-random distribution (p < 0.001)
Extracted: 12 KB binary payload (further analysis needed)
Method: Audio LSB embedding
Clean Files: 41 (no steganographic indicators)
Suspicious Files: 4 (data extracted)
Report: /cases/case-2024-001/analysis/steg_report.json
评论
支持 Markdown