Reverse engineering domácího routeru pomocí binwalk. Důvěřujete softwaru svého routeru?

Reverse engineering domácího routeru pomocí binwalk. Důvěřujete softwaru svého routeru?

Před několika dny jsem se rozhodl provést reverzní inženýrství firmwaru svého routeru pomocí binwalk.

Koupil jsem si TP-Link Archer C7 domácí router. Není to nejlepší router, ale pro mé potřeby je to zcela dostačující.

Každýkrát, když si koupím nový router, instalují OpenWRT. Proč? Obvykle se výrobci o podporu svých routerů příliš nestarají a s časem se software zastarává, objevují se zranitelnosti a tak dále, prostě chápete. Proto dávám přednost dobře podporovanému open-source firmwaru OpenWRT.

Po stažení OpenWRT jsem také stáhl poslední verzi firmwaru pro svůj nový Archer C7 z oficiálních stránek a rozhodl jsem se ji analyzovat. Jen tak pro zábavu a abych pověděl o binwalk.

Co je to binwalk?

Binwalk je nástroj s otevřeným zdrojovým kódem pro analýzu, reverzní inženýrství a extrakci obrazů firmwaru.

Vytvořený v roce 2010 Craigem Heffnerem, binwalk dokáže skenovat obrazy firmwaru a nalézt soubory, identifikovat a extrahovat obrazy souborových systémů, spustitelný kód, komprimované archivy, bootloadery a jádra, formáty souborů jako JPEG a PDF a mnoho dalšího.

Můžete použít binwalk pro reverzní inženýrství firmwaru k tomu, abyste pochopili, jak funguje. Hledat zranitelnosti v binárních souborech, extrahovat soubory a hledat backdoory nebo digitální certifikáty. Také můžete najít opkódy pro různé CPU.

Můžete rozbalit obrazy souborových systémů, abyste vyhledali konkrétní soubory s hesly (passwd, shadow atd.) a pokusit se prolomit hashe hesel. Můžete provést binární analýzu mezi dvěma nebo více soubory. Můžete provést analýzu entropie dat pro vyhledání komprimovaných dat nebo zakódovaných šifrovacích klíčů. To vše bez nutnosti přístupu ke zdrojovému kódu.

V podstatě je tu vše, co potřebujete 🙂

Jak funguje binwalk?

Hlavní funkcí binwalk je jeho signaturní skenování. Binwalk může skenovat obraz firmwaru za účelem vyhledávání různých vestavěných typů souborů a souborových systémů.

Znáte příkazovou utilitu soubor?

file /bin/bash
/bin/bash: ELF 64-bit LSB sdílený objekt, x86-64, verze 1 (SYSV), dynamicky propojeno, interpreter /lib64/l, pro GNU/Linux 3.2.0, BuildID[sha1]=12f73d7a8e226c663034529c8dd20efec22dde54, zkráceno

Tým souborkterá se dívá na hlavičku souboru a hledá podpis (magické číslo), aby určila typ souboru. Například, pokud soubor začíná posloupností bajtů 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A, ví, že se jedná o soubor PNG. Na Wikipedie existuje seznam běžných podpisů souborů.

Binwalk funguje podobně. Ale místo toho, aby hledal podpisy pouze na začátku souboru, binwalk prohledá celý soubor. Navíc binwalk může extrahovat soubory nalezené v obraze.

Nástroje soubor a binwalk používá knihovnu libmagic pro identifikaci podpisů souborů. Ale binwalk dále podporuje seznam uživatelských magických podpisů pro hledání komprimovaných / archivovaných souborů, záhlaví firmwaru, jader Linuxu, bootloaderů, souborových systémů atd.

Pojďme se pobavit?

Instalace binwalk

Binwalk je podporován na několika platformách, včetně Linuxu, OSX, FreeBSD a Windows.

Chcete-li nainstalovat nejnovější verzi binwalk, můžete stáhnout zdrojový kód a postupovat podle instalačních pokynů nebo krátkého průvodce, dostupného na webových stránkách projektu.

Binwalk má spoustu různých parametrů:

$ binwalk

Binwalk v2.2.0
Craig Heffner, ReFirmLabs
https://github.com/ReFirmLabs/binwalk

Použití: binwalk [OPCE] [SOUBOR1] [SOUBOR2] [SOUBOR3] ...

Možnosti pro skenování podpisů:
    -B, --signature              Skenovat cílové soubory pro běžné souborové podpisy
    -R, --raw=              Skenovat cílové soubory pro specifikovanou sekvenci bajtů
    -A, --opcodes                Skenovat cílové soubory pro běžné podpisy vykonatelných opcode
    -m, --magic=           Určit vlastní magický soubor k použití
    -b, --dumb                   Zakázat inteligentní klíčová slova podpisů
    -I, --invalid                Zobrazit výsledky označené jako neplatné
    -x, --exclude=          Vyjmout výsledky, které odpovídají 
    -y, --include=          Zobrazit pouze výsledky, které odpovídají 

Možnosti extrakce:
    -e, --extract                Automaticky extrahovat známé typy souborů
    -D, --dd=      Extrahovat  podpisy, přiřadit souborům příponu  a vykonat 
    -M, --matryoshka             Rekurzivně skenovat extrahované soubory
    -d, --depth=            Omezit hloubku rekurze matryoshka (výchozí: 8 úrovní hluboko)
    -C, --directory=        Extrahovat soubory/složky do vlastního adresáře (výchozí: aktuální pracovní adresář)
    -j, --size=             Omezit velikost každého extrahovaného souboru
    -n, --count=            Omezit počet extrahovaných souborů
    -r, --rm                     Smazat vyřezané soubory po extrakci
    -z, --carve                  Vyřezat data ze souborů, ale nevykonávat extrakční nástroje
    -V, --subdirs                Extrahovat do podadresářů pojmenovaných podle offsetu

Možnosti entropie:
    -E, --entropy                Vypočítat entropii souboru
    -F, --fast                   Použít rychlejší, ale méně podrobnou analýzu entropie
    -J, --save                   Uložit graf jako PNG
    -Q, --nlegend                Vynechat legendu z grafu entropie
    -N, --nplot                  Nenarodit graf entropie
    -H, --high=           Nastavit práh pro aktivaci vzestupné křivky entropie (výchozí: 0.95)
    -L, --low=            Nastavit práh pro aktivaci sestupné křivky entropie (výchozí: 0.85)

Možnosti porovnávání binárních souborů:
    -W, --hexdump                Provést hexdump / diff souboru nebo souborů
    -G, --green                  Zobrazit pouze řádky obsahující bajty, které jsou stejné mezi všemi soubory
    -i, --red                    Zobrazit pouze řádky obsahující bajty, které se liší mezi všemi soubory
    -U, --blue                   Zobrazit pouze řádky obsahující bajty, které se liší mezi některými soubory
    -u, --similar                Zobrazit pouze řádky, které jsou stejné mezi všemi soubory
    -w, --terse                  Porovnat všechny soubory, ale zobrazit pouze hex dump prvního souboru

Možnosti komprese raw:
    -X, --deflate                Skenovat pro raw deflate kompresní toky
    -Z, --lzma                   Skenovat pro raw LZMA kompresní toky
    -P, --partial                Provést povrchní, ale rychlejší sken
    -S, --stop                   Zastavit po prvním výsledku

Obecné možnosti:
    -l, --length=           Počet bajtů k prozkoumání
    -o, --offset=           Začít sken na tomto offsetu souboru
    -O, --base=             Přidat základní adresu ke všem vytištěným offsetům
    -K, --block=            Nastavit velikost bloku souboru
    -g, --swap=             Obrátit každé n bajty před skenováním
    -f, --log=             Uložit výsledky do souboru
    -c, --csv                    Uložit výsledky do souboru ve formátu CSV
    -t, --term                   Formátovat výstup tak, aby se vešel do terminálového okna
    -q, --quiet                  Potlačit výstup do stdout
    -v, --verbose                Povolit podrobný výstup
    -h, --help                   Zobrazit nápovědu
    -a, --finclude=         Skenovat pouze soubory, jejichž názvy odpovídají tomuto regexu
    -p, --fexclude=         Neskenerovat soubory, jejichž názvy odpovídají tomuto regexu
    -s, --status=           Povolit server stavu na určeném portu

Skenování obrazů

Začneme hledáním podpisů souborů uvnitř obrazu (obraz ze stránky TP-Link).

Spuštění binwalk s parametrem —signature:

$ binwalk --signature --term archer-c7.bin

DECIMÁLNĚ       HEXADECIMÁLNĚ     POPIS
------------------------------------------------------------------------------------------
21876         0x5574          Řetězec verze U-Boot, "U-Boot 1.1.4-g4480d5f9-dirty (Květen
                              20 2019 - 18:45:16)"
21940         0x55B4          Tabulka polynomu CRC32, big endian
23232         0x5AC0          Hlavička uImage, velikost hlavičky: 64 bajtů, CRC hlavičky:
                              0x386C2BD5, vytvořeno: 2019-05-20 10:45:17, velikost obrazu:
                              41162 bajtů, Adresa dat: 0x80010000, Vstupní bod:
                              0x80010000, crc dat: 0xC9CD1E38, OS: Linux, CPU: MIPS,
                              typ obrazu: Firmware Image, typ komprese: lzma, jméno obrazu:
                              "obraz u-boot"
23296         0x5B00          LZMA komprimovaná data, vlastnosti: 0x5D, velikost slovníku:
                              8388608 bajtů, nekomprimovaná velikost: 97476 bajtů
64968         0xFDC8          XML dokument, verze: "1.0"
78448         0x13270         Hlavička uImage, velikost hlavičky: 64 bajtů, CRC hlavičky:
                              0x78A267FF, vytvořeno: 2019-07-26 07:46:14, velikost obrazu:
                              1088500 bajtů, Adresa dat: 0x80060000, Vstupní bod:
                              0x80060000, crc dat: 0xBB9D4F94, OS: Linux, CPU: MIPS,
                              typ obrazu: Multi-File Image, typ komprese: lzma,
                              jméno obrazu: "MIPS OpenWrt Linux-3.3.8"
78520         0x132B8         LZMA komprimovaná data, vlastnosti: 0x6D, velikost slovníku:
                              8388608 bajtů, nekomprimovaná velikost: 3164228 bajtů
1167013       0x11CEA5        Squashfs souborový systém, little endian, verze 4.0,
                              komprese:xz, velikost: 14388306 bajtů, 2541 inodes,
                              velikost bloku: 65536 bajtů, vytvořeno: 2019-07-26 07:51:38
15555328      0xED5B00        gzip komprimovaná data, z Unixu, naposledy upraveno: 2019-07-26
                              07:51:41

Teď máme spoustu informací o tomto obraze.

Obraz používá U-Boot jako bootloader (hlavička obrazu na adrese 0x5AC0 a komprimovaný obraz bootloaderu na adrese 0x5B00). Na základě hlavičky uImage na adrese 0x13270 víme, že architektura procesoru je MIPS a jádro Linuxu má verzi 3.3.8. A na základě obrazu nalezeného na adrese 0x11CEA5, můžeme vidět, že rootfs je souborový systém squashfs.

Teď si rozbalíme bootloader (U-Boot) pomocí příkazu dd:

$ dd if=archer-c7.bin of=u-boot.bin.lzma bs=1 skip=23296 count=41162
41162+0 záznamů
41162+0 záznamů
41162 bajtů (41 kB, 40 KiB) zkopírováno, 0,0939608 s, 438 kB/s

Protože je obraz komprimován pomocí LZMA, musíme ho rozbalit:

$ unlzma u-boot.bin.lzma

Teď máme obraz U-Boot:

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

Co takhle hledat výchozí hodnotu pro 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

Proměnná prostředí U-Boot bootargs slouží k předávání parametrů jádru Linuxu. A z výše uvedeného lépe chápeme flash paměť zařízení.

Co říkáte na extrakci obrazu jádra Linuxu?

$ dd if=archer-c7.bin of=uImage bs=1 skip=78448 count=1088572
1088572+0 záznamů v
1088572+0 záznamů ven
1088572 bajtů (1,1 MB, 1,0 MiB) zkopírováno, 1,68628 s, 646 kB/s

Můžeme zkontrolovat, že obraz byl úspěšně extrahován pomocí příkazu soubor:

$ file uImage
uImage: u-boot legacy uImage, MIPS OpenWrt Linux-3.3.8, Linux/MIPS, Multi-File Image (lzma), 1088500 bajtů, Pá 26 Čvc 07:46:14 2019, Zátěžová adresa: 0x80060000, Vstupní bod: 0x80060000, Header CRC: 0x78A267FF, Data CRC: 0xBB9D4F94

Formát souboru uImage je v podstatě obraz jádra Linuxu s přidanou hlavou. Pojďme odstranit tuto hlavu, abychom získali konečný obraz jádra Linuxu:

$ dd if=uImage of=Image.lzma bs=1 skip=72
1088500+0 záznamů v
1088500+0 záznamů ven
1088500 bajtů (1,1 MB, 1,0 MiB) zkopírováno, 1,65603 s, 657 kB/s

Obraz je komprimován, takže ho pojďme rozbalit:

$ unlzma Image.lzma

Nyní máme obraz jádra Linuxu:

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

Co můžeme udělat s obrazem jádra? Můžeme například vyhledat řetězce v obraze a zjistit verzi jádra Linuxu a zjistit, jaké prostředí bylo použito pro jeho sestavení:

$ strings Image | grep "Linux version"
Linux version 3.3.8 (leo@leo-MS-7529) (gcc version 4.6.3 20120201 (předběžná verze) (Linaro GCC 4.6-2012.02) ) #1 Po 20 Kvě 18:53:02 CST 2019

I když byla firmware vydána minulý rok (2019), kdy píšu tento článek, používá starou verzi jádra Linuxu (3.3.8), vydanou v roce 2012, zkompilovanou s velmi starou verzí GCC (4.6) také z roku 2012!
(pozn. překl. stále důvěřujete svým routerům v kanceláři a doma?)

S volbou --opcodes můžeme také použít binwalk k vyhledání strojových instrukcí a určení architektury procesoru obrazu:

$ binwalk --opcodes Image
DECIMÁLNĚ       HEXADECIMÁLNĚ     POPIS
--------------------------------------------------------------------------------
2400          0x960           MIPS instrukce, funkční epilog
2572          0xA0C           MIPS instrukce, funkční epilog
2828          0xB0C           MIPS instrukce, funkční epilog

Co kořenový souborový systém? Místo toho, abychom obraz extrahovali ručně, pojďme použít možnost binwalk --extract:

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

Celý kořenový souborový systém bude extrahován do podadresáře:

$ 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)
 ---------------------------------------------------------------

Teď můžeme dělat spoustu různých věcí.

Můžeme hledat konfigurační soubory, hashované hesla, šifrovací klíče a digitální certifikáty. Můžeme analyzovat binární soubory pro hledání chyb a zranitelností.

Pomocí qemu a chroot můžeme dokonce spustit (emulovat) spustitelný soubor z obrazu:

$ 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 [function] [arguments]...
   or: busybox --list[-full]
   or: function [arguments]...

    BusyBox je multi-call binární soubor, který kombinuje mnoho běžných Unixových
    utilit do jednoho spustitelného souboru. Většina lidí vytvoří
    odkaz na busybox pro každou funkci, kterou chtějí používat, a BusyBox
    se zachová jako to, co bylo vyvoláno.

Aktuálně definované funkce:
    [, [[, 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

Skvělé! Ale nezapomeňte, že verze BusyBox je 1.19.4. To je velmi stará verze BusyBox, vydaná v dubnu 2012.

Takže TP-Link vydává obraz firmwaru v roce 2019 s využitím softwaru (GCC toolchain, jádro, BusyBox atd.) z roku 2012!

Teď rozumíte, proč vždy instalují OpenWRT na své routery?

To ještě není všechno

Binwalk také může provádět analýzu entropie, tisknout nekomprimovaná entropická data a generovat entropické grafy. Obvykle se vyšší entropie pozoruje, když jsou bajty v obraze náhodné. To může znamenat, že obraz obsahuje zašifrovaný, komprimovaný nebo obfuskovaný soubor. Těžce napsaný šifrovací klíč? Proč ne.

Reverse engineering domácího routeru pomocí binwalk. Důvěřujete softwaru svého routeru?

Můžeme také použít parametr --raw k vyhledávání uživatelské sekvence nekomprimovaných bajtů v obraze nebo parametr --hexdump pro provedení hexadecimálního výpisu porovnávajícího dva nebo více vstupních souborů.

Uživatelské signatury mohou být přidány do binwalk buď prostřednictvím souboru uživatelských signatur uvedeného v příkazovém řádku pomocí parametru --magic, nebo přidáním do adresáře $ HOME / .config / binwalk / magic.

Můžete najít více informací o binwalk na oficiální dokumentaci.

Rozšíření binwalk

Existuje API rozhraní binwalk, implementované jako modul Python, který může být použit jakýmkoli skriptem Python pro programové provádění skenování binwalk, a příkazový nástroj binwalk může být téměř úplně duplikován pouhými dvěma řádky kódu Python!

import binwalk
binwalk.scan()

Pomocí Python API můžete také vytvářet pluginy pod Python pro konfiguraci a rozšíření binwalk.

Existuje také plugin IDA a cloudová verze Binwalk Pro.

Tak proč si nestáhnout obraz firmwaru z internetu a nevyzkoušet binwalk? Slibuji, že si s tím užijete spoustu zábavy 🙂

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster