Scripting basico en bash 2
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)
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)
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 ~/* |
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:
Otra forma también muy utilizada es ponerlo entre comillas (“”) el nombre del archivo:
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.
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:
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)
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 |
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.
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 |
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:
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:
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 |
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 | remmina > /dev/null 2>&1 & |
¿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 | 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)
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 |
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.
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}' |
1 | awk "/millionth/" data.txt | awk '{print $2}' |
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 |
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 |
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 |
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 |
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 |
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 |
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
- Guía principal utilizada vídeo de s4vitaar