Entrada

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.

Bandit: nivel 10 → 11

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-Z y a-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 de awk que contiene cuántos campos tiene la línea actual. En The password is [REDACTED] hay 4 campos, así que NF vale 4.
  • $NF es, 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 / conceptoPara qué sirve
Base64Codificación (no cifrado) que representa datos con 64 caracteres
base64Codificar datos en base64
base64 -d ficheroDecodificar base64 directamente desde un fichero
= / == al finalRelleno de base64: pista para reconocerlo
awk '{print $NF}'Imprimir el último campo de la línea
NFNúmero de campos de la línea actual en awk
cut -d ' ' -f 4Sacar el cuarto campo separado por espacios
Esta entrada está licenciada bajo CC BY 4.0 por el autor.