
Ferramentas IPMI do trabalho da DARPA
Escrevi um software para explorar IPMI; aqui estão alguns dos resultados. Pensei em fazer o ciclo habitual de detetar, obter dados e auditar. Cada um destes acabou por ser um problema bastante interessante por si só, pelo menos para mim.
**BTW/FYI ** - Lancei uma nova ferramenta para explorar IPMI - https://github.com/zenfish/zipmi - bem como um conjunto de receitas/imagens/etc. de Qemu para executar BMCs como sistemas virtuais sob Qemu em https://github.com/zenfish/zbmc.
Os artigos e coisas de http://fish2.com/ipmi
Aqui está um pequeno programa Perl que tenta adivinhar uma conta num BMC remoto, extrair o seu hash, e depois tentar quebrar a sua palavra-passe (com hash HMAC). Escrevi um pequeno texto sobre isto para os curiosos. Intensamente comentado, pode ser útil.
A especificação IPMI diz que se pode obter a cifra de um sistema remoto sem qualquer autenticação, mas não conheço nenhuma ferramenta que o faça (todas exigem autenticação, embora, claro, se possa introduzir os bytes hex em bruto se se quiser!) Por isso escrevi esta pequena ferramenta para o fazer; segue sobretudo a saída do ipmitool; ao fazê-lo, acredito que encontrei um bug nesse utilitário (na linha final por vezes os sistemas emitem algum lixo que parece ser mal interpretado), mas quem sabe, não tenho sistemas suficientes para testar. De qualquer forma... ipmi-get-ciphers.py.
Se não servir para mais nada, é útil para detetar sistemas Cipher0 (nota - isto apenas indica cifras que são suportadas - não significa que estejam realmente ativadas), mas há coisas interessantes por aí.
Dois programas aqui, um é um simples sondador remoto em Python (estou a começar a odiar Perl, diga-se) e um segundo que usa utilitários do FreeIPMI para obter dados de configuração com credenciais.
Um pequeno programa Python (mais de 50% de comentários inline, 2,5k comprimido com gzip) que envia um único pacote a um BMC e analisa a resposta. O que se pode fazer com apenas um único pacote, pode-se perguntar? Mais de 10 testes de segurança diferentes para IPMI, para começar. Bem, para começar e para terminar, é apenas um pacote :) Requer Python, um BMC e um caminho aberto para a porta UDP 623 para funcionar. A utilização é simplesmente "ipmi-get-auth.py target".
ipmi-get-auth.py /
Uma descrição muito pequena
Levando isto a extremos... bem, aqui está uma espécie de mega versão do acima que o faz para todos os canais, todos os privilégios, todos... bem, percebem a ideia. Para os monomaníacos (leiam os comentários ou o post que escrevi sobre isto para ver porque faz o que faz!)
mega_chan.py /
Mega mega mega ... chan chan chan...
E aqui está um programa simples para enviar um pacote Get Device ID (ver p250 da especificação IPMI v 2) a um sistema. Isto deveria, em teoria, funcionar sem autenticação. Num pequeno levantamento que fiz, cerca de 90% dos sistemas responderam a isto (embora nem todos com informação válida!) Pode-se, por vezes, obter o fabricante e outra informação, como números de modelo e afins, mas mais interessante ainda é obter um ID único, tradicionalmente uma coisa difícil de obter pela rede.
get-ipmi-guid.py /
Get Device ID
A Supermicro teve alguns problemas com a divulgação de ficheiros de palavras-passe do seu BMC - por exemplo, veja este e outros relatos:
a-penetration-testers-guide-to-ipmi
Para usar este script, basta dizer:
dump_SM.py password_file
Funciona para mim, sem garantias implícitas, garantido, etc.
Bem, se você conseguir falar com a porta UDP 623, é bem simples descobrir se um sistema remoto está executando IPMI. A menos que você esteja dentro de um data center, porém, a maioria das pessoas bloqueia UDP. E mesmo que não bloqueiem... a varredura UDP é tão lenta quanto se pode imaginar. Então eu atualmente uso dois métodos básicos, aproveitando o venerável Nmap e o ipmiping (das ferramentas GNU FreeIPMI). A coisa mais fácil de fazer é:
</p> <p>
Como o Nmap é muito mais eficiente na varredura de redes em larga escala
do que o ipmiping, este método só é usado se o Nmap disser que um host
tem a UDP 623 aberta.
</p> <p>
Para o bem ou para o mal, essa porta costuma estar bloqueada, então na maior parte
do tempo outros métodos têm mais chance de descobrir de forma oblíqua se
o IPMI está ou não em execução.
</p> <p>
As portas são ponderadas pela sua capacidade indicativa e por se o
Nmap as encontra abertas, filtradas ou em outros estados.
</p> <p>
O Nmap também pode mostrar os banners dos serviços conectados. Eu uso
expressões regulares para caçar alvos - por exemplo, as strings
"iLO" e "DRAC" são bons indicadores de que um sistema pode estar executando
o Integrated Lights Out da HP, ou iLO.
</p> <p>
<strong>Nota:</strong> Atualmente eu NÃO uso o método de
broadcast ping (uma forma muito rápida de percorrer a sub-rede em que você
está); simplesmente não tenho dados sobre sua eficácia
nisso; embora seja muito rápido quando funciona, não senti que
permitisse o controle e a confiabilidade de varreduras arbitrárias.
Dois dos meus três sistemas (Dell e HP) responderam a um
RMCP ping. Nenhum respondeu a um broadcast ping pelo idiscover
(ipmiutil discover.) Todos, porém, responderam à minha ferramenta de
auditoria em Python abaixo.
</p> <p>