
Disa ditë më parë, vendosa të kryej inxhinierinë e reversit të firmware-it tim të routerit duke përdorur binwalk.
Bleva për vete . Nuk është routeri më i mirë, por mjafton për nevojat e mia.
Ădo herĂ« qĂ« blej njĂ« router tĂ« ri, instaloj . 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 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?
ë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, strippedEkipa 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ë 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ë dhe të ndiqni ose , 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 caktuarSkannimi i imazheve
Le të fillojmë me kërkimin e nënshkrimeve të skedarëve brenda imazhit (imazhi nga uebsiti ).
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:41Tani kemi shumë informacion rreth kësaj imazhi.
Imazhi përdor 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/sPasi imazhi është kompresuar me LZMA, na nevojitet të shkarkojmë atë:
$ unlzma u-boot.bin.lzmaTani 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=128MVariabli 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/sMund 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: 0xBB9D4F94Formati 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/sImazhi është i kompresuar, kështu që le të shpërbëjmë atë:
$ unlzma Image.lzmaTani 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 2019Megjithë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.binSistemi 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 dhe vulnerabilitete.
Me dhe 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, zcatHi! 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.

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.
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ë .
Zgjerimi i binwalk
Ekziston 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 për të personalizuar dhe zgjeruar binwalk.
Ka gjithashtu një dhe një version cloud .
Pra, pse tĂ« mos shkarkoni njĂ« imazh firmware nga interneti dhe tĂ« provoni binwalk? Premtoj, do tĂ« keni shumĂ« argĂ«tim đ
Burimi: habr.com
