Entrada

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.

Bandit: nivel 13 → 14

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 como bandit14.

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:

ClaveDónde estáQué hace
PúblicaEn el servidor, en ~/.ssh/authorized_keys del usuarioFunciona como una cerradura: puede estar a la vista de todos
PrivadaEn 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:

PermisoValor
Lectura (r)4
Escritura (w)2
Ejecución (x)1
CifraPara quiénSumaPermisos
6Dueño4 + 2lectura y escritura (rw-)
0Grupo0ninguno (---)
0Otros0ninguno (---)

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 / conceptoPara qué sirve
Clave pública / privadaPareja de claves: la pública en el servidor, la privada solo en tu poder
ssh -i clave usuario@hostConectarse usando una clave privada en lugar de contraseña
chmod 600 ficheroSolo el dueño puede leer y escribir (obligatorio para claves privadas)
Permisos en octalr = 4, w = 2, x = 1; una cifra para dueño, grupo y otros
ssh ... comandoEjecutar un comando remoto sin abrir sesión interactiva
scp -P puerto origen destinoCopiar ficheros por SSH
ssh-keygen -y -f claveObtener la clave pública a partir de la privada
/etc/bandit_pass/banditNContraseña de cada nivel, legible solo por su usuario
Esta entrada está licenciada bajo CC BY 4.0 por el autor.