
Assembly .NET em C# multithread para enumerar privilégios administrativos locais em hosts Windows via SMB, WMI e WinRM, com integração com BloodHound para reconhecimento do Active Directory.
Enumeração de Privilégios Administrativos Locais com Assembly .NET C# Multithreaded
> ./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 - Attempts to access C$ share
rpc - Attempts WMI query of Win32_ComputerSystem Class provider over RPC
winrm - Attempts WMI query of Win32_ComputerSystem Class Provider over WinRM Session
Arguments:
/bloodhound - generate bloodhound-digestible AdminTo and Session collection file
output file is zipped and enypted with randomized name and password
/dc - specify domain controller to query (if not ran on a domain-joined host)
/domain - specify domain name (if not ran on a domain-joined host)
/edr - check host for EDR (requires smb, rpc, or winrm)
/logons - return logged on users on a host (requires smb, rpc, or winrm)
/registry - enumerate sessions from registry hive (requires smb)
/services - return services running as users (requires smb, rpc, or winrm)
/socket - send bloodhound output to TCP socket instead of writing to disk
ex: ""127.0.0.1:8080""
/targets - comma-separated list of hostnames to check
/threads - specify maximum number of parallel threads (default=25)
/user - specify username that collection was run under (useful during token manipulation)
/validate - check credentials against Domain prior to scanning targets (useful during token manipulation)
/verbose - print additional logging information
/ou - specify LDAP OU to query enabled computer objects from
ex: "OU=Special Servers,DC=example,DC=local"
/ldap - query hosts from the following LDAP filters:
:all - All enabled computers with 'primary' group 'Domain Computers'
:dc - All enabled Domain Controllers (not read-only DCs)
:exclude-dc - All enabled computers that are not Domain Controllers or read-only DCs
:servers - All enabled servers
:servers-exclude-dc - All enabled servers excluding Domain Controllers or read-only DCs
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.
Como visto no exemplo de saída acima, tentar verificar o WinRM no host com endereço IP 10.10.10.10 resultará em erro devido ao cliente WinRM não tentar autenticar em um host via endereço IP.
Use nomes de host ao tentar verificar o acesso WinRM.
As flags /targets, /ldap e /ou podem ser usadas juntas ou separadamente para gerar uma lista de hosts a serem enumerados.
Todos os hosts retornados por essas flags são combinados e deduplicados antes do início da enumeração.
O LACheck suporta a escrita de dados coletados de AdminTo e Sessão em saída json que pode ser carregada no BloodHound
Esta saída destina-se apenas a complementar uma coleta existente do BloodHound com privilégios administrativos atualizados para um único usuário e Sessões coletadas de hosts onde privilégios administrativos foram identificados
A opção /bloodhound gravará um arquivo zip criptografado com nome aleatório no disco, que pode ser baixado, extraído e carregado no BloodHound
O BloodHound requer a resolução de usuários e computadores para SIDs. Devido a técnicas de impersonação como make_token e kerberos_ticket_use do Cobalt Strike, o LACheck pode não ser capaz de determinar com precisão o contexto de usuário para uma coleta. O argumento /user é necessário para fornecer ao LACheck o userprincipalname (formato = [email protected]) do contexto sob o qual ele é executado, a fim de correlacionar com precisão as informações da coleta.
A saída do BloodHound pode ser enviada para um socket TCP em vez de ser gravada em disco.
Se a conexão TCP falhar, a saída do BloodHound será gravada em disco.
Em um beacon do Cobalt Strike, as conexões TCP podem ser encaminhadas de um host de volta para a máquina local do operador usando rportfwd_local:
rportfwd_local 8888 127.0.0.1 8888
Um operador pode então redirecionar a saída do fluxo TCP para um arquivo local usando netcat:
nc -lvnp 8888 > computers.json
- = não implementado
Inspirado pelo script EDR.cna do harleyQu1nn
O método Directory.GetFiles retorna uma lista de drivers de:
Os drivers são comparados com uma lista de drivers conhecidos usados por fornecedores de EDR.
[EDR] WEB01 - Found: CrowdStrike, SentinelOne (svcadmin)
[EDR] DEV02 - no EDR found (svcadmin)
NetWkstaUserEnum retorna uma lista de usuários com logons interativos, de serviço e em lote
WTSEnumerateSessionsA retorna uma lista de sessões RDP em um host
WTSQuerySessionInformationA recupera informações detalhadas para cada sessão 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 sobre SIDs na hive \\Computer\HKEY_USERS\, tenta acessar Volatile Environment para cada SID e recupera valores das chaves USERDOMAIN e USERNAME.
Este método requer que o serviço Remote Registry esteja em execução no host remoto. Se não estiver:
AutomaticDevido ao processo potencialmente de várias etapas para enumerar cada host, este método pode ser mais lento em comparação com técnicas alternativas. smb /logons é mais rápido
[registry] WEB01 - contoso\devadmin (svcadmin)
O método ServiceController.GetServices recupera uma lista de serviços em um host
Cada serviço é consultado para determinar o usuário sob o qual está configurado para ser executado.
Devido à necessidade de consultar cada serviço individualmente, este método pode ser mais lento em comparação com técnicas alternativas. wmi /services é mais rápido
[service] WEB01 - [email protected] Service: secretsvc State: Running (svcadmin)
Inspirado pelo script EDR.cna do harleyQu1nn
A classe CIM_DataFile retorna uma lista de drivers de:
Os drivers são comparados com uma lista de drivers conhecidos usados por fornecedores de EDR.
[EDR] WEB01 - Found: CrowdStrike, SentinelOne (svcadmin)
[EDR] DEV02 - no EDR found (svcadmin)
A classe Win32_LoggedOnUser retorna uma lista de sessões logadas A classe Win32_LogonSession retorna informações detalhadas para cada sessão
[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)
Consulta a classe Win32_UserProfile para recuperar SIDs de perfis de usuário em um sistema.
O método EnumKey da classe StdRegProv recupera a hive \\Computer\HKEY_USERS\ e tenta acessar Volatile Environment para cada SID retornado, a fim de recuperar valores das chaves USERDOMAIN e USERNAME.
[registry] WEB01 - contoso\devadmin (svcadmin)
Consulta a classe Win32_Service para recuperar o nome, usuário e estado dos serviços
[service] WEB01 - [email protected] Service: secretsvc State: Running (svcadmin)
Cada verificação WMI também é implementada usando Recursos WMI e Enumeração WMI sobre WinRM.
Isso evita o uso de runspaces do PowerShell.
| SMB | WMI | WinRM |
|---|
| /edr | fast | fast | fast |
| /logons | fast | fast | fast |
| /services | slow | fast | fast |
| /registry | slow | fast | - |