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

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

Disa ditë më parë, vendosa të kryej inxhinierinë e reversit të firmware-it tim të routerit duke përdorur binwalk.

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

Çdo herĂ« qĂ« blej njĂ« router tĂ« ri, instaloj OpenWRT. Pse? Zakonisht prodhuesit nuk e shqetĂ«sojnĂ« shumĂ« mbĂ«shtetje pĂ«r routerat e tyre dhe me kalimin e kohĂ«s softueri plaket, ndodhin dobĂ«si dhe kĂ«shtu me radhĂ«, nĂ« pĂ«rgjithĂ«si ju e kuptoni. Prandaj preferoj firmware-in open-source tĂ« mbĂ«shtetur mirĂ« nga komuniteti, OpenWRT.

Pas shkarkimit të OpenWRT, gjithashtu e shkarkova imazhin më të fundit të firmware-it për Archer C7-in tim të ri nga faqja zyrtare dhe vendosa ta analizoj. Thjesht për qejf dhe për të treguar rreth binwalk.

ÇfarĂ« Ă«shtĂ« binwalk?

Binwalk është një mjet me kod të hapur për analizimin, inxhinierinë e reversit dhe nxjerrjen e imazheve të firmware-it.

E krijuar në vitin 2010 nga Craig Heffner, binwalk mund të skanojë imazhe të firmware dhe të gjejë skedarë, të identifikojë dhe nxjerrë imazhe të sistemeve të skedarëve, kod ekzekutiv, arkiva të paketuar, bootloader-a dhe bërthama, formate skedari si JPEG dhe PDF, dhe shumë të tjera.

Mund ta përdorni binwalk për inxhinierinë e reversimit të firmware-it për të kuptuar se si është strukturuar. Të kërkoni për dobësi në skedarët binarë, të nxirrni skedarë dhe të kërkoni backdoora ose certifikata digjitale. Po ashtu, mund të gjeni opcode për një mori CPU-esh të ndryshëm.

Mund të ekspozoni imazhe të sistemeve të skedarëve për të kërkuar skedarë të caktuar fjalëkalish (passwd, shadow, etj.) dhe të provoni të thyeni hash-et e fjalëkalive. Mund të kryeni një analizë binarizmi midis dy ose më shumë skedarëve. Mund të kryeni një analizë të entropisë së të dhënave për të kërkuar të dhëna të padukshme ose çelësa të koduar. Të gjitha këto pa nevojën e qasjes në kodin burimor.

NĂ« pĂ«rgjithĂ«si, gjithçka qĂ« nevojitet, Ă«shtĂ« 🙂

Si funksionon binwalk?

Karakteristika kryesore e binwalk është skanimi i nënshkrimit të tij. Binwalk mund të skanojë imazhin e firmware për të kërkuar lloje të ndryshme të integruara skedarësh dhe sisteme skedarësh.

A e dini utilitarin e linjës së komandës file?

file /bin/bash
/bin/bash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=12f73d7a8e226c663034529c8dd20efec22dde54, stripped

Ekipa fileshikon në krye të skedarit dhe kërkon një nënshkrim (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 është një skedar PNG. Në Wikipedia ka një listë të nënshkrimeve të zakonshme të skedareve.

Binwalk funksionon në të njëjtën mënyrë. Por në vend që të kërkojë nënshkrime vetëm në fillim të skedarit, binwalk do të skanojë të gjithë skedarin. Për më tepër, binwalk mund të nxjerrë skedarë që gjenden në imazhe.

Mjetet file dhe binwalk përdor bibliotekën libmagic për identifikimin e nënshkrimeve të skedareve. Por binwalk mbështet gjithashtu një listë të nënshkrimeve magjike të personalizuara për të kërkuar skedarë të kompresuar/të arkivuar, tituj firmware, bërthama Linux, bootloader, sisteme skedari dhe kështu me radhë.

A dëshiron 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 ose udhëzimin e shkurtër, e disponueshme 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 [OPCIONET] [FILE1] [FILE2] [FILE3] ...

Opciones për Skanimin e Nënshkrimeve:
    -B, --signature              Skano skedarin(e) e caktuar për nënshkrime të zakonshme
    -R, --raw=              Skano skedarin(e) e caktuar për sekuencën e specifikuar të bytes
    -A, --opcodes                Skano skedarin(e) e caktuar për nënshkrime të zakonshme të opcode-ve të ekzekutueshëm
    -m, --magic=           Specify a custom magic file to use
    -b, --dumb                   Çaktivizo fjalĂ«t kyçe tĂ« mençura tĂ« nĂ«nshkrimeve
    -I, --invalid                Trego rezultatet e shënuara si të pavlefshme
    -x, --exclude=          Ekskludo rezultatet që përputhen me 
    -y, --include=          Trego vetëm rezultatet që përputhen me 

Opciones për Ekstraktim:
    -e, --extract                Ekstrakto automatikisht llojet e skedarëve të njohura
    -D, --dd=      Ekstrakto nënshkrime , jep skedarëve një zgjerim të , dhe ekzekuto 
    -M, --matryoshka             Skano në mënyrë rekurzive skedarët e ekstraktuar
    -d, --depth=            Kufizo thellësinë e rikthimit matryoshka (default: 8 nivele të thella)
    -C, --directory=        Ekstrakto skedarë/foldera në një direktori të personalizuar (default: direktoria aktuale e punës)
    -j, --size=             Kufizo madhësinë e çdo skedari të ekstraktuar
    -n, --count=            Kufizo numrin e skedarëve të ekstraktuar
    -r, --rm                     Fshij skedarët e gdhendur pas ekstraktimit
    -z, --carve                  Gdhend të dhëna nga skedarët, por mos ekzekuto utilitarët e ekstraktimit
    -V, --subdirs                Ekstrakto në nën-drejtoritë të emërtuara sipas offset-it

Opciones për Entropinë:
    -E, --entropy                Llogarit entropinë e skedarit
    -F, --fast                   Përdor analiza të shpejtë, por më pak të detajizuara për entropinë
    -J, --save                   Ruaj diagramin si një PNG
    -Q, --nlegend                Ndalo legjendën nga diagrami i plotë të entropisë
    -N, --nplot                  Mos krijo një diagram të entropisë
    -H, --high=           Vendos kërkesën e pragut për entropinë në rritje (default: 0.95)
    -L, --low=            Vendos kërkesën e pragut për entropinë me rënie (default: 0.85)

Opciones për Diferencimin e Binareve:
    -W, --hexdump                Kryej një hexdump / diferencim të një skedari ose skedarëve
    -G, --green                  Trego vetëm linjat që përmbajnë byte që janë të njëjta ndërmjet të gjitha skedarëve
    -i, --red                    Trego vetëm linjat që përmbajnë byte që janë të ndryshme ndërmjet të gjitha skedarëve
    -U, --blue                   Trego vetëm linjat që përmbajnë byte që janë të ndryshme ndërmjet disa skedarëve
    -u, --similar                Trego vetëm linjat që janë të njëjta ndërmjet të gjitha skedarëve
    -w, --terse                  Diferenco të gjitha skedarët, por trego vetëm një hexdump të skedarit të parë

Opciones për Kompresimin e Papërpunuar:
    -X, --deflate                Skano për skema kompresimi të papërpunuara deflate
    -Z, --lzma                   Skano për skema kompresimi të papërpunuara LZMA
    -P, --partial                Kryej një skanues sipërfaqësor, por më të shpejtë
    -S, --stop                   Ndalo pas rezultatit të parë

Opciones të Përgjithshme:
    -l, --length=           Numri i bytes për të skanuar
    -o, --offset=           Filloni skanimin në këtë offset të skedarit
    -O, --base=             Shto një adresë baze në të gjitha offset-et e shtypura
    -K, --block=            Përcakto madhësinë e bllokut të skedarit
    -g, --swap=             Kthe çdo n byte para skanimit
    -f, --log=             Regjistro rezultatet në skedar
    -c, --csv                    Regjistro rezultatet në skedar në format CSV
    -t, --term                   Format output-in për të përshtatur dritaren e terminalit
    -q, --quiet                  Shtyp output-in në stdout
    -v, --verbose                Aktivizo output-in e hollësishëm
    -h, --help                   Trego output-in e ndihmës
    -a, --finclude=         Skano vetëm skedarët që emrat e tyre përputhen me këtë regex
    -p, --fexclude=         Mos skano skedarët që emrat e tyre përputhen me këtë regex
    -s, --status=           Aktivizo serverin e statusit në portin e caktuar

Skannimi i imazheve

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

Lançimi i binwalk me parametrin —signature:

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

NUMRI       HEXADECIMAL     PËRSHKRIM
------------------------------------------------------------------------------------------
21876         0x5574          Stringa e versionit U-Boot, "U-Boot 1.1.4-g4480d5f9-dirty (Mai
                              20 2019 - 18:45:16)"
21940         0x55B4          Tabela polinome CRC32, big endian
23232         0x5AC0          Header i uImage, madhësia e header-it: 64 bytes, CRC-i i header-it:
                              0x386C2BD5, krijuar: 2019-05-20 10:45:17, madhësia e imazhit:
                              41162 bytes, Adresa e të dhënave: 0x80010000, Pikë hyrjeje:
                              0x80010000, CRC-i i të dhënave: 0xC9CD1E38, OS: Linux, CPU: MIPS,
                              lloji i imazhit: Firmware Image, lloji i kompresimit: lzma, emri i imazhit:
                              "u-boot image"
23296         0x5B00          Të dhëna të kompresuara LZMA, pronësi: 0x5D, madhësia e fjalorit:
                              8388608 bytes, madhësia e pakompresuar: 97476 bytes
64968         0xFDC8          Dokument XML, version: "1.0"
78448         0x13270         Header i uImage, madhësia e header-it: 64 bytes, CRC-i i header-it:
                              0x78A267FF, krijuar: 2019-07-26 07:46:14, madhësia e imazhit:
                              1088500 bytes, Adresa e të dhënave: 0x80060000, Pikë hyrjeje:
                              0x80060000, CRC-i i të dhënave: 0xBB9D4F94, OS: Linux, CPU: MIPS,
                              lloji i imazhit: Multi-File Image, lloji i kompresimit: lzma,
                              emri i imazhit: "MIPS OpenWrt Linux-3.3.8"
78520         0x132B8         Të dhëna të kompresuara LZMA, pronësi: 0x6D, madhësia e fjalorit:
                              8388608 bytes, madhësia e pakompresuar: 3164228 bytes
1167013       0x11CEA5        Sistemi i skedarëve Squashfs, little endian, version 4.0,
                              kompresimi:xz, madhësia: 14388306 bytes, 2541 inodes,
                              madhësia e bllokut: 65536 bytes, 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 rreth kësaj imazhi.

Imazhi përdor U-Boot si ngarkues (koka e imazhit në adresën 0x5AC0 dhe imazhi i ngarkuesit të kompresuar në adresën 0x5B00). Bazuar në kokën e uImage në adresën 0x13270, ne dimë se arkitektura e procesorit është MIPS, dhe bërthama Linux ë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 skedareve squashfs.

Tani le të nxjerrim ngarkuesin (U-Boot) me komandën dd:

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

Pasi imazhi është kompresuar me LZMA, na nevojitet të shkarkojmë atë:

$ unlzma u-boot.bin.lzma

Tani kemi imazhin U-Boot:

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

ÇfarĂ« me kĂ«rkimin e vlerĂ«s default 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

Variabli i ambientit U-Boot bootargs përdoret për kalimin e parametrave në bërthamat Linux. Dhe nga e gjithë kjo, ne kuptojmë më mirë flash-in e pajisjes.

ÇfarĂ« me nxjerrjen e imazhit tĂ« bĂ«rthamĂ«s Linux?

$ dd if=archer-c7.bin of=uImage bs=1 skip=78448 count=1088572
1088572+0 records in
1088572+0 records out
1088572 bytes (1,1 MB, 1,0 MiB) kopjuar, 1,68628 s, 646 kB/s

Mund të verifikojmë se imazhi është nxjerrë me sukses me komandën file:

$ 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 skedarit uImage është kryesisht imazhi i bërthamës Linux me një header shtesë. Le të heqim këtë header për të marrë imazh përfundimtar të bërthamës Linux:

$ dd if=uImage of=Image.lzma bs=1 skip=72
1088500+0 records in
1088500+0 records out
1088500 bytes (1,1 MB, 1,0 MiB) kopjuar, 1,65603 s, 657 kB/s

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

$ unlzma Image.lzma

Tani kemi imazhin e bërthamës Linux:

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

ÇfarĂ« mund tĂ« bĂ«jmĂ« me imazhin e bĂ«rthamĂ«s? Mund tĂ« bĂ«jmĂ«, pĂ«r shembull, njĂ« kĂ«rkim nĂ« vargjet nĂ« imazh dhe tĂ« gjejmĂ« versionin e bĂ«rthamĂ«s Linux dhe tĂ« mĂ«sojmĂ« pĂ«r ambientin qĂ« Ă«shtĂ« pĂ«rdorur pĂ«r ndĂ«rtimin e bĂ«rthamĂ«s:

$ 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 Mon May 20 18:53:02 CST 2019

Megjithëse firma u lëshua vitin e kaluar (2019), kur po e shkruaj këtë artikull, ajo përdor një version të vjetër të bërthamës Linux (3.3.8) të lëshuar në vitin 2012, e kompjuterizuar me një version shumë të vjetër të GCC (4.6) gjithashtu nga viti 2012!
(shën. përkthyer a i besoni akoma routerave tuaj në zyrë dhe në shtëpi?)

Me opsionin --opcodes ne gjithashtu mund të përdorim binwalk për të kërkuar instruksione makinerie dhe për të përcaktuar arkitekturën e procesorit të imazhit:

$ binwalk --opcodes Image
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
2400          0x960           MIPS instructions, function epilogue
2572          0xA0C           MIPS instructions, function epilogue
2828          0xB0C           MIPS instructions, function epilogue

ÇfarĂ« ndodh me sistemin e skedarit tĂ« rrĂ«njĂ«s? NĂ« vend qĂ« tĂ« nxjerrim imazhin manualisht, le tĂ« pĂ«rdorim opsionin binwalk --extract:

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

Sistemi i plotë i skedarëve të rrënjës do të nxirret në nënfolderin:

$ 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
 ---------------------------------------------------------------
   Për ata që po rockojnë... (%C, %R)
 ---------------------------------------------------------------

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

Mund të kërkojmë skedarë konfigurimi, hash-e fjalëshkalimi, çelësa kriptografikë dhe certifikata digjitale. Mund të analizojmë skedarët binarë për të gjejmë gabime dhe vulnerabilitete.

Me qemu dhe chroot madje mund të nisim (emulojmë) 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 me shumë thirrje që kombinon shumë utilitete të zakonshëm Unix
    në një ekzekutues të vetëm.  Shumica e njerëzve do të krijojnë një
    lidhje me busybox për çdo funksion që duan të përdorin dhe BusyBox
    do të sillet siç u thirr.

Funksionet e përcaktuara aktualisht:
    [, [[, 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

Hi! Por vini re në dukje se versioni i BusyBox është 1.19.4. Ky është një version shumë i vjetër i BusyBox, i lëshuar në prill të vitit 2012.

Pra ndaj, TP-Link lëshon një imazh të firmware në vitin 2019 duke përdorur softuerin (GCC toolchain, kernel, BusyBox etj.) të vitit 2012!

Tani e kuptoni pse unë gjithmonë instaloj OpenWRT në routerët e mi?

Kjo nuk është e gjitha

Binwalk gjithashtu mund të kryejë analizë entropike, të printojë të dhënat entropike të papërpunuara dhe të gjenerojë grafika entropike. Zakonisht, një entropi e lartë vërehet kur bajtyt në imazh janë të rastësishëm. Kjo mund të nënkuptojë se imazhi përmban një skedar të enkriptuar, të comprimit ose të obfuscimit. Një çelës enkriptimi i shkruar fort? Pse jo.

Inxhinieria e reversit e routerit të shtëpisë 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ë personalizuar të bajtëve të papërpunuar në imazh ose parametrin --hexdump për të kryer një dump heksadecimal që krahason dy ose më shumë skedarë hyrës.

Nënshkrimet e personalizuara mund të shtohen në binwalk ose përmes një skedari të nënshkrimeve të personalizuara të specifikuara në vijën e komandës me parametrin --magic, ose duke i shtuar ato në katalogun $HOME/.config/binwalk/magic.

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

Zgjerimi i binwalk

Ekziston një API binwalk, i realizuar si një modul Python, që mund të përdoret nga çdo skenar Python për të ekzekutuar scanning binwalk programatikisht, dhe utiliteti i komandës binwalk mund të riprodhohet pothuajse plotësisht me vetëm dy rreshta Kodi Python!

import binwalk
binwalk.scan()

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

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

Pra, pse tĂ« mos shkarkoni njĂ« imazh firmware nga interneti dhe tĂ« provoni binwalk? Premtoj, do tĂ« keni shumĂ« argĂ«tim 🙂

Burimi: habr.com

Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« đŸ”„ Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« | ProHoster