
Cosas de IPMI del trabajo de DARPA
Escribí algún software para explorar IPMI; aquí hay algunos de los resultados. Pensé en hacer el ciclo habitual de detectar, obtener datos y auditar. Cada uno de estos resultó ser un problema bastante interesante por sí mismo, al menos para mí.
**BTW/FYI ** - Publiqué una nueva herramienta para explorar IPMI - https://github.com/zenfish/zipmi - así como un conjunto de recetas/imágenes/etc. de Qemu para ejecutar BMCs como sistemas virtuales bajo Qemu en https://github.com/zenfish/zbmc.
Los artículos y cosas de http://fish2.com/ipmi
Aquí hay un pequeño programa en Perl que intenta adivinar una cuenta en un BMC remoto, extraer su hash, y luego intentar descifrar su contraseña (con hash HMAC). Escribí un pequeño texto sobre esto para los curiosos. Con abundantes comentarios, puede resultar de alguna utilidad.
La especificación de IPMI dice que se puede obtener el cifrado de un sistema remoto sin ninguna autenticación, pero no conozco ninguna herramienta que realmente haga esto (todas requieren autenticación, ¡aunque por supuesto se podrían introducir los bytes hex en bruto si se quisiera!) Así que escribí este pequeño programa para hacerlo; en su mayoría intenta seguir la salida de ipmitool; al hacerlo creo que encontré un error en esa utilidad (en la línea final a veces los sistemas emiten algunos datos basura que parecen ser malinterpretados), pero quién sabe, no tengo suficientes sistemas para probar. En fin... ipmi-get-ciphers.py.
Si no sirve para otra cosa, es útil para detectar sistemas Cipher0 (nota - esto solo señala los cifrados que son compatibles - no significa que estén realmente activados), pero hay cosas interesantes ahí fuera.
Dos programas aquí, uno es un simple sondeador remoto en Python (empezando a odiar Perl, que conste) y un segundo que usa utilidades de FreeIPMI para obtener datos de configuración con credenciales.
Un pequeño programa en python (más del 50% de comentarios en línea, 2.5k comprimido con gzip) que envía un único paquete a un BMC y reflexiona sobre la respuesta. ¿Qué se puede hacer con un solo paquete, uno se podría preguntar? Más de 10 pruebas de seguridad diferentes para IPMI, para empezar. Bueno, para empezar y para terminar, es solo un paquete :) Requiere python, un BMC y una ruta abierta al puerto UDP 623 para funcionar. El uso es simplemente "ipmi-get-auth.py target".
ipmi-get-auth.py /
Una descripción muy breve
Llevando esto a los extremos... bueno, aquí hay una especie de mega versión de lo anterior que lo hace para todos los canales, todos los privilegios, todos... bueno, ya se hacen una idea. ¡Para los monomaníacos (lean los comentarios o la publicación que escribí al respecto para ver por qué hace lo que hace!)
mega_chan.py /
Mega mega mega ... chan chan chan...
Y aquí hay un programa simple para enviar un paquete Get Device ID (ver p250 de la especificación IPMI v 2) a un sistema. Esto debería, en teoría, funcionar sin autenticación. En un pequeño estudio que hice, alrededor del 90% de los sistemas respondieron a esto (¡aunque no todos con información válida!) A veces se puede obtener el fabricante y otra información, como números de modelo y demás, pero lo más interesante es obtener realmente un ID único, tradicionalmente algo difícil de obtener a través de la red.
get-ipmi-guid.py /
Get Device ID
Supermicro ha tenido algunos problemas con la divulgación del archivo de contraseñas de su BMC - por ejemplo, véase este y otros análisis:
a-penetration-testers-guide-to-ipmi
Para usar este script simplemente ejecuta:
dump_SM.py password_file
A mí me funciona, sin garantía implícita, garantizada, etc.
Bueno, si puedes comunicarte con el puerto UDP 623, es bastante sencillo averiguar si un sistema remoto está ejecutando IPMI. Sin embargo, a menos que estés dentro de un centro de datos, la mayoría de la gente bloquea UDP. Y aunque no lo hagan... el escaneo UDP es tan lento como uno pueda imaginar. Así que actualmente estoy usando dos métodos básicos, aprovechando el venerable Nmap y ipmiping (de las herramientas GNU FreeIPMI). Lo más fácil de hacer es:
</p> <p>
Dado que Nmap es mucho más eficiente escaneando redes a gran escala
que ipmiping, este método solo se usa si Nmap indica que un host
tiene el UDP 623 abierto.
</p> <p>
Para bien o para mal, este puerto suele estar bloqueado, por lo que muchas
veces otros métodos tienen más probabilidades de averiguar de forma oblicua si
IPMI está en ejecución o no.
</p> <p>
Los puertos se ponderan según su capacidad indicativa y según si
Nmap los encuentra abiertos, filtrados u en otros estados.
</p> <p>
Nmap también puede mostrar los banners de los servicios conectados. Uso
expresiones regulares para buscar objetivos; por ejemplo, las cadenas
"iLO" y "DRAC" son buenos indicadores de que un sistema podría estar ejecutando
el servicio Integrated Lights Out de HP, o iLO.
</p> <p>