SECURITY WEB CHALLENGE 22/01/13 SECTRACK http://www.sec-track.com/ Solucionario por: @nonroot
Introducción: Security Web Hacking Challenge es un corto pero entretenido reto de seguridad en aplicaciones Web, que nos desafía a vulnerar un sistema hecho a la medida para el almacenamiento de imágenes. El objetivo del reto es analizar en detalle el sistema de hosting de imágenes, enumerar características y funcionalidades del mismo y por supuesto identificar vulnerabilidades que nos permitan leer archivos ocultos en el sistema. No quiere decir esto, que la vulnerabilidad se trate de un LFI o Source Disclosure (aunque pueden existir) sino que una vez logremos identificar la vulnerabilidad (que pueden ser varias) y explotarla debemos escalar privilegios (o simplemente interactuar con los existentes) para leer información confidencial almacenada en el servidor objetivo. La información precisa a identificar es un mensaje oculto entre dos personas. Precisamente la información sobre una cita entre ambas. http://www.sec-track.com/
Solución: La solución se va escribiendo en el mismo orden en que se van encontrando las cosas, puede parecer que la ruta era obvia y me desvío en otros asuntos, pero así funcionaba la mente en ese momento. La solución del reto me tomó 3 horas aproximadamente porque estuve pensando en posibles rutas que no me llevaron a ningún lado. A. Lo primero como siempre es descargar la maquina del juego, chequear su integridad y buscar pistas en la descripción del reto que se publicó en el sitio web. Link: http://www.sec-track.com/security-challenge-ctf-web-premio-libro-ethical-hacking-2-0 SecTracker>md5sum Web_Sec_Challenge_Img.rar 328ddbf34e00d662ea4c89672dac29d3 Web_Sec_Challenge_Img.rar (OK) SecTracker> Pistas: -Una maquina linux (boot) -Servicio web corriendo en el puerto 8880 posiblemente (imagen del post introductorio) -Uso de MySQL (boot de la maquina) -Nombre de la maquina drunkadm (boot)
B. Hay que encontrar la maquina corriendo en la red local, un barrido de ping NO muestra maquinas activas en la red, es posible que la VM este filtrando. SecTracker>fping -g 192.168.0.0/24 192.168.0.25 is alive ICMP Port Unreachable from 192.168.0.152 for ICMP Echo sent to 192.168.0.152 192.168.0.159 is alive 192.168.0.160 is alive ICMP Port Unreachable from 192.168.0.152 for ICMP Echo sent to 192.168.0.152 192.168.0.1 is unreachable 192.168.0.2 is unreachable … Si se observan los 3 tipos de respuesta con la utilidad fping, se pueden tener las maquinas que posibles. “Is alive” la maquina esta activa y acepta los pings. “is unreachable” la maquina no esta disponible “ICMP port Unreachable” la maquina esta en otro estado (filtrada?), esta es nuestra candidata. En mi caso la maquina mas sospechosa es 192.168.0.152. Veamos si tiene el puerto web (8880) abierto: SecTracker>nmap -sS 192.168.0.152 -p 8880 Starting Nmap 5.61TEST4 ( http://nmap.org ) at 2013-01-22 13:15 EST Nmap scan report for 192.168.0.152 Host is up (0.00067s latency). PORT STATE SERVICE 8880/tcp open cddbp-alt MAC Address: 00:0C:29:26:4B:A8 (VMware) Nmap done: 1 IP address (1 host up) scanned in 11.36 seconds SecTracker> C. Entramos al sitio web y leemos el código fuente en busca de scripts php.
Observamos varios scripts php desde el source: info.php, index.php, upload.php, myphp.php Empezamos a evaluarlos de forma básica: •
index.php carga el sitio normal
El sitio permite subir imágenes que son desplegadas inmediatamente, las imágenes son almacenadas en el directorio /images/ sobre la raíz del sistema, mas adelante volvemos a esto. •
upload.php requiere el envío de parámetros por POST
•
myphp.php requiere envío de datos
http://192.168.0.152:8880/myphp.php?id=101 Obtenemos información del sistema, al correrle SQLMap contra este script nos dice que id no es
una variable inyectable. 21:25:18] [WARNING] GET parameter 'id' is not injectable
Al cambiar valores del id, obtenemos diferentes respuestas, busquemos algunas mas: SecTracker>for i in {1..10000}; do wget http://192.168.0.152:8880/myphp.php?id=$i ; done
Obtenemos un resultado así: SecTracker>ls -l ... -rw-r--r-1 root -rw-r--r-1 root -rw-r--r-1 root -rw-r--r-1 root -rw-r--r-1 root -rw-r--r-1 root … SecTracker>
staff staff staff staff staff staff
70 Jan 21 21:51 myphp.php?id=1671 70 Jan 21 21:51 myphp.php?id=1672 70 Jan 21 21:51 myphp.php?id=1673 70 Jan 21 21:51 myphp.php?id=1674 70 Jan 21 21:51 myphp.php?id=1675 70 Jan 21 21:51 myphp.php?id=1676
Las respuestas con 70 bytes son las del mensaje de error, busquemos respuestas diferentes: SecTracker>ls -la | grep -v "70 Jan" total 10976 drwxr-xr-x 1346 root staff 45764 Jan 21 21:47 . -rw-r--r-- 1 root staff 4598 Jan 21 21:47 myphp.php?id=101 -rw-r--r-- 1 root staff 1326 Jan 21 21:47 myphp.php?id=102 -rw-r--r-- 1 root staff 11012 Jan 21 21:47 myphp.php?id=104 -rw-r--r-- 1 root staff 49949 Jan 21 21:47 myphp.php?id=108 -rw-r--r-- 1 root staff 2031 Jan 21 21:47 myphp.php?id=116 -rw-r--r-- 1 root staff 3475 Jan 21 21:47 myphp.php?id=132 -rw-r--r-- 1 root staff 1867 Jan 21 21:47 myphp.php?id=164 -rw-r--r-- 1 root staff 57314 Jan 21 21:47 myphp.php?id=99 SecTracker> Según esto, los id 101, 102, 104, 108, 116, 132, 164 y 99 darán mensajes diferentes.
Con el id=132 logro identificar que la aplicación esta configurando cookies que pueden ser usadas para validar durante el proceso de upload de las imágenes … Despues de las pruebas me di cuenta que no funcionaba en ninguna validación, FAIL :)
D. Algo que intento en este punto es tratar de configurar una cookie “trypios” con diferentes valores. Ninguno de los valores configurados funcionó. FAIL :) E. Lo que intento a continuación es validar la integridad de las imágenes que subo al sistema, para eso subo una imagen y luego la descargo para verificarla. SecTracker>md5sum webchall*.png 9937c44d2c0f6a2f11240d8e2b1069a0 webchall.png (Imagen que subo al sistema) 9937c44d2c0f6a2f11240d8e2b1069a0 webchall2.png (Imagen que descargo del sistema) SecTracker> Con esto compruebo que el sistema conserva la integridad de las imágenes que se suben, pero lo que me llama la atención es el nombre de la imagen cuando sube al sistema, tiene cara de MD5 :P Lo primero que intento es generar el hash MD5 de las imágenes que subo al sistema para compararlas con sus respectivos nombres cuando se almacenan, pero los valores no corresponden,
entonces empiezo un proceso manual para intentar identificar un patr贸n.
a.jpg 394659692a460258b45a99f1424ea357.jpg a.png 32d3ca5e23f4ccf1e4c8660c40e75f33.png a.gif a7200b4bac77e8804f9e48304a92b6d9.gif a.jpeg 14a53cac5a312f3d1ad4980fec051d42.jpeg b.jpg efaf98db2eac3a61946ca0282ae6ddd4.jpg Los nombres que aparecen en el sistema corresponden a los valores MD5 de los nombres de las im谩genes que se suben: SecTracker>echo -n "a.jpg" | md5sum 394659692a460258b45a99f1424ea357 SecTracker>echo -n "a.png" | md5sum 32d3ca5e23f4ccf1e4c8660c40e75f33 SecTracker>echo -n "a.gif" | md5sum a7200b4bac77e8804f9e48304a92b6d9 SecTracker> F. Descargo un shell en php con la intenci贸n de hacerlo pasar por una imagen. El shell lo pueden descargar desde aqu铆: http://xploitaday.komodin.org/tools/php-encoder/
G. Como paso siguiente intento subir un shell en php al sistema, pero obtengo un error relacionado con la extensi贸n que uso en el nombre del archivo.
H. Intento camuflar la extensi贸n del shell usando una doble extensi贸n y genero el MD5 en caso de que suba al sistema. SecTracker>cp shell.php shell.jpg.php SecTracker>echo -n "shell.jpg.php" | md5sum 809d9ef057f63c676e1d78dbb7a43826 SecTracker> I. Subo el archivo shell.jpg.php al sistema y no se visualiza ninguna imagen, pero tampoco se genera un error, entonces intento cargar el archivo .php en el directorio /images/.
Con esto tenemos el shell web dentro del sistema.
J. Una vez dentro del sistema empiezo a buscar informaci贸n como por ejemplo identificar la versi贸n del kernel, verificar si el sistema tiene netcat, gcc, etc.
Tambi茅n busco los usuarios en /home y me encuentro con un usuario bob, como es el 煤nico usuario pareciera que tiene algo que ver con el reto.
Los scripts que est谩n en el home del usuario bob requieren de una palabra secreta, cualquier palabra se puede usar pero no producen resultados coherentes (texto plano legible).
K. Sigo explorando buscando las posibilidades de comunicaci贸n del usuario bob, por eso intento encontrar archivos que tengan la palabra bob y termino entrar al inbox de correo del usuario en /var/mail/, sin embargo no tengo los permisos para poder leer los archivos, pero sospecho que el usuario puede tener mensajes que ayudan a resolver el tema. FAIL :).
L. Al no encontrar mucha informaci贸n por este lado intento abrir puertos en la maquina para conectarme desde la consola (netcat).
Los puertos siguen apareciendo filtrados, lo intento con varios puertos pero obtengo el mismo resultado, por lo que pienso que el sistema debe tener el iptables habilitado. Buscamos las reglas que deben cargar al inicio del sistema. En /etc/init.d/ encontramos que el archivo firewall.sh tiene permisos modificados y no puedo leerlos, pero eso me da indicios que seguramente si hay un firewall filtrando la salida y entrada de paquetes en puertos diferentes al 22/TCP y al 8880/TCP. FAIL :)
M. Ya un poco perdido con el asunto empiezo a probar exploits locales (exploits*.c) contra el kernel, exploits contra phpinfo(), contra apache, contra todo lo que se aparezca y nada, no logro escalar privilegios en el sistema, entonces pienso que quiz谩 no sea necesario ya que el reto se trata de una aplicaci贸n web. FAIL :)
N. Vuelvo a la raíz del servidor web a leer detalladamente los archivos que se encuentran allí y veo un archivo que no había visto antes, el archivo /var/www/.proof.
En este archivo se menciona un código secreto, así que supongo que es el código del usuario bob. O. Pruebo el código en el sistema y NO obtengo resultados correctos.
¿Será que el código está en base64? SecTracker>echo -n "TGglMUxecjJDSDclN1Ej" | base64 -d Lh%1L^r2CH7%7Q# SecTracker>
WIN :)
P. El lugar donde se van a encontrar Alice y Bob es Akti Tompazi 4 , como se puede ver en la siguiente imagen de googlemaps donde se usaron las coordenadas encontradas.
Con esto se termina el reto, pero aún quedan cosas pendientes por investigar:
TODO: COSAS POR HACER 1. 2. 3. 4. 5. 6.
Escalar privilegios en el sistema (#). Encontrar las claves de los usuarios root y bob. Examinar si el servicio MySQL (127.0.0.1) tiene informaci贸n. Examinar si el servicio EXIM (127.0.0.1) tiene informaci贸n o es vulnerable. Buscar otra forma de explotar el sistema web (vulnerabilidad diferente). Verificar si las librer铆as de AES usadas para cifrar el mensaje de bob tienen alg煤n bug introducido que permita romper el cifrado de forma diferente. 7. Identificar el motivo por el cual el archivo .php que se sube en el directorio /images/ del sistema se elimina cada cierto tiempo. Si tienen alguna duda sobre el solucionario pueden escribir a: fernando.a.quintero@gmail.com o contactarme por twitter en: @nonroot Gracias por el reto!