
Outils IPMI issus des travaux de la DARPA
J'ai écrit un logiciel pour explorer IPMI ; voici quelques résultats. Je pensais suivre le cycle habituel : détection, récupération de données et audit. Chacun de ces aspects s'est révélé être un problème assez intéressant en soi, du moins pour moi.
**BTW/FYI ** - J'ai publié un nouvel outil pour explorer IPMI - https://github.com/zenfish/zipmi - ainsi qu'un ensemble de recettes/images/etc. Qemu pour exécuter des BMC en tant que systèmes virtuels sous Qemu à l'adresse https://github.com/zenfish/zbmc.
Les articles et autres documents de http://fish2.com/ipmi
Voici un petit programme Perl qui tente de deviner un compte sur un BMC distant, d'en extraire le hash, puis d'essayer de casser son mot de passe (haché en HMAC). J'ai rédigé un petit texte à ce sujet pour les curieux. Abondamment commenté, il pourra peut-être être utile.
La spécification IPMI indique que l'on peut obtenir le chiffrement d'un système distant sans aucune authentification, mais je ne connais aucun outil qui le fasse réellement (ils exigent tous une authentification, bien sûr vous pourriez saisir les octets hexadécimaux bruts si vous le souhaitiez !) J'ai donc écrit ce petit outil pour le faire ; il suit essentiellement la sortie d'ipmitool ; ce faisant, je pense avoir trouvé un bug dans cet utilitaire (sur la dernière ligne, parfois les systèmes émettent des déchets qui semblent être mal interprétés), mais qui sait, je n'ai pas assez de systèmes pour tester. Bref... ipmi-get-ciphers.py.
Si ce n'est rien d'autre, utile pour repérer les systèmes Cipher0 (note - cela signale simplement les chiffrements qui sont pris en charge - cela ne signifie pas qu'ils sont réellement activés), mais il y a des choses intéressantes dans la nature.
Deux programmes ici, l'un est un simple sondeur distant en Python (je commence à détester Perl, je vous le dis) et un second qui utilise les utilitaires de FreeIPMI pour récupérer les données de configuration authentifiées.
Un petit programme Python (plus de 50 % de commentaires en ligne, 2,5k compressé en gzip) qui envoie un seul paquet à un BMC et analyse la réponse. Que peut-on faire avec un seul paquet, pourrait-on se demander ? Plus de 10 tests de sécurité différents pour IPMI, pour commencer. Eh bien, pour commencer et pour finir, ce n'est qu'un paquet :) Nécessite Python, un BMC et un chemin ouvert vers le port UDP 623 pour fonctionner. L'utilisation est simplement « ipmi-get-auth.py target ».
ipmi-get-auth.py /
Une très brève description
En poussant à l'extrême... eh bien, voici une sorte de méga version de ce qui précède qui le fait pour tous les canaux, tous les privilèges, tous... enfin, vous voyez l'idée. Pour les monomaniaques (lisez les commentaires ou l'article que j'ai écrit à ce sujet pour comprendre pourquoi il fait ce qu'il fait !)
mega_chan.py /
Mega mega mega ... chan chan chan...
Et voici un simple programme pour envoyer un paquet Get Device ID (voir p250 de la spécification IPMI v 2) à un système. Cela devrait, en théorie, fonctionner sans authentification. Dans une petite enquête, environ 90 % des systèmes ont répondu à cela (mais pas tous avec des informations valides !) Vous pouvez, parfois, obtenir le fournisseur et d'autres informations, comme les numéros de modèle et autres, mais le plus intéressant est en fait d'obtenir un ID unique, traditionnellement une chose difficile à obtenir via le réseau.
get-ipmi-guid.py /
Get Device ID
Supermicro a eu quelques problèmes de divulgation de fichiers de mots de passe depuis son BMC - par exemple, voir ceci et d'autres articles :
a-penetration-testers-guide-to-ipmi
Pour utiliser ce script, il suffit de saisir :
dump_SM.py password_file
Fonctionne chez moi, aucune garantie implicite, explicite, etc.
Eh bien, si vous pouvez communiquer avec le port UDP 623, il est assez simple de déterminer si un système distant exécute IPMI. Toutefois, à moins de vous trouver à l'intérieur d'un centre de données, la plupart des gens bloquent l'UDP. Et même s'ils ne le font pas... le scan UDP est à peu près aussi lent qu'on peut l'imaginer. J'utilise donc actuellement deux méthodes de base, en m'appuyant sur le vénérable Nmap et ipmiping (issu des outils GNU FreeIPMI). La chose la plus simple à faire est :
</p> <p>
Comme Nmap est bien plus efficace pour scanner des réseaux à grande échelle
qu'ipmiping, cette méthode n'est utilisée que si Nmap indique qu'un hôte
a le port UDP 623 ouvert.
</p> <p>
Pour le meilleur ou pour le pire, ce port est souvent bloqué, si bien que la plupart du
temps d'autres méthodes sont plus susceptibles de déterminer indirectement si
IPMI est en cours d'exécution ou non.
</p> <p>
Les ports sont pondérés selon leur capacité indicative et selon que
Nmap les trouve ouverts, filtrés, ou dans d'autres états.
</p> <p>
Nmap peut également afficher les bannières des services auxquels il se connecte. J'utilise
des expressions régulières pour traquer les cibles - par exemple les chaînes
"iLO" et "DRAC" sont de bons indicateurs qu'un système pourrait exécuter
le service Integrated Lights Out de HP, ou iLO.
</p> <p>