Reverse engineering af en hjemme router ved hjælp af binwalk. Stoler du på softwaren i din router?

Reverse engineering af en hjemme router ved hjælp af binwalk. Stoler du på softwaren i din router?

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 TP-Link Archer C7 hjemme-router. Ikke den bedste router, men den er helt tilstrækkelig til mine behov.

Hver gang jeg køber en ny router, installerer jeg OpenWRT. 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å downloadet den nyeste firmwarebillede 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?

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, stripped

Kommandoen 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å Wikipedia 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 downloade kildekoden og følge installationsvejledningen eller den korte vejledning, 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 port

Scanning images

Let's start by searching for file signatures within the image (image from the site TP-Link).

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:41

Now we have plenty of information about this image.

The image uses U-Boot 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/s

Since the image is compressed with LZMA, we need to unpack it:

$ unlzma u-boot.bin.lzma

Now we have the U-Boot image:

$ ls -l u-boot.bin
-rw-rw-r-- 1 sprado sprado 97476 Feb  5 08:48 u-boot.bin

How 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=128M

U-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/s

Vi 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: 0xBB9D4F94

Formatet 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/s

Billedet er komprimeret, så lad os pakke det ud:

$ unlzma Image.lzma

Nu har vi billedet af Linux-kernen:

$ ls -la Image
-rw-rw-r-- 1 sprado sprado 3164228 Feb  5 10:51 Image

Hvad 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 2019

Selvom 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 epilog

Hvad med roden af filsystemet? I stedet for at udtrække billedet manuelt, lad os bruge muligheden binwalk --extract:

$ binwalk --extract --quiet archer-c7.bin

Hele 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 at finde fejl og sårbarheder.

Ved hjælp af qemu og chroot 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, zcat

Fedt! 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.

Reverse engineering af en hjemme router ved hjælp af binwalk. Stoler du på softwaren i din router?

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.

Brugerdefinerede signaturer 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 den officielle dokumentation.

Binwalk-udvidelsen

Der findes API-interface 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 Python-plugins til at tilpasse og udvide binwalk.

Der findes også IDA-plugin og en cloud version Binwalk Pro.

Så hvorfor ikke downloade en firmware-billede fra internettet og prøve binwalk? Jeg lover, du får det sjovt 🙂

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster