Bandit: nivel 13 → 14
Esta vez no hay contraseña, sino una clave privada SSH. Entendemos cómo funciona la autenticación por clave, por qué hay que darle permisos 600 y cómo entrar con ssh -i.
Hasta ahora, en cada nivel conseguíamos una contraseña para entrar en el siguiente. En este cambia el juego: lo que encontramos es una clave privada SSH, que nos permite entrar como bandit14 sin escribir ninguna contraseña. Es la forma de autenticación que se usa de verdad en servidores, así que merece la pena entender bien cómo funciona.
Las contraseñas aparecen como
[REDACTED], siguiendo las normas de OverTheWire. Por la misma razón, tampoco publicamos el contenido de la clave privada: con ella cualquiera podría entrar comobandit14.
Conexión al nivel 13
1
2
$ sshpass -p '[REDACTED]' ssh bandit13@bandit.labs.overthewire.org -p 2220
bandit13@bandit:~$ export TERM=xterm
El enunciado
Según el enunciado del nivel 14, la contraseña del siguiente nivel está en /etc/bandit_pass/bandit14 y solo la puede leer el usuario bandit14. Para este nivel no nos dan la contraseña de bandit14, sino una clave privada SSH con la que entrar como ese usuario.
1
2
bandit13@bandit:~$ ls
HINT sshkey.private
Esta vez hay dos ficheros. Empezamos por la pista:
1
2
3
4
5
6
7
8
9
10
11
bandit13@bandit:~$ cat HINT
If you have trouble with this level, note the following:
1) As for all other levels, this level has a website with information:
https://overthewire.org/wargames/bandit/bandit14.html
2) No, the level is not broken. To verify, see:
https://status.overthewire.org/
3) The current version of OverTheWire prevents logging in from one
level to another via localhost. Log out, and see 1)
4) If you get errors, read the error message on your screen.
We mean it!
El punto importante es el 3: no podemos usar la clave desde el propio servidor para saltar a bandit14 a través de localhost (así se resolvía este nivel en versiones antiguas de Bandit). Hay que salir del servidor y conectarse desde nuestra máquina usando la clave.
Claves SSH: cómo funcionan
La autenticación por clave se basa en una pareja de claves que van siempre juntas:
| Clave | Dónde está | Qué hace |
|---|---|---|
| Pública | En el servidor, en ~/.ssh/authorized_keys del usuario | Funciona como una cerradura: puede estar a la vista de todos |
| Privada | En tu poder (aquí, sshkey.private) | Es la llave: quien la tiene puede entrar, así que nunca se comparte |
Al conectarte, el servidor te plantea un reto que solo se puede resolver con la clave privada correspondiente a una de sus claves públicas autorizadas. La clave privada nunca viaja por la red: solo se usa para demostrar que la tienes. Si el reto sale bien, entras sin contraseña.
En Bandit, alguien ha dejado la clave privada de bandit14 en el home de bandit13, y eso es justo lo que vamos a aprovechar.
Traer la clave a nuestra máquina
Mostramos la clave con cat:
1
2
bandit13@bandit:~$ cat sshkey.private
[REDACTED: clave privada]
Copiamos todo el contenido, incluidas las líneas -----BEGIN ...----- y -----END ...-----, salimos del servidor y lo pegamos en un fichero sshkey.private en nuestra máquina.
Permisos 600: por qué son obligatorios
1
$ chmod 600 sshkey.private
Este paso no es opcional. SSH comprueba los permisos de la clave privada antes de usarla y, si otros usuarios del sistema pueden leerla, se niega a utilizarla: muestra un aviso de unprotected private key file indicando que los permisos son demasiado abiertos e ignora la clave. Tiene lógica: una clave privada que cualquiera puede leer ya no es privada.
El 600 es la notación octal de los permisos. Cada cifra corresponde a uno de los tres niveles que vimos en el nivel 6 → 7: dueño, grupo y otros. Y cada cifra es la suma de los permisos que concede:
| Permiso | Valor |
|---|---|
Lectura (r) | 4 |
Escritura (w) | 2 |
Ejecución (x) | 1 |
| Cifra | Para quién | Suma | Permisos |
|---|---|---|---|
6 | Dueño | 4 + 2 | lectura y escritura (rw-) |
0 | Grupo | 0 | ninguno (---) |
0 | Otros | 0 | ninguno (---) |
Es decir, 600 significa “solo yo puedo leer y modificar este fichero”. En un ls -l se vería como -rw-------.
Entrar como bandit14 con la clave
1
2
$ ssh -i sshkey.private bandit14@bandit.labs.overthewire.org -p 2220
bandit14@bandit:~$
La opción -i (identity file) le dice a ssh qué clave privada usar. Fíjate en que aquí ya no necesitamos sshpass: no hay contraseña que pasar, la clave hace todo el trabajo y entramos directamente.
Leer la contraseña de bandit14
Ahora que somos bandit14, podemos leer el fichero que nos indicaba el enunciado:
1
2
bandit14@bandit:~$ cat /etc/bandit_pass/bandit14
[REDACTED]
En /etc/bandit_pass/ está la contraseña de cada nivel, y cada fichero solo lo puede leer su usuario. Desde bandit13 no habríamos podido abrir este; como bandit14, sí. La guardamos, porque es la que usaremos para conectarnos a este nivel a partir de ahora y la que necesitaremos en el siguiente.
Otras formas
1. Traer la clave con scp
1
2
$ sshpass -p '[REDACTED]' scp -P 2220 bandit13@bandit.labs.overthewire.org:sshkey.private .
$ chmod 600 sshkey.private
Igual que con el hexdump del nivel anterior, scp evita los errores de copiar y pegar. Con las claves esto es especialmente importante: si al pegar se pierde un carácter o el salto de línea final, ssh dirá que la clave tiene un formato no válido y no podrás entrar. Recuerda: -P mayúscula para el puerto en scp.
2. Sacar la contraseña sin abrir una sesión interactiva
1
2
$ ssh -i sshkey.private bandit14@bandit.labs.overthewire.org -p 2220 cat /etc/bandit_pass/bandit14
[REDACTED]
Si después de la dirección escribes un comando, ssh no te abre una terminal: ejecuta ese comando en el servidor, te muestra su salida y cierra la conexión. Es muy útil para automatizar tareas en máquinas remotas.
3. Comprobar a qué clave pública corresponde
1
$ ssh-keygen -y -f sshkey.private
ssh-keygen -y calcula la clave pública a partir de la privada (al revés no se puede, y en eso se basa la seguridad del sistema). Es una forma rápida de comprobar que la clave se ha copiado bien: si el fichero está corrupto, este comando fallará antes de que lo intentes con ssh. Lo que te muestra es lo que habría en el authorized_keys del servidor.
Pasar al nivel siguiente
Ya estamos dentro como bandit14, y con su contraseña podemos conectarnos como siempre en las próximas sesiones:
1
$ sshpass -p '[REDACTED]' ssh bandit14@bandit.labs.overthewire.org -p 2220
Resumen
| Comando / concepto | Para qué sirve |
|---|---|
| Clave pública / privada | Pareja de claves: la pública en el servidor, la privada solo en tu poder |
ssh -i clave usuario@host | Conectarse usando una clave privada en lugar de contraseña |
chmod 600 fichero | Solo el dueño puede leer y escribir (obligatorio para claves privadas) |
| Permisos en octal | r = 4, w = 2, x = 1; una cifra para dueño, grupo y otros |
ssh ... comando | Ejecutar un comando remoto sin abrir sesión interactiva |
scp -P puerto origen destino | Copiar ficheros por SSH |
ssh-keygen -y -f clave | Obtener la clave pública a partir de la privada |
/etc/bandit_pass/banditN | Contraseña de cada nivel, legible solo por su usuario |