
For nogle dage siden besluttede jeg at foretage reverse engineering af firmwaren til min router ved hjælp af binwalk.
Jeg har købt mig en . Ikke den bedste router, men den er helt tilstrækkelig til mine behov.
Hver gang jeg køber en ny router, installerer jeg . Hvorfor? Som regel er producenterne ikke særlig interesserede i at understøtte deres routere, og over tid bliver softwaren forældet, der opstår sårbarheder og så videre, så I forstår. Derfor foretrækker jeg en godt understøttet open-source firmware som OpenWRT.
Efter at have downloadet OpenWRT har jeg også til min nye Archer C7 fra den officielle hjemmeside og besluttet at analysere den. Bare for sjov og for at fortælle om binwalk.
Hvad er binwalk?
er et open source værktøj til analyse, reverse engineering og udtræk af firmwarebilleder.
Skabt i 2010 af Craig Heffner, kan binwalk scanne firmwarebilleder og finde filer, identificere og udtrække filsystembilleder, eksekverbar kode, komprimerede arkiver, bootere og kerner, filtyper som JPEG og PDF og meget mere.
Du kan bruge binwalk til at reverse engineere firmwaren for at forstå, hvordan den fungerer. Søg i binære filer efter sårbarheder, udtræk filer og led efter backdoors eller digitale certifikater. Man kan også finde opcodes til mange forskellige CPU'er.
Du kan udpakke filsystembilleder for at lede efter specifikke filtyper af adgangskoder (passwd, shadow osv.) og forsøge at bryde adgangskode-hashes. Du kan udføre binær analyse mellem to eller flere filer. Du kan udføre entropianalyse af data for at finde komprimerede data eller kodede krypteringsnøgler. Alt dette uden behov for adgang til kildekoden.
Kort sagt, alt hvad du behøver, er her 🙂
Hvordan fungerer binwalk?
Den primære funktion i binwalk er dens signatur scanning. Binwalk kan scanne firmwarebilleder for at finde forskellige indlejrede filtyper og filsystemer.
Kender du kommandolinjeværktøjet file?
file /bin/bash
/bin/bash: ELF 64-bit LSB delt objekt, x86-64, version 1 (SYSV), dynamisk linket, fortolker /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=12f73d7a8e226c663034529c8dd20efec22dde54, strippedKommandoen fileser på filens header og leder efter en signatur (magisk nummer) for at bestemme filtypen. For eksempel, hvis filen starter med byte-sekvensen 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A, hun ved, at det er en PNG-fil. På der er en liste over almindelige filsignaturer.
Binwalk fungerer på samme måde. Men i stedet for kun at søge efter signaturer i begyndelsen af filen, vil binwalk scanne hele filen. Derudover kan binwalk udtrække filer, der findes i billedet.
Værktøjer file og binwalk bruger et bibliotek libmagic til at identificere filsignaturer. Men binwalk understøtter desuden en liste over brugerdefinerede magiske signaturer til at søge efter komprimerede / arkiverede filer, firmware-headere, Linux-kerneler, bootloadere, filsystemer osv.
Lad os have det sjovt?
Installation af binwalk
Binwalk understøttes på flere platforme, herunder Linux, OSX, FreeBSD og Windows.
For at installere den nyeste version af binwalk kan du og følge eller , der er tilgængelig på projektets websted.
Binwalk har mange forskellige parametre:
$ binwalk
Binwalk v2.2.0
Craig Heffner, ReFirmLabs
https://github.com/ReFirmLabs/binwalk
Brug: binwalk [OPTIONS] [FILE1] [FILE2] [FILE3] ...
Signatur Scanning Indstillinger:
-B, --signature Scanning målfil(er) for almindelige filsignaturer
-R, --raw= Scanning målfil(er) for den angivne byte-sekvens
-A, --opcodes Scanning målfil(er) for almindelige eksekverbare opcode signaturer
-m, --magic= Angiv en brugerdefineret magic-fil til brug
-b, --dumb Deaktiver smarte signatur-nøgleord
-I, --invalid Vis resultater markeret som ugyldige
-x, --exclude= Udeluk resultater, der matcher
-y, --include= Vis kun resultater, der matcher
Udtrækningsmuligheder:
-e, --extract Udfør automatisk udtræk af kendte filtyper
-D, --dd= Uddrag signaturer, giv filerne en udvidelse af , og udfør
-M, --matryoshka Rekursiv scanning af udtrukne filer
-d, --depth= Begræns matryoshka-rekursion dybde (standard: 8 niveauer dyb)
-C, --directory= Uddrag filer/mapper til en brugerdefineret mappe (standard: nuværende arbejdsmappe)
-j, --size= Begræns størrelsen af hver udtrukken fil
-n, --count= Begræns antallet af udtrukne filer
-r, --rm Slet skårne filer efter udtrækning
-z, --carve Udhul data fra filer, men udfør ikke udtræksværktøjer
-V, --subdirs Uddrag til underkataloger navngivet efter offset
Entropi Indstillinger:
-E, --entropy Beregn filers entropi
-F, --fast Brug hurtigere, men mindre detaljeret, entropi-analyse
-J, --save Gem plot som en PNG
-Q, --nlegend Udelad legenden fra entropi plot grafen
-N, --nplot Generer ikke en entropi plot graf
-H, --high= Indstil tærskel for stigende edge entropi trigger (standard: 0.95)
-L, --low= Indstil tærskel for faldende edge entropi trigger (standard: 0.85)
Binær Diffing Indstillinger:
-W, --hexdump Udfør en hexdump / diff af en eller flere filer
-G, --green Vis kun linjer, der indeholder bytes, der er de samme blandt alle filer
-i, --red Vis kun linjer, der indeholder bytes, der er forskellige blandt alle filer
-U, --blue Vis kun linjer, der indeholder bytes, der er forskellige blandt nogle filer
-u, --similar Vis kun linjer, der er de samme mellem alle filer
-w, --terse Diff alle filer, men vis kun en hexdump af den første fil
Rå Komprimeringsindstillinger:
-X, --deflate Scanning for rå deflate komprimeringsstrømme
-Z, --lzma Scanning for rå LZMA komprimeringsstrømme
-P, --partial Udfør en overfladisk, men hurtigere, scanning
-S, --stop Stop efter det første resultat
Generelle Indstillinger:
-l, --length= Antal bytes, der skal scannes
-o, --offset= Start scanning på denne fil-offset
-O, --base= Tilsæt en basisadresse til alle udskrevne offsets
-K, --block= Indstil filblok størrelse
-g, --swap= Vend hver n byte før scanning
-f, --log= Log resultater til fil
-c, --csv Log resultater til fil i CSV format
-t, --term Formater output til at passe til terminalvinduet
-q, --quiet Undertrykt output til stdout
-v, --verbose Aktiver detaljeret output
-h, --help Vis hjælpe-output
-a, --finclude= Scan kun filer, hvis navne matcher denne regex
-p, --fexclude= Scann ikke filer, hvis navne matcher denne regex
-s, --status= Aktiver statusserveren på den angivne portScanning images
Let's start by searching for file signatures within the image (image from the site ).
Running binwalk with the parameter —signature:
$ binwalk --signature --term archer-c7.bin
DECIMAL HEXADECIMAL DESCRIPTION
------------------------------------------------------------------------------------------
21876 0x5574 U-Boot version string, "U-Boot 1.1.4-g4480d5f9-dirty (May
20 2019 - 18:45:16)"
21940 0x55B4 CRC32 polynomial table, big endian
23232 0x5AC0 uImage header, header size: 64 bytes, header CRC:
0x386C2BD5, created: 2019-05-20 10:45:17, image size:
41162 bytes, Data Address: 0x80010000, Entry Point:
0x80010000, data CRC: 0xC9CD1E38, OS: Linux, CPU: MIPS,
image type: Firmware Image, compression type: lzma, image
name: "u-boot image"
23296 0x5B00 LZMA compressed data, properties: 0x5D, dictionary size:
8388608 bytes, uncompressed size: 97476 bytes
64968 0xFDC8 XML document, version: "1.0"
78448 0x13270 uImage header, header size: 64 bytes, header CRC:
0x78A267FF, created: 2019-07-26 07:46:14, image size:
1088500 bytes, Data Address: 0x80060000, Entry Point:
0x80060000, data CRC: 0xBB9D4F94, OS: Linux, CPU: MIPS,
image type: Multi-File Image, compression type: lzma,
image name: "MIPS OpenWrt Linux-3.3.8"
78520 0x132B8 LZMA compressed data, properties: 0x6D, dictionary size:
8388608 bytes, uncompressed size: 3164228 bytes
1167013 0x11CEA5 Squashfs filesystem, little endian, version 4.0,
compression:xz, size: 14388306 bytes, 2541 inodes,
blocksize: 65536 bytes, created: 2019-07-26 07:51:38
15555328 0xED5B00 gzip compressed data, from Unix, last modified: 2019-07-26
07:51:41Now we have plenty of information about this image.
The image uses as the bootloader (header of the image at address 0x5AC0 and the compressed bootloader image at address 0x5B00). Based on the uImage header at address 0x13270, we know that the CPU architecture is MIPS, and the Linux kernel is version 3.3.8. And based on the image found at address 0x11CEA5, we can see that rootfs is the filesystem squashfs.
Now let's unpack the bootloader (U-Boot) using the command dd:
$ dd if=archer-c7.bin of=u-boot.bin.lzma bs=1 skip=23296 count=41162
41162+0 records in
41162+0 records out
41162 bytes (41 kB, 40 KiB) copied, 0.0939608 s, 438 kB/sSince the image is compressed with LZMA, we need to unpack it:
$ unlzma u-boot.bin.lzmaNow we have the U-Boot image:
$ ls -l u-boot.bin
-rw-rw-r-- 1 sprado sprado 97476 Feb 5 08:48 u-boot.binHow about searching for the default value for bootargs?
$ strings u-boot.bin | grep bootargs
bootargs
bootargs=console=ttyS0,115200 board=AP152 rootfstype=squashfs init=/etc/preinit mtdparts=spi0.0:128k(factory-uboot),192k(u-boot),64k(ART),1536k(uImage),14464k@0x1e0000(rootfs) mem=128MU-Boot environment variable bootargs bruges til at overføre parametre til Linux-kernen. Og fra det ovenfor kan vi bedre forstå enhedens flashhukommelse.
Hvad med at udtrække Linux-kernens billede?
$ dd if=archer-c7.bin of=uImage bs=1 skip=78448 count=1088572
1088572+0 posteret ind
1088572+0 posteret ud
1088572 bytes (1,1 MB, 1,0 MiB) kopieret, 1,68628 s, 646 kB/sVi kan kontrollere, at billedet er blevet udtrukket med kommandoen file:
$ file uImage
uImage: u-boot legacy uImage, MIPS OpenWrt Linux-3.3.8, Linux/MIPS, Multi-File Image (lzma), 1088500 bytes, Fre Jul 26 07:46:14 2019, Load Address: 0x80060000, Entry Point: 0x80060000, Header CRC: 0x78A267FF, Data CRC: 0xBB9D4F94Formatet af uImage-filen er primært billedet af Linux-kernen med en ekstra header. Lad os fjerne denne header for at få det endelige billede af Linux-kernen:
$ dd if=uImage of=Image.lzma bs=1 skip=72
1088500+0 posteret ind
1088500+0 posteret ud
1088500 bytes (1,1 MB, 1,0 MiB) kopieret, 1,65603 s, 657 kB/sBilledet er komprimeret, så lad os pakke det ud:
$ unlzma Image.lzmaNu har vi billedet af Linux-kernen:
$ ls -la Image
-rw-rw-r-- 1 sprado sprado 3164228 Feb 5 10:51 ImageHvad kan vi gøre med billedet af kernen? Vi kunne for eksempel søge gennem billederne og finde versionen af Linux-kernen og lære om miljøet, der blev brugt til at bygge kernen:
$ strings Image | grep "Linux version"
Linux version 3.3.8 (leo@leo-MS-7529) (gcc version 4.6.3 20120201 (prerelease) (Linaro GCC 4.6-2012.02) ) #1 Man May 20 18:53:02 CST 2019Selvom firmwaren blev udgivet sidste år (2019), da jeg skrev denne artikel, bruger den en gammel version af Linux-kernen (3.3.8), der blev udgivet i 2012, kompilering med en meget gammel version af GCC (4.6) også fra 2012!
(bem. overs. stoler du stadig på dine routere på kontoret og derhjemme?)
Med mulighed --opcodes kan vi også bruge binwalk til at finde maskininstruktioner og bestemme billedets processorarkitektur:
$ binwalk --opcodes Image
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
2400 0x960 MIPS instruktioner, funktion epilog
2572 0xA0C MIPS instruktioner, funktion epilog
2828 0xB0C MIPS instruktioner, funktion epilogHvad med roden af filsystemet? I stedet for at udtrække billedet manuelt, lad os bruge muligheden binwalk --extract:
$ binwalk --extract --quiet archer-c7.binHele roden af filsystemet vil blive udtrukket til en undermappe:
$ cd _archer-c7.bin.extracted/squashfs-root/
$ ls
bin dev etc lib mnt overlay proc rom root sbin sys tmp usr var www
$ cat etc/banner
MM NM MMMMMMM M M
$MMMMM MMMMM MMMMMMMMMMM MMM MMM
MMMMMMMM MM MMMMM. MMMMM:MMMMMM: MMMM MMMMM
MMMM= MMMMMM MMM MMMM MMMMM MMMM MMMMMM MMMM MMMMM'
MMMM= MMMMM MMMM MM MMMMM MMMM MMMM MMMMNMMMMM
MMMM= MMMM MMMMM MMMMM MMMM MMMM MMMMMMMM
MMMM= MMMM MMMMMM MMMMM MMMM MMMM MMMMMMMMM
MMMM= MMMM MMMMM, NMMMMMMMM MMMM MMMM MMMMMMMMMMM
MMMM= MMMM MMMMMM MMMMMMMM MMMM MMMM MMMM MMMMMM
MMMM= MMMM MM MMMM MMMM MMMM MMMM MMMM MMMM
MMMM$ ,MMMMM MMMMM MMMM MMM MMMM MMMMM MMMM MMMM
MMMMMMM: MMMMMMM M MMMMMMMMMMMM MMMMMMM MMMMMMM
MMMMMM MMMMN M MMMMMMMMM MMMM MMMM
MMMM M MMMMMMM M M
M
---------------------------------------------------------------
For those about to rock... (%C, %R)
---------------------------------------------------------------Nu kan vi lave mange forskellige ting.
Vi kan søge efter konfigurationsfiler, adgangskodehashes, kryptografiske nøgler og digitale certifikater. Vi kan analysere binære filer for og sårbarheder.
Ved hjælp af og vi kan endda køre (emulere) en eksekverbar fil fra billedet:
$ ls
bin dev etc lib mnt overlay proc rom root sbin sys tmp usr var www
$ cp /usr/bin/qemu-mips-static .
$ sudo chroot . ./qemu-mips-static bin/busybox
BusyBox v1.19.4 (2019-05-20 18:13:49 CST) multi-call binary.
Copyright (C) 1998-2011 Erik Andersen, Rob Landley, Denys Vlasenko
and others. Licensed under GPLv2.
See source distribution for full notice.
Usage: busybox [funktion] [argumenter]...
or: busybox --list[-full]
or: funktion [argumenter]...
BusyBox er et multi-call binær, der kombinerer mange almindelige Unix
værktøjer i en enkelt eksekverbar fil. De fleste vil oprette et
link til busybox for hver funktion, de ønsker at bruge, og BusyBox
vil fungere som det, det blev kaldt som.
Aktuelt definerede funktioner:
[, [[, addgroup, adduser, arping, ash, awk, basename, cat, chgrp, chmod, chown, chroot, clear, cmp, cp, crond, crontab, cut, date, dd, delgroup, deluser, dirname, dmesg, echo, egrep, env, expr, false,
fgrep, find, free, fsync, grep, gunzip, gzip, halt, head, hexdump, hostid, id, ifconfig, init, insmod, kill, killall, klogd, ln, lock, logger, ls, lsmod, mac_addr, md5sum, mkdir, mkfifo, mknod, mktemp,
mount, mv, nice, passwd, pgrep, pidof, ping, ping6, pivot_root, poweroff, printf, ps, pwd, readlink, reboot, reset, rm, rmdir, rmmod, route, sed, seq, sh, sleep, sort, start-stop-daemon, strings,
switch_root, sync, sysctl, tail, tar, tee, telnet, test, tftp, time, top, touch, tr, traceroute, true, udhcpc, umount, uname, uniq, uptime, vconfig, vi, watchdog, wc, wget, which, xargs, yes, zcatFedt! Men bemærk, at versionen af BusyBox er 1.19.4. Det er en meget gammel version af BusyBox, der blev udgivet i april 2012.
Således udgiver TP-Link en firmwarebillede i 2019 ved brug af software (GCC toolchain, kernel, BusyBox osv.) fra 2012!
Nu forstår du, hvorfor jeg altid installerer OpenWRT på mine routere?
Det er endnu ikke alt
Binwalk kan også udføre entropianalyse, udskrive rå entropidata og generere entropigrafer. Stor entropi ses typisk, når bytes i billedet er tilfældige. Dette kan betyde, at billedet indeholder en krypteret, komprimeret eller obfuskateret fil. Hårdkode-krypteringsnøgle? Hvorfor ikke.

Vi kan også bruge parameteren --raw til at søge efter en brugerdefineret sekvens af rå bytes i billedet eller parameteren --hexdump til at udføre en hex dump, der sammenligner to eller flere indtastningsfiler.
kan tilføjes til binwalk enten via en brugerdefineret signaturfil angivet på kommandolinjen med parameteren --magic, eller ved at tilføje dem til katalogen $ HOME / .config / binwalk / magic.
Du kan finde flere oplysninger om binwalk i .
Binwalk-udvidelsen
Der findes binwalk, implementeret som et Python-modul, der kan bruges af enhver Python-script til programmatisk at udføre binwalk-scanning, og kommandolinjeværktøjet binwalk kan næsten helt genskabes med blot to linjer Python-kode!
import binwalk
binwalk.scan()Med Python API'et kan du også oprette til at tilpasse og udvide binwalk.
Der findes også og en cloud version .
Så hvorfor ikke downloade en firmware-billede fra internettet og prøve binwalk? Jeg lover, du får det sjovt 🙂
Kilde: habr.com
