Содержание статьи
SMB
SMB — это сетевой протокол, который служит в основном для доступа к данным на удаленном компьютере. Говоря проще, когда ты пытаешься залезть на шару, то как раз им и пользуешься. Выпущен он был в далеком 1983 году, но лишь со времен Windows 2000 стал походить на тот, каким мы его знаем сейчас (например, работать на 445-м порте).
Сейчас есть три основные версии протокола. Существенная разница заключается в командах, пропускной способности (за счет разных вариантов кеширования) и обновлении безопасности (шифрование и заплатки дыр). Плюс разработчики не упускают возможности сделать работу с SMB более удобной, поэтому с каждым релизом в него добавляются разные плюхи (например, восстановление соединения при разрыве).
В рамках данной статьи мы рассматриваем конкретно SMBv2. Нам необходимо знать, что существует механизм защиты Microsoft SMB Protocol. Он основан на двух методах контроля доступа: share-level и user-level.
Для предоставления доступа методом share-level необходимо иметь соответствующий логин и пароль. После успешной аутентификации пользователь получает доступ ко всем данным, которые находятся на ресурсе.
Метод user-level также берет за основу логин и пароль. Отличие заключается в том, что в этом случае системный администратор задает список доступа, то есть явно указывает, каким пользователям и группам предоставить доступ к ресурсу. Нам интересен и тот и другой метод, так как в обоих случаях способ аутентификации остается неизменным — NTLMv2.
![](/wp-content/themes/engine/img/warning-icon.jpg)
WARNING
Вся информация в этой статье предоставлена в ознакомительных целях. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный данными материалами!
NTLMv2
Нас интересует именно NTLMv2, так как SMBv2, который мы будем рассматривать, использует его. Эта версия протокола сетевой аутентификации появилась во времена Windows NT 4.0 SP4 и с небольшими изменениями дожила до наших дней в составе Windows 10. В NTLMv2 используется одноименный тип рукопожатий (NTLMv2 handshake), считающийся более безопасным, чем устаревшие LM и NTLM первой версии.
Работает все следующим образом. При открытии документа со ссылкой на сетевую шару клиент (которым в нашем случае будет компьютер жертвы) передает этому серверу команду на получение контента. Для этого он отсылает ему имя пользователя и имя домена, на что сервер запускает процедуру авторизации по типу «запрос/ответ».
Он отправляет клиенту однократно используемое рандомное число — server nonce
. В ответ клиент отсылает новый запрос, который содержит другое псевдослучайное число — client nonce
и метку времени.
Запросы клиента и сервера объединяются в общий секрет (session nonce), из которого на стороне сервера вычисляется хеш сессии HMAC-MD5 или HMAC-SHA-256 (в зависимости от версии SMB и настроек безопасности).
На стороне клиента хеш сессии шифруется тремя ключами DES, генерируемыми из дополненного нулями и разделенного на три блока NT-хеша пользовательского пароля. Это и есть итоговый NTLMv2-ответ, который отправляется серверу.
Сервер объединяет NTLMv2-ответ со своим запросом и вычисляет от него новый хеш HMAC-MD5 или HMAC-SHA-256.
На финальном этапе контроллер домена получает хешированный NTLMv2-ответ вместе с запросами клиента и сервера. Он считывает из своей базы NT-хеш пользовательского пароля и расшифровывает полученный клиентский ответ. Если удачно — серверу возвращается ответ об успешной аутентификации.
Поясню для заядлых брутфорсеров: множество хешей NT составляет 2^128 (или более 340 тысяч дециллионов) вариантов. Средняя скорость брутфорса пар NTLM-хеш — пароль на компе с Core i7 и топовой видеокартой уровня GTX1080 составляет порядка 700 миллионов в секунду (зависит от программы и особенностей конфигурации). Поиск по радужным таблицам на нем же выполняется гораздо быстрее — на скорости около 100 000 миллионов в секунду.
Вопрос к читателю
Как ты думаешь, сколько времени потребуется на брутфорс пароля по NTLM-хешу при стандартном математическом ожидании 50% (то есть когда пароль отыскивается в первой половине множества перебираемых вариантов)?
Ответ для ленивых: комп сгорит быстрее.
Описание уязвимости
В конкретном примере рассматривается частный случай атаки Pass the Hash, подробности о которой читай во врезке. Атаковать мы будем с помощью Office Open XML. Это формат хранения офисных документов, и представляет он собой не что иное, как обычный ZIP-архив, в который упакованы текст, графика и остальные данные. Нам необходимо заставить документ обратиться к удаленному (естественно, подконтрольному нам) SMB-серверу, перехватить трафик и выудить оттуда хешированные учетные данные. Для этого воспользуемся возможностью данного формата встраивать в тело документа текст из другого документа (субдокумента).
В частности, в MS Office имеется функция под названием subDoc, о которой и пойдет речь. Сама функция ничего особо злого в себе не несет, так как предназначена она для динамического обновления контента.
К примеру, возьмем два файла: doc1 и doc2. Вставим при помощи функции subDoc
текст из doc1 в doc2. Изменим текст в doc1. Теперь при открытии файла doc2 он обратится к источнику текста и внесет те же самые изменения, а точнее — просто обновит содержимое.
Фокус в том, что мы можем модернизировать файл doc2 таким образом, чтобы он ссылался на файл на удаленном сервере (неважно, в локальной сети это будет или за NAT). На этот раз, открывая doc2, Word обратится по SMB-протоколу за содержимым, что позволит нам перехватить трафик и достать оттуда необходимые нам данные. Если файл будет недоступен, то документ просто не сможет обновиться.
Делать мы будем так, чтобы ссылка была вообще не на файл, а просто на сервер по SMB. На том конце, естественно, кто-то встретит нужные пакеты и получит заветный логин (в открытом виде) и NTLMv2-ответ (с которым в итоге и нужно развлекаться). При этом на стороне атакуемого не будет никакой подозрительной активности. Он просто открывает файл.
Pass the Hash
Суть атаки передачи хеша состоит в том, чтобы вынудить атакуемый компьютер отправить на сетевой узел, подконтрольный хакеру, запрос, содержащий хешированный пароль текущего пользователя. В данной статье рассматривается вариант с использованием ссылки на общий сетевой ресурс в «злонамеренно составленном» документе формата Office Open XML. При открытии файла автоматически выполнится попытка авторизации по SMB без Session Security Flag, для чего отправится стандартный запрос, содержащий зашифрованный NTLM-хеш пароля.
Разумеется, это справедливо только в том случае, если на компьютере жертвы используется SMB-NTLM. Если корпоративная сеть мигрирует на Kerberos, изменится система «запрос/ответ». В ней появится промежуточный сервер, поэтому таким способом хеш перехватить уже не удастся. Подробнее см. доклад c конференции Black Hat.
Подготовка
Для реализации описанной выше теории нам необходимы четыре вещи:
- Любая Linux-машина (какой уж взлом без линуксов-то…).
- Пакет Microsoft Word, начиная с 2007.
- Прямые руки.
- Компьютер жертвы или его имитация.
В эксперименте я использовал следующие программы:
- Ubuntu Server 16.04;
- MS Windows 7 Ultimate (сборка 7600);
- пакет MS Office 2010, стандартное издание.
Помимо Windows 7, успешные испытания были проведены на Windows Server 2012 R2, версия 6.3, билд 9600.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»