
Disa ditë më parë, vendosa të bëj inxhinieri të rikthimit të firmuerit të routerit tim duke përdorur binwalk.
Bleva për vete . 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 . 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 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?
ë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 shkurtruarEkipa 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ë 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ë dhe të ndiqni или , 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 specifikuarSkandimi i imazheve
Do të fillojmë me kërkimin e nënshkrimeve të skedarëve brenda imazhit (imazhi nga faqja ).
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:41Tani kemi shumë informacion mbi këtë imazh.
Imazhi përdor 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/sDuke qenë se imazhi është kompresuar me LZMA, na nevojitet ta nxjerrim atë:
$ unlzma u-boot.bin.lzmaTani kemi imazhin e U-Boot:
$ ls -l u-boot.bin
-rw-rw-r-- 1 sprado sprado 97476 Shk 5 08:48 u-boot.binSi 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=128MVariabla 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/sMund 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: 0xBB9D4F94Formati 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/sImazhi është i kompresuar, kështu që le të shpërthejmë atë:
$ unlzma Image.lzmaTani 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 2019Megjithë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.binSistemi 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 dhe vulnerabiliteteve.
Me ndihmën e dhe 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.

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.
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ë .
Zgjerimi binwalk
Ekziston një 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 për të personalizuar dhe zgjeruar binwalk.
Ka gjithashtu dhe një version në cloud .
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
