A házi router visszafejtése binwalk segítségével. Megbízik a router szoftverében?

A házi router visszafejtése binwalk segítségével. Megbízik a router szoftverében?

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 TP-Link Archer C7 otthoni routert. Nem a legjobb router, de az igényeimnek teljesen megfelel.

Minden alkalommal, amikor új routert vásárolok, telepítem a OpenWRT. 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 letöltöttem az Archer C7-hez készült legfrissebb firmware-képet 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?

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 Wikipédián 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 forrást és követheted a telepítési útmutatót vagy rövid útmutatót, 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 szervert

Ké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 TP-Link).

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

Most sok információnk van erről a képről.

A kép a következőt használja U-Boot 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.lzma

Most 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.bin

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

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

Ellenő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: 0xBB9D4F94

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

A kép tömörítve van, ezért bontsuk ki:

$ unlzma Image.lzma

Most már van Linux kernel képünk:

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

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

Bá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ógus

Mi 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.bin

A 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 hibák keresésére és sebezhetőségekre.

A segítségével qemu és chroot 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 házi router visszafejtése binwalk segítségével. Megbízik a router szoftverében?

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.

Egyedi aláírásokat 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: hivatalos dokumentációban.

A binwalk kiterjesztése

Létezik API 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 Python bővítményeket hozhat létre a binwalk testreszabásához és bővítéséhez.

Van továbbá IDA bővítmény és a felhőalapú verziója Binwalk Pro.

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

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster