
IPMI-Zeug aus der DARPA-Arbeit
Ich habe einige Programme geschrieben, um IPMI zu erkunden; hier sind einige der Ergebnisse. Ich dachte, ich mache den üblichen Zyklus aus Erkennen, Daten abrufen und Auditieren. Jeder dieser Schritte erwies sich als ein ziemlich interessantes Problem für sich, zumindest für mich.
Übrigens/zur Info – Ich habe ein neues Tool zur Erkundung von IPMI veröffentlicht – https://github.com/zenfish/zipmi – sowie eine Sammlung von Qemu-Rezepten/Images/usw., um BMCs als virtuelle Systeme unter Qemu unter https://github.com/zenfish/zbmc auszuführen.
Die Papers und Dinge von http://fish2.com/ipmi
Hier ist ein kleines Perl-Programm, das versucht, ein Konto auf einem entfernten BMC zu erraten, dessen Hash zu extrahieren und dann zu versuchen, dessen (HMAC-gehashtes) Passwort zu knacken. Ich habe für Neugierige ein wenig darüber geschrieben. Es ist stark kommentiert und könnte von einigem Nutzen sein.
Die IPMI-Spezifikation besagt, dass man die Cipher eines entfernten Systems ohne jegliche Authentifizierung abrufen kann, aber mir ist kein Tool bekannt, das dies tatsächlich tut (sie alle erfordern Authentifizierung, obwohl man natürlich die rohen Hex-Bytes eingeben könnte, wenn man wollte!). Also habe ich dieses kleine Programm geschrieben, das dies tut; es versucht weitgehend, der Ausgabe von ipmitool zu folgen; dabei glaube ich, einen Bug in diesem Utility gefunden zu haben (in der letzten Zeile geben Systeme manchmal etwas Müll aus, der offenbar falsch interpretiert wird), aber wer weiß, ich habe nicht genügend Systeme zum Testen. Wie auch immer... ipmi-get-ciphers.py.
Wenn nichts anderes, so ist es nützlich, um Cipher0-Systeme zu erkennen (Hinweis – dies zeigt lediglich Cipher an, die unterstützt werden – es bedeutet nicht, dass sie tatsächlich aktiviert sind), aber da draußen gibt es interessante Dinge.
Zwei Programme hier, eines ist ein einfacher Python- Remote-Prober (ich fange an, Perl zu hassen, das sage ich euch) und ein zweites, das Utilities von FreeIPMI verwendet, um Konfigurationsdaten mit Anmeldedaten abzurufen.
Ein kleines Python-Programm (über 50 % Inline-Kommentare, 2,5k gzip-komprimiert), das ein einzelnes Paket an ein BMC sendet und die Antwort analysiert. Was kann man mit nur einem einzigen Paket tun, mag man sich fragen? 10+ verschiedene Sicherheitstests für IPMI, zum Beispiel. Nun, zum Beispiel und zum Schluss, es ist nur ein Paket :) Erfordert Python, ein BMC und einen offenen Pfad zu UDP-Port 623, um zu funktionieren. Die Verwendung ist einfach „ipmi-get-auth.py target“.
ipmi-get-auth.py /
Eine sehr kurze Beschreibung
Auf die Spitze getrieben... nun, hier ist eine Art Mega-Version des Obigen, die es für alle Kanäle, alle Privilegien, alle... nun, ihr versteht schon, macht. Für die Monomanen (lest die Kommentare oder den Beitrag, den ich darüber geschrieben habe, um zu sehen, warum es tut, was es tut!)
mega_chan.py /
Mega mega mega ... chan chan chan...
Und hier ist ein einfaches Programm, das ein Get Device ID-Paket (siehe S. 250 der IPMI v 2-Spezifikation) an ein System sendet. Dies sollte theoretisch ohne Authentifizierung funktionieren. In einer kleinen Umfrage antworteten etwa 90 % der Systeme darauf (allerdings nicht alle mit gültigen Informationen!) Man kann manchmal den Hersteller und andere Informationen wie Modellnummern und dergleichen erhalten, aber interessanter ist tatsächlich das Erhalten einer eindeutigen ID, traditionell eine schwierige Sache über das Netz.
get-ipmi-guid.py /
Get Device ID
Supermicro hatte einige Probleme mit der Offenlegung von Passwortdateien aus seinem BMC – siehe zum Beispiel dies und andere Berichte:
a-penetration-testers-guide-to-ipmi
Um dieses Skript zu verwenden, geben Sie einfach Folgendes ein:
dump_SM.py password_file
Bei mir funktioniert es, ohne Gewähr, Garantie usw.
Nun, wenn Sie mit UDP-Port 623 kommunizieren können, ist es ziemlich einfach herauszufinden, ob ein entferntes System IPMI ausführt. Es sei denn, Sie befinden sich in einem Rechenzentrum, blockieren jedoch die meisten Leute UDP. Und selbst wenn sie es nicht tun... UDP-Scans sind so langsam, wie man es sich nur vorstellen kann. Daher verwende ich derzeit zwei grundlegende Methoden und setze dabei auf das bewährte Nmap und ipmiping (aus den FreeIPMI-GNU-Tools). Das Einfachste ist:
</p> <p>
Da Nmap beim Scannen großer Netzwerke weitaus effizienter ist
als ipmiping, wird diese Methode nur verwendet, wenn Nmap meldet, dass ein Host
UDP 623 geöffnet hat.
</p> <p>
Ob zum Guten oder Schlechten, dieser Port ist oft blockiert, sodass
andere Methoden häufig eher indirekt herausfinden, ob
IPMI ausgeführt wird oder nicht.
</p> <p>
Ports werden nach ihrer Aussagekraft gewichtet und danach, ob
Nmap sie als offen, gefiltert oder in anderen Zuständen vorfindet.
</p> <p>
Nmap kann auch die Banner der verbundenen Dienste anzeigen. Ich verwende
reguläre Ausdrücke, um nach Zielen zu suchen – zum Beispiel sind die Zeichenfolgen
"iLO" und "DRAC" gute Hinweise darauf, dass ein System möglicherweise
HPs Integrated Lights Out-Dienst oder iLO ausführt.
</p> <p>