Bandit: nivel 10 → 11
La contraseña viene codificada en base64. Entendemos qué es base64 (y por qué no es cifrado), la decodificamos con base64 -d y nos quedamos con la última palabra usando awk y $NF.
En el nivel anterior la contraseña estaba escondida entre basura binaria. Ahora está a la vista, pero disfrazada: el fichero contiene la contraseña codificada en base64, una forma de representar datos que encontrarás constantemente en ciberseguridad (cabeceras HTTP, tokens, correos, payloads…). Saber reconocerla y decodificarla es de esas cosas que hay que tener automatizadas.
Las contraseñas aparecen como
[REDACTED], siguiendo las normas de OverTheWire. En este nivel también ocultamos la cadena en base64, porque cualquiera podría decodificarla y obtener la contraseña.
Conexión al nivel 10
1
2
$ sshpass -p '[REDACTED]' ssh bandit10@bandit.labs.overthewire.org -p 2220
bandit10@bandit:~$ export TERM=xterm
El enunciado
Según el enunciado del nivel 11, la contraseña está en el fichero data.txt, que contiene datos codificados en base64.
1
2
3
4
bandit10@bandit:~$ ls
data.txt
bandit10@bandit:~$ cat data.txt
[REDACTED: cadena en base64]
Al abrirlo vemos una única línea de letras, números y un par de signos = al final. Ese aspecto ya es una pista muy fuerte de que estamos ante base64.
¿Qué es base64?
Base64 es una codificación: una forma de representar cualquier dato (texto, imágenes, binarios) usando solo 64 caracteres “seguros” que pasan sin problemas por sistemas pensados para texto:
- las letras
A-Zya-z - los números
0-9 - los símbolos
+y/ - y
=como relleno (padding) al final
Funciona agrupando los datos de 3 en 3 bytes y representando cada grupo con 4 caracteres. Cuando al final no queda un grupo completo de 3 bytes, se rellena con =. Por eso tantas cadenas en base64 acaban en = o ==, y por eso son un poco más largas que el original (un 33 % más).
Un ejemplo con un texto inofensivo:
1
2
3
4
$ echo "hola" | base64
aG9sYQo=
$ echo "aG9sYQo=" | base64 -d
hola
Base64 no es cifrado. No hay clave ni secreto: cualquiera puede decodificarlo con un solo comando. Si alguna vez ves contraseñas “protegidas” con base64 en una aplicación o un fichero de configuración, en la práctica están en texto claro.
Decodificar la contraseña
Copiamos la cadena que nos ha mostrado cat y se la pasamos a base64 -d (decode) con echo y una tubería:
1
2
bandit10@bandit:~$ echo "[REDACTED: cadena en base64]" | base64 -d
The password is [REDACTED]
El resultado es una frase en inglés con la contraseña al final.
Quedarnos solo con la contraseña: $NF
Para sacar únicamente la contraseña, añadimos awk a la cadena:
1
2
bandit10@bandit:~$ echo "[REDACTED: cadena en base64]" | base64 -d | awk '{print $NF}'
[REDACTED]
En el nivel 7 → 8 usamos $2 para imprimir el segundo campo. Aquí usamos algo más flexible:
NF(Number of Fields) es una variable deawkque contiene cuántos campos tiene la línea actual. EnThe password is [REDACTED]hay 4 campos, así queNFvale 4.$NFes, por tanto,$4: el último campo, sea cual sea su posición.
La ventaja de $NF frente a escribir $4 a mano es que no tienes que contar las palabras: si la frase fuera más larga o más corta, seguiría devolviendo la última.
Otras formas
1. Decodificar el fichero directamente (sin copiar y pegar)
1
2
bandit10@bandit:~$ base64 -d data.txt
The password is [REDACTED]
base64 -d acepta el fichero como argumento, igual que grep o sort en niveles anteriores. Es la forma más limpia y además evita el principal riesgo de la solución con echo: equivocarte al copiar la cadena (un carácter de menos y la decodificación sale mal o falla). Siempre que el dato ya esté en un fichero, mejor trabajar sobre el fichero.
Con el filtro final quedaría así:
1
2
bandit10@bandit:~$ base64 -d data.txt | awk '{print $NF}'
[REDACTED]
2. Con cut y un delimitador
1
2
bandit10@bandit:~$ base64 -d data.txt | cut -d ' ' -f 4
[REDACTED]
En el nivel 7 → 8 vimos que cut usa el tabulador como separador por defecto. Con -d ' ' le decimos que separe por espacios, y con -f 4 que saque el cuarto campo. Funciona, pero aquí sí tienes que saber que la contraseña es la cuarta palabra: es justo la rigidez que $NF evita.
3. Un detalle curioso: el Cg== del final
La cadena de este nivel termina en Cg==. No es casualidad: Cg== es exactamente lo que produce base64 al codificar un salto de línea suelto. Puedes comprobarlo tú mismo:
1
2
$ printf '\n' | base64
Cg==
Eso significa que el texto original terminaba en un salto de línea, como cualquier línea creada con echo. Fíjate también en el ejemplo de antes: echo "hola" da aG9sYQo=, pero si quitas el salto de línea con printf 'hola' obtienes aG9sYQ==. Cambiar un solo byte cambia la salida.
Pasar al nivel siguiente
1
2
bandit10@bandit:~$ exit
$ sshpass -p '[REDACTED]' ssh bandit11@bandit.labs.overthewire.org -p 2220
Resumen
| Comando / concepto | Para qué sirve |
|---|---|
| Base64 | Codificación (no cifrado) que representa datos con 64 caracteres |
base64 | Codificar datos en base64 |
base64 -d fichero | Decodificar base64 directamente desde un fichero |
= / == al final | Relleno de base64: pista para reconocerlo |
awk '{print $NF}' | Imprimir el último campo de la línea |
NF | Número de campos de la línea actual en awk |
cut -d ' ' -f 4 | Sacar el cuarto campo separado por espacios |