Bandit Nivel 12 a 13

Nivel del wargame Bandit (OverTheWire) — juego legal y educativo para practicar terminal Linux. Pagina oficial: https://overthewire.org/wargames/bandit/bandit13.html

Este es el nivel mas largo y elaborado de Bandit hasta ahora. No hay un truco unico: hay que combinar varios comandos y repetir un proceso hasta llegar a la password. Es normal sentirse perdido al principio — al final del nivel entenderas por que.


Objetivo

Conectarte como bandit12 y extraer la password de data.txt, que es un hexdump de un archivo que ha sido comprimido varias veces seguidas (capas sobre capas). Cada vez que descomprimes, aparece otro archivo comprimido de distinto tipo, hasta llegar a un archivo de texto plano con la password.


Que aprendes

Comandos principales

ComandoPara que sirve
mktemp -dCrea un directorio temporal unico en /tmp/
cpCopia un archivo
xxdConvierte datos binarios a hexdump y viceversa
xxd -rRevierte un hexdump: texto hexadecimal → binario original
file <archivo>Detecta el tipo real de un archivo (no se fia de la extension)
mvRenombra o mueve un archivo
gzip -dDescomprime archivos .gz
bzip2 -dDescomprime archivos .bz2
tar xfExtrae archivos .tar (empaquetado, no compresion)

Conceptos clave

Hexdump: representacion textual de datos binarios. Cada byte del archivo original se escribe como dos digitos hexadecimales (00–FF). xxd hace esta conversion y xxd -r la invierte.

Compresion en capas: un archivo puede comprimirse varias veces con algoritmos distintos. Para recuperar el contenido original hay que descomprimir cada capa en orden inverso.

file vs extension: en Linux, la extension de un archivo (.txt, .gz…) es solo cosmética. El comando file lee los primeros bytes del archivo (la “firma magica” o magic bytes) para saber que tipo de datos contiene realmente. Es la herramienta fiable.

Directorio de trabajo en /tmp/: en los niveles de Bandit no tienes permisos de escritura en tu home ni en /. El directorio /tmp/ existe para archivos temporales y cualquier usuario puede escribir ahi.


Paso a paso

1. Conectarte como bandit12

ssh [email protected] -p 2220

Introduce la password de bandit12 (la que obtuviste en el nivel anterior).

2. Ver el archivo de partida

ls
cat data.txt | head -5

Lo que veras:

0000000: 1f8b 0808 dfcd eb66 0203 6461 7461 322e  .......f..data2.
0000010: 6269 6e00 013d 02c2 fd42 5a68 3931 4159  bin..=...BZh91AY
0000020: 2653 59ca 83b2 c100 0017 7fff dff3 f4a7  &SY.............
0000030: fc9f fefe f2f3 cffe f5ff ffdd bf7e 5bfe  .............~[.
0000040: fadf e8ed df7f f9fb bfff 6de5 b3f6 ec7e  ..........m....~

Esto es el hexdump: columna izquierda = posicion, columna central = bytes en hexadecimal, columna derecha = representacion ASCII (los puntos son bytes no imprimibles). No es el contenido util; es la codificacion del archivo binario original.

3. Crear un directorio de trabajo en /tmp/

No puedes escribir en tu home. Crea un directorio temporal propio:

TMPDIR=$(mktemp -d)
echo $TMPDIR

Lo que veras (el nombre exacto sera diferente cada vez):

/tmp/tmp.aB3xKq7mNp

mktemp -d garantiza que el nombre no colisiona con nada existente.

4. Copiar data.txt al directorio de trabajo

cp ~/data.txt $TMPDIR/
cd $TMPDIR
ls

Lo que veras:

data.txt

5. Revertir el hexdump

Convierte el hexdump de vuelta a los bytes binarios originales:

xxd -r data.txt > data

No veras nada en pantalla (es binario). Comprueba que el archivo se creo:

ls -lh

Lo que veras:

total 8.0K
-rw-r--r-- 1 bandit12 bandit12 2.5K Jun 14 10:00 data
-rw-r--r-- 1 bandit12 bandit12 2.5K Jun 14 10:00 data.txt

6. El bucle: identificar → renombrar → descomprimir → repetir

A partir de aqui repites siempre la misma secuencia de tres pasos hasta llegar al texto plano. El numero exacto de capas puede variar ligeramente entre ejecuciones del servidor, pero el proceso es identico.

Paso del bucle: identificar con file

file data

Ejemplo de salida posible:

data: gzip compressed data, was "data2.bin", last modified: ...

Segun lo que diga file, actuas distinto:


Caso A: gzip (gzip compressed data)

Renombra el archivo con extension .gz y descomprime:

mv data data.gz
gzip -d data.gz
ls

Lo que veras:

data2.bin

(El nombre puede variar. Renombralo a data para continuar el bucle limpiamente si prefieres, o usa el nombre que aparezca.)

mv data2.bin data
file data

Caso B: bzip2 (bzip2 compressed data)

Renombra con extension .bz2 y descomprime:

mv data data.bz2
bzip2 -d data.bz2
ls

El archivo resultante aparecera sin extension o con otro nombre. Renombralo a data:

# ajusta el nombre al que aparezca en 'ls'
mv data2 data
file data

Caso C: tar (POSIX tar archive o tar archive)

tar no comprime, empaqueta. Extrae su contenido:

mv data data.tar
tar xf data.tar
ls

Apareceran uno o mas archivos. Identifica cual es el de datos (normalmente data5.bin, data6.bin, etc.) y renombralo:

mv data5.bin data    # ajusta el nombre al que aparezca
file data

Ejemplo de secuencia completa realista

A continuacion se muestra una sesion de ejemplo con los tipos que suelen aparecer (los nombres exactos los decide el servidor):

# Iteracion 1
file data
# data: gzip compressed data, was "data2.bin"
mv data data.gz && gzip -d data.gz
mv data2.bin data
 
# Iteracion 2
file data
# data: bzip2 compressed data, block size = 9k
mv data data.bz2 && bzip2 -d data.bz2
mv data2 data
 
# Iteracion 3
file data
# data: gzip compressed data, was "data4.bin"
mv data data.gz && gzip -d data.gz
mv data4.bin data
 
# Iteracion 4
file data
# data: POSIX tar archive (GNU)
mv data data.tar && tar xf data.tar
mv data5.bin data
 
# Iteracion 5
file data
# data: POSIX tar archive (GNU)
mv data data.tar && tar xf data.tar
mv data6.bin data
 
# Iteracion 6
file data
# data: bzip2 compressed data, block size = 9k
mv data data.bz2 && bzip2 -d data.bz2
mv data6 data
 
# Iteracion 7
file data
# data: POSIX tar archive (GNU)
mv data data.tar && tar xf data.tar
mv data8.bin data
 
# Iteracion 8
file data
# data: gzip compressed data, was "data9.bin"
mv data data.gz && gzip -d data.gz
mv data9.bin data
 
# Iteracion 9
file data
# data: ASCII text
cat data

7. Leer la password

Cuando file data diga ASCII text, el proceso termino:

cat data

Lo que veras:

The password is <cadena_de_~32_caracteres>

Esa cadena es la password de bandit13. Copiala.


Por que funciona

xxd -r lee el formato que produce xxd (offset + hex + ascii) y reconstruye el binario original byte a byte. Es el inverso exacto de xxd.

file lee los primeros bytes de cada archivo buscando firmas magicas: patrones de bytes que identifican el formato. Por ejemplo, un archivo gzip siempre empieza por 1f 8b; un archivo bzip2 por 42 5a 68 (que en ASCII es BZh). Esto es independiente del nombre o extension del archivo.

Por que renombrar antes de descomprimir: gzip -d y bzip2 -d exigen que el archivo tenga la extension correcta (.gz, .bz2) para trabajar con el. tar es mas flexible pero renombrar ayuda a no perderse.

Por que /tmp/: el enorno Bandit restringe permisos. /tmp/ es el espacio pensado para archivos temporales de sesion, con permisos de escritura para todos los usuarios.


Errores comunes

gzip: data: unknown suffix -- ignored Olvidaste renombrar el archivo antes de descomprimir. Anadir la extension correcta es obligatorio para gzip y bzip2.

bzip2: Can't guess original name for data.bz2 -- using data.bz2.out Esto es solo un aviso; el archivo de salida se llamara data.bz2.out. Renombralo a data y sigue.

tar: Refusing to create empty archive Estas intentando crear un tar en vez de extraer. Usa tar xf (x = extract, f = file), no tar cf.

Permission denied al escribir en ~/ Estas intentando crear archivos fuera de /tmp/. Vuelve a tu directorio temporal: cd $TMPDIR.

Me pierdo con los nombres de archivo Usa ls despues de cada paso para ver exactamente que archivos existen. Renombra siempre el resultado a data antes de la siguiente iteracion: asi el bucle es uniforme y no te confundes.

file data sigue diciendo el mismo tipo Probablemente el archivo no se descomprimio bien (error silencioso). Revisa si hay un archivo .out o .bz2.out que no viste.


Pasar al siguiente nivel

Con la password obtenida en cat data, conéctate como bandit13:

ssh [email protected] -p 2220

Cuando pregunte la password, pega la cadena de ~32 caracteres que copiaste.


Conexiones

Conceptos relacionados para profundizar

  • Firmas magicas de archivos (magic bytes): cada formato binario tiene bytes de identificacion al inicio.
  • Algoritmos de compresion: gzip usa DEFLATE; bzip2 usa Burrows-Wheeler + Huffman; tar no comprime, solo empaqueta.
  • El directorio /tmp/ y permisos en sistemas multiusuario.