
Před několika dny jsem se rozhodl provést reverzní inženýrství firmwaru svého routeru pomocí binwalk.
Koupil jsem si . 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í . 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é 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?
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ácenoTý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 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 a postupovat podle nebo , 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 portuSkenování obrazů
Začneme hledáním podpisů souborů uvnitř obrazu (obraz ze stránky ).
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:41Teď máme spoustu informací o tomto obraze.
Obraz používá 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/sProtože je obraz komprimován pomocí LZMA, musíme ho rozbalit:
$ unlzma u-boot.bin.lzmaTeď máme obraz U-Boot:
$ ls -l u-boot.bin
-rw-rw-r-- 1 sprado sprado 97476 5. února 08:48 u-boot.binCo 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=128MPromě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/sMůž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: 0xBB9D4F94Formá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/sObraz je komprimován, takže ho pojďme rozbalit:
$ unlzma Image.lzmaNyní máme obraz jádra Linuxu:
$ ls -la Image
-rw-rw-r-- 1 sprado sprado 3164228 Úno 5 10:51 ImageCo 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 2019I 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í epilogCo 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.binCelý 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 a zranitelností.
Pomocí a 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, zcatSkvě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.

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ů.
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 .
Rozšíření binwalk
Existuje 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 pro konfiguraci a rozšíření binwalk.
Existuje také a cloudová verze .
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
