Entrada

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.

Bandit: nivel 14 → 15

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:

  • localhost es el nombre que una máquina usa para referirse a sí misma. Apunta a la dirección 127.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, localhost es 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ónQué hace
-tSolo conexiones TCP
-lSolo los puertos en escucha (listening)
-nMuestra 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/30000 abre la conexión y la asocia al descriptor 3, para lectura y escritura (<>). Los descriptores 0, 1 y 2 ya los conocemos del nivel 6 → 7; el 3 es el primero libre.
  • cat ... >&3 envía la contraseña por esa conexión.
  • cat <&3 lee 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 / conceptoPara qué sirve
localhost / 127.0.0.1La propia máquina (interfaz de loopback)
PuertoNúmero que identifica a qué servicio va una conexión
nc host puertoAbrir una conexión TCP y hablar con el servicio
nc host puerto < ficheroEnviar el contenido de un fichero al servicio
ss -tlnVer los puertos TCP en escucha
/dev/tcp/host/puertoConexión TCP desde bash, sin herramientas externas
exec 3<>Abrir un descriptor de fichero para leer y escribir
Esta entrada está licenciada bajo CC BY 4.0 por el autor.