
Il y a quelques jours, j'ai décidé de procéder à une ingénierie inverse du firmware de mon routeur en utilisant binwalk.
Je me suis acheté un . Ce n'est pas le meilleur routeur, mais il est tout à fait suffisant pour mes besoins.
Chaque fois que j'achÚte un nouveau routeur, j'installe . Pourquoi ? En rÚgle générale, les fabricants ne se soucient pas beaucoup du soutien de leurs routeurs et avec le temps, le logiciel devient obsolÚte, des vulnérabilités apparaissent, etc., vous avez compris. C'est pourquoi je préfÚre un firmware open-source bien soutenu par la communauté, comme OpenWRT.
AprÚs avoir téléchargé OpenWRT, j'ai également pour mon nouveau Archer C7 depuis le site officiel et j'ai décidé de l'analyser. Juste pour le plaisir et pour parler de binwalk.
Qu'est-ce que binwalk ?
est un outil open-source pour l'analyse, l'ingénierie inverse et l'extraction d'images de firmware.
Créé en 2010 par Craig Heffner, binwalk peut scanner des images de firmware et trouver des fichiers, identifier et extraire des images de systÚmes de fichiers, du code exécutable, des archives compressées, des chargeurs et des noyaux, des formats de fichiers tels que JPEG et PDF, et bien plus encore.
Vous pouvez utiliser binwalk pour effectuer une ingénierie inverse du firmware afin de comprendre comment il fonctionne. Cherchez des vulnérabilités dans les fichiers binaires, extrayez des fichiers et recherchez des portes dérobées ou des certificats numériques. Vous pouvez également trouver des opcodes pour une multitude de processeurs différents.
Vous pouvez décompresser des images de systÚmes de fichiers pour chercher des fichiers spécifiques tels que des mots de passe (passwd, shadow, etc.) et tenter de casser des hashs de mots de passe. Vous pouvez effectuer une analyse binaire entre deux fichiers ou plus. Vous pouvez réaliser une analyse d'entropie des données pour détecter des données compressées ou des clés de chiffrement encodées. Tout cela sans nécessiter d'accÚs au code source.
En gros, tout ce qu'il faut est lĂ đ
Comment fonctionne binwalk ?
La principale caractéristique de binwalk est son scan par signature. Binwalk peut analyser une image de firmware à la recherche de divers types de fichiers intégrés et de systÚmes de fichiers.
Vous connaissez l'utilitaire en ligne de commande fichier?
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, strippedCommande fichierqui examine l'en-tĂȘte du fichier et recherche une signature (nombre magique) pour dĂ©terminer le type de fichier. Par exemple, si un fichier commence par une sĂ©quence de bytes 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A, elle sait que c'est un fichier PNG. Ă il existe une liste de signatures de fichiers courantes.
Binwalk fonctionne de la mĂȘme maniĂšre. Mais au lieu de rechercher des signatures uniquement au dĂ©but du fichier, binwalk va scanner l'ensemble du fichier. De plus, binwalk peut extraire les fichiers trouvĂ©s dans l'image.
Outils fichier et binwalk utilise la bibliothĂšque libmagic pour identifier les signatures de fichiers. Mais binwalk il prend Ă©galement en charge une liste de signatures magiques personnalisĂ©es pour rechercher des fichiers compressĂ©s / archivĂ©s, des en-tĂȘtes de micrologiciels, des noyaux Linux, des chargeurs de dĂ©marrage, des systĂšmes de fichiers, etc.
On s'amuse ?
Installation de binwalk
Binwalk est pris en charge sur plusieurs plates-formes, y compris Linux, OSX, FreeBSD et Windows.
Pour installer la derniĂšre version de binwalk, vous pouvez et suivre ou , disponible sur le site Web du projet.
Binwalk a de nombreuses options différentes :
$ binwalk
Binwalk v2.2.0
Craig Heffner, ReFirmLabs
https://github.com/ReFirmLabs/binwalk
Utilisation : binwalk [OPTIONS] [FICHIER1] [FICHIER2] [FICHIER3] ...
Options de scan de signature :
-B, --signature Scanner le(s) fichier(s) cible(s) Ă la recherche de signatures de fichiers courants
-R, --raw= Scanner le(s) fichier(s) cible(s) à la recherche de la séquence d'octets spécifiée
-A, --opcodes Scanner le(s) fichier(s) cible(s) à la recherche de signatures d'opcodes exécutables communs
-m, --magic= Spécifier un fichier magique personnalisé à utiliser
-b, --dumb Désactiver les mots-clés de signature intelligents
-I, --invalid Afficher les résultats marqués comme invalides
-x, --exclude= Exclure les rĂ©sultats qui correspondent Ă
-y, --include= Afficher uniquement les rĂ©sultats qui correspondent Ă
Options d'extraction :
-e, --extract Extraire automatiquement les types de fichiers connus
-D, --dd= Extraire les signatures de , donner aux fichiers une extension de et exécuter
-M, --matryoshka Scanner récursivement les fichiers extraits
-d, --depth= Limiter la profondeur de récursion matryoshka (par défaut : 8 niveaux)
-C, --directory= Extraire fichiers / dossiers dans un répertoire personnalisé (par défaut : répertoire de travail actuel)
-j, --size= Limiter la taille de chaque fichier extrait
-n, --count= Limiter le nombre de fichiers extraits
-r, --rm Supprimer les fichiers extraits aprĂšs extraction
-z, --carve Extraire des données des fichiers, mais ne pas exécuter les utilitaires d'extraction
-V, --subdirs Extraire dans des sous-répertoires nommés par l'offset
Options d'entropie :
-E, --entropy Calculer l'entropie des fichiers
-F, --fast Utiliser une analyse d'entropie plus rapide, mais moins détaillée
-J, --save Enregistrer le graphique sous forme de PNG
-Q, --nlegend Omettre la légende du graphique de l'entropie
-N, --nplot Ne pas générer de graphique d'entropie
-H, --high= Définir le seuil de déclenchement d'entropie en bord montant (par défaut : 0,95)
-L, --low= Définir le seuil de déclenchement d'entropie en bord descendant (par défaut : 0,85)
Options de comparaison binaire :
-W, --hexdump Effectuer un hexdump / diff d'un fichier ou de fichiers
-G, --green Afficher uniquement les lignes contenant des octets identiques parmi tous les fichiers
-i, --red Afficher uniquement les lignes contenant des octets différents parmi tous les fichiers
-U, --blue Afficher uniquement les lignes contenant des octets différents parmi certains fichiers
-u, --similar Afficher uniquement les lignes qui sont identiques entre tous les fichiers
-w, --terse Diff tous les fichiers, mais n'affiche qu'un hex dump du premier fichier
Options de compression brute :
-X, --deflate Scanner Ă la recherche de flux de compression deflate raw
-Z, --lzma Scanner Ă la recherche de flux de compression LZMA raw
-P, --partial Effectuer un scan superficiel, mais plus rapide
-S, --stop ArrĂȘter aprĂšs le premier rĂ©sultat
Options générales :
-l, --length= Nombre d'octets Ă scanner
-o, --offset= Commencer le scan Ă cet offset de fichier
-O, --base= Ajouter une adresse de base à tous les offsets imprimés
-K, --block= Définir la taille des blocs de fichiers
-g, --swap= Inverser tous les n octets avant de scanner
-f, --log= Journaliser les résultats dans un fichier
-c, --csv Journaliser les résultats dans un fichier au format CSV
-t, --term Formater la sortie pour s'adapter Ă la fenĂȘtre du terminal
-q, --quiet Supprimer la sortie vers stdout
-v, --verbose Activer la sortie détaillée
-h, --help Afficher l'aide
-a, --finclude= Scanner uniquement les fichiers dont les noms correspondent Ă cette regex
-p, --fexclude= Ne pas scanner les fichiers dont les noms correspondent Ă cette regex
-s, --status= Activer le serveur d'état sur le port spécifiéNumérisation des images
Commençons par chercher les signatures des fichiers à l'intérieur de l'image (image du site ).
ExĂ©cution de binwalk avec l'option âsignature :
$ binwalk --signature --term archer-c7.bin
DĂCIMAL HEXADECIMAL DESCRIPTION
------------------------------------------------------------------------------------------
21876 0x5574 ChaĂźne de version U-Boot, "U-Boot 1.1.4-g4480d5f9-dirty (20 mai
2019 - 18:45:16)"
21940 0x55B4 Tableau de polynĂŽmes CRC32, big endian
23232 0x5AC0 En-tĂȘte uImage, taille de l'en-tĂȘte : 64 octets, CRC de l'en-tĂȘte :
0x386C2BD5, créé : 2019-05-20 10:45:17, taille de l'image :
41162 octets, Adresse de données : 0x80010000, Point d'entrée :
0x80010000, CRC de données : 0xC9CD1E38, OS : Linux, CPU : MIPS,
type d'image : Image du Firmware, type de compression : lzma, nom de l'image :
"image u-boot"
23296 0x5B00 Données compressées LZMA, propriétés : 0x5D, taille du dictionnaire :
8388608 octets, taille non compressée : 97476 octets
64968 0xFDC8 Document XML, version : "1.0"
78448 0x13270 En-tĂȘte uImage, taille de l'en-tĂȘte : 64 octets, CRC de l'en-tĂȘte :
0x78A267FF, créé : 2019-07-26 07:46:14, taille de l'image :
1088500 octets, Adresse de données : 0x80060000, Point d'entrée :
0x80060000, CRC de données : 0xBB9D4F94, OS : Linux, CPU : MIPS,
type d'image : Image Multi-Fichiers, type de compression : lzma,
nom de l'image : "MIPS OpenWrt Linux-3.3.8"
78520 0x132B8 Données compressées LZMA, propriétés : 0x6D, taille du dictionnaire :
8388608 octets, taille non compressée : 3164228 octets
1167013 0x11CEA5 SystĂšme de fichiers Squashfs, little endian, version 4.0,
compression : xz, taille : 14388306 octets, 2541 i-nodes,
taille de bloc : 65536 octets, créé : 2019-07-26 07:51:38
15555328 0xED5B00 Données compressées gzip, provenant de Unix, derniÚre modification : 2019-07-26
07:51:41Nous avons maintenant beaucoup d'informations sur cette image.
L'image utilise comme chargeur d'amorçage (en-tĂȘte de l'image Ă l'adresse 0x5AC0 et image compressĂ©e du chargeur Ă l'adresse 0x5B00). En nous basant sur l'en-tĂȘte uImage Ă l'adresse 0x13270, nous savons que l'architecture du processeur est MIPS, et le noyau Linux est la version 3.3.8. Et sur la base de l'image trouvĂ©e Ă l'adresse 0x11CEA5, nous pouvons voir que rootfs est le systĂšme de fichiers squashfs.
Décompressons maintenant le chargeur (U-Boot) en utilisant la commande dd:
$ dd if=archer-c7.bin of=u-boot.bin.lzma bs=1 skip=23296 count=41162
41162+0 enregistrements en
41162+0 enregistrements sortants
41162 octets (41 kB, 40 KiB) copiés, 0,0939608 s, 438 kB/sPuisque l'image est compressée avec LZMA, nous devons la décompresser :
$ unlzma u-boot.bin.lzmaNous avons maintenant l'image U-Boot :
$ ls -l u-boot.bin
-rw-rw-r-- 1 sprado sprado 97476 Fev 5 08:48 u-boot.binQue diriez-vous de chercher la valeur par défaut pour 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=128MVariable d'environnement U-Boot bootargs est utilisé pour passer des paramÚtres au noyau Linux. Et à partir de ce qui précÚde, nous comprenons mieux la mémoire flash de l'appareil.
Que diriez-vous d'extraire l'image du noyau Linux ?
$ dd if=archer-c7.bin of=uImage bs=1 skip=78448 count=1088572
1088572+0 enregistrements lus
1088572+0 enregistrements écrits
1088572 octets (1,1 Mo, 1,0 MiB) copiés, 1,68628 s, 646 kB/sNous pouvons vérifier que l'image a été extraite avec succÚs en utilisant la commande fichier:
$ file uImage
uImage: u-boot legacy uImage, MIPS OpenWrt Linux-3.3.8, Linux/MIPS, Image Multi-Fichier (lzma), 1088500 octets, Ven 26 Jul 07:46:14 2019, Adresse de chargement: 0x80060000, Point d'entrĂ©e: 0x80060000, CRC d'en-tĂȘte: 0x78A267FF, CRC de donnĂ©es: 0xBB9D4F94Le format de fichier uImage est principalement une image du noyau Linux avec un en-tĂȘte supplĂ©mentaire. Retirons cet en-tĂȘte pour obtenir l'image finale du noyau Linux :
$ dd if=uImage of=Image.lzma bs=1 skip=72
1088500+0 enregistrements lus
1088500+0 enregistrements écrits
1088500 octets (1,1 Mo, 1,0 MiB) copiés, 1,65603 s, 657 kB/sL'image est compressée, alors décompressons-la :
$ unlzma Image.lzmaNous avons maintenant l'image du noyau Linux :
$ ls -la Image
-rw-rw-r-- 1 sprado sprado 3164228 Fev 5 10:51 ImageQue pouvons-nous faire avec l'image du noyau ? Nous pourrions, par exemple, rechercher des chaßnes dans l'image pour trouver la version du noyau Linux et apprendre sur l'environnement utilisé pour compiler le noyau :
$ strings Image | grep "Linux version"
Version du noyau Linux 3.3.8 (leo@leo-MS-7529) (gcc version 4.6.3 20120201 (version préliminaire) (Linaro GCC 4.6-2012.02)) #1 Lun Mai 20 18:53:02 CST 2019Bien que le firmware ait été publié l'année derniÚre (2019), lorsque j'écris cet article, il utilise une ancienne version du noyau Linux (3.3.8), publiée en 2012, compilée avec une trÚs vieille version de GCC (4.6) également de 2012 !
(note de la trad. faites-vous encore confiance Ă vos routeurs au bureau et Ă la maison ?)
Avec l'option --opcodes nous pouvons également utiliser binwalk pour rechercher des instructions machines et déterminer l'architecture du processeur de l'image :
$ binwalk --opcodes Image
DĂCIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
2400 0x960 instructions MIPS, épilogue de fonction
2572 0xA0C instructions MIPS, épilogue de fonction
2828 0xB0C instructions MIPS, épilogue de fonctionQu'en est-il du systÚme de fichiers racine ? PlutÎt que d'extraire l'image manuellement, utilisons l'option binwalk --extract:
$ binwalk --extract --quiet archer-c7.binLe systÚme de fichiers racine complet sera extrait dans un sous-répertoire :
$ 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
---------------------------------------------------------------
Pour ceux qui vont rocker... (%C, %R)
---------------------------------------------------------------Maintenant, nous pouvons faire beaucoup de choses différentes.
Nous pouvons rechercher des fichiers de configuration, des hashs de mots de passe, des clés cryptographiques et des certificats numériques. Nous pouvons analyser des fichiers binaires pour et des vulnérabilités.
Avec et nous pouvons mĂȘme exĂ©cuter (Ă©muler) un fichier exĂ©cutable Ă partir de l'image :
$ 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) binaire multi-appel.
Droit d'auteur (C) 1998-2011 Erik Andersen, Rob Landley, Denys Vlasenko
et d'autres. Sous licence GPLv2.
Voir la distribution source pour l'avis complet.
Utilisation : busybox [fonction] [arguments]...
ou : busybox --list[-full]
ou : fonction [arguments]...
BusyBox est un binaire multi-appel qui combine de nombreux utilitaires Unix
courants en un seul exécutable. La plupart des gens créeront un
lien vers busybox pour chaque fonction qu'ils souhaitent utiliser et BusyBox
agira comme ce pour quoi il a été invoqué.
Fonctions actuellement définies :
[, [[, 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, zcatCool ! Mais notez que la version de BusyBox est 1.19.4. C'est une trĂšs ancienne version de BusyBox, sortie en avril 2012.
Ainsi, TP-Link publie une image de firmware en 2019 en utilisant des logiciels (GCC toolchain, kernel, BusyBox, etc.) de 2012 !
Maintenant, vous comprenez pourquoi j'installe toujours OpenWRT sur mes routeurs ?
Ce n'est pas tout
Binwalk peut également effectuer une analyse d'entropie, imprimer des données brutes d'entropie et générer des graphiques d'entropie. En général, une grande entropie est observée lorsque les octets de l'image sont aléatoires. Cela peut signifier que l'image contient un fichier chiffré, compressé ou obfusqué. Une clé de chiffrement écrite en dur ? Pourquoi pas.

Nous pouvons également utiliser le paramÚtre --raw pour rechercher une séquence personnalisée d'octets bruts dans l'image ou le paramÚtre --hexdump pour effectuer un dump hexadécimal, comparant deux fichiers d'entrée ou plus.
peuvent ĂȘtre ajoutĂ©es Ă binwalk soit via un fichier de signatures personnalisĂ©es spĂ©cifiĂ© dans la ligne de commande avec le paramĂštre --magic, soit en les ajoutant au rĂ©pertoire $ HOME / .config / binwalk / magic.
Vous pouvez trouver plus d'informations sur binwalk dans .
L'extension binwalk
Il existe binwalk, implĂ©mentĂ©e sous forme de module Python, pouvant ĂȘtre utilisĂ©e par n'importe quel script Python pour rĂ©aliser des scans de binwalk, et l'outil en ligne de commande binwalk peut ĂȘtre presque entiĂšrement reproduit en seulement deux lignes de code Python !
import binwalk
binwalk.scan()Avec l'API Python, vous pouvez également créer pour personnaliser et étendre binwalk.
Il existe également et une version cloud .
Alors pourquoi ne pas tĂ©lĂ©charger une image de firmware depuis Internet et essayer binwalk ? Je vous promets que vous vous amuserez beaucoup đ
Source : habr.com
