Bandit Nivel 16 → 17

Recurso oficial: https://overthewire.org/wargames/bandit/bandit17.html

Este nivel combina tres herramientas distintas: escaneo de puertos con nmap, conexión SSL con openssl, y autenticación SSH con clave privada RSA. Es el primer nivel donde la recompensa no es una contraseña sino una clave privada, lo que introduce un flujo de autenticación diferente al de todos los niveles anteriores.


Objetivo

Entras como bandit16. En algún lugar del rango de puertos 31000–32000 de localhost hay un servicio que habla SSL. Al enviarle la contraseña actual de bandit16, ese servicio responde con una clave privada RSA que te da acceso a bandit17.

Tu misión: descubrir qué puerto es, conectarte por SSL, obtener la clave y usarla para entrar al siguiente nivel.


Qué aprendes

Comandos nuevos

ComandoPara qué sirve
nmap -p <rango> <host>Escanea un rango de puertos y muestra cuáles están abiertos
nmap -sVAdemás de si está abierto, intenta identificar el servicio que corre en cada puerto
openssl s_client -connect <host>:<puerto>Establece una conexión SSL/TLS hacia un servidor y permite intercambiar datos manualmente
chmod 600 <archivo>Da permisos de lectura/escritura solo al propietario (obligatorio para claves SSH)
ssh -i <archivo_clave> <usuario>@<host> -p <puerto>Autentica en SSH usando una clave privada en lugar de contraseña

Conceptos clave

  • Puerto: un número (0–65535) que identifica un canal de comunicación dentro de una misma máquina o servidor. Un proceso “escucha” en un puerto esperando conexiones.
  • Escaneo de puertos: técnica para detectar qué puertos de un host están activos. nmap es la herramienta estándar.
  • SSL/TLS: protocolo de cifrado que se usa sobre una conexión de red (como HTTPS es HTTP + TLS). openssl s_client permite conectarse manualmente a un servidor que use TLS.
  • Clave privada RSA: archivo de texto que empieza con -----BEGIN RSA PRIVATE KEY-----. Es la mitad secreta de un par de claves asimétricas. SSH la usa para autenticarte sin contraseña, pero el archivo debe tener permisos 600 o SSH lo rechaza por seguridad.
  • /tmp/: directorio temporal de Linux. Todo usuario puede escribir en él. Es el sitio habitual en Bandit para guardar archivos intermedios de trabajo.

Paso a paso

1. Conectarse como bandit16

ssh [email protected] -p 2220

Introduce la contraseña de bandit16 cuando te la pidan.


2. Escanear el rango de puertos con nmap

nmap -p 31000-32000 localhost

Lo que verás (ejemplo ilustrativo; los puertos exactos pueden variar):

Starting Nmap 7.80 ( https://nmap.org )
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000078s latency).
Not shown: 996 closed ports
PORT      STATE SERVICE
31046/tcp open  unknown
31518/tcp open  unknown
31691/tcp open  unknown
31790/tcp open  unknown
31960/tcp open  unknown

Nmap done: 1 IP address (1 host up) scanned in 0.12 seconds

Hay varios puertos abiertos. Necesitas identificar cuál habla SSL. Usa la flag -sV para que nmap intente detectar el servicio:

nmap -p 31000-32000 -sV localhost

Salida con detección de versión (ejemplo):

PORT      STATE SERVICE     VERSION
31046/tcp open  echo
31518/tcp open  ssl/echo
31691/tcp open  echo
31790/tcp open  ssl/unknown
31960/tcp open  echo

Los que dicen ssl/ son los que hablan SSL. Descarta los que ponen solo echo (te devuelven lo mismo que envías, no son el objetivo). Busca el que diga algo como ssl/unknown — ese es el candidato. En este ejemplo sería el puerto 31790.


3. Conectarse al puerto SSL con openssl

Sustituye <PUERTO> por el número que encontraste en el paso anterior (p.ej. 31790):

openssl s_client -connect localhost:<PUERTO>

Verás un bloque largo de información sobre el certificado SSL y al final una línea en blanco esperando tu entrada:

CONNECTED(00000003)
depth=0 CN = localhost
verify error:num=18:self signed certificate
verify return:1
depth=0 CN = localhost
verify return:1
---
Certificate chain
 0 s:CN = localhost
   i:CN = localhost
---
[... más info del certificado ...]
---
read R BLOCK

Cuando aparezca el cursor parpadeando (o simplemente después del bloque de info), escribe la contraseña de bandit16 y pulsa Enter:

<contraseña-de-bandit16>

Si es el puerto correcto, el servidor responderá con una clave privada RSA:

-----BEGIN RSA PRIVATE KEY-----
... (cuerpo de la clave omitido por seguridad) ...
-----END RSA PRIVATE KEY-----

Correct!

Si el servidor solo te hace eco de lo que escribiste (o no responde nada útil), es el puerto equivocado: prueba el siguiente candidato ssl/ que encontraste con nmap.


4. Guardar la clave privada en /tmp

Copia todo el bloque desde -----BEGIN RSA PRIVATE KEY----- hasta -----END RSA PRIVATE KEY----- (ambas líneas inclusive).

Crea un archivo en /tmp/ para guardarla. Usa un nombre que no colisione con otros usuarios (en el servidor hay mucha gente):

nano /tmp/clave_bandit17.key

Terminal Kitty: como este nano corre dentro del servidor, si ves Error opening terminal: xterm-kitty ejecuta antes export TERM=xterm (o TERM=xterm nano /tmp/clave_bandit17.key).

Pega el bloque de la clave, guarda (Ctrl+O, Enter) y sal (Ctrl+X).

Alternativa si prefieres sin editor interactivo, puedes usar cat con redirección:

cat > /tmp/clave_bandit17.key << 'EOF'
-----BEGIN RSA PRIVATE KEY-----
... (cuerpo de la clave omitido por seguridad) ...
-----END RSA PRIVATE KEY-----
EOF

5. Aplicar permisos correctos a la clave

Este paso es obligatorio. SSH se niega a usar una clave privada que otros usuarios puedan leer:

chmod 600 /tmp/clave_bandit17.key

Verificar:

ls -la /tmp/clave_bandit17.key

Debes ver:

-rw------- 1 bandit16 bandit16 1679 Jun 14 12:34 /tmp/clave_bandit17.key

Los guiones ------ al final significan que grupo y otros no tienen ningún permiso. Eso es lo correcto.


6. Conectarse a bandit17 usando la clave

Bloqueo de localhost (igual que en 14-nivel-13-a-14): OverTheWire bloquea ssh ...@localhost:2220 desde dentro del servidor (Connecting from localhost is blocked to conserve resources). Usa el hostname real bandit.labs.overthewire.org:

  • Atajo (desde dentro): el mismo comando pero con el hostname real en vez de localhost. Si el firewall interno lo permite, entras directo.
  • Siempre funciona (desde tu portátil): cat /tmp/clave_bandit17.key, copia la clave ENTERA (de -----BEGIN a -----END), pégala en un archivo en tu máquina, chmod 600, y conéctate desde ahí.
ssh -i /tmp/clave_bandit17.key [email protected] -p 2220

Si todo está bien, entrarás como bandit17 directamente, sin que te pida contraseña.

Una vez dentro, puedes leer la contraseña de bandit17 para tenerla como respaldo (por si necesitas entrar desde fuera):

cat /etc/bandit_pass/bandit17

Salida:

<cadena_de_~32_caracteres>

Esa cadena es la contraseña de bandit17. Guárdala.


Por qué funciona

El flujo completo

bandit16 → nmap descubre puertos → openssl conecta al puerto SSL
       → envía contraseña → servidor devuelve clave RSA privada
       → guardamos clave → chmod 600 → ssh -i usa clave → bandit17

Por qué nmap -sV distingue SSL

nmap con -sV (Service Version detection) hace un “banner grab”: se conecta al puerto, intenta varios protocolos conocidos (HTTP, FTP, SSL/TLS…) y analiza la respuesta. Si el servidor hace el handshake TLS, nmap lo cataloga como ssl/<algo>. Sin -sV solo sabe si el puerto está abierto o cerrado, no qué habla.

Por qué openssl s_client en lugar de nc

nc (netcat) es una conexión TCP en texto plano. Los puertos SSL de este nivel cifran el canal: si te conectas con nc, verás basura binaria del handshake TLS. openssl s_client realiza el handshake TLS automáticamente y luego te deja interactuar con el canal ya descifrado.

Por qué chmod 600

SSH protege al usuario: si la clave privada puede ser leída por otros (permisos 644, 777, etc.), cualquiera en el sistema podría robarla e impersonarte. OpenSSH rechaza claves con permisos demasiado abiertos con el error Permissions 0644 for '...' are too open. 600 significa solo lectura+escritura para el propietario, ningún permiso para grupo ni otros.

Por qué /tmp y no el home

El directorio home de bandit16 puede tener restricciones. /tmp es universalmente escribible por cualquier usuario. Es el espacio de trabajo temporal estándar en estos ejercicios.


Errores comunes

”WARNING: UNPROTECTED PRIVATE KEY FILE!”

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/tmp/clave_bandit17.key' are too open.

Causa: olvidaste el chmod 600. Solución: chmod 600 /tmp/clave_bandit17.key y vuelve a intentar el ssh.


El servidor solo hace eco (no da clave RSA)

Escribes la contraseña y ves que el servidor te la devuelve tal cual. Estás en un puerto ssl/echo, no en el objetivo. Solución: sal (Ctrl+C) y prueba el otro puerto SSL que encontraste con nmap.


nmap no encuentra ningún puerto ssl

A veces -sV tarda mucho o el servidor está ocupado. Solución: prueba conectarte manualmente con openssl s_client -connect localhost:<puerto> a cada uno de los puertos abiertos que listó nmap sin -sV. El puerto SSL hace el handshake TLS; los demás mostrarán un error de protocolo o solo eco.


La clave pegada tiene espacios o saltos de línea de más

Si al pegar la clave en nano se introdujeron espacios extra o la línea -----BEGIN... quedó truncada, el archivo de clave estará corrupto. Síntoma: ssh da invalid format o no supported authentication methods available. Solución: borra el archivo (rm /tmp/clave_bandit17.key), crea uno nuevo y pega la clave con más cuidado, verificando que la primera y última línea sean exactamente -----BEGIN RSA PRIVATE KEY----- y -----END RSA PRIVATE KEY-----.


Host key verification failed al conectar al servidor

@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @

Puede pasar si el servidor regeneró sus claves. Solución temporal para este contexto de laboratorio:

ssh -i /tmp/clave_bandit17.key -o StrictHostKeyChecking=no [email protected] -p 2220

Pasar al siguiente nivel

Con la contraseña de bandit17 que leíste en /etc/bandit_pass/bandit17, conéctate desde tu máquina local:

ssh [email protected] -p 2220

Introduce cuando te pida:

<cadena_de_~32_caracteres>

(la cadena que obtuviste en el paso 6)


Conexiones

  • 00_README — índice y progresión completa de Bandit
  • MOC_Ciberseguridad — mapa de contenido de ciberseguridad en la bóveda
  • — escaneo de puertos en profundidad (si existe)
  • — qué es SSL/TLS, handshake, certificados (si existe)
  • — autenticación SSH con par de claves (si existe)