Binwalk

Outil d'analyse et d'extraction de firmware. Parcourt les fichiers binaires à la recherche de systèmes de fichiers embarqués, de données compressées, de code exécutable et de signatures de fichiers connues. Firmware analysis and extraction tool. Scans binary files for embedded filesystems, compressed data, executable code, and known file signatures.

↗ https://github.com/ReFirmLabs/binwalk

Overview

Binwalk analyzes binary files — primarily firmware images — to identify and extract embedded files, filesystems, and data. It uses a signature database to recognize compressed archives, filesystems (SquashFS, JFFS2, ext), certificates, kernel images, and more. Essential for IoT/embedded device analysis.

Basic Analysis

Scan and identify signatures

binwalk firmware.bin

Verbose scan

binwalk -v firmware.bin

Show magic signatures matched

binwalk -B firmware.bin

Entropy analysis (high entropy = compressed/encrypted)

binwalk -E firmware.bin

Plot entropy graph

binwalk -E -J firmware.bin   # JSON output for plotting

Extraction

Auto-extract all identified components

binwalk -e firmware.bin

Extract to specific directory

binwalk -e -C /output/dir firmware.bin

Recursive extraction (extract embedded archives too)

binwalk -eM firmware.bin

Extract specific signature matches

binwalk --extract="zip:unzip %e" firmware.bin

Carve files at specific offset

dd if=firmware.bin bs=1 skip=OFFSET count=SIZE of=extracted.bin

Filesystem Analysis (after extraction)

After extraction, examine the _firmware.bin.extracted/ directory

ls _firmware.bin.extracted/
# Common findings:
# squashfs-root/  → root filesystem
# etc/passwd      → user accounts
# etc/shadow      → hashed passwords
# www/            → web interface files
# usr/sbin/       → binaries to reverse

# Find interesting files
find _firmware.bin.extracted/ -name "*.conf" -o -name "*.xml" -o -name "*.key"
find _firmware.bin.extracted/ -name "passwd" -o -name "shadow"
grep -r "password" _firmware.bin.extracted/ 2>/dev/null

Specific Filesystem Tools

# Mount SquashFS
sudo mount -o loop squashfs-root.squashfs /mnt/squash
# or
unsquashfs squashfs-root.squashfs

# JFFS2
modprobe jffs2; modprobe mtdram; modprobe mtdblock; modprobe mtdchar
dd if=jffs2.img of=/dev/mtd0
mount -t jffs2 /dev/mtdblock0 /mnt/jffs2

cramfs

sudo mount -o loop cramfs.img /mnt/cramfs

String Analysis

# Find strings in firmware (cleartext creds, keys, URLs)
strings firmware.bin | grep -i "passw\|secret\|key\|admin"
strings firmware.bin | grep -E "https?://"
strings firmware.bin | grep -E "[A-Za-z0-9+/]{40,}={0,2}"  # base64

Tips

  • binwalk -eM (recursive) is the most thorough; it can take a while on complex firmware
  • High entropy regions (>0.9 on entropy plot) indicate encryption — these can’t be extracted
  • After extraction, treat the squashfs-root/ like a real Linux filesystem
  • Look for hardcoded credentials, private keys, and API tokens in config files
Help / Man page
binwalk [options] file1 [file2 ...]

Signature Scan:
  -B, --signature       Scan for common signatures (default)
  -R, --raw=str         Scan for raw string sequence
  -A, --opcodes         Scan for CPU instructions
  -m, --magic=file      Custom magic file

Extraction:
  -e, --extract         Auto-extract known file types
  -M, --matryoshka      Recursive extraction
  -C, --directory=dir   Output directory
  -j, --size=int        Limit extracted file sizes
  -n, --count=int       Limit number of extracted files
  -0, --run-as=str      Run as specified user

Entropy:
  -E, --entropy         Calculate entropy
  -F, --fast            Use faster entropy calculation
  -J, --save            Save entropy graph as image

Formatting:
  -v, --verbose         Verbose output
  -t, --term            Fit output to terminal width
  -q, --quiet           Suppress output
  -l, --length=int      Bytes to scan
  -o, --offset=int      Starting offset

Vue d’ensemble

Binwalk analyse les fichiers binaires, principalement les images de firmware, pour identifier et extraire les fichiers, systèmes de fichiers et données embarqués. Il s’appuie sur une base de signatures pour reconnaître les archives compressées, les systèmes de fichiers (SquashFS, JFFS2, ext), les certificats, les images de kernel, et plus. Indispensable pour l’analyse d’appareils IoT/embarqués.

Analyse de base

# Parcourir et identifier les signatures
binwalk firmware.bin

# Scan verbeux
binwalk -v firmware.bin

# Afficher les signatures magic correspondantes
binwalk -B firmware.bin

# Analyse d'entropie (entropie élevée = compressé/chiffré)
binwalk -E firmware.bin

# Tracer le graphe d'entropie
binwalk -E -J firmware.bin   # Sortie JSON pour le tracé

Extraction

# Extraire automatiquement tous les composants identifiés
binwalk -e firmware.bin

# Extraire vers un répertoire spécifique
binwalk -e -C /output/dir firmware.bin

# Extraction récursive (extrait aussi les archives embarquées)
binwalk -eM firmware.bin

# Extraire des correspondances de signature spécifiques
binwalk --extract="zip:unzip %e" firmware.bin

# Découper un fichier à un offset précis
dd if=firmware.bin bs=1 skip=OFFSET count=SIZE of=extracted.bin

Analyse du système de fichiers (après extraction)

# Après extraction, examiner le répertoire _firmware.bin.extracted/
ls _firmware.bin.extracted/
# Découvertes courantes :
# squashfs-root/  → système de fichiers racine
# etc/passwd      → comptes utilisateurs
# etc/shadow      → mots de passe hachés
# www/            → fichiers de l'interface web
# usr/sbin/       → binaires à reverser

# Trouver les fichiers intéressants
find _firmware.bin.extracted/ -name "*.conf" -o -name "*.xml" -o -name "*.key"
find _firmware.bin.extracted/ -name "passwd" -o -name "shadow"
grep -r "password" _firmware.bin.extracted/ 2>/dev/null

Outils spécifiques par système de fichiers

# Monter du SquashFS
sudo mount -o loop squashfs-root.squashfs /mnt/squash
# ou
unsquashfs squashfs-root.squashfs

# JFFS2
modprobe jffs2; modprobe mtdram; modprobe mtdblock; modprobe mtdchar
dd if=jffs2.img of=/dev/mtd0
mount -t jffs2 /dev/mtdblock0 /mnt/jffs2
# cramfs
sudo mount -o loop cramfs.img /mnt/cramfs

Analyse des chaînes

# Trouver des chaînes dans le firmware (identifiants en clair, clés, URLs)
strings firmware.bin | grep -i "passw\|secret\|key\|admin"
strings firmware.bin | grep -E "https?://"
strings firmware.bin | grep -E "[A-Za-z0-9+/]{40,}={0,2}"  # base64

Conseils

  • binwalk -eM (récursif) est le plus exhaustif ; cela peut prendre un moment sur un firmware complexe
  • Les régions à haute entropie (>0,9 sur le graphe d’entropie) indiquent du chiffrement : elles ne peuvent pas être extraites
  • Après extraction, traitez le squashfs-root/ comme un vrai système de fichiers Linux
  • Cherchez des identifiants en dur, des clés privées et des tokens d’API dans les fichiers de configuration
Aide / Page de manuel
binwalk [options] file1 [file2 ...]

Signature Scan:
  -B, --signature       Scan for common signatures (default)
  -R, --raw=str         Scan for raw string sequence
  -A, --opcodes         Scan for CPU instructions
  -m, --magic=file      Custom magic file

Extraction:
  -e, --extract         Auto-extract known file types
  -M, --matryoshka      Recursive extraction
  -C, --directory=dir   Output directory
  -j, --size=int        Limit extracted file sizes
  -n, --count=int       Limit number of extracted files
  -0, --run-as=str      Run as specified user

Entropy:
  -E, --entropy         Calculate entropy
  -F, --fast            Use faster entropy calculation
  -J, --save            Save entropy graph as image

Formatting:
  -v, --verbose         Verbose output
  -t, --term            Fit output to terminal width
  -q, --quiet           Suppress output
  -l, --length=int      Bytes to scan
  -o, --offset=int      Starting offset