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
| Comando | Para qué sirve |
|---|---|
nmap -p <rango> <host> | Escanea un rango de puertos y muestra cuáles están abiertos |
nmap -sV | Ademá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.
nmapes 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_clientpermite 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 permisos600o 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 2220Introduce la contraseña de bandit16 cuando te la pidan.
2. Escanear el rango de puertos con nmap
nmap -p 31000-32000 localhostLo 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 localhostSalida 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.keyTerminal Kitty: como este
nanocorre dentro del servidor, si vesError opening terminal: xterm-kittyejecuta antesexport TERM=xterm(oTERM=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-----
EOF5. 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.keyVerificar:
ls -la /tmp/clave_bandit17.keyDebes 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 bloqueassh ...@localhost:2220desde dentro del servidor (Connecting from localhost is blocked to conserve resources). Usa el hostname realbandit.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-----BEGINa-----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 2220Si 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/bandit17Salida:
<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 2220Pasar 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 2220Introduce 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)