
IPMI-материалы из работ DARPA
Я написал немного программ для исследования IPMI; вот некоторые из результатов. Я решил проделать обычный цикл: обнаружение, получение данных и аудит. Каждая из этих задач оказалась довольно интересной сама по себе, по крайней мере для меня.
**BTW/FYI ** - Я выпустил новый инструмент для исследования IPMI - https://github.com/zenfish/zipmi - а также набор рецептов/образов Qemu и прочего для запуска BMC как виртуальных систем под Qemu по адресу https://github.com/zenfish/zbmc.
Статьи и прочее с http://fish2.com/ipmi
Вот небольшая программа на Perl, которая пытается угадать учётную запись на удалённом BMC, извлечь её хеш, а затем попытаться взломать её (HMAC-хешированный) пароль. Я написал немного об этом для любопытствующих. Снабжена подробными комментариями, может оказаться полезной.
Спецификация IPMI говорит, что можно получить шифры удалённой системы без какой-либо аутентификации, но я не знаю ни одного инструмента, который бы это делал (все они требуют аутентификации, хотя, конечно, можно ввести сырые hex-байты, если захочется!) Поэтому я написал эту небольшую программу; она в основном старается следовать выводу ipmitool; при этом, полагаю, я нашёл баг в этой утилите (в последней строке иногда системы выдают какой-то мусор, который, похоже, неверно интерпретируется), но кто знает, у меня недостаточно систем для тестирования. В общем... ipmi-get-ciphers.py.
Как минимум, полезно для выявления систем с Cipher0 (учтите - это лишь указывает на поддерживаемые шифры - это не значит, что они действительно включены), но в дикой природе встречаются интересные вещи.
Здесь две программы: одна - простой Python-скрипт для удалённого зондирования (начинаю ненавидеть Perl, скажу я вам), а вторая использует утилиты из FreeIPMI для получения конфигурационных данных с учётными данными.
Небольшая программа на Python (более 50% встроенных комментариев, 2.5k в gzip), которая отправляет один пакет на BMC и обдумывает ответ. Что можно сделать с помощью одного пакета, спросите вы? Для начала - более 10 различных проверок безопасности IPMI. Ну, для начала и для конца, это всего лишь пакет :) Требует python, BMC и открытый путь к UDP-порту 623. Использование простое: "ipmi-get-auth.py target".
ipmi-get-auth.py /
Очень краткое описание
Доводя это до крайности... что ж, вот своего рода мега-версия вышеописанного, которая делает это для всех каналов, всех привилегий, всех... ну, вы поняли. Для одержимых (читайте комментарии или пост, который я написал об этом, чтобы понять, почему она делает то, что делает!)
mega_chan.py /
Mega mega mega ... chan chan chan...
А вот простая программа для отправки пакета Get Device ID (см. стр. 250 спецификации IPMI v 2) системе. Теоретически это должно работать без аутентификации. В небольшом исследовании около 90% систем ответили на это (хотя и не все с корректной информацией!) Иногда можно получить сведения о производителе и другую информацию, например номера моделей и прочее, но интереснее всего фактически получить уникальный ID, который традиционно трудно получить через сеть.
get-ipmi-guid.py /
Get Device ID
У Supermicro были проблемы с раскрытием файла паролей из их BMC - например, см. это и другие описания:
a-penetration-testers-guide-to-ipmi
Чтобы использовать этот скрипт, просто введите:
dump_SM.py password_file
У меня работает, без каких-либо гарантий, явных или подразумеваемых, и т.д.
Что ж, если вы можете обратиться к UDP-порту 623, довольно просто выяснить, запущена ли на удалённой системе служба IPMI. Однако, если вы не находитесь внутри дата-центра, большинство людей блокируют UDP. И даже если не блокируют... UDP-сканирование — это примерно так же медленно, как только можно вообразить. Поэтому я сейчас использую два базовых метода, опираясь на почтенный Nmap и ipmiping (из набора Gnu-утилит FreeIPMI). Самое простое, что можно сделать:
</p> <p>
Поскольку Nmap гораздо эффективнее сканирует крупномасштабные сети,
чем ipmiping, этот метод используется только если Nmap сообщает, что у хоста
открыт UDP 623.
</p> <p>
Так или иначе, этот порт часто блокируется, поэтому большую часть
времени другие методы с большей вероятностью позволят косвенно выяснить,
запущена ли служба IPMI.
</p> <p>
Порты взвешиваются по их индикативной способности и по тому, находит ли
Nmap их открытыми, фильтруемыми или в иных состояниях.
</p> <p>
Nmap также может показывать баннеры подключённых служб. Я использую
регулярные выражения для поиска целей — например, строки
"iLO" и "DRAC" являются хорошими индикаторами того, что на системе может быть запущена
служба Integrated Lights Out от HP, или iLO.
</p> <p>
<strong>Примечание:</strong> В настоящее время я НЕ использую метод
broadcast ping (очень быстрый способ просканировать подсеть, в которой вы
находитесь); у меня просто нет данных о его эффективности;
хотя он очень быстр, когда работает, мне показалось, что он
не обеспечивает контроля и надёжности произвольных сканирований.
Две из трёх моих систем (Dell и HP) ответили на
RMCP ping. Ни одна не ответила на broadcast ping через idiscover
(ipmiutil discover.) Однако все ответили на мой Python-инструмент
аудита, приведённый ниже.
</p> <p>