Bank es una máquina relativamente simple, sin embargo, una enumeración web adecuada es clave para encontrar los datos necesarios para la entrada. También existe un método de entrada no deseado, que muchos usuarios descubren antes de encontrar los datos correctos.
Reconnaissance
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Bank. Este resultado lo almacenaremos en un archivo llamado allPorts.
❯ nmap -p- --open -sS --min-rate 1000 -vvv -Pn -n 10.10.10.29 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-02-16 21:47 CET
Initiating SYN Stealth Scan at 21:47
Scanning 10.10.10.29 [65535 ports]
Discovered open port 53/tcp on 10.10.10.29
Discovered open port 22/tcp on 10.10.10.29
Discovered open port 80/tcp on 10.10.10.29
Completed SYN Stealth Scan at 21:47, 12.53s elapsed (65535 total ports)
Nmap scan report for 10.10.10.29
Host is up, received user-set (0.035s latency).
Scanned at 2025-02-16 21:47:10 CET for 13s
Not shown: 65532 closed tcp ports (reset)
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 63
53/tcp open domain syn-ack ttl 63
80/tcp open http syn-ack ttl 63
Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 12.63 seconds
Raw packets sent: 65535 (2.884MB) | Rcvd: 65541 (2.622MB)
❯ extractPorts allPorts
[*] Extracting information...
[*] IP Address: 10.10.10.29
[*] Open ports: 22,53,80
[*] Ports copied to clipboard
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Apache, el servicio de DNS y SSH.
❯ nmap -sCV -p22,53,80 10.10.10.29 -A -oN targeted -oX targetedXML
Starting Nmap 7.95 ( https://nmap.org ) at 2025-02-16 21:48 CET
Nmap scan report for bank.htb (10.10.10.29)
Host is up (0.071s 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-title: HTB Bank - Login
|_Requested resource was login.php
|_http-server-header: Apache/2.4.7 (Ubuntu)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.10 - 4.11, Linux 3.2 - 4.14
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
TRACEROUTE (using port 22/tcp)
HOP RTT ADDRESS
1 66.51 ms 10.10.16.1
2 32.33 ms bank.htb (10.10.10.29)
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 17.64 seconds
Transformaremos el archivo generado targetedXML para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
❯ xsltproc targetedXML > index.html
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
Web Enumeration
Realizaremos una comprobación de las tecnologías que son utilizadas en el sitio web.
Realizamos una enumeración de directorios y páginas web a través de la herramienta de feroxbuster, pero no logramos obtener resultado ninguno.
❯ feroxbuster -u http://10.10.10.29 -t 200 -C 500,502
___ ___ __ __ __ __ __ ___
|__ |__ |__) |__) | / ` / \ \_/ | | \ |__
| |___ | \ | \ | \__, \__/ / \ | |__/ |___
by Ben "epi" Risher 🤓 ver: 2.11.0
───────────────────────────┬──────────────────────
🎯 Target Url │ http://10.10.10.29
🚀 Threads │ 200
📖 Wordlist │ /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt
💢 Status Code Filters │ [500, 502]
💥 Timeout (secs) │ 7
🦡 User-Agent │ feroxbuster/2.11.0
💉 Config File │ /etc/feroxbuster/ferox-config.toml
🔎 Extract Links │ true
🏁 HTTP methods │ [GET]
🔃 Recursion Depth │ 4
───────────────────────────┴──────────────────────
🏁 Press [ENTER] to use the Scan Management Menu™
──────────────────────────────────────────────────
403 GET 10l 30w -c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
404 GET 9l 32w -c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
200 GET 14l 74w 6216c http://10.10.10.29/icons/ubuntu-logo.png
200 GET 378l 980w 11510c http://10.10.10.29/
404 GET 9l 33w 285c http://10.10.10.29/Donate%20Cash
404 GET 9l 33w 285c http://10.10.10.29/Site%20Assets
[#################>--] - 14s 26939/30007 2s found:4 errors:91
[#################>--] - 14s 26921/30002 1886/s http://10.10.10.29/ [##################>-] - 14s 27120/30007 2s found:4 errors:91
[##################>-] - 14s 27105/30002 1892/s http://10.10.10.29/ [##################>-] - 14s 27331/30007 2s found:4 errors:91
[##################>-] - 14s 27304/30002 1900/s http://10.10.10.29/ [####################] - 20s 30007/30007 0s found:4 errors:91
[####################] - 20s 30002/30002 1491/s http://10.10.10.29/
Virtual Hosting
Probamos de aplicar Virtual Hosting para verificar si al acceder a través de http://bank.htb se nos mostraba una página diferente.
El nombre de dominio lo podemos deducir de las máquinas que ya hemos realizado en HTB, pero también se nos presentaba esta información en la enumeración de Nmap al realizar el traceroute.
❯ cat /etc/hosts | grep bank
10.10.10.29 bank.htb
Virtual Hosting es una técnica que permite que un solo servidor web aloje múltiples sitios web, utilizando diferentes nombres de dominio, direcciones IP o rutas. Existen dos tipos principales:
Virtual Hosting basado en nombre: El servidor identifica qué sitio mostrar en función del dominio utilizado en la solicitud.
Virtual Hosting basado en IP: Cada sitio tiene una dirección IP distinta, pero todos comparten el mismo servidor.
Esta técnica optimiza los recursos, permitiendo la gestión de varios sitios en una sola máquina, lo que es esencial para el alojamiento web moderno.
DNS Enumeration
Realizaremos una enumeración a través del DNS que se encuentra expuesto, para verificar si logramos obtener más información al respecto de nombres de dominio.
El comando dig A @10.10.10.29 bank.htb se utiliza para consultar un servidor DNS específico (en este caso, 10.10.10.29) para obtener el registro A (dirección IPv4) de un dominio, en este caso, bank.htb. Esto es útil para verificar la resolución de nombres de dominio y asegurarse de que el servidor DNS está configurado correctamente.
❯ dig A @10.10.10.29 bank.htb
; <<>> DiG 9.20.4-4-Debian <<>> A @10.10.10.29 bank.htb
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7069
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;bank.htb. IN A
;; ANSWER SECTION:
bank.htb. 604800 IN A 10.10.10.29
;; AUTHORITY SECTION:
bank.htb. 604800 IN NS ns.bank.htb.
;; ADDITIONAL SECTION:
ns.bank.htb. 604800 IN A 10.10.10.29
;; Query time: 31 msec
;; SERVER: 10.10.10.29#53(10.10.10.29) (UDP)
;; WHEN: Sun Feb 16 21:51:35 CET 2025
;; MSG SIZE rcvd: 86
El comando dig AAAA @10.10.10.29 bank.htb consulta el servidor DNS en la dirección 10.10.10.29 para obtener el registro AAAA, que corresponde a la dirección IPv6 del dominio bank.htb. Este tipo de consulta se utiliza para obtener la dirección IPv6 asociada a un nombre de dominio.
❯ dig AAAA @10.10.10.29 bank.htb
; <<>> DiG 9.20.4-4-Debian <<>> AAAA @10.10.10.29 bank.htb
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58762
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;bank.htb. IN AAAA
;; AUTHORITY SECTION:
bank.htb. 604800 IN SOA bank.htb. chris.bank.htb. 5 604800 86400 2419200 604800
;; Query time: 32 msec
;; SERVER: 10.10.10.29#53(10.10.10.29) (UDP)
;; WHEN: Sun Feb 16 21:52:06 CET 2025
;; MSG SIZE rcvd: 79
El comando dig any bank.htb @10.10.10.29 realiza una consulta DNS de tipo ANY al servidor DNS en la dirección 10.10.10.29 para obtener todos los registros asociados al dominio bank.htb. Esto incluye registros de tipo A, AAAA, MX, TXT, entre otros.
❯ dig any bank.htb @10.10.10.29
; <<>> DiG 9.20.4-4-Debian <<>> any bank.htb @10.10.10.29
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19558
;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 2
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;bank.htb. IN ANY
;; ANSWER SECTION:
bank.htb. 604800 IN SOA bank.htb. chris.bank.htb. 5 604800 86400 2419200 604800
bank.htb. 604800 IN NS ns.bank.htb.
bank.htb. 604800 IN A 10.10.10.29
;; ADDITIONAL SECTION:
ns.bank.htb. 604800 IN A 10.10.10.29
;; Query time: 199 msec
;; SERVER: 10.10.10.29#53(10.10.10.29) (TCP)
;; WHEN: Sun Feb 16 21:52:58 CET 2025
;; MSG SIZE rcvd: 128
El comando dig axfr bank.htb @10.10.10.29 realiza una consulta de transferencia de zona DNS (AXFR) al servidor DNS en la dirección 10.10.10.29 para obtener todos los registros DNS asociados al dominio bank.htb. Esto generalmente se usa para obtener una copia completa de la zona DNS, pero puede ser restringido por el servidor para evitar la divulgación de información sensible, como en este caso.
❯ dig axfr bank.htb@10.10.10.29
; <<>> DiG 9.20.4-4-Debian <<>> axfr bank.htb@10.10.10.29
;; global options: +cmd
; Transfer failed.
Initial Access
Information Leakage
Realizaremos una comprobación de las tecnologías que son utilizadas en el sitio web.
Realizamos una enumeración de la página web en la cual nos proporcionó el siguiente resultado con diversas páginas y directorios interesantes.
❯ feroxbuster -u http://bank.htb/ -t 200 -C 500,502,404
___ ___ __ __ __ __ __ ___
|__ |__ |__) |__) | / ` / \ \_/ | | \ |__
| |___ | \ | \ | \__, \__/ / \ | |__/ |___
by Ben "epi" Risher 🤓 ver: 2.11.0
───────────────────────────┬──────────────────────
🎯 Target Url │ http://bank.htb/
🚀 Threads │ 200
📖 Wordlist │ /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt
💢 Status Code Filters │ [500, 502, 404]
💥 Timeout (secs) │ 7
🦡 User-Agent │ feroxbuster/2.11.0
💉 Config File │ /etc/feroxbuster/ferox-config.toml
🔎 Extract Links │ true
🏁 HTTP methods │ [GET]
🔃 Recursion Depth │ 4
───────────────────────────┴──────────────────────
🏁 Press [ENTER] to use the Scan Management Menu™
──────────────────────────────────────────────────
404 GET 9l 32w -c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
403 GET 10l 30w -c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
301 GET 9l 28w 301c http://bank.htb/inc => http://bank.htb/inc/
301 GET 9l 28w 304c http://bank.htb/assets => http://bank.htb/assets/
301 GET 9l 28w 305c http://bank.htb/uploads => http://bank.htb/uploads/
200 GET 1l 287w 16994c http://bank.htb/assets/js/sweetalert.min.js
200 GET 7l 432w 37045c http://bank.htb/assets/js/bootstrap.min.js
200 GET 0l 0w 0c http://bank.htb/inc/user.php
200 GET 23l 38w 622c http://bank.htb/inc/footer.php
200 GET 29l 182w 14288c http://bank.htb/assets/img/Thumbs.db
200 GET 48l 93w 1024c http://bank.htb/assets/css/login.css
200 GET 13l 53w 5927c http://bank.htb/assets/img/htb-logo.png
200 GET 4l 1412w 95785c http://bank.htb/assets/js/jquery.js
302 GET 188l 319w 7322c http://bank.htb/ => login.php
200 GET 2377l 6406w 69707c http://bank.htb/assets/js/bootstrap.js
200 GET 935l 2309w 22957c http://bank.htb/assets/css/sweetalert.css
200 GET 106l 587w 35387c http://bank.htb/assets/fonts/glyphicons-halflings-regular.eot
200 GET 1672l 2840w 26651c http://bank.htb/assets/font-awesome/css/font-awesome.css
200 GET 4l 56w 21984c http://bank.htb/assets/font-awesome/css/font-awesome.min.css
200 GET 6757l 16077w 146010c http://bank.htb/assets/css/bootstrap.css
200 GET 288l 13959w 108738c http://bank.htb/assets/fonts/glyphicons-halflings-regular.svg
200 GET 1673l 3210w 162920c http://bank.htb/assets/font-awesome/fonts/FontAwesome.otf
200 GET 520l 42211w 287007c http://bank.htb/assets/font-awesome/fonts/fontawesome-webfont.svg
302 GET 0l 0w 0c http://bank.htb/inc/header.php => login.php
200 GET 0l 0w 0c http://bank.htb/inc/ticket.php
200 GET 227l 378w 3480c http://bank.htb/assets/css/htb-bank.css
200 GET 16l 42w 332c http://bank.htb/assets/font-awesome/scss/_bordered-pulled.scss
200 GET 19l 44w 378c http://bank.htb/assets/font-awesome/scss/_list.scss
200 GET 14l 34w 695c http://bank.htb/assets/font-awesome/scss/_path.scss
200 GET 20l 59w 672c http://bank.htb/assets/font-awesome/scss/_rotated-flipped.scss
200 GET 561l 1133w 15592c http://bank.htb/assets/font-awesome/scss/_variables.scss
200 GET 552l 2489w 35004c http://bank.htb/assets/font-awesome/scss/_icons.scss
200 GET 227l 1523w 117910c http://bank.htb/assets/font-awesome/fonts/fontawesome-webfont.woff
200 GET 233l 1412w 99659c http://bank.htb/assets/font-awesome/fonts/fontawesome-webfont.eot
200 GET 1063l 4200w 142944c http://bank.htb/assets/font-awesome/fonts/fontawesome-webfont.ttf
200 GET 11l 47w 419c http://bank.htb/assets/font-awesome/scss/_core.scss
301 GET 9l 28w 313c http://bank.htb/assets/js/theme => http://bank.htb/assets/js/theme/
Volveremos a realizar la enumeración de directorios, pero esta vez con la herramienta de gobuster.
Al realizar la enumeración, verificamos que se nos muestra distintos directorios, entre los cuales nos llama la atención el nombre de balance-transfer.
Una transferencia de saldo es la transferencia del saldo de una cuenta a otra cuenta, a menudo mantenida en otra institución. Se utiliza con mayor frecuencia al describir una transferencia de saldo de una tarjeta de crédito.
La extensión de archivo .acc no tiene un solo significado definido y puede variar dependiendo del contexto en el que se use. Algunas posibles aplicaciones de los archivos con esta extensión son:
Archivos de base de datos: En algunas aplicaciones, los archivos .acc pueden estar asociados a bases de datos o aplicaciones de contabilidad.
Archivos de configuración: En otros casos, pueden ser archivos de configuración específicos para programas o sistemas particulares.
Archivos de acceso: Algunas veces, esta extensión se usa para archivos que almacenan información relacionada con el acceso o autenticación en un sistema.
Al realizar la comprobación de uno de esos archivos, verificamos que se trata de un reporte bancario en el cual aparecen datos del usuario, contraseña, transacciones etc. Este contenido se encuentra encriptado.
Desde la propia página web, tratamos de comprobar si alguno de esos archivos tenía un tamaño distinto, con lo cual probamos en darle a la opción de Size y se ordenó alfabéticamente de menor a mayor tamaño.
En el resultado obtenido, comprobamos que solamente uno de ellos tenía un tamaño menor al resto, lo cual nos llevó a sospechar que quizás tuviera otro contenido sensible, etc.
Al realizar la comprobación del archivo, verificamos que aparecían las credenciales del usuario chris en texto plano. Al parecer, la encriptación no funcionó en ese archivo, por ese motivo el tamaño inferior al resto.
También podemos realizar esa comprobación a través del siguiente comando de cURL, en el cual filtrábamos por el nombre del archivo junto a su tamaño y a través de expresiones regulares, eliminábamos aquellos resultados repetitivos.
❯ curl -s -X GET 'http://bank.htb/balance-transfer/' | html2text | awk '{print $3, $5}' | paste -d ' ' - - | grep -vE '582|583|584|585' | sort
Server bank.htb
09ed7588d1cd47ffca297cc7dac22c52.acc 581
68576f20e9732f1b2edc4df5b8533230.acc 257
941e55bed0cb8052e7015e7133a5b9c7.acc 581
Directory -
of ****** Last Description
Verificamos que hemos logrado acceso a la cuenta de banco del usuario chris. Entre la información presente, podemos visualizar el saldo disponible, transacciones, etc.
Abusing File Upload (RCE)
Ingresando al apartado de Support, comprobamos que teníamos la capacidad de realizar un ticket y subir un archivo, con lo cual nos llevó a pensar en subir un archivo malicioso (webshell) para lograr tener acceso al sistema.
Al intentar subir directamente un archivo con extensión .php, se nos mostró el siguiente mensaje de error indicando que solamente estaba permitido la subida de imágenes.
Tratamos de cambiar el Content-Type y la extensión del archivo a una que nos acepte el servidor. Al enviar la solicitud, se nos indicó que se había realizado correctamente la solicitud.
Comprobamos en el panel de My Tickets que se ha creado nuestro ticket en el cual dispone de un Attachment que es el archivo que hemos logrado subir.
Al acceder al archivo, se nos mostraba la URL en la cual se almacenaban estos archivos y en este caso, como realmente no era una imagen, nos apareció el siguiente mensaje de error.
Probamos distintas manera de intentar eludir la restricción del File Upload, pero en ninguna obtuvimos resultado...
Revisando el código fuente de http://bank.htb/support.htb, verificamos que aparece una línea comentada en la cual se informa que han añadido la extensión .htb para que pueda ejecutar php con propósitos de debug, algo bastante inusual...
Por lo tanto, decidimos en intentar subir un archivo con extensión .htb tal y como se nos indicaba, verificamos que se logra subir correctamente el archivo malicioso de nuestra webshell.
Realizamos una comprobación para verificar que tenemos la capacidad de ejecutar comandos a través de la webshell subida.
Al verificar el RCE, el siguiente paso será lograr obtener acceso al sistema. Nos pondremos en escucha con nc.
❯ nc -nlvp 443
listening on [any] 443 ...
A través del primer comando, lo que realizaremos es codificar nuestra sintaxis de la reverse shell en formato URL, para no tener problemas a la hora de ejecutarlo a través de la webshell.
Una vez obtenido el comando a ejecutar, haremos uso de la webshell para otorgarnos acceso al sistema.
Verificamos que finalmente logramos acceso al equipo y podemos visualizar la flag de user.txt.
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.3] from (UNKNOWN) [10.10.10.29] 60798
bash: cannot set terminal process group (1073): Inappropriate ioctl for device
bash: no job control in this shell
www-data@bank:/var/www/bank/uploads$ cat /home/chris/user.txt
ab47a4cf55**********************
Al obtener la reverse shell, mejoramos la calidad de la shell con los siguientes pasos para obtener una TTY interactiva.
Realizaremos una verificación inicial de los privilegios que dispone el usuario actual. Verificamos que no disponemos de algún grupo interesante ni permisos de sudoers.
Al verificar si había algún permiso de SUID sobre algún binario, comprobamos la existencia de un binario inusual llamado /var/htb/bin/emergency.
Verificamos el propietario de este binario y nos encontramos que es root.
www-data@bank:/var/www/bank/uploads$ ls -l /var/htb/bin/emergency
-rwsr-xr-x 1 root root 112204 Jun 14 2017 /var/htb/bin/emergency
Probamos de utilizar el binario para verificar el funcionamiento de este. Inesperadamente, este binario nos proporcionó acceso como root con lo cual pudimos visualizar la flag de root.txt.
Al parecer este binario era como una especie de backdoor que habrían dejado los administradores del sistema.
Por lo tanto, generamos una contraseña a través de openssl y verificamos que en este caso, el usuarioroot no disponía de ninguna contraseña asignada. Con lo cual, podemos añadir un nuevo usuario, o remplazar la x por el valor de nuestra contraseña generada para que el usuarioroot disponga de nuestras credenciales.
Modificamos el archivo /etc/passwd y le asignamos al usuarioroot nuestras credenciales generadas, verificamos que los cambios se han guardado correctamente.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Al acceder a, nos encontramos con la página que viene con Apache por defecto.
Al acceder a, nos encontramos con la siguiente página web que nos proporciona un panel de autenticación. Intentamos realizar un Authentication Bypass con inyecciones SQL, pero no obtuvimos resultado.
Al acceder a , verificamos un gran listado de archivos .acc que parecen ser transferencias bancarias.
Volvemos al panel de autenticación de y probamos de autenticarnos con las credenciales del usuario encontrado.