Ingénierie inverse d'un routeur domestique avec binwalk. Faites-vous confiance au logiciel de votre routeur ?

Ingénierie inverse d'un routeur domestique avec binwalk. Faites-vous confiance au logiciel de votre routeur ?

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 routeur TP-Link Archer C7. 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 OpenWRT. 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 téléchargé la derniÚre image du firmware 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 ?

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, stripped

Commande 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. À Wikipedia 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 télécharger le code source et suivre les instructions d'installation ou guide rapide, 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 TP-Link).

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:41

Nous avons maintenant beaucoup d'informations sur cette image.

L'image utilise U-Boot 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/s

Puisque l'image est compressée avec LZMA, nous devons la décompresser :

$ unlzma u-boot.bin.lzma

Nous avons maintenant l'image U-Boot :

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

Que 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=128M

Variable 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/s

Nous 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: 0xBB9D4F94

Le 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/s

L'image est compressée, alors décompressons-la :

$ unlzma Image.lzma

Nous avons maintenant l'image du noyau Linux :

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

Que 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 2019

Bien 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 fonction

Qu'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.bin

Le 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 chercher des erreurs et des vulnérabilités.

Avec qemu et chroot 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, zcat

Cool ! 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.

Ingénierie inverse d'un routeur domestique avec binwalk. Faites-vous confiance au logiciel de votre routeur ?

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.

Des signatures personnalisĂ©es 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 la documentation officielle.

L'extension binwalk

Il existe Interface API 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 des plugins Python pour personnaliser et étendre binwalk.

Il existe également un plugin IDA et une version cloud Binwalk Pro.

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

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster