Inxhinieria e rikthimit të routerit shtëpiak me ndihmën e binwalk. A i besoni softuerit të routerit tuaj?

Inxhinieria e rikthimit të routerit shtëpiak me ndihmën e binwalk. A i besoni softuerit të routerit tuaj?

Disa ditë më parë, vendosa të bëj inxhinieri të rikthimit të firmuerit të routerit tim duke përdorur binwalk.

Bleva për vete routerin shtëpiak TP-Link Archer C7. Nuk është routeri më i mirë, por për nevojat e mia është mjaft i mjaftueshëm.

Çdo herë kur blej një router të ri, instaloj OpenWRT. Pse? Zakonisht prodhuesit nuk shqetësohen shumë për mbështetje të routerëve të tyre dhe me kalimin e kohës softueri bëhet i vjetruar, shfaqen vulnerabilitete e kështu me radhë, e morët vesh. Prandaj preferoj firmuerin OpenWRT, i cili mbështetet mirë nga komuniteti me kod të hapur.

Pas shkarkimit të OpenWRT, gjithashtu shkarkova imazhin më të fundit të firmuerit për Archer C7-të tim nga faqja zyrtare dhe vendosa ta analizoj. Thjesht për argëtim dhe për të folur për binwalk.

Çfarë është binwalk?

Binwalk është një mjet me kod të hapur për analizën, inxhinierinë e rikthimit dhe nxjerrjen e imazheve të firmuerit.

I krijuar në vitin 2010 nga Craig Heffner, binwalk mund të skanojë imazhet e firmuerit dhe të gjejë skedarë, të identifikojë dhe të nxjerrë imazhe të sistemeve të skedarëve, kod ekzekutiv, arkiva të kompresuar, boot-loadera dhe bërthama, formate skedari si JPEG dhe PDF, dhe shumë më tepër.

Mund ta përdorni binwalk për inxhinierin e rikthimit të firmuerit për të kuptuar se si funksionon. Të kërkoni vulnerabilitete në skedarët binarë, të nxirrni skedarë dhe të kërkoni backdoora ose certifikata digjitale. Mund të gjeni gjithashtu opcodes për shumë CPU të ndryshëm.

Mund të rishkarkoni imazhet e sistemeve të skedarëve për të kërkuar skedarë specifikë të fjalëkalimeve (passwd, shadow etj.) Dhe të provoni të thyeni hash-et e fjalëkalimeve. Mund të kryeni një analizë binarë midis dy ose më shumë skedarëve. Mund të kryeni analizën e entropisë së të dhënave për të gjetur të dhëna të kompresuara ose çelësa të koduar. Të gjitha këto pa pasur nevojë për qasje në kodin burimor.

Në përmbledhje, gjithçka që nevojitet është aty 🙂

Si funksionon binwalk?

Karakteristika kryesore e binwalk është skanimi i tij me nënshkrim. Binwalk mund të skanojë imazhin e firmuerit për të kërkuar lloje të ndryshme të skedarëve dhe sistemeve të skedarëve të integruara.

E dini utilitarin e linjës së komandës thotë?

file /bin/bash
/bin/bash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), e lidhur dinamikisht, interpretuese /lib64/l, për GNU/Linux 3.2.0, BuildID[sha1]=12f73d7a8e226c663034529c8dd20efec22dde54, e shkurtruar

Ekipa thotëshikon skedullin e skedarit dhe kerkon firmën (numri magjik) për të përcaktuar tipin e skedarit. Për shembull, nëse skedari fillon me një sekuencë bajtesh 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A, ajo e di se ky është një skedar PNG. Në Wikipedia ka një listë të firmave të zakonshme të skedareve.

Binwalk funksionon në të njëjtën mënyrë. Por në vend që të kërkojë firma vetëm në fillim të skedarit, binwalk do të skanojë të gjithë skedarin. Për më tepër, binwalk mund të nxjerrë skedaret e gjetura në imazh.

Mjetet thotë dhe binwalk përdorin bibliotekën libmagic për identifikimin e firmave të skedareve. Por binwalk shton gjithashtu një listë të firmave magjike të personalizuara për të kërkuar skedare të kompresuara/zip, tituj firmware, bërthama Linux, bootloadera, sisteme skedaresh dhe shumë të tjera.

Le të argëtohemi?

Instalimi i binwalk

Binwalk mbështetet në disa platforma, përfshirë Linux, OSX, FreeBSD dhe Windows.

Për të instaluar versionin më të fundit të binwalk, mund të shkarkoni kodin burimor dhe të ndiqni udhëzimet e instalimit или manualin e shkurtër, që është i disponueshëm në faqen e internetit të projektit.

Binwalk ka shumë parametra të ndryshëm:

$ binwalk

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

Përdorimi: binwalk [OPSIONET] [FILE1] [FILE2] [FILE3] ...

Opsionet e Skandimit të Nënshkrimit:
    -B, --signature              Skano skedarin(e) e caktuar(a) për nënshkrimet e zakonshme të skedarëve
    -R, --raw=              Skano skedarin(e) e caktuar(a) për sekuencën e specifikuar të bajtave
    -A, --opcodes                Skano skedarin(e) e caktuar(a) për nënshkrimet e zakonshme të opcode-ve ekzekutiv
    -m, --magic=           Specifiko një skedar magjik personal për t'u përdorur
    -b, --dumb                   Çaktivizo fjalët kyçe të mençura të nënshkrimit
    -I, --invalid                Trego rezultatet e shënuara si të pavlefshme
    -x, --exclude=          Përjashto rezultatet që përputhen me 
    -y, --include=          Trego vetëm rezultatet që përputhen me 

Opsionet e Nxjerrjes:
    -e, --extract                Automatizoni nxjerrjen e llojeve të njohura të skedarëve
    -D, --dd=      Nxirrni nënshkrimet , jepni skedarëve një zgjerim , dhe ekzekutoni 
    -M, --matryoshka             Skano me recursion skedarët e nxjerrë
    -d, --depth=            Kufizo thellësinë e recursion-it matryoshka (default: 8 nivele të thella)
    -C, --directory=        Nxirrni skedarët/fondet në një direktori të personalizuar (default: direktoria aktuale e punës)
    -j, --size=             Kufizo madhësinë e çdo skedari të nxjerrë
    -n, --count=            Kufizo numrin e skedarëve të nxjerrë
    -r, --rm                     Fshini skedarët e gdhendur pas nxjerrjes
    -z, --carve                  Nxirrni të dhëna nga skedarët, por mos ekzekutoni utilitetet e nxjerrjes
    -V, --subdirs                Nxirrni në nën-drejtime të emërtuara sipas offset-it

Opsionet e Entropisë:
    -E, --entropy                Llogaritni entropinë e skedarit
    -F, --fast                   Përdorni analizën e entropisë më të shpejtë, por më pak të detajuar
    -J, --save                   Ruani grafikun si një PNG
    -Q, --nlegend                Kërkoni të mos shfaqet legjenda në grafikun e entropisë
    -N, --nplot                  Mos krijoni një grafik të entropisë
    -H, --high=           Vendosni pragun e aktivizimit të entropisë së rritjes (default: 0.95)
    -L, --low=            Vendosni pragun e aktivizimit të entropisë në rënie (default: 0.85)

Opsionet e Diferencimit Binar:
    -W, --hexdump                Kryeni një hexdump/diferencë të një skedari ose skedarësh
    -G, --green                  Trego vetëm linjat që përmbajnë bajta të njëjtë midis të gjitha skedarëve
    -i, --red                    Trego vetëm linjat që përmbajnë bajta të ndryshëm midis të gjitha skedarëve
    -U, --blue                   Trego vetëm linjat që përmbajnë bajta të ndryshëm midis disa skedarëve
    -u, --similar                Trego vetëm linjat që janë të njëjta midis të gjitha skedarëve
    -w, --terse                  Diferenconi të gjitha skedarët, por tregoni vetëm një hexdump të skedarit të parë

Opsionet e Kompresionit të Papërpunuar:
    -X, --deflate                Skano për stream-e të kompresimit të papërpunuar deflate
    -Z, --lzma                   Skano për stream-e të kompresimit të papërpunuar LZMA
    -P, --partial                Kryeni një skanimin sipërfaqësor, por më të shpejtë
    -S, --stop                   Ndalo pas rezultatit të parë

Opsionet e Përgjithshme:
    -l, --length=           Numri i bajtave për të skanuar
    -o, --offset=           Filloni skanimin në këtë pozitë të skedarit
    -O, --base=             Shtoni një adresë baze në të gjithë offset-et e printuara
    -K, --block=            Vendosni madhësinë e bllokut të skedarit
    -g, --swap=             Invertoni çdo n bajt para skanimit
    -f, --log=             Regjistroni rezultatet në skedar
    -c, --csv                    Regjistroni rezultatet në skedar në formatin CSV
    -t, --term                   Formatoni daljen për të përputhur dritaren e terminalit
    -q, --quiet                  Shtypni daljen në stdout
    -v, --verbose                Aktivizoni daljen e hollësishme
    -h, --help                   Trego ndihmën e daljes
    -a, --finclude=         Skano vetëm skedarët të cilët emrat e përputhen me këtë regex
    -p, --fexclude=         Mos skano skedarët të cilët emrat e përputhen me këtë regex
    -s, --status=           Aktivizoni serverin e statusit në portin e specifikuar

Skandimi i imazheve

Do të fillojmë me kërkimin e nënshkrimeve të skedarëve brenda imazhit (imazhi nga faqja TP-Link).

Ekzekutimi i binwalk me parametrin —signature:

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

DECIMAL       HEXADECIMAL     DESCRIPTION
------------------------------------------------------------------------------------------
21876         0x5574          Stringa e versionit U-Boot, "U-Boot 1.1.4-g4480d5f9-dirty (Maj
                              20 2019 - 18:45:16)"
21940         0x55B4          Tabela polinomiale CRC32, big endian
23232         0x5AC0          Header i uImage, madhësia e header-it: 64 byte, CRC i header-it:
                              0x386C2BD5, krijuar: 2019-05-20 10:45:17, madhësia e imazhit:
                              41162 byte, Adresa e të dhënave: 0x80010000, pika e hyrjes:
                              0x80010000, CRC i të dhënave: 0xC9CD1E38, OS: Linux, CPU: MIPS,
                              lloji i imazhit: Imazhi Firmware, tipi i kompresimit: lzma, emri i imazhit:
                              "imazhi u-boot"
23296         0x5B00          Të dhëna të kompresuara LZMA, vetitë: 0x5D, madhësia e fjalorit:
                              8388608 byte, madhësia e pakompresuar: 97476 byte
64968         0xFDC8          Dokument XML, version: "1.0"
78448         0x13270         Header i uImage, madhësia e header-it: 64 byte, CRC i header-it:
                              0x78A267FF, krijuar: 2019-07-26 07:46:14, madhësia e imazhit:
                              1088500 byte, Adresa e të dhënave: 0x80060000, pika e hyrjes:
                              0x80060000, CRC i të dhënave: 0xBB9D4F94, OS: Linux, CPU: MIPS,
                              lloji i imazhit: Imazh Multi-Files, tipi i kompresimit: lzma,
                              emri i imazhit: "MIPS OpenWrt Linux-3.3.8"
78520         0x132B8         Të dhëna të kompresuara LZMA, vetitë: 0x6D, madhësia e fjalorit:
                              8388608 byte, madhësia e pakompresuar: 3164228 byte
1167013       0x11CEA5        Filesistemi Squashfs, little endian, version 4.0,
                              kompresimi:xz, madhësia: 14388306 byte, 2541 inodet,
                              madhësia e bllokut: 65536 byte, krijuar: 2019-07-26 07:51:38
15555328      0xED5B00        Të dhëna të kompresuara gzip, nga Unix, e modifikuar për herë të fundit: 2019-07-26
                              07:51:41

Tani kemi shumë informacion mbi këtë imazh.

Imazhi përdor U-Boot si ngarkues (header-i i imazhit në adresën 0x5AC0 dhe imazhi i kompresuar i ngarkuesit në adresën 0x5B00). Duke u bazuar në headerin e uImage në adresën 0x13270, ne dimë që arkitektura e procesorit është MIPS, dhe bërthama e Linux-it është versioni 3.3.8. Dhe mbi bazën e imazhit, të gjetur në adresën 0x11CEA5, ne mund të shohim se rootfs është sistemi i skedarëve squashfs.

Tani le të nxjerrim ngarkuesin (U-Boot) përmes komandës dd:

$ dd if=archer-c7.bin of=u-boot.bin.lzma bs=1 skip=23296 count=41162
41162+0 rekordet në
41162+0 rekordet jashtë
41162 byte (41 kB, 40 KiB) të kopjuar, 0,0939608 s, 438 kB/s

Duke qenë se imazhi është kompresuar me LZMA, na nevojitet ta nxjerrim atë:

$ unlzma u-boot.bin.lzma

Tani kemi imazhin e U-Boot:

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

Si për gjetjen e vlerës së paracaktuar për 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

Variabla e ambientit U-Boot bootargs përdoret për të kaluar parametrat në kernelin Linux. Dhe nga e gjithë kjo, kuptojmë më mirë flash memorien e pajisjes.

Si është ekstraktimi i imazhit të kernelit Linux?

$ dd if=archer-c7.bin of=uImage bs=1 skip=78448 count=1088572
1088572+0 regjistra brenda
1088572+0 regjistra jashtë
1088572 bytes (1.1 MB, 1.0 MiB) u kopjua, 1.68628 s, 646 kB/s

Mund të verifikojmë se imazhi është ekstraktuar me sukses me komandën thotë:

$ file uImage
uImage: u-boot legacy uImage, MIPS OpenWrt Linux-3.3.8, Linux/MIPS, Multi-File Image (lzma), 1088500 bytes, Fri Jul 26 07:46:14 2019, Load Address: 0x80060000, Entry Point: 0x80060000, Header CRC: 0x78A267FF, Data CRC: 0xBB9D4F94

Formati i skedës uImage është në thelb imazhi i kernelit Linux me një header të shtuar. Le të heqim këtë header për të marrë imazhin përfundimtar të kernelit Linux:

$ dd if=uImage of=Image.lzma bs=1 skip=72
1088500+0 regjistra brenda
1088500+0 regjistra jashtë
1088500 bytes (1.1 MB, 1.0 MiB) u kopjua, 1.65603 s, 657 kB/s

Imazhi është i kompresuar, kështu që le të shpërthejmë atë:

$ unlzma Image.lzma

Tani kemi imazhin e kernelit Linux:

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

Çfarë mund të bëjmë me imazhin e kernelit? Mund të bëjmë search për vargje në imazh dhe të gjejmë versionin e kernelit Linux dhe të mësojmë për mjedisin e përdorur për të ndërtuar kernelin:

$ strings Image | grep "Linux version"
Linux version 3.3.8 (leo@leo-MS-7529) (gcc version 4.6.3 20120201 (përpara regjistrimit) (Linaro GCC 4.6-2012.02) ) #1 Mon Maj 20 18:53:02 CST 2019

Megjithëse firmware-u u lëshua vitin e kaluar (2019), ndërsa unë e shkruaj këtë artikull, përdor një version të vjetër të kernelit Linux (3.3.8), lëshuar në vitin 2012, i ndërtuar me një version të shumë të vjetër të GCC (4.6) gjithashtu nga viti 2012!
(shën. e përkthyesit: a besoni ende në routerët tuaj në zyrë dhe shtëpi?)

Me opsionin --opcodes mund të përdorim gjithashtu binwalk për të gjetur instruksionet e makinerisë dhe për të përcaktuar arkitekturën e procesorit të imazhit:

$ binwalk --opcodes Image
Decimal       Hexadecimal     Description
--------------------------------------------------------------------------------
2400          0x960           Instruksione MIPS, epilog i funksionit
2572          0xA0C           Instruksione MIPS, epilog i funksionit
2828          0xB0C           Instruksione MIPS, epilog i funksionit

Çfarë lidhje ka me sistemin e skedarëve në rrënjë? Në vend që ta nxjerrim imazhin manualisht, le të përdorim opsionin binwalk --extract:

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

Sistemi i plotë i skedarëve në rrënjë do të ekstraktohet në një nënkatolog:

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

Tani tani mund të bëjmë shumë gjëra të ndryshme.

Mund të kërkojmë skedarë konfigurimi, hash-e fjalëkalimi, çelësa kriptografikë dhe certifikata dixhitale. Mund të analizojmë skedarët binarë për gjetjen e gabimeve dhe vulnerabiliteteve.

Me ndihmën e qemu dhe chroot madje mund të ekzekutojmë (simulojmë) një skedar ekzekutiv nga imazhi:

$ 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 është një binar multikall që kombinon shumë utilitarë të zakonshëm Unix në një ekzekutiv të vetëm.  Shumica e njerëzve do të krijojnë një lidhje me busybox për çdo funksion që dëshirojnë të përdorin dhe BusyBox do të veprojë si çdo gjë që u thirr.

Shumë mirë! Por vini re që versione e BusyBox është 1.19.4. Kjo është një version shumë i vjetër i BusyBox, i lëshuar në prill 2012.

Kështu, TP-Link lëshon imazhin e firmware në 2019 duke përdorur softuerin (GCC toolchain, kernel, BusyBox, etj.) të vitit 2012!

Tani e kuptoni pse unë gjithmonë vendos OpenWRT në rrugët e mia?

Kjo nuk është e gjitha

Binwalk gjithashtu mund të kryejë analizë entropike, të printojë të dhëna entropike të papërpunuara dhe të gjenerojë grafika entropike. Zakonisht, një entropi e lartë vërehet kur bajtat në figurë janë të rastësishme. Kjo mund të nënkuptojë se figura përmban një skedar të enkriptuar, të shfrytëzuar ose obfuskuar. Çelësi i enkriptimit i shkruajtur fort? Pse jo.

Inxhinieria e rikthimit të routerit shtëpiak me ndihmën e binwalk. A i besoni softuerit të routerit tuaj?

Ne gjithashtu mund të përdorim parametrin --raw për të kërkuar një sekuencë të përdoruesit të bajtave të papërpunuara në figurë ose parametrin --hexdump për të kryer një dump hexadecimal, duke krahasuar dy ose më shumë skedarë input.

Nënshkrimet e përdoruesve mund të shtohen në binwalk ose nëpërmjet një skedari nënshkrimesh të përdoruesve, i caktuar në linjën e komandës duke përdorur parametrin --magic, ose duke i shtuar ato në katalogun $ HOME / .config / binwalk / magic.

Mund të gjeni më shumë informacion rreth binwalk në dokumentacionin zyrtar.

Zgjerimi binwalk

Ekziston një API binwalk, i implementuar si një modul Python, i cili mund të përdoret nga çdo skenar Python për të kryer automatikisht skanimin e binwalk, dhe utilita e komandës binwalk mund të rikopjohet pothuajse plotësisht vetëm me dy rreshta kodi Python!

import binwalk
binwalk.scan()

Me Python API mund të krijoni gjithashtu plugins në Python për të personalizuar dhe zgjeruar binwalk.

Ka gjithashtu një plugin IDA dhe një version në cloud Binwalk Pro.

Pra, pse të mos shkarkoni një figurë të firmware nga Interneti dhe të provoni binwalk? Premtoj se do t'ju argëtojë shumë 🙂

Burimi: habr.com

Blini hostim të besueshëm për faqe interneti me mbrojtje DDoS, serverë VPS VDS 🔥 Blini hostim të besueshëm për faqe interneti me mbrojtje DDoS, serverë VPS VDS - ProHoster