
Эксплойт локального повышения привилегий в Windows с использованием спуфинга NBNS, поддельного прокси WPAD и ретрансляции NTLM из HTTP в SMB для получения доступа NT AUTHORITY\SYSTEM.
#Potato Повышение привилегий в Windows 7, 8, 10, Server 2008, Server 2012
###Как это работает Potato использует известные проблемы в Windows для получения локального повышения привилегий, а именно NTLM relay (в частности HTTP->SMB relay) и NBNS-спуфинг.
Используя описанные ниже техники, непривилегированный пользователь может получить доступ уровня "NT AUTHORITY\SYSYTEM" к хосту Windows в конфигурациях по умолчанию.
Эксплойт состоит из 3 основных частей, все из которых в некоторой степени настраиваются через параметры командной строки:
#####1. Локальный NBNS-спуфер NBNS — это широковещательный UDP-протокол разрешения имён, обычно используемый в средах Windows. При тестировании на проникновение мы часто перехватываем сетевой трафик и отвечаем на NBNS-запросы, наблюдаемые в локальной сети. Для целей повышения привилегий мы не можем предполагать, что способны перехватывать сетевой трафик, так как же нам выполнить NBNS-спуфинг?
Если мы можем заранее узнать, для какого хоста целевая машина (в данном случае наша цель — 127.0.0.1) будет отправлять NBNS-запрос, мы можем сформировать ответ и зафлудить целевой хост NBNS-ответами (поскольку это UDP-протокол). Одна сложность заключается в том, что 2-байтовое поле в NBNS-пакете, TXID, должно совпадать в запросе и ответе. Мы можем обойти это, выполняя быстрый флуд и перебирая все 65536 возможных значений.
А что, если у хоста, который мы пытаемся подделать, уже есть DNS-запись? Что ж, мы можем ЗАСТАВИТЬ DNS-запросы завершаться ошибкой забавным способом. Используя технику под названием "port exhaustion", мы привязываемся к каждому UDP-порту. Когда вы попытаетесь выполнить DNS-запрос, он завершится ошибкой, потому что не будет доступного исходного порта, на который мог бы прийти DNS-ответ.
В ходе тестирования это оказалось на 100% эффективным.
#####2. Поддельный WPAD-прокси-сервер Имея возможность подделывать NBNS-ответы, мы можем нацелить наш NBNS-спуфер на 127.0.0.1. Мы зафлуживаем целевую машину (нашу собственную машину) NBNS-пакетами-ответами для хоста "WPAD" или "WPAD.DOMAIN.TLD", и сообщаем, что хост WPAD имеет IP-адрес 127.0.0.1.
В то же время мы запускаем HTTP-сервер локально на 127.0.0.1. Когда он получает запрос на "http://wpad/wpad.dat", он отвечает примерно следующим:
FindProxyForURL(url,host){
if (dnsDomainIs(host, "localhost")) return "DIRECT";
return "PROXY 127.0.0.1:80";}
Это приведёт к тому, что весь HTTP-трафик на целевой машине будет перенаправлен через наш сервер, работающий на 127.0.0.1.
Интересно, что эта атака, даже выполненная пользователем с низкими привилегиями, затронет всех пользователей машины. Это включает администраторов и системные учётные записи. Смотрите скриншоты "egoldstein_spoofing.png" и "dade_spoofed.png" для примера.
#####3. HTTP -> SMB NTLM Relay Теперь, когда весь HTTP-трафик проходит через контролируемый нами сервер, мы можем делать такие вещи, как запрос NTLM-аутентификации...
В эксплойте Potato все запросы перенаправляются с помощью 302-редиректа на "http://localhost/GETHASHESxxxxx", где xxxxx — некоторый уникальный идентификатор. Запросы к "http://localhost/GETHASHESxxxxx" отвечают 401-запросом на NTLM-аутентификацию.
Учётные данные NTLM ретранслируются на локальный SMB-слушатель для создания новой системной службы, которая выполняет заданную пользователем команду. Эта команда будет выполнена с привилегией "NT AUTHORITY\SYSTEM".
###Использование эксплойта Использование в настоящее время зависит от операционной системы.
Оно также иногда бывает нестабильным из-за особенностей того, как Windows обрабатывает настройки прокси и файл WPAD. Часто, когда эксплойт не работает, требуется оставить его запущенным и ждать. Когда у Windows уже есть кэшированная запись для WPAD или она разрешает прямой доступ в интернет, потому что WPAD не был найден, может потребоваться 30-60 минут для обновления. Необходимо оставить эксплойт запущенным и попытаться вызвать его снова позже, после истечения этого времени.
Перечисленные здесь техники упорядочены от наименее к наиболее сложной. Любая техника, расположенная ниже в списке, должна работать на всех предыдущих версиях. Для каждой включены видео и скриншоты.
#####Windows 7 — см. https://www.youtube.com/watch?v=Nd6f5P3LSNM Windows 7 можно довольно надёжно проэксплуатировать через механизм обновления Windows Defender.
В Potato.exe есть код для автоматического запуска этого. Просто выполните следующее:
Potato.exe -ip <local ip> -cmd <command to run> -disable_exhaust true
Это запустит NBNS-спуфер, подделает "WPAD" на 127.0.0.1, затем проверит обновления Windows Defender.
Если в вашей сети уже есть DNS-запись для "WPAD", вы можете попробовать "-disable_exhaust false". Это должно привести к сбою DNS-запроса, и он должен откатиться к NBNS. Мы протестировали это пару раз, и это сработало
#####Windows Server 2008 — см. https://www.youtube.com/watch?v=z_IGPWgL5SY Поскольку Windows Server не поставляется с Defender, нам нужен альтернативный метод. Вместо этого мы просто проверим обновления Windows. Другая оговорка заключается в том, что, по крайней мере в моём домене, Server 2K8 хотел WPAD.DOMAIN.TLD вместо просто WPAD. Ниже приведён пример использования:
Potato.exe -ip <local ip> -cmd <command to run> -disable_exhaust true -disable_defender true --spoof_host WPAD.EMC.LOCAL
После успешного запуска просто проверьте обновления Windows. Если это не сработает, подождите около 30 минут с запущенным эксплойтом и проверьте снова. Если всё ещё не работает, попробуйте фактически скачать обновление.
Если в вашей сети уже есть DNS-запись для "WPAD", вы можете попробовать "-disable_exhaust false". Это должно привести к сбою DNS-запроса, и он должен откатиться к NBNS. Мы протестировали это пару раз, и это сработало
#####Windows 8/10/Server 2012 — см. https://www.youtube.com/watch?v=Kan58VeYpb8 В новейших версиях Windows, по-видимому, Windows Update может больше не учитывать настройки прокси, заданные в "Internet Options", или не проверять WPAD. Вместо этого настройки прокси для Windows Update управляются с помощью "netsh winhttp proxy..."
Вместо этого для этих версий мы полагаемся на более новую функцию Windows — "automatic updater of untrusted certificates". Подробности можно найти на https://support.microsoft.com/en-us/kb/2677070 и https://technet.microsoft.com/en-us/library/dn265983.aspx
Из статьи на technet: "The Windows Server 2012 R2, Windows Server 2012, Windows 8.1, and Windows 8 operating systems include an automatic update mechanism that downloads certificate trust lists (CTLs) on a daily basis."
Похоже, что эта часть Windows всё ещё использует WPAD, даже когда настройка прокси winhttp установлена в direct.
В этом случае использование Potato следующее:
Potato.exe -ip <local ip> -cmd <cmd to run> -disable_exhaust true -disable_defender true
На этом этапе вам нужно будет подождать до 24 часов или найти другой способ вызвать это обновление.
Если в вашей сети уже есть DNS-запись для "WPAD", вы можете попробовать "-disable_exhaust false". Это должно привести к сбою DNS-запроса, и он должен откатиться к NBNS. Мы протестировали это пару раз, и это сработало
###Меры противодействия
Включение "Extended Protection for Authentication" в Windows должно остановить атаки NTLM relay.
SMB Signing также может смягчить этот тип атаки, однако для подтверждения этого с моей стороны потребуется дополнительное исследование.
###Off Broadcast NBNS Spoofing Используя ту же технику NBNS-спуфинга, что и в эксплойте Potato, мы можем выполнять NBNS-спуфинг против любого хоста, с которым можем взаимодействовать по UDP 137. Нам просто нужно отправлять UDP-пакеты достаточно быстро, чтобы успеть вставить действительный ответ до истечения тайм-аута NBNS-запроса.
Демонстрационное видео этого можно посмотреть на https://www.youtube.com/watch?v=Mzn7ozkyG5g
Демонстрационная лаборатория имеет следующую конфигурацию:
PFSense firewall 10.0.0.0/24 -> Corporate LAN 10.0.1.0 /24 -> Server network
Из корпоративной сети мы будем атаковать машину в серверной сети.
Использование: python Responder.py –I eth0 –spoof <target>:<spoof address>:<spoof host>