Introducción

Vamos a utilizar la página OverTheWire Bandit, aquí aprenderemos sobre el scripting en general y varias formas de realizar la misma acción.

Os recomiendo que intenteis hacerlo por vuestra cuenta (eso incluye buscar por internet también)
Bandit_level

Actualmente solo vamos a hacer los 10 primeros niveles, cabrá la posibilidad de extenderlo al resto de niveles en un futuro

Nivel 0

Para hacer los niveles nos tenemos que conectar por ssh:
Con el usuario bandit0, la contraseña bandit0, el host bandit.labs.overthewire.org y el puerto 2220

1
ssh -p 2220 bandit0@bandit.labs.overthewire.org

Le indicamos que es la primera vez que entramos poniendo “yes” y ponemos la contraseña.

Ya dentro si hacemos ls podemos ver un archivo readme si le hacemos un cat para ver la información podremos ver la contraseña del siguiente nivel (boJ9jbbUNNfktd78OOpsqOltutMc3MY1)
Bandit0

Cerramos sesión (exit)

Nivel 1

En la página web en el nivel 0 –> 1 nos indica que la contraseña esta en un archivo llamado “-“.

Para avanzar al siguiente nivel tenemos que iniciar por ssh con bandit1:

1
ssh -p 2220 bandit1@bandit.labs.overthewire.org

Y introducir la contraseña del nivel anterior.

Bien ahora nos encontramos con el archivo que se llama “-“, si intentamos hacerle un cat a este archivo se queda colgado ya que se interpreta como un parámetro de cat.

Para ello podemos hacer lo siguiente:

1
cat ~/*

Bandit1

Ya podemos ver la contraseña del siguiente nivel (CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9),
este comando lo que hace es mostrarme el contenido de todos los archivos que existan en esa ruta, os recuerdo que está ruta es /home/bandit1.

Nivel 2

Este nivel nos dice que hay un archivo que se llama “spaces in this filename”, la dificultad de este nivel es que no podemos hacerle un “cat spaces in this filename” porque se cree que son archivos diferentes.
Una forma de solucionar esto es tabulando en verde poner el nombre entero por ejemplo:
bandit2

Otra forma también muy utilizada es ponerlo entre comillas (“”) el nombre del archivo:
bandit2_2

Con estos dos se puede visualizar la contraseña (UmHadQclWmgdLOKQ3YNgjWxGoRMb5luK)

Nivel 3

Nos está indicando que hay un archivo oculto en el directorio inhere.
Nos desplazamos con “cd inhere dentro de la carpeta” y si hacemos un ls no podemos ver nada, para ver archivos ocultos podemos utilizar:

1
ls -a

Este comando sirve para hacer un listado de todos (all) los archivos.
bandit3
Y ya podremos ver el archivo que contiene la password (pIwrPrtPN36QITSp3EQaw936yaFoFgAB)

Nivel 4

Nos dice que la contraseña está en el único archivo humanamente legible.

¿Cómo sabemos de todos esos archivos en cuál esta la contraseña?
¿Lo vamos mirando uno a uno?

Vamos a utilizar el comando file, este comando es muy bueno para saber con que tipo de archivo estamos tratando, ya sea un gif, png, jpg etc…

1
file inhere/*

Podemos ver el tipo de todos los archivos:
bandit4

A la vista nos puede destacar uno el file07 nos indica que está en ASCII vamos a echarle un vistazo.

Para echarle un vistazo podemos utilizar find y xargs.

1
find . -name -file07 | xargs cat

Find es un comando para buscar archivos en un directorio, con el . le indicamos que sea en el actual, con el parámetro -name le estamos indicando el nombre del archivo que en mi caso es “file07”

Xargs es un comando que se utiliza principalmente para trabajar de forma paralela y sirve para mostrar el output del primer parámetro. Por ejemplo no podriamos poner “find . -name .file07 | cat” pero con xargs si funcionaría (no solo funciona con cat)

bandit4_2

Ya se puede apreciar la contraseña del siguiente nivel (koReBOKuIDDepwhWk7jZC0RTdopnAYKh)

Nivel 5

Nos indica que el archivo está dentro del directorio inhere, en algún directorio y que cumple las siguiente propiedades:

  • Humanamente legible
  • 1033 bytes de tamaño
  • No es ejecutable

Después de ver tantos directorios y tantos archivos parece imposible, pero con este comando lo podemos averiguar:

Dentro de inhere

1
file ???????????/* | grep ASCII | find -size 1033c

bandit5

Explicación

file ???????????/* Ya vimos anteriormente lo que hacía file, pero os preguntaréis que significan todas esas interrogaciones, las interrogaciones etán representando un caracter y como he visto todos los directorios tienen el mismo número de caracteres (11), pues con esto estamos sacando el tipo de archivo de el contenido de todos los ficheros

grep ASCII A nosotros solo nos interesa los archivos ASCII, asi que con grep filtramos para que solo nos muestre la línea que contenga ASCII.

find -size 1033c Find tiene un parámetro para buscar archivos de un tamaño, la c son bytes, sus opciones más utilizadas son las siguientes:

  • c: bytes
  • k: kilobytes
  • m: megabytes
  • g: gigabytes

Si juntamos todo sería así:
Muestrame los archivos que sean ASCII con un tamaño de 1033 bytes.

Y si le añadimos un xargs al final nos muestra el contenido:

1
file ???????????/* | grep ASCII | find -size 1033c | xargs cat

Podemos ver la contraseña del siguiente nivel (DXjZPULLxYr17uwoI01bNLQbtFemEgo7), aunque tarda un rato el comando y nos desconfigura el lugar del prompt, pero con un simple Ctrl + l para limpiar pantalla se nos vuelve a poner normal.

bandit5_2

Nivel 6

Nos dice que el archivo está guardado en algún sitio y tiene las siguientes propiedades:

  • El propietario es bandit7
  • El grupo propietario es bandit6
  • Ocupa 33 bytes

Tenemos las propiedades pero no tenenemos de idea de donde está así que vamos a construir el siguiente comando:

1
find / -type f -user bandit7 -group bandit6 -size 33c

bandit6

Os preguntaréis que hacemos con eso que hay no se puede sacar nada en claro, bien para ello vamos a hacer que no se muestren los errores por consola para ello vamos a utilizar 2>/dev/null

1
find / -type f -user bandit7 -group bandit6 -size 33c 2>/dev/null

Explicación

Estamos buscando en la raíz porque no tenemos ni idea de donde está (/).

-type f Estamos buscando un fichero
-user bandit7 Archivo que tenga de propietario bandit7
-group bandit6 Archivo que pertenezca al grupo bandit6
-size 33c Ya lo vimos anteriormente y es para buscar archivos de 33 bytes.

2 El 2 se llama stderr y es el encargado de controlar los errores. Con el “>” los estamos dirigiendo.

/dev/null Es una ruta en nuestro equipo linux que se utiliza como agujero negro, lo que movéis hay se borra.

No hacer!! Si por ejemplo ponéis:

1
mv /* /dev/null

Estas enviando la raíz de tu equipo al infierno, os cargaríais el equipo.

Datos extras:
Stdin Son los datos enviados al programa (Input) normalmente escritos por teclado, se utiliza una o.
Stdout Es la salida del comando exitosa(Output), para este se utiliza el 1.

Ej:
bandit6_2

Convertir stder a stdin

Ejemplo:

1
cat /etc/passwd 2>&1

Esto es muy útil en las webshells cuando no vemos un error, podemos utilizar esto.

También se utiliza para lanzar aplicaciones, muchas veces en consola hace un montón de ruido innecesario que se puede omitir:

bandit6_4

Esto que vemos es stdin (no son errores), así que para evitar esto podemos reedirigir el flujo del programa.

1
remmina > /dev/null 2>&1

bandit6_5

Este comando lo que hace es reedirigir al /dev/null y si hay errores para que no se muestren por consola el stder se convierte en stdin (2>&1).

Para que no se muestre el stdin ni el stder.

Una vez realizado esto podemos ponerlo en segundo plano (&), así podremos utilizar la consola, pero si os daís cuenta si cierramos la consola el programa se cerrará, para que no pase esto podemos utilizar disown, esto se utiliza para desenganchar el proceso asociado en segundo plano.

1
2
remmina > /dev/null 2>&1 &
disown

¿Qué esta haciendo el comando?

Estamos redirigiendo los errores (stder) y los no errrores (stdin) al /dev/null (agujero negro), lo estamos poniendo en segundo plano (&) y para desenganchar el proceso en segundo plano utilizamos disown.

El comando a ejecutar sería el siguiente:

1
2
find / -type f -user bandit7 -group bandit6 -size 33c 2>/dev/null | xargs cat

Nos mostraría la contraseña del siguiente nivel por pantalla (HKBPTKQnIay4Fw76bEy8PVxKEDQRKTzs)
bandit6_3

Nivel 7

La contraseña esta guardada en el archivo data.txt después de la palabra millionth

Varias formas de hacerlo

Ej forma incorrecta

Si le hacéis un cat al archivo podréis ver que esta lleno de contenido, si le haceis un cat data.txt | wc -l podréis ver las líneas que tiene el archivo. Una forma muy fácil de obtener la contraseña es así:

1
cat data.txt | grep millionth

bandit7

Ej forma correcta

Pero la forma de arriba no es la forma óptima de hacerlo, lo suyo es hacer un grep de un criterio (la palabra indicada “millionth”) a un archivo:

1
grep millionth data.txt

Cómo podéis apreciar tarda incluso menos en mostrarnos la contraseña.
bandit7_2

AWK

Con el comando awk aparte de filtrar, podemos grepear.
AWK tarda un poco más que grep, pero no se nota porque son microsegundos. AWK es más potente que grep.
Ejs:

1
cat data.txt | awk "/millionth/"
1
awk "/millionth/" data.txt

AWK nos permite filtrar por argumentos:

1
awk "/millionth/" data.txt | awk '{print $1}'

bandit7_3

1
awk "/millionth/" data.txt | awk '{print $2}'

bandit7_4

Quiero que me muestre el último elemento:

1
awk "/millionth/" data.txt | awk 'NF{print $NF}'

También podemos revertir la cadena:

1
awk "/millionth/" data.txt | rev

bandit7_5

Como podéis ver está todo al revés

Para ponerla bien otra vez aplicariamos otro rev

Si tenemos curiosidad y queremos saber en que línea se situa la palabra millionth podemos hacer:

1
grep "millionth" data.txt -n 

bandit7_6
Cómo se puede ver en la imagen está en la lína 37.262

Ahora si queremos ver lo que hay en esa línea sería así:

1
awk 'NR==37262' data.txt

bandit7_7

Como se puede ver hay multiples maneras de hacer este ejercicio más las que me deje, para llevarnos siempre al mismo resultado la contraseña del siguiente nivel (cvX2JJa4CFALtqS87jk27qwqGhBM9plV)

Nivel 8

Tenemos que la única línea que no esta repetida en el archivo data.txt

Resolución

Para ello vamos a hacer un ordenamiento alfabético (cat data.txt | sort ) podremos ver las repeticiones que existen, para mostrar las líneas únicas se utiliza el comando uniq -u, pero tiene que estar ordenado si no uniq no funciona

1
cat data.txt | sort | uniq -u

bandit8

Explicación / Pseudocódigo

Estamos viendo por pantalla el contenido de data.txt (cat), estamos ordenando alfabéticamente el contenido y solo queremos ver las líneas únicas y así nos muestra la clave del siguiente nivel(UsvVyFSfZZWbi6wgC7dAFyFuR6jQQUhR)

Nivel 9

En este nivel tendremos un archivo ilegible humanamente (data.txt) y tendremos que encontrar la clave para el siguiente nivel en dicho archivo

Con el comando strings podemos ver el contenido legible de dicho archivo

1
strings data.txt

Ya podemos ver algunas posibles contraseñas, pero vamos a organizarlo mejor

1
strings data.txt | grep "==" | tail -n 1

Bandit9

Explicación /Pseudocódigo

Estamos buscando los carácteres legibles (strings), filtrando por los == (grep) y como hemos visto estaba la contraseña entre las dadas, ahora vamos a indicar que nos coja la última línea del resultado (tail -n 1) y podremos ver la contraseña del siguiente nivel(truKLdjsbJ5g7yyJ2X2R0o3a5HQJFuLk)

Nivel 10

La contraseña está en el archivo data.txt que está en base64 (codificado)

Bien si habeís abierto el archivo veréis el contenido codificado y para ello tenemos que decodificarlo, ¿Cómo hacemos eso? Muy fácil, tenemos el comando base64 para codificar y decodificar

Para codificar sería así:

1
echo 'hola esto va a estar codificado' | base64

Pero nosotros lo queremos decodificar así que sería de la siguiente forma:

1
echo 'VGhlIHBhc3N3b3JkIGlzIElGdWt3S0dzRlc4TU9xM0lSRnFyeEUxaHhUTkViVVBSCg==' | base64 --decode

bandit10

Ya podríamos ver la clave del siguiente nivel (IFukwKGsFW8MOq3IRFqrxE1hxTNEbUPR)

Explicación/Pseudocódigo

Estamos mostrando por pantalla la cadena codificada, pero con base64 –decode la estamos decodificando para poder leerla claramente

Recursos