
Amusons-nous en creusant dans le firmware d'un routeur Zyxel et l'architecture MIPS
Les tutoriels sont fournis à titre informatif et éducatif uniquement. Je crois que le hacking éthique, la sécurité de l'information et la cybersécurité devraient être des sujets familiers pour quiconque utilise des informations numériques et des ordinateurs. Je crois qu'il est impossible de se défendre contre les hackers sans savoir comment le hacking est effectué.
$ IDA Pro +7.0 (vous pouvez utiliser Radar2 car IDA est assez cher)
$ Routeur exécutant Rompager 4.07 : il en existe un nombre immense, comme TP-Link TD-W8951*, ZyXEL P-660R, Billion BiPAC 51**/52**
$ UART vers USB
La vulnérabilité Misfortune Cookie existe depuis un certain temps mais il manque encore une analyse publique illustrant les détails techniques de la vulnérabilité. Selon Check Point, le logiciel affecté est le serveur web embarqué RomPager d'AllegroSoft. Des analyses à l'échelle d'Internet suggèrent que RomPager est probablement le logiciel serveur web le plus populaire au monde en termes de nombre de points d'accès disponibles. RomPager est généralement intégré dans le firmware livré avec l'appareil. Cette vulnérabilité spécifique a été introduite dans la base de code en 2002. De plus, les appareils exposés sont ceux utilisant les services RomPager avec des versions antérieures à 4.34 (et plus précisément 4.07).
Pour ce tutoriel, j'utiliserai un ZXHN H108L qui utilise Rompager 4.07
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="ZXHN H108L"
Content-Type: text/html
Transfer-Encoding: chunked
Server: RomPager/4.07 UPnP/1.0
EXT:
Maintenant, utilisons le port série. D'abord, nous devons déterminer le débit en bauds
$ sudo stty -F /dev/ttyUSB0
SORTIE :
speed 115200 baud; line = 0;
-brkint -imaxbel
appareil
J'utilise minicom, vous pouvez utiliser n'importe quoi, de screen à HyperTerminal, mais je préfère celui-ci pour sa stabilité ;)
$ sudo minicom -s
+-----------------------------------------------------------------------+
| A - Périphérique série : /dev/modem |
| B - Emplacement fichier verrou : /var/lock |
| C - Programme d'appel : |
| D - Programme de sortie : |
| E - Bps/Parité/Bits : 115200 8N1 |
| F - Contrôle de flux matériel : Non |
| G - Contrôle de flux logiciel : Non |
| |
| Changer quel paramètre ? |
+-----------------------------------------------------------------------+
| Écran et clavier |
| Sauvegarder la config |
| Sauvegarder sous.. |
| Quitter |
| Quitter Minicom |
+--------------------------+
Maintenant, nous sommes prêts :
$ sudo minicom -D /dev/ttyUSB0 -b 115200
Bootbase Version: VTC_SPI1.26 | 2012/12/26 16:00:00
RAM: Size = 8192 Kbytes
Found SPI Flash 2MiB GD25Q16 at 0xbfc00000
SPI Flash Quad Enable
Turn off Quad Mode
RAS Version: ZXHN H108LV4.0.0a_ZRQ_MA
System ID: $2.12.162.0(G94.BY.2)3.20.19.0| 2014/03/21 20140321_v006 | 2014
Appuyez sur une touche pour entrer en mode debug dans les 3 secondes.
..........
Pour afficher les commandes possibles :
$ ATHE
======= Liste des commandes de debug =======
AT répond juste OK
ATHE affiche l'aide
ATBAx change le débit en bauds. 1:38.4k, 2:19.2k, 3:9.6k 4:57.6k 5:115.2k
ATENx,(y) définit le BootExtension Debug Flag (y=mot de passe)
ATSE affiche la graine du générateur de mot de passe
ATTI(h,m,s) change l'heure système en heure:min:sec ou affiche l'heure actuelle
ATDA(y,m,d) change la date système en année/mois/jour ou affiche la date actuelle
ATDS vide la pile RAS
ATDT vide la zone commune du module de démarrage
ATDUx,y vide le contenu mémoire de l'adresse x pour la longueur y
ATRBx affiche la valeur 8 bits de l'adresse x
ATRWx affiche la valeur 16 bits de l'adresse x
ATRLx affiche la valeur 32 bits de l'adresse x
ATGO(x) exécute le programme à l'adresse x ou démarre le routeur
ATGR démarre le routeur
ATGT exécute le programme de test matériel
ATRTw,x,y(,z) test RAM niveau w, de l'adresse x à y (z itérations)
ATSH vide les données liées au fabricant dans la ROM
ATDOx,y télécharge depuis l'adresse x pour la longueur y vers le PC via XMODEM
ATTD télécharge la configuration du routeur vers le PC via XMODEM
ATUR téléverse le firmware du routeur dans la flash ROM
< appuyez sur une touche pour continuer >
Ce firmware possède un ensemble de commandes cachées très utiles pour notre analyse dynamique. Le problème est que nous ne pouvons pas voir les registres ni définir des points d'arrêt, mais heureusement, avec ces commandes cachées, nous aurons ces fonctionnalités. Pour les voir et les utiliser, nous devons utiliser ATEN. Cependant, cette commande nécessite un mot de passe. Que pouvons-nous faire maintenant ? Analysons le firmware en sens inverse pour trouver l'algorithme du générateur de mot de passe.
(Analyse statique) Regardons d'abord le fichier firmware :
$ binwalk ras
binwalk1
$ dd if=ras of=rom1.lzma bs=1 skip=85043 count=66696
$ dd if=ras of=rom2.lzma bs=1 skip=350259 count=3350556
$ lzma -d <rom1.lzma> rom1
$ lzma -d <rom2.lzma> rom2
Voyons maintenant la signature dans les fichiers extraits :
$ binwalk -Y rom1
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 Code exécutable MIPS, 32/64 bits, big endian, au moins 1250 instructions valides
string est un excellent outil pour avoir une idée de ce qu'est un fichier binaire ou de ce qu'il contient. Voyons si nous pouvons trouver l'algorithme du mot de passe :
$ strings rom1 | grep -i aten
$ strings rom2 | grep -i aten
Apparemment, nous ne pouvons pas le voir car le firmware est toujours compressé, ce qui signifie que nous devons le vider du routeur en utilisant le mode de débogage :
$ ATDO bfc00000, 1f0000
xmodem
La première chose qui vient à l'esprit est de commencer à chercher une table de répartition. Pourquoi ? Juste une intuition, la seule alternative est un if-elif mais ce serait un long ensemble de conditions pour vérifier la validité du mot de passe fourni par l'utilisateur, et voici ce que j'ai trouvé :
ROM:800158A0 CmdTable: .word unk_80015C20 # DATA XREF: sub_8000E3D8+4Co
ROM:800158A0 # sub_8000E3D8+90o ...
ROM:800158A4 .word sub_8000E6D0
ROM:800158A8 .byte 0
ROM:800158A9 .byte 0
ROM:800158AA .byte 0
ROM:800158AB .byte 0
ROM:800158AC .word aJustAnswerOk # " just answer OK"
ROM:800158B0 .word aAthe # "ATHE"
ROM:800158B4 .word CMD_SHOW_HELP_ATHE
ROM:800158B8 .byte 0
ROM:800158B9 .byte 0
ROM:800158BA .byte 0
ROM:800158BB .byte 0
ROM:800158BC .word aPrintHelp # " print help"
ROM:800158C0 .word aAtba # "ATBA"
ROM:800158C4 .word CMD_ATBA
...
ROM:800158D0 .word aAten # "ATEN"
ROM:800158D4 .word CMD_ATEN