
Roba IPMI dal lavoro DARPA
Ho scritto alcuni software per esplorare IPMI; ecco alcuni dei risultati. Ho pensato di fare il solito ciclo di rilevamento, acquisizione dati e audit. Ognuno di questi si è rivelato un problema piuttosto interessante di per sé, almeno per me.
BTW/FYI - Ho rilasciato un nuovo strumento per esplorare IPMI - https://github.com/zenfish/zipmi - così come una serie di ricette/immagini/etc. di Qemu per eseguire BMC come sistemi virtuali sotto Qemu su https://github.com/zenfish/zbmc.
I documenti e le cose da http://fish2.com/ipmi
Ecco un piccolo programma Perl che tenta di indovinare un account su un BMC remoto, estrarne l'hash, e poi provare a craccare la sua password (hashata con HMAC). Ho scritto un piccolo articolo su questo per i curiosi. Pesantemente commentato, potrebbe essere utile.
La specifica IPMI dice che puoi ottenere i cipher di un sistema remoto senza alcuna autenticazione, ma non sono a conoscenza di alcuno strumento che lo faccia davvero (tutti richiedono autenticazione, anche se ovviamente potresti inserire i byte hex grezzi se volessi!) Quindi ho scritto questo piccolo programma per farlo; per lo più cerca di seguire l'output di ipmitool; nel farlo credo di aver trovato un bug in quell'utilità (nell'ultima riga a volte i sistemi emettono della spazzatura che sembra essere interpretata male), ma chi lo sa, non ho abbastanza sistemi per testarlo. Comunque... ipmi-get-ciphers.py.
Se non altro, utile per individuare sistemi Cipher0 (nota - questo indica semplicemente i cipher supportati - non significa che siano effettivamente attivi), ma ci sono cose interessanti in giro.
Due programmi qui, uno è un semplice prober remoto in Python (sto iniziando a odiare Perl, ve lo dico io) e un secondo che usa le utilità di FreeIPMI per recuperare dati di configurazione con credenziali.
Un piccolo programma Python (oltre il 50% di commenti inline, 2.5k gzip'd) che invia un singolo pacchetto a un BMC e riflette sulla risposta. Cosa puoi fare con un solo pacchetto, uno potrebbe chiedere? 10+ diversi test di sicurezza per IPMI, tanto per cominciare. Beh, tanto per cominciare e per finire, è solo un pacchetto :) Richiede Python, un BMC e un percorso aperto verso la porta UDP 623 per funzionare. L'uso è semplicemente "ipmi-get-auth.py target".
ipmi-get-auth.py /
Una descrizione molto breve
Portando questo agli estremi... beh, ecco una specie di versione mega di quanto sopra che lo fa per tutti i canali, tutti i privilegi, tutti... beh, avete capito. Per i monomaniaci (leggete i commenti o il post che ho scritto al riguardo per capire perché fa quello che fa!)
mega_chan.py /
Mega mega mega ... chan chan chan...
Ed ecco un semplice programma per inviare un pacchetto Get Device ID (vedi p250 della specifica IPMI v 2) a un sistema. Questo dovrebbe, in teoria, funzionare senza autenticazione. In una piccola indagine che ho condotto, circa il 90% dei sistemi ha risposto a questo (anche se non tutti con informazioni valide!) A volte puoi ottenere il vendor e altre informazioni, come numeri di modello e simili, ma la cosa più interessante è ottenere un ID univoco, tradizionalmente una cosa difficile da ottenere via rete.
get-ipmi-guid.py /
Get Device ID
Supermicro ha avuto alcuni problemi con la divulgazione dei file di password dai loro BMC - per esempio, vedi questo e altri articoli:
a-penetration-testers-guide-to-ipmi
Per usare questo script basta dire:
dump_SM.py password_file
Funziona per me, nessuna garanzia implicita, garantita, ecc.
Beh, se puoi parlare con la porta UDP 623, è abbastanza semplice scoprire se un sistema remoto sta eseguendo IPMI. A meno che tu non sia dentro un data center, comunque, la maggior parte delle persone blocca UDP. E anche se non lo fanno... la scansione UDP è lenta quanto si possa immaginare. Quindi attualmente sto usando due metodi di base, sfruttando il venerabile Nmap e ipmiping (dagli strumenti GNU FreeIPMI.) La cosa più semplice da fare è:
</p> <p>
Poiché Nmap è molto più efficiente nella scansione di reti su larga scala
rispetto a ipmiping, questo metodo viene usato solo se Nmap dice che un host
ha la porta UDP 623 aperta.
</p> <p>
Nel bene e nel male questa porta è spesso bloccata, quindi molte
volte altri metodi hanno più probabilità di scoprire indirettamente se
IPMI è in esecuzione o no.
</p> <p>
Le porte sono pesate in base alla loro capacità indicativa e al fatto che
Nmap le trovi aperte, filtrate o in altri stati.
</p> <p>
Nmap può anche mostrare i banner dei servizi a cui si connette. Uso
espressioni regolari per cercare i target - per esempio le stringhe
"iLO" e "DRAC" sono buoni indicatori che un sistema potrebbe eseguire
il servizio Integrated Lights Out di HP, o iLO.
</p> <p>
<strong>Nota:</strong> Attualmente NON uso il metodo del
ping broadcast (un modo molto rapido per attraversare la sottorete in cui
ti trovi); semplicemente non ho dati sull'efficacia
di questo; anche se molto veloce quando funziona, non mi sembrava che
permettesse il controllo e l'affidabilità delle scansioni arbitrarie.
Due dei miei tre sistemi (Dell e HP) hanno risposto a un
ping RMCP. Nessuno ha risposto a un ping broadcast di idiscover
(ipmiutil discover.) Tutti, comunque, hanno risposto al mio
strumento di audit Python qui sotto.
</p> <p>