De todos los comandos nuevos que me fueron cayendo en los primeros niveles de Bandit, file fue de los que más me costó encontrar por mi cuenta — casi todos los comandos de esos primeros días eran nuevos para mí, y este nivel en concreto necesitó que me echaran una mano y me lo explicaran antes de dar con la tecla.
El problema del nivel 4
El objetivo es sencillo de enunciar y menos de resolver: dentro de un directorio llamado inhere hay varios archivos con nombres parecidos (-file00, -file01, -file02…), y solo uno de ellos es legible por humanos — el resto son datos binarios o basura pensada para despistar. Hay que encontrar cuál es el bueno y leer su contenido.
bandit4@bandit:~/inhere$ ls
-file00 -file01 -file02 -file03 -file04 -file05 -file06 -file07 -file08 -file09
Lo primero que probé, como haría cualquiera que viene de los niveles anteriores, fue simplemente cat cada archivo uno a uno. Con dos o tres archivos es viable; con diez, es lento e ineficiente — y además, con varios de ellos, cat escupe una mezcla de caracteres ilegibles en la terminal que no aporta nada.
Por qué “abrir todos y mirar” no es la forma de resolverlo
Aquí está la primera lección real del nivel, más allá del comando en sí: cuando algo se puede automatizar con la herramienta correcta, hacerlo a mano no es “más seguro”, es simplemente peor. Fuerza bruta visual (abrir archivo por archivo) funciona con 10 archivos; con 1.000, ya no. La pregunta correcta no es “¿cómo miro cada uno?”, es “¿qué herramienta me dice de antemano cuál merece la pena mirar?”
El comando file: no lee el contenido, identifica el tipo
Ahí es donde entra file, un comando que no conocía antes de este nivel. No abre el archivo para que lo leas tú — analiza la estructura interna del archivo y te dice qué tipo de dato es, sin necesidad de que tú lo interpretes:
bandit4@bandit:~/inhere$ file ./-file07
./-file07: ASCII text
Frente a, por ejemplo:
bandit4@bandit:~/inhere$ file ./-file02
./-file02: data
La diferencia es clara en la propia salida: “ASCII text” significa que el archivo contiene texto legible; “data” significa datos binarios sin una estructura de texto reconocible — justo lo que Bandit está usando para camuflar el archivo bueno entre el resto.
Aplicarlo a todos los archivos de golpe
En vez de repetir file diez veces a mano, se puede aplicar a todos los archivos del directorio de una sola vez usando el comodín *:
bandit4@bandit:~/inhere$ file ./*
./-file00: data
./-file01: data
./-file02: data
./-file03: data
./-file04: data
./-file05: data
./-file06: data
./-file07: ASCII text
./-file08: data
./-file09: data
Con una sola línea, file etiqueta los diez archivos, y el que dice “ASCII text” salta a la vista entre los que dicen “data”. A partir de ahí, ya sabes exactamente cuál leer con cat — y, como los nombres empiezan por guion (el mismo problema que ya vimos en el nivel anterior), hace falta ./ delante para que no se interprete como una opción del comando.
bandit4@bandit:~/inhere$ cat ./-file07
Qué tipos de archivo reconoce file, más allá de “texto vs datos”
El nivel solo necesita distinguir texto de binario, pero file identifica muchos más tipos, y merece la pena saber que existen porque los vas a encontrar en niveles posteriores y fuera de Bandit:
Salida de file | Qué significa |
|---|---|
ASCII text | Texto plano legible |
data | Binario sin estructura reconocible por file |
gzip compressed data | Archivo comprimido con gzip |
bzip2 compressed data | Archivo comprimido con bzip2 |
POSIX tar archive | Archivo empaquetado con tar |
ELF 64-bit executable | Programa ejecutable de Linux |
Este último dato es importante para más adelante: file no adivina por la extensión del nombre (.txt, .zip…) — analiza los primeros bytes del archivo, su “firma” real. Por eso funciona incluso con los nombres raros de este nivel, que no llevan ninguna extensión que dé pistas.
Cuando hay muchos más archivos: combinarlo con grep
Diez archivos se pueden leer a simple vista en la salida de file ./*, pero ¿qué pasa si hubiera cien? Ahí ya no basta con mirar la lista — hace falta filtrarla. La combinación natural es pasar la salida de file a grep, buscando literalmente la palabra que indica texto legible:
bandit4@bandit:~/inhere$ file ./* | grep "ASCII text"
./-file07: ASCII text
El símbolo | (pipe) coge la salida completa de file ./* y la usa como entrada de grep, que se queda solo con las líneas que contienen “ASCII text”, descartando todo lo demás. Con cien archivos, el resultado es exactamente igual de directo que con diez — la única línea que aparece es la que necesitas. Esta combinación de “un comando genera datos, otro los filtra” es un patrón que se repite constantemente en la línea de comandos de Linux, y que vuelve a aparecer, con otras herramientas, en el resto de la serie de Bandit.
Pon a prueba lo que has entendido
Tienes 10 archivos sin extensión y necesitas encontrar el único que es texto legible. ¿Por qué es mejor usar `file ./*` que abrir cada uno con `cat`?
Resumen rápido
file identifica el tipo real de un archivo analizando su contenido, no su nombre ni su extensión — distingue texto legible (“ASCII text”) de datos binarios (“data”) y de muchos otros formatos (comprimidos, ejecutables). Aplicado con ./* a todos los archivos de un directorio de golpe, convierte un problema de “abrir uno a uno a ver qué encuentro” en una respuesta inmediata. El siguiente obstáculo de la serie ya no busca por nombre ni por tipo de contenido, sino por características combinadas de tamaño y permisos — lo ves en Bandit nivel 5 a 6: cómo combinar tamaño y permisos en un solo find.