warning
Вся информация предоставлена исключительно в ознакомительных целях. Лица, использующие данную информацию в противозаконных целях, могут быть привлечены к ответственности.
Задача
Пробрутить виртуальные хосты, используя TLS SNI
Решение
Я думаю, тебе известно, что на одном веб‑сервере может располагаться несколько сайтов. Это возможно за счет применения виртуальных хостов. Когда пользователь подключается к сайту, то в HTTP-заголовках передается в поле Host имя сервера, куда хочет попасть пользователь, и на основании этого веб‑сервер отдает тот или иной сайт. Таким образом, на одном IP-адресе может располагаться любое количество сайтов.
При этом, с точки зрения атакующего, важно различать виртуальные хосты и разные доменные имена. Необходимо брутить и то и другое, так как бывает ситуация, когда на сам веб‑сервер виртуальный хост есть и получить доступ к нему можно, но по DNS он не резолвится. Такое случается, например, если виртуальный хост остался, а запись переехала или виртуальный хост используется внутри корпоративной сети и не резолвится внешними серверами. Профит можно получить при этом приличный: найти либо админку, либо девелоперскую версию сайта, то есть расширить attack surface.
Сама методика брута достаточно проста — подключайся к хосту да меняй «Host:» в заголовке запроса. Но иногда обнаруживаются подводные камни. Например, когда вне зависимости от корректности Host сервер тебе возвращает один и тот же сайт, при этом меняя все ссылки на имя хоста, которое ты ему посылал. В таких ситуациях отличить «находку» от уже найденного может быть не просто.
Для таких ситуаций недавно и появилась идея брута виртуальных хостов с использованием TLS- (он же SSL-) расширения SNI.
Изначально предполагалось, что SSL фактически привязывался к IP-адресу хоста. Ты подключаешься, а сервер тебе возвращает свой сертификат. Возможности передать серверу имя хоста, к которому ты подключаешься, не было. В свою очередь, и у сервера не было возможности отдать тебе необходимый сертификат (если у него их было несколько). Чтобы исправить эту проблему, внедрили такое расширение для протокола TLS, как SNI (Server Name Indication).
Теперь при подключении по SSL первым же пакетом в ClientHello клиент отправляет имя хоста, которое его интересует, и по нему сервер может отдать необходимый сертификат. Почти все современные браузеры и веб‑серверы поддерживают данную технологию.
Протестировать и посмотреть примеры конфигов для Apache можно тут.
Так вот, идея брута лежит на поверхности. Все, что нам нужно, — менять имя хоста в SNI в ClientHello и парсить ответы, отследить другой сертификат достаточно просто. К моменту выхода этот статьи в паблик, я думаю, успею намутить и выложить простенький PoC (смотри у меня в твиттере). Из достоинств, кроме простоты парсинга, еще можно упомянуть незаметность (полного хендшейка не происходит, данных по HTTP не посылаем). Кстати, у техники большой потенциал — надо только дождаться, когда SPDY или даже HTTP версии 2 будет повсеместным.
Задача
Экспортировать дамп в Wireshark
Решение
Wireshark является де‑факто стандартом для анализа трафика. Возможности его достаточно широки, а количество поддерживаемых протоколов (точнее, диссекторов, с помощью которых парсятся протоколы) зашкаливает. В общем, если не знаешь, как осуществляется подключение к любимому сайту, то Wireshark тебе поможет: увидишь всю последовательность TCP handshake и резолва UDP, посмотришь поля всех слоев TCP/IP-стека.
Но сегодня хотелось бы коснуться интересной фичи — возможности импорта в Wireshark дампов пакетов, причем можно не целого пакета (по всей OSI), а c любого уровня. Например, с транспортного (TCP).
Зачем это может быть нужно? Ну, как минимум для того, чтобы никуда не отправлять данные, а сразу их анализировать. Я вот пока смотрел TLS SNI — отправлял пакеты с помощью скрипта, снифал их в Wiresharkе и только после этого мог разбирать. А так можно было сразу импортировать в него.
Данные для импорта (File-Import from Hex Dump) должны быть, во‑первых, в hex’овом формате, а во‑вторых, с дополнительным полем offset (см. рисунок), которое указывает на отступ. Так как обычно дампы представляют собой просто последовательность, их необходимо немного конвертировать.
Сделать это можно либо ручками (а‑ля Python), либо скриптиком от Дидье Стивенса (Didier Stevens). Правда, этот скрипт совместим только с его знаменитым hex-редактором 010 Editor.
Еще момент: если у тебя есть только часть пакета (не все уровни), то можно указать Wireshark’у, чтобы он «забил» отсутствующую часть пустышками. Делается это при импорте — Dummy Headers, и далее выбираешь уровень.
Задача
Собрать списки для пентеста
Решение
Пентест — это дело очень практическое. Даже если какая‑то система с первого взгляда кажется достаточно защищенной, «пощупав» ее с различных сторон, мы все равно найдем хоть что‑то дельное. Различные паролики, кривые конфигурации, временные файлы и прочее. С другой стороны, есть целая масса околотеоретических и лабораторных атак, которые на практике неприменимы. Я вот поддерживаю определенное мнение, что та же Beast-атака на SSL (наделавшая некогда много шума) совершенно далека от жизни.
Как ни странно, одним из основных методов пентестера является различный брутфорс, то есть перебор (в более широком понятии). Причем списочков для брута необходимо достаточно много от различного вида паролей до типовых URL’ов. Обычно они накапливаются в том или ином виде в ходе работ, но все‑таки необходим какой‑то базис. Так вот, его можно почерпнуть в одном из OWASPовских проектов — SecList. На гитхабе (где он фактически располагается) можно найти подборки паролей, дефолтных путей по основным веб‑серверам, строчек для фаззинга и перебора поддоменов и так далее. Отличный наборчик — качай да пополняй.
Задача
Собрать сведения, используя SNMP без MIB
Решение
SNMP (по умолчанию UDP/161) — это такой бородатый протокол управления и мониторинга за различного вида девайсами, который очень часто используется в корпоративных сетях. О нем я писал номеров 20–30 назад :). Но коснусь его еще раз.
Если описывать в общих чертах, то у нас есть агент, который консолидирует информацию о какой‑то системе, а есть менеджер, который подключается и по необходимости запрашивает нужную информацию. Есть еще такая штука, как snmp trap, — возможность агента сказать менеджеру, что что‑то произошло. Для доступа к агенту используется community string (читай: пароль).
Сама информация у агента представляется в формате «ты мне ключ, а я тебе значение». При этом самое важное, что сами ключи выстраиваются в виде иерархии (дерева). Это необходимо, чтобы была расширяемость и при этом сохранялась универсальность подхода. Само дерево имеет ряд дефолтных веток, а различные производители могут добавлять свои кастомные.
Для доступа к конкретному значению необходимо указать его ключ — OID. Это местонахождение значения в дереве, так как каждое значение между точками указывает на некоторую ветку — 1.3.6.1.2.1.1.3.0. Пример дерева можно посмотреть на рисунке.
Есть еще такое понятие — MIB (Management Information Bases). По сути, это официальное описание какой‑то ветки дерева — какой OID для хранения чего используется. Есть MIB для дефолтных веток, а есть специальные от отдельных производителей (у Cisco, например, их несколько).
Так вот, доступ к кастомным MIB’ам зачастую закрыт (то есть скачать у производителя их не получится), но облазить все уголки доступной информации хочется. Вот тут и помогает нам одна из команд SNMP-протокола GetNextRequest, которая дает нам возможность прочитать следующее значение. При этом агент автоматически будет спускаться по дереву, и мы сможем таким образом пройти по всем доступным веткам (даже где MIB’а у нас нет).
Вот этот самый функционал и реализован в знаменитой тулзе snmpwalk. Пример использования:
snmpwalk -v 2c -c public 192.168.0.254 .1
- -v — версия SNMP протокола;
- -c — community string;
- 192.168.0.254 — сканируемый хост;
- .1 — сканируемая ветка дерева.
Коснулись мы этой темы сегодня потому, что в SNMP иногда можно найти совсем удивительные вещи. Недавно в Metasploit были добавлены модули, которые для группы сетевых девайсов из определенного поля по SNMP вытаскивали пароли (хеши) всех пользователей девайса. И если для пользователей в самих девайсах еще меняют пароли, то вот про community-стринги чаще всего забывают. Так что рекомендую грабить все, что отдается по SNMP, и просматривать на различные приятности.
Задача
Получить контроль над сервером через BMC
Решение
Продолжим тему про безграмотную конфигурацию железок. Где‑то с год назад прокатилась большая волна инфы про взлом серверов с использование протокола IPMI. И могу тебе подтвердить — почти во всех корпоративных сетях это работает :).
Но, немного тебя заинтриговав, давай все же вернусь к началу начал, чтобы было все понятно. Расскажу в упрощенной форме, так как я касался этой темы только с точки зрения взлома и в тонкостях могу ошибиться.
Есть серверы (железные штуки) корпоративного уровня. В смысле брендовые, дорогие и, возможно, мощные. Во многих из них встроена дополнительная железячка (либо отдельно вставлено) — BMC, Baseboard Management Controllers. По сути, это отдельный компьютер (компьютер внутри компьютера — вау! :)), который используется для удаленного управления сервером. Например, это может пригодиться, когда у тебя сервер подвис или сломалось железное что‑то и фактически нет возможности уже подключиться напрямую к серверу и промониторить, что с ним. А тут бац — и через BMC имеешь доступ. Причем возможностей через BMC масса: это и просмотр различных характеристик сервера, и возможность управлять питанием, а главное — возможность удаленно подключить устройства (жесткий диск, DVD-образ) и иметь полный визуальный доступ, то есть видеть изображение, иметь возможность тыкать мышью и клацать клавой. И из таких возможностей и появляется второе применение для BMC — возможность удаленной установки ОС по типу с системами виртуализации. Все это становится возможным потому, что BMC реально встраивается в сервер и имеет прямой доступ к компонентам материнской платы.
Как видишь, BMC — вещь крутая, но к ней надо иметь доступ, и, как ни странно, для этого достаточно часто используется тот же сетевой адаптер, что и у сервера. Вот только IP-шник другой. По бестпрактис, конечно, BMC’шки должны выделяться в отдельный сетевой сегмент... да вот только многие даже не знают про BMC и их возможности, что уж тут говорить про практики. А ведь BMC по умолчанию включен.
Окей, с целью и задачей, я думаю, ясно — захакать BMC и захватить мир. Но как же это сделать? Итак, BMC — это модные штуки, а потому и методов доступа они предоставляют массу. Это и веб, и SSH, и IPMI, плюс всякое другое… Самое трудное, вероятно, — это найти в кучах «мусора», что встречается в корпоративке, то, что нам нужно. А сделать это иногда ой как непросто.
Есть ряд методов. Во‑первых, каждая корпорация придумала свое название для BMC и окружающих его технологий: HP iLO, Dell DRAC/iDRAC, ASUS iKVM BMC, Oracle/Sun ILOM, Fujitsu iRMC, IBM IMM, Supermicro IPMI. Если мы видим где‑то такие слова, то сразу понимаем, что это — «сладкое».
Увидеть мы их можем чаще всего на портах 80 (в HTTP), а также в SSL-сертификатах с 443-го порта, то есть при сканировании Nmap’ом с –sV
(определение сервисов и запуск дефолтных скриптов). Второй вариант — IPMI, но его я коснусь отдельно в следующем вопросе. Другие же сервисы чаще всего возвращают слишком общую информацию.
Как же ломать? Первое, что мы делаем, как это обычно для такого рода технологий, — проверяем учетные записи по умолчанию. И могу сказать, что шанс того, что учетка подойдет, очень высок. Перечень прилагается на картинке.
Что же делать, если они не подошли? Вариант первый — еще побрутить, вариант второй — воспользоваться уязвимостями. Так, в веб‑скриптах от Supermicro IPMI нашли несколько переполняшек, в том числе и анонимных. Плюс в тех же Supermicro используется UPNP уязвимой версии. Поиск в Metasploit’e — search supermicro выдаст тебе необходимые результаты.
Вариант третий — поломать через IPMI. Об этом читай далее.
Задача
Захватить контроль над сервером через BMC, используя IPMI
Решение
Продолжим предыдущий вопрос. Итак, IPMI — это Intelligent Platform Management Interface, то есть еще один протокол управления, поддерживаемый большинством топовых производителей (см. выше) и задуманный некогда Intel’ом.
У него есть несколько спецификаций: 1, 1.5 и 2.0. Первая не поддерживала управление через сеть (использовался RS232), а потому нам не очень интересна. 1.5 и 2.0 вышли в 2001 и 2004 году соответственно. Причем вторая актуальная и поддерживается всеми производителями.
Основная разница для нас между 1.5 и 2.0 была во внедрении дополнительных мер защиты и дополнительных возможностей (удаленная консоль, возможность проброса девайсов).
Сам IPMI по сети работает через протокол RMCP, использующий 623-й UDP-порт (но может встретиться и на TCP). Пока что Nmap не умеет детектировать и определять, что сервис — это IPMI, а жаль. Но с поиском отлично справляется модуль Metasploit’а, плюс выводит информацию по версиям.
use auxiliary/scanner/ipmi/ipmi_version
set RHOSTS 192.168.0.1/24
run
Так вот, как было сказано выше, в 2.0 добавили побольше «секьюрити». Я вот лично не понимаю, как вообще такое могло появиться...
IPMI 2.0 поддерживает 14 видов различного шифрования и аутентификации пользователя в системе (различные виды хеш‑функций и методы для передачи пароля, виды шифрования трафика). Зачем оно так сделано — ума не приложу. Но проблема в другом.
Кто‑то удосужился добавить в спецификацию так называемый cipher 0 (zero), который подразумевает отсутствие необходимости передавать пароль. Да‑да, у нас все секьюрно: пароль не передаем, аутентифицируем пользователя только по логину. WTF?!
Да, такая вот фича. Но что еще хуже (не для нас, конечно), до недавнего времени у почти всех производителей была включена поддержка этой фичи по умолчанию. То есть все, что нам нужно для доступа, — знать имя логина. А он, как мы видели, почти везде известен.
Но и это еще не все. На некоторых IPMI существует также null-пользователь, то есть пользователь без имени и с таким же пустым паролем, и при этом с админскими правами.
О’кей, как нам это все заюзать?
Во‑первых, найденные ранее IPMI чекаем на поддержку cipher 0.
use auxiliary/scanner/ipmi/ipmi_cipher_zero
set RHOSTS 192.168.0.1/24
run
Далее, подключаемся и выполняем команды. Для этого нам нужна тулзенка ipmitool.
sudo apt-get install ipmitool
Данная команда доставит нам ее в ОС. Кстати, раньше был косяк, что версия IPMI в Kali была старой и не поддерживала такую штуку, как cipher 0. Далее пишем
ipmitool -I lanplus -C 0 -H 192.168.0.10 -U Administrator -P any_password user list
- -I lanplus — указываем, что мы используем IPMI версии 2;
- -С 0 — указываем, что применить cipher 0, то есть без пароля;
- -U — имя пользователя (он должен существовать);
- -P — пароль можно указать любой;
- user list — команда после аутентификации — вывести список пользователей.
В некоторых мануалах пишут, что надо сначала пытаться выполнить команду без cipher 0, а потом с ним, но у меня и без этого работает.
Если хочется подключиться под анонимным юзером, то просто на месте логина и пароля оставляем ничего (точнее, кавычки с пустотой):
ipmitool -I lanplus -H 192.168.0.10 -U '' -P '' user list
Для того чтобы создать пользователя и войти в систему через веб, надо выполнить такую последовательность:
ipmitool -I lanplus -C 0 -H 192.168.0.10 -U Administrator -P any_password user set name 6 hacker
ipmitool -I lanplus -C 0 -H 192.168.0.10 -U Administrator -P any_password user set password 6 password
ipmitool -I lanplus -C 0 –H 192.168.0.10 -U Administrator -P any_password user priv 6 4
ipmitool -I lanplus -C 0 -H 192.168.0.10 -U Administrator -P any_password user enable 6
Суть ее такова. Ранее в user list мы смотрим свободный слот (в примере — 6). А после для него в первой строке задаем имя юзера (hacker), далее задаем пароль (password), устанавливаем привилегии администратора (4) и в конце включаем аккаунт. Теперь можно идти в веб‑интерфейс.
Согласись, эти баги — трешатинка. Но и это еще не все. В той же спецификации есть поддержка еще одной фичи «безопасной аутентификации».
Он намутили еще один вид «безопасной» аутентификации (HMAC-SHA-1, подробнее можно почитать тут), при которой до полной аутентификации можно получить соленый хеш пароля пользователя. Да‑да, нужно знать только лишь существующее имя пользователя в системе, и бац! У нас уже есть все необходимое для брута: и соль, и хеш.
Что хуже всего — это часть спецификации, то есть бага на уровне протокола, а потому и поддерживается всеми вендорами!
Опять‑таки для проведения атаки нам поможет MSF:
use auxiliary/scanner/ipmi/ipmi_dumphashes
set RHOSTS 192.168.0.10
set OUTPUT_HASHCAT_FILE /home/user/ipmi_hashcat.txt
run
По умолчанию MSF также пробегается по полученным хешам с мини‑набором паролей, так что, возможно, и к Hashcat’у прибегать не потребуется. Если же потребуется, то файлик из OUTPUT_HASHCAT_FILE нам пригодится.
Пример для запуска Hashcat:
hashcat --username -m 7300 ipmi_hashcat.txt -a 0 passwords.txt
- --username — пропустить имя пользователя из файла;
- -m 7300 — указываем, что ломаем IPMI соленые хешики;
- -a 0 num_passwords.txt — говорим, что используем перебор по словарю, и указываем его.
Но и это еще не все! Так уж получается, что хранить пароль BMC-шке необходимо в открытом виде (в смысле не в виде хеша, хотя могли бы и зашифровать), так как он используется при аутентификации. И ведь нашли злодеи место хранения, как минимум для Supermicro IPMI: /nv/PSBlock или /nv/PSStore. Да, конечно, в случае доступа BMC через cipher 0 мы можем найти и вытащить пароль от реальных учеток и с ними уже пойти на другие сервера, но это не так серьезно.
А серьезно то, что в тех же замученных Supermicro IPMI эти файлики доступны всем без аутентификации по UPnP на порту 49152, который также доступен по умолчанию!
http://192.168.0.10:49152/PSBlock, и все!
No comments, как говорится.
В заключение скажу, что набираю людей в команду пентестеров. Если есть интерес — пиши на почту. Успешных познаний нового!