IoT - Analyse d'une Camera IP
Je participe régulièrement au club de hacking du CLUSIR de Lyon et j'essaye de régulièrement proposer des challenges pour les différentes séances. La séance du jeudi 23 Février 2017 abordait le sujet de la sécurité des IoT (Internet of Things).
Quelques jours avant la séance je me suis rappelé que quelques années auparavant j'avais acheté une Camera IP sur un site Chinois, DealeXtreme. Je ne l'ai presque jamais utilisé et je me suis dit qu'il pourrait être intéressant de l'analyser et pourquoi pas en faire un challenge.
La camera en question :
Une fois la caméra sortie de sa boite je trouve en dessous un "User Name" et un "Password".
Je décide de brancher la caméra en ethernet, Nmap me permet rapidement de la trouver sur le réseau et me remonte 3 ports ouverts : 23, 81 et 8600
Comme trop souvent sur les IoT le protocol Telnet est encore utilisé. J'essaye donc de me connecter dessus avec les identifiants de la caméra.
Fail! Les identifiants ne fonctionnent pas, j'essaye ensuite de bruteforcer le password root par défaut, sans succès...
J'essaye donc de voir ce que l'interface Web propose sur le port 81 :
Cette fois-ci, le login "admin" et le password "888888" fonctionnent pour se connecter sur l'interface d'administration de la caméra !
A ce stade je trouve la version du firmware 48.2.64.214 ainsi que d'autres informations concerant la caméra et sa configuration mais rien concernant l'accès en Telnet.
Sur la boite de la Camera IP des dessins indiquent la possibilité de télécharger une application Android : Eye4 pour contrôler la caméra. je décide donc de l'installer sur mon smartphone de test, caméra Chinoise et application Chinoise oblige ;].
L'application propose quasiment les mêmes fonctionnalités que l'interface Web, mais une fonctionnalité supplémentaire semble intéressante. Il est possible de mettre à jour le firmware depuis l'application :
Ayant déjà configuré pour d'autres tests mitmproxy (cf: article sur tinder) je peux facilement analyser les requêtes qui sont faites lorsque je clique sur la nouvelle version du firmware :
Dans la réponse je peux voir l'url de téléchargement du nouveau firmware 48.2.64.217 :
Dans un premier temps je veux analyser le firmware qui est installé de base sur la Camera IP, je modifie donc l'url en mettant 48.2.64.214 et je lance le téléchargement :
L'outil binwalk permet de rapidement analyser et extraire récursivement les fichiers du firmware :
Je liste ensuite les fichiers que nous obtenons :
En regardant chaque fichier, on voit que ipcam.sh est un script Shell qui lance les autres fichiers binaires, le plus intéressant est daemon.vstar.v13 qui semble contenir le password root du device :
Malheureusement la tentative de cassage du password, en ligne puis avec John, format DES crypt (8 chars + salt), s'avère infructueuse.
En cherchant sur internet sur des forums ou des utilisateurs demandent le password root de cette caméra, qui n'est volontairement pas donné par le constructeur (Qui a dit backdoor ?), je suis tombé sur un post ou le password 2010vesta est mentionné comme étant celui d'une autre caméra. A partir de là, mon deuxième test fût le bon, le password root de ma caméra est 2011vesta :
\o/ j'ai donc eu de la chance, mais imaginons que je ne trouve pas le password root, comment puis-je faire pour me connecter sur la caméra ?
Sur l'interface Web de la caméra une fonctionnalité dans "entretien" permet d'uploader soit même un firmware pour le mettre à jour :
Si j'arrive à modifier le password root dans le firmware récupéré et que je l'upload ensuite sur la Camera IP je devrais pouvoir me connecter dessus ! En cherchant sur internet je trouve comment procéder.
Je commence par analyser les 64 premiers bytes du firmware :
Les 32 premiers bytes semblent être un header propre au firmware, ensuite 4 bytes suivis du header d'un zip.
Le footer du fichier présente lui aussi 32 bytes particuliers :
Etant donnée la présence de la commande unzip dans les strings du fichier daemon.vstar.v13 il semble qu'il s'agisse bien d'un zip récursif classique. Il est donc possible de récupérer ce zip, le déziper , le modifier et le reziper puis rajouter le header et le footer !
Pour extraire correctement le zip, dd est l'outil parfait, le firmware possède un header de 32 bytes + 4 bytes et un footer de 32 bytes. La taille totale est de 306632 bytes.
Les commandes une fois lancées :
Le zip est bon et je retrouve tous les fichiers extraits plus tôt avec binwalk. Il faut modifier le password hashé dans le fichier daemon.vstar.v13.
je génère le nouveau hash du password :
$ python -c 'import crypt; print crypt.crypt("1337","le")'
leKcWxk7577yg
Je veux donc remplacer cette ligne :
root:OYZVRABjiXqqQ:0:0:Adminstrator:/:/bin/sh
Par celle-là :
root:leKcWxk7577yg:0:0:Adminstrator:/:/bin/sh
Pour modifier le fichier daemon.vstar.v13 et le remplacer j'utilise un éditeur hexadécimal, bless :
Pour finir je reconstitue le zip :
$ zip -r firmware_modified.zip system/
Il faut repackager le firmware en ajoutant le header et le footer ainsi que les 4 bytes suivant le header, les 4 bytes constituent la taille du zip en hexadécimal !
Reconstruction du firmwware avec le header, les 4 bytes de la taille avec l'hexadécimal "4ad83" -> "\x16\x41\x04\x00" et le footer :
$ (echo -ne "wifi-camera-sys-qetyipadgjlzcbmn\x83\xad\x04\x00" ; cat firmware_modified.zip ; echo -ne "wifi-camera-end-nvxkhfsouteqzhpo" ) > firmware_modified.bin
Il ne reste plus qu'à uploader le firmware modifié par l'interface web, la camera reboot, je tente de me connecter en telnet avec le nouveau password.....
\o/ root access :]
J'ai donc construit un petit challenge par la suite, writeup :
La première étape était de récupérer la version du firmware en se connectant sur l'interface web avec les credentials par défaut (l'IP de la Camera IP étant donné). Soit en cherchant sur internet soit en retournant simplement la Camera IP.
Pour la deuxième étape il fallait analyser le firmware modifié (binwalk), récupérer le nouveau password root dans le fichier daemon.vstar.v13, le casser avec john (rapide avec le nouveau password faible), ensuite se connecter sur la Camera IP et récupérer le flag dans /tmp.
Si vous voulez essayer/analyser -> firmware modifié
Fap'ment,