Bandit: nivel 14 → 15
Primer nivel de red. Enviamos la contraseña actual a un servicio que escucha en el puerto 30000 de localhost usando nc, y entendemos qué son los puertos y la interfaz de loopback.
Hasta el nivel anterior todo ocurría dentro del sistema de ficheros: buscar, filtrar, decodificar, descomprimir. A partir de aquí Bandit empieza a meter redes en la ecuación. En este nivel hay un servicio escuchando en un puerto de la propia máquina, y para conseguir la contraseña tenemos que hablar con él. La herramienta para eso es nc (netcat), la “navaja suiza” de las conexiones de red.
Las contraseñas aparecen como
[REDACTED], siguiendo las normas de OverTheWire.
Conexión al nivel 14
1
2
$ sshpass -p '[REDACTED]' ssh bandit14@bandit.labs.overthewire.org -p 2220
bandit14@bandit:~$ export TERM=xterm
El enunciado
Según el enunciado del nivel 15, la contraseña del siguiente nivel se obtiene enviando la contraseña del nivel actual al puerto 30000 de localhost.
1
2
bandit14@bandit:~$ ls
bandit14@bandit:~$
El home está vacío: esta vez no hay ficheros que buscar. Todo pasa por la red.
Conceptos: localhost y puertos
Dos ideas que vamos a necesitar a partir de ahora:
localhostes el nombre que una máquina usa para referirse a sí misma. Apunta a la dirección127.0.0.1, la interfaz de loopback: el tráfico que se envía ahí no sale a ninguna red, se queda dentro del propio equipo. Como estamos conectados por SSH al servidor de Bandit,localhostes ese servidor.- Un puerto es un número (del 0 al 65535) que identifica a qué servicio va dirigida una conexión dentro de una máquina. Una misma dirección IP puede tener muchos servicios a la vez, cada uno “escuchando” en su puerto: SSH suele usar el 22 (en Bandit, el 2220 desde fuera), un servidor web el 80 o el 443… Aquí alguien ha dejado un servicio escuchando en el 30000.
La solución: nc
Primero necesitamos la contraseña actual. La conocemos porque acabamos de usarla para entrar, pero también está en el fichero que vimos en el nivel anterior:
1
2
bandit14@bandit:~$ cat /etc/bandit_pass/bandit14
[REDACTED]
Ahora abrimos una conexión con el servicio:
1
2
bandit14@bandit:~$ nc localhost 30000
[REDACTED]
nc localhost 30000 abre una conexión TCP con el puerto 30000 de la propia máquina y se queda esperando. A partir de ahí, nc funciona como un tubo: lo que escribimos se envía al servicio y lo que el servicio responde aparece en pantalla. Pegamos la contraseña de bandit14, pulsamos Enter, el servicio comprueba que es correcta y nos responde con la contraseña de bandit15.
Es una forma muy directa de entender cómo funcionan muchos protocolos de red por dentro: al final, un servicio no es más que un programa que lee lo que le llega por un puerto y contesta.
Otras formas
1. Sin copiar y pegar: redirección o tubería
1
bandit14@bandit:~$ nc localhost 30000 < /etc/bandit_pass/bandit14
En lugar de escribir la contraseña a mano, le pasamos el fichero a nc por la entrada estándar con <, la misma redirección que usamos con tr en el nivel 11 → 12. nc envía el contenido del fichero al servicio y muestra la respuesta. También funciona con una tubería:
1
bandit14@bandit:~$ cat /etc/bandit_pass/bandit14 | nc localhost 30000
Las dos formas evitan los errores típicos de pegar (un espacio de más, un carácter que falta) y además se pueden usar dentro de scripts.
2. Ver qué puertos están escuchando con ss
1
bandit14@bandit:~$ ss -tln
Antes de conectarte a un servicio, es útil saber qué hay escuchando en la máquina. ss muestra las conexiones y los puertos abiertos:
| Opción | Qué hace |
|---|---|
-t | Solo conexiones TCP |
-l | Solo los puertos en escucha (listening) |
-n | Muestra los puertos como números en lugar de traducirlos a nombres de servicio |
En la lista que devuelve deberías encontrar el 30000, junto a otros puertos que usan niveles posteriores de Bandit. En pentesting, enumerar los puertos abiertos es casi siempre el primer paso. ss es el sustituto moderno de netstat, que hace lo mismo con netstat -tln.
3. Sin nc: el truco de /dev/tcp en bash
1
2
3
bandit14@bandit:~$ exec 3<>/dev/tcp/localhost/30000
bandit14@bandit:~$ cat /etc/bandit_pass/bandit14 >&3
bandit14@bandit:~$ cat <&3
Bash tiene una función integrada poco conocida: si rediriges a una ruta con la forma /dev/tcp/host/puerto, abre una conexión TCP. Ese fichero no existe en el disco; es bash quien lo interpreta.
exec 3<>/dev/tcp/localhost/30000abre la conexión y la asocia al descriptor3, para lectura y escritura (<>). Los descriptores 0, 1 y 2 ya los conocemos del nivel 6 → 7; el 3 es el primero libre.cat ... >&3envía la contraseña por esa conexión.cat <&3lee lo que responde el servicio.
Es muy útil en máquinas donde no está instalado nc, algo que pasa a menudo en entornos reales.
Pasar al nivel siguiente
1
2
bandit14@bandit:~$ exit
$ sshpass -p '[REDACTED]' ssh bandit15@bandit.labs.overthewire.org -p 2220
Resumen
| Comando / concepto | Para qué sirve |
|---|---|
localhost / 127.0.0.1 | La propia máquina (interfaz de loopback) |
| Puerto | Número que identifica a qué servicio va una conexión |
nc host puerto | Abrir una conexión TCP y hablar con el servicio |
nc host puerto < fichero | Enviar el contenido de un fichero al servicio |
ss -tln | Ver los puertos TCP en escucha |
/dev/tcp/host/puerto | Conexión TCP desde bash, sin herramientas externas |
exec 3<> | Abrir un descriptor de fichero para leer y escribir |