Steganography Analysis Skill
Detect and extract hidden data from images, audio, files, and text.
Setup
./setup.sh # installs all tools project-locally (no sudo)
source scripts/env.sh
See SETUP.md for manual installation fallback.
Decision Tree
What file type are you analyzing?
Image (PNG/BMP)
exiftool image.png— check metadata for hidden fieldspngcheck -v image.png— validate structure, find hidden chunkszsteg -a image.png— LSB pattern detectionpython3 scripts/bit_plane_extract.py image.png --list— bit plane statisticspython3 scripts/png_crc_fix.py image.png— dimension/CRC mismatchbinwalk -e image.png— embedded file extractionunzip image.png -d out/— try as polyglot
Image (JPEG)
exiftool -v3 image.jpg— verbose metadata + structuresteghide extract -sf image.jpg— DCT coefficient extractionjsteg reveal image.jpg— JPEG LSBbinwalk -e image.jpg— embedded data- If password-protected:
stegseek --seed image.jpgfirst, then ask operator for wordlist path
Image (GIF)
- Extract animation frames — look for hidden content in individual frames
gifsicle --color-info image.gif— palette manipulation checkbinwalk -e image.gif— appended data
Audio (WAV/MP3/FLAC)
sox audio.wav -n spectrogram -o spectro.png— visual patterns in frequency domainpython3 scripts/wavsteg.py -i audio.wav -o out.txt -n 1— LSB extractionpython3 scripts/wav_header_check.py audio.wav— appended data after audiomultimon-ng -t wav -a DTMF audio.wav— DTMF phone tones
Text File
cat -A file.txt | head— whitespace patterns (tabs/spaces encoding)python3 scripts/zero_width_decode.py file.txt— zero-width Unicodepython3 scripts/homoglyph_detect.py file.txt— lookalike character substitutionstegsnow -C file.txt— snow whitespace steganography
Any File Type (First Pass)
file suspicious_file # true file type
strings -n 8 suspicious_file | head # readable strings
binwalk suspicious_file # embedded file signatures
xxd suspicious_file | head -20 # magic bytes
Password Needed?
stegseek --seed image.jpg— detect steghide data without a wordlist firststegseek image.jpg wordlist.txt— fast steghide cracker (Linux; on macOS:docker run --rm -it -v "$(pwd):/steg" rickdejager/stegseek)- Ask the operator for wordlist path before brute-forcing. Common locations:
/usr/share/wordlists/rockyou.txt(Kali),~/wordlists/, or the operator may have a custom one. Don't assume a default path exists. - Try common passwords first:
password,flag,secret, the filename, challenge name
Bundled Scripts
All in scripts/, stdlib-only (except bit_plane_extract.py which needs Pillow+numpy):
| Script | Use when |
|---|---|
bit_plane_extract.py |
Visual bit plane analysis (StegSolve replacement) |
png_crc_fix.py |
PNG dimensions don't match CRC — brute-force correct size |
wavsteg.py |
Data hidden in WAV audio LSBs |
wav_header_check.py |
Extra data appended after WAV content |
zero_width_decode.py |
Invisible Unicode characters encoding data |
homoglyph_detect.py |
Cyrillic/Latin or other lookalike character swaps |
External Tools
Installed project-locally by setup.sh. See COMMANDS.md for full usage.
| Tool | What it does |
|---|---|
| zsteg | PNG/BMP LSB pattern detection |
| stegoveritas | Automated multi-tool analysis pass |
| binwalk | Embedded file extraction + entropy analysis |
| steghide | JPEG/WAV/BMP DCT steganography |
| stegseek | Fast steghide passphrase cracker (Linux binary; macOS via Docker) |
| jsteg | JPEG LSB extraction |
| exiftool | Metadata extraction and manipulation |
| pngcheck | PNG structure validation |
| foremost | File carving from raw data |
| stegsnow | Whitespace steganography |
Common Failure Modes
- zsteg returns noise: Try
--alland look for patterns with high confidence scores, not raw output - steghide says "could not extract": File may not contain steghide data, or wrong passphrase — try stegseek
- binwalk finds nothing: File may use LSB/visual stego, not embedded files — try zsteg or bit_plane_extract
- StegSolve won't start: Requires Java. Use
python3 scripts/bit_plane_extract.pyas a CLI alternative - Zero-width decoder returns empty: File may use homoglyphs or whitespace encoding instead — try both detectors