
Néhány nappal ezelőtt úgy döntöttem, hogy visszafejtem a routerem firmware-jét a binwalk használatával.
Vettem magamnak egy . Nem a legjobb router, de az igényeimnek teljesen megfelel.
Minden alkalommal, amikor új routert vásárolok, telepítem a . Miért? Általában a gyártók nem nagyon törődnek a routereik támogatásával, és idővel a szoftver elavul, sebezhetőségek jelennek meg, és így tovább, érti. Ezért előnyben részesítem a jól támogató közösségi open-source firmware-t, az OpenWRT-t.
Miután letöltöttem az OpenWRT-t, szintén a hivatalos weboldalról, és úgy döntöttem, hogy elemezni fogom. Csak a szórakozás kedvéért, és hogy meséljek a binwalk-ról.
Mi az a binwalk?
egy nyílt forráskódú eszköz firmware-képek elemzésére, visszafejtésére és kicsomagolására.
Craig Heffner 2010-ben létrehozta a binwalk-t, amely képes firmware-képeket beolvasni és fájlokat találni, azonosítani és fájlrendszer-képeket, futtatható kódot, tömörített archívumokat, betöltőket és kernel-t, valamint fájlformátumokat, mint például JPEG és PDF, és még sok mást is kicsomagolni.
A binwalk-ot firmware-k visszafejtésére használhatja annak megértésére, hogyan működik. Kereshet sebezhetőségeket a bináris fájlokban, fájlokat vonhat ki és kereshet hátsó ajtókat vagy digitális tanúsítványokat. A opcodes számos különböző CPU-hoz is megtalálhatók.
Kicsomagolhatja a fájlrendszer-képeket, hogy specifikus fájlokat keressen jogosultsági adatokkal (passwd, shadow stb.) és megpróbálhatja feltörni a jelszóhordozókat. Két vagy több fájl között bináris elemzést végezhet. Adat-entropia elemzést is végezhet a tömörített adatok vagy titkosítási kulcsok keresésére. Mindezt anélkül, hogy hozzáférne a forráskódhoz.
Összességében minden szükséges dolog megvan 🙂
Hogyan működik a binwalk?
A binwalk fő jellemzője az aláírás alapú beolvasás. A binwalk képes beolvasni a firmware-képet különböző beágyazott fájltípusok és fájlrendszerek keresésére.
Ismeri a parancssori segédprogramot file?
file /bin/bash
/bin/bash: ELF 64-bit LSB megosztott objektum, x86-64, 1-es verzió (SYSV), dinamikusan linkelt, értelmező: /lib64/l, a GNU/Linux 3.2.0-hoz, BuildID[sha1]=12f73d7a8e226c663034529c8dd20efec22dde54, levágva.A parancs filemegnézi a fájl fejlécét, és keres egy aláírást (varázsszámot), hogy meghatározza a fájl típusát. Például, ha a fájl a byte-sorozattal kezdődik, 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A, tudja, hogy ez egy PNG fájl. A fájlok gyakori aláírásainak listája.
A Binwalk hasonlóan működik. De ahelyett, hogy csak a fájl elején keresne aláírásokat, a binwalk az egész fájlt átvizsgálja. Ezenkívül a binwalk képes fájlokat kinyerni, amelyek az image-ben találhatók.
Eszközök file és binwalk az aláírások azonosításához a libmagic könyvtárat használja. De binwalk támogat egyéni mágikus aláírások listáját is, hogy keressen tömörített / archivált fájlokat, firmware fejlécet, Linux kernel, indítókat, fájlrendszereket stb.
Szórakozzunk?
A binwalk telepítése
A Binwalk több platformon is támogatott, beleértve a Linuxot, OSX-t, FreeBSD-t és Windows-t.
A binwalk legújabb verziójának telepítéséhez letöltheted a és követheted a vagy , amely a projekt weboldalán elérhető.
A Binwalk sok különböző opcióval rendelkezik:
$ binwalk
Binwalk v2.2.0
Craig Heffner, ReFirmLabs
https://github.com/ReFirmLabs/binwalk
Használat: binwalk [OPTIONS] [FILE1] [FILE2] [FILE3] ...
Jelzőkeresési lehetőségek:
-B, --signature Célfájl(ok) vizsgálata a közönséges fájljelzőkért
-R, --raw= Célfájl(ok) vizsgálata a megadott bájtsorozatra
-A, --opcodes Célfájl(ok) vizsgálata a közönséges végrehajtható opcode jelzőkért
-m, --magic= Használj egyedi mágiát.
-b, --dumb A intelligens jelzőkulcsszavak letiltása
-I, --invalid Érvénytelenre jelölt eredmények megjelenítése
-x, --exclude= Azokat az eredményeket zárd ki, amelyek megfelelnek a értéknek
-y, --include= Csak azokat az eredményeket jelenítsd meg, amelyek a értéknek megfelelnek
Kicsomagolási lehetőségek:
-e, --extract Ismert fájltípusok automatikus kicsomagolása
-D, --dd= Kicsomagolás a jelzőkért, az állományok kiterjesztésének adása, és a végrehajtása
-M, --matryoshka Kicsomagolt fájlok rekurzív vizsgálata
-d, --depth= Matryoshka rekurziómélység korlátozása (alapértelmezés: 8 szint mélység)
-C, --directory= Fájlok/mappák kicsomagolása egyedi mappába (alapértelmezés: aktuális munkakönyvtár)
-j, --size= Minden kicsomagolt fájl méretének korlátozása
-n, --count= Kicsomagolt fájlok számának korlátozása
-r, --rm Kivágott fájlok törlése a kicsomagolás után
-z, --carve Adat kiemelése fájlokból, de a kicsomagoló eszközök végrehajtásának mellőzése
-V, --subdirs Kicsomagolás az offset alapján elnevezett almappákba
Entrópia lehetőségek:
-E, --entropy Fájl entrópia számítása
-F, --fast Gyorsabb, de kevesebb részletességű entrópia elemzés használata
-J, --save Ábra mentése PNG formátumban
-Q, --nlegend A legenda kihagyása az entrópia ábra grafikonból
-N, --nplot Entrópia ábra grafikon nem generálása
-H, --high= A növekvő él entrópia trigger küszöb beállítása (alapértelmezés: 0.95)
-L, --low= A csökkenő él entrópia trigger küszöb beállítása (alapértelmezés: 0.85)
Bináris különbségelemzési lehetőségek:
-W, --hexdump Fájl vagy fájlok hexdump/diff végrehajtása
-G, --green Csak azokat a sorokat jelenítse meg, amelyek byte-okat tartalmaznak, és amelyek minden fájlban azonosak
-i, --red Csak azokat a sorokat jelenítse meg, amelyek byte-okat tartalmaznak, és amelyek különböznek minden fájlban
-U, --blue Csak azokat a sorokat jelenítse meg, amelyek byte-okat tartalmaznak, és amelyek néhány fájlban különböznek
-u, --similar Csak azokat a sorokat jelenítse meg, amelyek minden fájl között azonosak
-w, --terse Különbséget mutat minden fájl között, de csak az első fájl hex dumpját jeleníti meg
Nyers tömörítési lehetőségek:
-X, --deflate Nyers deflate tömörítési folyamatok nyomozása
-Z, --lzma Nyers LZMA tömörítési folyamatok nyomozása
-P, --partial Felületes, de gyorsabb vizsgálat végrehajtása
-S, --stop Állj meg az első eredménynél
Általános lehetőségek:
-l, --length= A vizsgálandó byte-ok száma
-o, --offset= A vizsgálat kezdeti pontjának beállítása
-O, --base= Alapcím hozzáadása minden kiírt offsethez
-K, --block= Fájl blokkméretének beállítása
-g, --swap= Minden n byte felcserélése a vizsgálat előtt
-f, --log= Eredmények naplózása fájlba
-c, --csv Eredmények naplózása CSV formátumba
-t, --term Kimenet formázása a terminál ablakának megfelelően
-q, --quiet Kimenet elnyomása a stdout-ra
-v, --verbose Részletes kimenet engedélyezése
-h, --help Segítségkimenet megjelenítése
-a, --finclude= Csak azok a fájlok, amelyek nevei megfelelnek ennek a regexnek, vizsgálják
-p, --fexclude= Ne vizsgálják azokat a fájlokat, amelyek nevei megfelelnek ennek a regexnek
-s, --status= A megadott porton engedélyezze a státusz szervertKépfájlok szkennelése
Kezdjük a fájlok aláírásának keresésével a képfájlban (a fájl a következő webhelyről ).
A binwalk indítása a —signature paraméterrel:
$ binwalk --signature --term archer-c7.bin
TIZEDES HEXADECIMÁLIS LEÍRÁS
------------------------------------------------------------------------------------------
21876 0x5574 U-Boot verziószám, "U-Boot 1.1.4-g4480d5f9-dirty (május
20 2019 - 18:45:16)"
21940 0x55B4 CRC32 polinom táblázat, nagy endian
23232 0x5AC0 uImage fejléc, fejléc mérete: 64 bájt, fejléc CRC:
0x386C2BD5, létrehozva: 2019-05-20 10:45:17, kép mérete:
41162 bájt, Adatcím: 0x80010000, Belépési pont:
0x80010000, adatok CRC: 0xC9CD1E38, OS: Linux, CPU: MIPS,
kép típusa: Firmware Image, tömörítési típus: lzma, kép
neve: "u-boot image"
23296 0x5B00 LZMA tömörített adatok, tulajdonságok: 0x5D, szótár mérete:
8388608 bájt, kicsomagolatlan méret: 97476 bájt
64968 0xFDC8 XML dokumentum, verzió: "1.0"
78448 0x13270 uImage fejléc, fejléc mérete: 64 bájt, fejléc CRC:
0x78A267FF, létrehozva: 2019-07-26 07:46:14, kép mérete:
1088500 bájt, Adatcím: 0x80060000, Belépési pont:
0x80060000, adatok CRC: 0xBB9D4F94, OS: Linux, CPU: MIPS,
kép típusa: Multi-File Image, tömörítési típus: lzma,
kép neve: "MIPS OpenWrt Linux-3.3.8"
78520 0x132B8 LZMA tömörített adatok, tulajdonságok: 0x6D, szótár mérete:
8388608 bájt, kicsomagolatlan méret: 3164228 bájt
1167013 0x11CEA5 Squashfs fájlrendszer, kis endian, verzió 4.0,
tömörítés:xz, méret: 14388306 bájt, 2541 inode,
blokk méret: 65536 bájt, létrehozva: 2019-07-26 07:51:38
15555328 0xED5B00 gzip tömörített adatok, Unixból, utolsó módosítás: 2019-07-26
07:51:41Most sok információnk van erről a képről.
A kép a következőt használja mint betöltőprogram (a kép fejlécének címe 0x5AC0 és a betöltőprogram tömörített képe címen 0x5B00). Az 0x13270 címen található uImage fejléc alapján tudjuk, hogy a processzor architektúrája MIPS, és a Linux kernel verziója 3.3.8. Az 0x11CEA5 címen található kép alapján pedig láthatjuk, hogy rootfsa fájlrendszer squashfs Most csomagoljuk ki a betöltőprogramot (U-Boot) a következő parancs segítségével $ dd if=archer-c7.bin of=u-boot.bin.lzma bs=1 skip=23296 count=41162 41162+0 rögzítés be 41162+0 rögzítés ki 41162 bájt (41 kB, 40 KiB) másolva, 0,0939608 s, 438 kB/s.
Mivel a kép LZMA tömörítéssel van tömörítve, ki kell csomagolnunk: dd:
$ unlzma u-boot.bin.lzmaMost megvan a U-Boot képünk:
$ ls -l u-boot.bin
-rw-rw-r-- 1 sprado sprado 97476 feb 5 08:48 u-boot.binMi a helyzet a bootargs alapértelmezett értékének keresésével?
$ 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 környezeti változó 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 bootargs használják a Linux kernel paramétereinek átadására. És az előzőkből jobban megértjük az eszköz flash memóriáját.
Mi a helyzet a Linux kernel képének kinyerésével?
$ dd if=archer-c7.bin of=uImage bs=1 skip=78448 count=1088572
1088572+0 rekord be
1088572+0 rekord ki
1088572 bájt (1,1 MB, 1,0 MiB) másolva, 1,68628 s, 646 kB/sEllenőrizhetjük, hogy a kép sikeresen ki lett-e nyerve a következő parancs segítségével file:
$ file uImage
uImage: u-boot régi uImage, MIPS OpenWrt Linux-3.3.8, Linux/MIPS, Többfájlú Kép (lzma), 1088500 bájt, 2019. július 26. 07:46:14, Betöltési cím: 0x80060000, Belépési pont: 0x80060000, Fejléc CRC: 0x78A267FF, Adat CRC: 0xBB9D4F94Az uImage fájlformátum alapvetően a Linux kernel képe, kiegészítő fejléc mellett. Töröljük ezt a fejet, hogy megkapjuk a végső Linux kernel képet:
$ dd if=uImage of=Image.lzma bs=1 skip=72
1088500+0 rekord be
1088500+0 rekord ki
1088500 bájt (1,1 MB, 1,0 MiB) másolva, 1,65603 s, 657 kB/sA kép tömörítve van, ezért bontsuk ki:
$ unlzma Image.lzmaMost már van Linux kernel képünk:
$ ls -la Image
-rw-rw-r-- 1 sprado sprado 3164228 Febr 5 10:51 ImageMit tehetnénk a kernel képpel? Például kereshetünk a képen, hogy megtaláljuk a Linux kernel verziót és információt kapjunk a kernel összeállításához használt környezetről:
$ 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 Hétf May 20 18:53:02 CST 2019Bár a firmware-t tavaly adták ki (2019), amikor ezt a cikket írom, egy régi Linux kernel verziót (3.3.8) használ, amelyet 2012-ben adtak ki, és amihez egy rendkívül régi GCC verzió (4.6) van társítva, szintén 2012-ből!
(megj. sz. még mindig bízol az irodai és otthoni routereidben?)
A --opcodes opcióval a binwalk-ot is használhatjuk gépi utasítások keresésére és a kép processzor architektúrájának meghatározására:
$ binwalk --opcodes Image
DECIMÁLIS HEXADECIMÁLIS LEÍRÁS
--------------------------------------------------------------------------------
2400 0x960 MIPS utasítások, függvény epilógus
2572 0xA0C MIPS utasítások, függvény epilógus
2828 0xB0C MIPS utasítások, függvény epilógusMi a helyzet a gyökér fájlrendszerrel? Ahelyett, hogy kézzel nyernénk ki a képet, használjuk a következő opciót binwalk --extract:
$ binwalk --extract --quiet archer-c7.binA teljes gyökér fájlrendszer a következő almappába lesz kinyerve:
$ 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)
---------------------------------------------------------------Most már sok mindent csinálhatunk.
Kereshetünk konfigurációs fájlokat, jelszóhash-eket, kriptográfiai kulcsokat és digitális tanúsítványokat. Elemezhetjük a bináris fájlokat és sebezhetőségekre.
A segítségével és még futtathatjuk (emulálhatjuk) a végrehajtható fájlt a lemezképből:
$ 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 egy olyan multi-call bináris, amely sok közös Unix
segédprogramot egyesít egyetlen végrehajtható fájlba. A legtöbb ember linket fog létrehozni a busybox számára minden funkcióhoz, amit használni szeretne, és a BusyBox úgy fog működni, mint amit éppen kért.Nagyszerű! De vegye figyelembe, hogy a BusyBox verziója - 1.19.4. Ez egy nagyon régi verziója a BusyBox-nak, ami 2012 áprilisában jelent meg.
Tehát a TP-Link 2019-ben adja ki a firmware képet, amely a 2012-es szoftvereket (GCC toolchain, kernel, BusyBox stb.) használja!
Most már megérti, miért telepítem mindig az OpenWRT-t az útválasztóimra?
De ez még nem minden
A Binwalk entropianalízist is végezhet, nyers entropiadatokat nyomtathat ki, és entropiadiagramokat generálhat. Általában magas entropia figyelhető meg, amikor az adatok képesek véletlenszerűen elhelyezkedni a képen. Ez arra utalhat, hogy a fájl titkosított, tömörített vagy obfuszkált. Hardveresen beágyazott titkosítási kulcs? Miért ne?

A következő paramétert is használhatjuk: --raw a nyers byteok egyedi sorozatának keresésére a képen, vagy a --hexdump paramétert a két vagy több bemeneti fájl hexadecimális dumpjának összehasonlításához.
hozzáadhatunk a binwalkhoz, akár egy parancssoron keresztül megadott aláírási fájl segítségével a --magicparaméterrel, vagy úgy, hogy őket a következő mappába helyezzük: $ HOME / .config / binwalk / magic.
További információt a binwalkról itt talál: .
A binwalk kiterjesztése
Létezik A binwalk Python moduljaként valósul meg, amely bármely Python szkript által automatizált binwalk vizsgálat végrehajtására használható, a parancssori binwalk utasítás pedig majdnem teljesen duplikálható mindössze két Python sorral!
import binwalk
binwalk.scan()A Python API segítségével hozhat létre a binwalk testreszabásához és bővítéséhez.
Van továbbá és a felhőalapú verziója .
Tehát miért ne töltene le egy firmware képet az internetről, és ne próbálja ki a binwalkot? Ígérhetem, hogy nagyon szórakoztató lesz 🙂
Forrás: habr.com
