Bandit: nivel 7 → 8
Un fichero enorme y una sola línea que nos interesa. Encadenamos grep y awk con tuberías para quedarnos solo con la contraseña junto a la palabra millionth.
En el nivel anterior teníamos que encontrar un fichero perdido en todo el servidor. Ahora sabemos exactamente en qué fichero está la contraseña, pero el problema es otro: ese fichero es enorme, y lo que buscamos es una sola línea entre miles. Es el momento de presentar a dos herramientas básicas para trabajar con texto en Linux: grep para filtrar líneas y awk para quedarnos con la parte de la línea que nos interesa.
Las contraseñas aparecen como
[REDACTED], siguiendo las normas de OverTheWire.
Conexión al nivel 7
1
2
$ sshpass -p '[REDACTED]' ssh bandit7@bandit.labs.overthewire.org -p 2220
bandit7@bandit:~$ export TERM=xterm
El enunciado
Según el enunciado del nivel 8, la contraseña está en el fichero data.txt, al lado de la palabra millionth.
1
2
bandit7@bandit:~$ ls
data.txt
Si probamos a abrirlo directamente con cat data.txt, la terminal se llena de líneas y más líneas: cada una tiene una palabra seguida de una cadena que parece una contraseña. Leerlo a ojo no es una opción. Necesitamos filtrar.
Para hacerte una idea del tamaño de un fichero antes de abrirlo,
wc -l data.txtte dice cuántas líneas tiene. Así evitas inundar la terminal.
Filtrar con grep
1
2
bandit7@bandit:~$ cat data.txt | grep "millionth"
millionth [REDACTED]
Aquí entran en juego dos piezas:
- La tubería
|conecta la salida estándar (stdout) del comando de la izquierda con la entrada estándar (stdin) del de la derecha.catvuelca el fichero entero, pero en lugar de ir a la pantalla, ese texto entra engrep. grep "millionth"lee línea a línea y solo deja pasar las que contienen el patrónmillionth. Todo lo demás se descarta.
Resultado: de todo el fichero, solo sobrevive la línea que buscamos, con la palabra y la contraseña.
Quedarnos solo con la contraseña con awk
La línea anterior ya nos da la contraseña, pero todavía lleva delante la palabra millionth. Para sacar solo la contraseña, añadimos un eslabón más a la cadena:
1
2
bandit7@bandit:~$ cat data.txt | grep "millionth" | awk '{print $2}'
[REDACTED]
awk es una herramienta (y en realidad un pequeño lenguaje) para procesar texto por columnas:
- Por defecto, divide cada línea en campos usando los espacios en blanco (espacios y tabuladores) como separador.
$1es el primer campo (la palabramillionth),$2el segundo (la contraseña), y$0sería la línea completa.{print $2}significa “para cada línea que te llegue, imprime el segundo campo”.
Fíjate en que el programa de
awkva entre comillas simples. Es importante: con comillas dobles, la shell intentaría sustituir$2por una variable propia (que estaría vacía) antes de queawkllegara a verlo, y el comando no haría lo que esperas.
Otras formas
1. Sin cat: grep puede leer el fichero directamente
1
2
bandit7@bandit:~$ grep "millionth" data.txt
millionth [REDACTED]
grep acepta el nombre del fichero como argumento, así que cat data.txt | sobra. Funciona igual, pero te ahorras un proceso. Tiene hasta nombre propio en el mundillo: useless use of cat (“uso inútil de cat”). Con cat no está mal, solo es redundante.
2. Solo con awk
1
2
bandit7@bandit:~$ awk '/millionth/ {print $2}' data.txt
[REDACTED]
awk también sabe filtrar: el patrón entre barras /millionth/ hace de grep, y el bloque {print $2} solo se ejecuta en las líneas que coinciden. Un único comando hace el trabajo de los tres.
3. Con cut y búsqueda por palabra completa
1
2
bandit7@bandit:~$ grep -w "millionth" data.txt | cut -f2
[REDACTED]
grep -wbusca la palabra completa: no coincidiría con algo comomillionthssi existiera en el fichero. Aquí no cambia el resultado, pero es buena costumbre cuando buscas una palabra concreta.cut -f2saca el segundo campo, pero solo si el separador es un tabulador, que es el que usacutpor defecto (a diferencia deawk, que acepta cualquier espacio en blanco). Puedes comprobar qué separador hay congrep millionth data.txt | cat -A: los tabuladores aparecen como^I.
Pasar al nivel siguiente
1
2
bandit7@bandit:~$ exit
$ sshpass -p '[REDACTED]' ssh bandit8@bandit.labs.overthewire.org -p 2220
Resumen
| Comando / concepto | Para qué sirve |
|---|---|
| Tubería (barra vertical) | Pasar la salida de un comando como entrada del siguiente |
grep patrón fichero | Mostrar solo las líneas que contienen el patrón |
grep -w | Buscar la palabra completa |
awk '{print $2}' | Imprimir el segundo campo de cada línea |
awk '/patrón/ {print $2}' | Filtrar e imprimir un campo en un solo paso |
cut -f2 | Sacar el segundo campo separado por tabuladores |
wc -l | Contar las líneas de un fichero |
| Comillas simples | Evitan que la shell interprete $2 antes que awk |