domingo, 30 de octubre de 2016

Fundamentals: WAF ( Web Application Firewall )



Autor: @txambe


Hoy vamos a ver un tema muy interesante (por lo menos a mí me lo parece) y son las distintas técnicas para realizar un fingerprint de los firewall de aplicaciones web o más conocidos como WAF.

Bueno pues empecemos por el principio ¿Que es un firewall?  es un sistema de seguridad que controla el tráfico de una red, servidor o una aplicación, los puede haber tanto hardware como software.

Se pueden diferenciar dos tipos de firewall :

·         Los firewalls de capa de red funciona a nivel de red (capa 3 del modelo OSI, capa 2 del stack de protocolos TCP/IP) como filtro de paquetes IP. A este nivel se pueden realizar filtros según los distintos campos de los paquetes IP: dirección IP origen, dirección IP destino. En este tipo de firewall se permiten filtrados según campos de nivel de transporte (capa 3 TCP/IP, capa 4 Modelo OSI), como el puerto origen y destino, o a nivel de enlace de datos (no existe en TCP/IP, capa 2 Modelo OSI) como la dirección MAC.

·         Los firewall de aplicaciones web, trabaja en el nivel de aplicación (capa 7 del modelo OSI), de manera que los filtrados se pueden adaptar a características propias de los protocolos de este nivel. Por ejemplo, si se trata de tráfico HTTP, se pueden realizar filtrados según la URL a la que se está intentando acceder.

Un cortafuegos a nivel 7 de tráfico HTTP suele denominarse proxy, y permite que los pc de una organización  entren a Internet de una forma controlada. Un proxy oculta de manera eficaz las verdaderas direcciones de red.

Los WAF funcionan en los siguientes modos::

·         Negative Model (Blacklist based) 
·         Positive Model (Whitelist based) 
·         Mixed/Hybrid Model (Blacklist & whitelist model)


Las formas en que podemos implementar un WAF son:

·         Reverse proxy 
·         Inline 
·        Connected to a Switch (SPAN>Port Mirroring)


Métodos de identificación de WAF

Los métodos mas conocidos que podemos encontrar, se encuetrarn:

·         Drop Action  → Envia un paquete FIN / RST 
·         Reglas Pre-Built  → Cada WAF tiene sus propias  Negative Secutity Signatures  
·         Ataques  Side-Channel  → Basados en Timing behavior


Herramientas de Detección de WAF

Hay muchas herramientas y scripts que pueden detectar la presencia y la huella digital del WAF :

·         imperva detect.py

Realiza un un primer test de base y luego realiza otros 5 test adicionales , sus resultados son muy rápidos.



·         Paradox WAF detection 
·         F5 Cookie Decoder Burp extension 
·         FatCat SQL Injector


  
NMAP scripts

Los scripts de nmap pueden detectar varios productos  IDS, IPS, y WAF. Como los siguientes , BarracudaWAF, PHPIDS, dotDefender, Imperva , Web Firewall, Blue Coat SG 400.

Detectando  WAF usando  NMAP

nmap -p80 --script http-waf-detect


Fingerprinting  de WAF usando NMAP

nmap -p80 --script http-waf-fingerprint

Wafw00f.py

Wafw00f puede identificar los patrones mas comunes de mas de 25 tipos de WAF

Fingerprinting  de WAF usando WAFw00f
wafw00f.py

Un problema que nos podemos encontrar a la hora de la detección es que los WAF oculten su identidad   a partir de los valores de las cookies y así como las respuestas HTTP  de tipo 200 ,  así que será necesario realizar  test adicionales ,  por ejemplo con imperva-detect.py.
 El siguiente enlace es un resumen de las distintas herramientas que hay disponibles para la detección de WAF



Un tema importante a tratar , son las reglas que se implementan ,  ya que tienen un impacto en el funcionamiento de la aplicación web que esta detrás del WAF.

Una mala configuración  puede darnos problemas tales como:
           
            • Bloquear peticiones legitimas  (falsos positivos) 
            • El conjunto de reglas necesita ser revisado.


Y un conjunto de reglas muy laxa sin excepciones puede :

·         Pueda darnos  (falsos negativos) 
·         El atacante eluda el  WAF y por lo tanto haga un exploit de la aplicación.
  
Continuara ….


Happy Hacking.


miércoles, 26 de octubre de 2016

Piratas del corsair



Autor: @toespar

Telegram continúa buscando diferenciarse con funcionalidades que atraigan a los usuarios. Viendo que el mundo de los videojuegos cada vez reúne a más gente en teléfonos, qué mejor que poder hablar y jugar con tus amigos sin salir de la conversación. Por ello, la propia plataforma ha creado varios juegos accesibles desde el propio chat con tan solo poner @gamebot.


Viernes por la tarde, y de repente, me llega una notificación de Telegram en un chat en el que se mostraba el siguiente mensaje:


Se había abierto la veda. Y aunque he de reconocer que no soy muy de jugar, el hecho de tener más puntuación que el resto me impulsaba a ello. Tras unos breves intentos lo consigo.


Evidentemente, esto siguió varias veces más hasta que llegó un punto en el que me resultaba imposible conseguir más puntos que el primero, pero el asunto no podía quedar así. Por ello, me pongo a investigar cómo funciona la puntuación del juego abriendo la versión desktop en el ordenador que, casualmente, todavía no integra el juego en el propio chat sino que lo abre directamente en el navegador.

Lo primero que hacemos es configurar BurpSuite  y Firefox para obtener las distintas peticiones que se realizan en función de los distintos escenarios del juego.

Ahora ya estamos listos para interceptar los paquetes y observar cómo se realizan las peticiones, así que nos ponemos a jugar hasta que nos eliminan. Tras un breve periodo de tiempo, vemos como van llegando distintas peticiones a Burp, tanto del propio dominio que estamos analizando como de otros. Por lo tanto, eliminamos las peticiones que no nos interesan, quedándonos únicamente con aquellas que nos pueden ser de interés:


Tal y como vemos en la captura, la URL más interesante es aquella relacionada con la asignación de puntuación: setScore. Adicionalmente, observamos también que la primera petición se realiza para obtener el código JavaScript que ejecutará las distintas funciones del juego, por lo que si buscamos la función que realiza el setScore podremos entender cómo se realiza la asignación de puntos:


Se realiza un post a la API setScore y se le pasan como parámetros data y score. Si seguimos buscando de donde se obtienen los datos llegamos a la función main:


Dichos datos se obtienen de la URL del juego, la cual contiene una cadena codificada en Base64 que contiene algunos parámetros como el identificador del usuario, su nombre, el nombre del juego, el identificador del chat, entre otros. Esta cadena varía en función del juego y puntuación obtenida en la partida anterior.

Si ahora nos centramos en el parámetro score, podemos ver que este varía en función de las monedas obtenidas durante el juego. No obstante, si nos fijamos en BurpSuite, observamos que el parámetro se pasa sin ningún identificador que compruebe la autenticidad del valor obtenido en el juego.


De esta forma, para obtener la puntuación que queramos únicamente deberemos editar el parámetro score en el cuerpo del mensaje. Para ello, mandamos la petición al repeater de BurpSuite y editamos dicho valor:


Si todo ha ido bien, obtenemos la siguiente respuesta:


Y si nos fijamos en el chat…


Objetivo conseguido! Ahora sí somos los piratas del Corsair ;)

sábado, 22 de octubre de 2016

Fundamentals: Instalación de Proxychain y Tor en Kali



Autor: @txambe

En el articulo de hoy vamos a ver  cómo instalar, configurar y utilizar Proxychains y Tor en Kali Linux de manera a que nuestra privacidad esté siempre garantizada y podamos que, aunque el servidor nos identifique, poder cambiar nuestra identidad fácilmente pudiendo seguir manteniendo al máximo nuestro anonimato.
Lo primero que debemos hacer es actualizar el sistema con los parches y con las aplicaciones más recientes, para ello abriremos un terminal y teclearemos:
  • sudo apt-get update && sudo apt-get upgrade
Esperaremos a que se actualicen los repositorios y se instalen todas las actualizaciones antes de continuar con este proceso. Una vez actualizado nuestro sistema instalaremos Tor en él desde los mismos repositorios tecleando:

  • sudo apt-get install tor


Cuando finalice la instalación de este módulo iniciamos el servicio :
  • sudo service tor start
Comprobamos que se ha iniciado correctamente con:
  • sudo service tor status

Con Tor ya iniciado vamos a modificar el archivo de configuración de Proxychains, para ello teclearemos:
  • sudo nano /etc/proxychains.conf
En este archivo debemos realizar los siguientes cambios:
  • Des-comentar borrando el # la línea dynamic_chain
  • Comentar con un # la línea strict_chain
  • Añadir al final de archivo: socks5 127.0.0.1 9050


Con estos pasos ya tenemos todo listo. Ya podemos abrir una nueva pestaña de navegación anónima tecleando:
  • proxychains iceweasel www.loquesea.net
Y comprobar desde cual-es-mi-ip.net que la IP que obtenemos no es la misma que tenemos realmente en nuestra conexión, sino que está ofuscada por la red Tor.

A partir de ahora, todo el tráfico que generemos en la ventana del navegador abierta desde el comando anterior mucho cuidado con esto ,será totalmente anónima, pudiendo establecer una conexión directa no anónima desde cualquier otra ventana que abramos manualmente del mismo navegador.

Happy h@cking

sábado, 15 de octubre de 2016

Creando URLs con CSRF implícito

Resultado de imagen de csrf

Autor: Samuel Lopez Saura

CSRF son las siglas de Cross Site Request Forgery. Esto es una técnica a través de la cual un usuario víctima realiza determinadas acciones programadas sin ser consciente de ello.

Imaginémonos el siguiente escenario.

El usuario A es administrador del sitio web empresadeejemplo.com

Dentro de empresadeejemplo.com puede realizar las siguientes acciones.

  Ver empleados de la empresa
  Ver  nómina de un empleado
  Subir sueldo a un empleado
  Ver mi sueldo
  Mi historial

El sitio web empresadeejemplo.com tiene un mecanismo de sesiones y solo permite que el usuario admin realice las acciones marcadas en rojo.


Para subir el sueldo de un empleado se encuentra con el siguiente escenario.


El usuario administrador elige un usuario, la cantidad a subir su sueldo y al darle a enviar genera una URL tal que

http://empresadeejemplo.com/admin/subirsueldo.php?usuario=juan_ejemplo_perez&aumento=100

Dentro de la petición HTTP se manda la Cookie de sesión del administrador. La aplicación comprobará que la cookie de sesión es válida y que pertenece a un usuario con privilegios administrativos.

Dentro del código de la aplicación habrá algo parecido a esto:

$usuario = $_REQUEST[‘usuario’];
$aumento = $_REQUEST[‘aumento’];

→ si el usuario al que corresponde la sesión es admin
        subir_sueldo($usuario, $cantidad);
        header(‘Location: /admin’); /* Redirigimos al panel de administración */

→  si el usuario al que corresponde la sesión no es admin
        header(‘Location: /’);  /* Redirigimos a la raíz del sitio */

La aplicación funcionaría y en principio un usuario que no fuera admin no podría realizar la acción.

La pregunta es, ¿qué pasaría si admin hiciera clic en http://empresadeejemplo.com/admin/subirsueldo.php?usuario=juan_ejemplo_perez&aumento=9000 sin ser consciente de ello?

Su navegador realizaría una petición GET  y mandaría su cookie de sesión el servidor comprobaría que realmente es admin quién está realizando la acción y subiría en 9000€ el sueldo al empleado juan ejemplo perez.

Pero ¿cómo va a hacer clic en eso el administrador? Volvamos atrás, cuando hacemos clic emitimos una petición GET al servidor y esta la procesa. Esta petición también la realizamos cuando, por ejemplo, cargamos una imagen. Entonces si el usuario administrador visitara un sitio web que cargase esa URL su navegador emitiría una petición GET al servidor como si el propio administrador conscientemente hiciera la petición.

– Una imagen dice más de mil palabras


Además, ¿y si los datos se pasaran por el método POST en lugar de por el método GET?
Desde PHP podemos recibir parámetros con $_GET, $_POST, $_REQUEST. El primero contiene un array asociativo con los datos mandados por el método GET. El segundo por el método POST y el tercero por cualquiera de los dos métodos.

La utilización de $_REQUEST es una práctica muy común y sin una validación adecuada podemos enviar en un método GET parámetros que el servidor procesaría como si fuera un método POST para un campo que se espera ser recibido solo por POST. Es decir, en una URL podríamos simular un “POST” implícito en ella si al recibir el parámetro lo recibiéramos mediante $_REQUEST.


junto a un método POST los parámetros de usuario y aumento.


Si el documento PHP tuviese en cuenta por donde vienen los datos. Utilizando $_POST o $_GET en lugar de la opción genérica $_REQUEST. Y la acción fuera dada por el método POST habría que simular el envío de un formulario con esos valores al servidor pero el mecanismo sería muy similar a la opción de la imagen con la excepción de que sería un código javascript quién realizase la petición POST o activase el envío de un formulario.

La tarde del miércoles creé una micro aplicación que bajo un fin educativo automatizaba este proceso.



Arriba a la derecha tenemos un botón que pone Nueva URL. Esto levantará una ventana donde podremos poner los parámetros.



Lo que nos genera una URL como la siguiente:

Cuando copiemos la URL y la peguemos en la barra del navegador nos encontraremos con esto:


Lo que está pasando en realidad es lo siguiente:

  Se accede a http://cj.curiosoinformatico.com, lo primero en cargar es un script que comprueba si tenemos parámetros en la URL que nos indiquen a donde redirigir y donde hacer clic.
  De tenerlos carga el sitio que hemos escogido para hacer clic como una imagen nada sospechosa y cambia la URL del documento al sitio destino.
  No obstante como la URL es un poco sospechosa podemos usar un acortador de enlaces como bit.ly para hacerla más confiable.

¡Magia! Esta poderosa URL subirá nuestro sueldo en 9000 euros sin que nadie se entere y le informará a nuestro jefe de un evento donde aprender y mejorar su seguridad. http://bit.ly/2ea3VFM



Nota del autor: Actualmente la página no tiene soporte para peticiones POST -si tiene para GET y para los POST que recoja PHP a través de $_REQUEST (que en realidad se envían como GET)-. Imagino que en un hueco libre que tenga se lo pondré pero si alguien quiere adelantarse aquí dejo el github del mismo.

https://github.com/curiosoinformatico/two_steps_redirector 


******************* ACTUALIZACIÓN *********************

Tras publicar este articulo Vicente Aguilera Diaz se puso en contacto con nosotros y nos indico varios interesantes enlaces de sus publicaciones sobre CSRF y redes sociales, aquí podéis consultarlos:

Caso Facebook: http://www.isecauditors.com/advisories-2011#2011-002

Caso Linkedin: http://seclists.org/fulldisclosure/2013/Mar/216

Caso Gmail: http://www.securiteam.com/securitynews/5ZP010UQKK.html



Muchas gracias Vicente.







jueves, 13 de octubre de 2016

NMAP SCRIPTING ENGINE




Autor : @txambe

En el articulo de hoy vamos a ver una forma distinta de utilizar esta herramienta tan potente como es nmap normalmente utilizada como escaneador de puertos, en esta ocasión la utilizaremos como escaner de vulnerabilidades , no llega a la potencia de Nessus , Openvas , pero en determinados escenarios que no podamos utilizar dichos programas, nmap es un gran aliado a tener en cuenta.

Nmap Scripting Engine ( NSE ) es una de las opciones mas potentes que tiene nmap a parte de su función como escaner de red. Permite escribir scripts para automatizar tareas de red. Esos scripts pueden ser ejecutados en paralelo para así aprovecharse de de la velocidad y eficiencia de nmap.

Con NSE podemos acabar distintas tareas.

·         Auth: Verifica procesos de autenticación.
·         brute: Obtención de información por medio de fuerza bruta.
·         discovery: Recuperación de información de equipos.
·         dos: Relacionados con ataques del tipo DoS.
·         external: Script que utilizan servicios de terceras partes.
·         intrusive: Utiliza scripts que son considerados intrusivos para la víctima o target.
·         safe: ejecuta scripts “seguros” en cuanto a la intrusión de sistemas.
·         vuln: Verifica la existencia de las vulnerabilidades más conocidas.

Para mantener actualizados los scripts debemos ejecutar el comando nmap conscript-updatedb como parámetro.

En /usr/share/nmap/scripts/ (dependiendo el SO que corremos), se encuentran todos los scripts disponibles.

Comentar que los script de nmap están realizados en lenguaje LUA.

Para activar NSE deberemos escribir en la linea de comandos la opción -sC o --script si se quiere indicar un conjunto de scripts. Nmap soporte dos tipos de scripts de tipo servicio y de host..

Los  de tipo servicio relacionan  puertos abiertos ( servicio asociado )  en el objetivo.



Usando NSE

Para iniciar el motor de scripts:

 $nmap -sC 

Para seleccionar un script:

 $nmap –script

Pasar argumentos a los scripts:

   --script-args “http.useragent=0, hhtp.pipeline=15”
   --script-args  http.useragent=CUM,pipeline=10
   --script-args  whois={whodb=”no follow”}


Para realizar una selección  avanzada de scripts:

 nmap -p80 –script “http-*and(not(httpd-brute or http-slowloris))” < objetivo>


Recomendaciones de uso

No usar los dns de tu ISP , mejor usar los de google , por ejemplo:

nmap –dns-servers 8.8.8.8,8.8.4.4


Variar la configuración de tiempo:

nmap T5
Usar el filtro -p si solo interesa el resultado de cierto servicio:

$nmap -p80 –script http-trace 

Si trabajamos con scripts de tipo HTTP , mi recomendación es cambiar el user-agent:

$nmap -p80 –script http-enum 

Debido a la cantidad de argumentos que tiene , es recomendable tener otra consola abierta , en la carpeta donde están los scripts y usar:

c a t < script > | grep @args

O también entrar dentro de la carpeta de los scripts y desde ahí lanzar los scripts.


También una buena fuente de información sobre scripts no aceptados al repositorio oficial:


Enlaces interesantes a scripts no oficiales:

·         vulscan
·         http-google-email
·         http-screenshot

En este punto quería hablaros de una herramienta interesante , NSEarch no es mas que un buscador de scripts la podéis descargar de https://github.com/JKO/nsearch


Una vez descargada la herramienta , solo hay que descomprimir y lanzar su instalador. Cuando ya se encuentra instalada se puede ejecutar con el siguiente comando:

python nsearch.py



En el siguiente enlace podéis encontrar mas información:


Para distinguir entre versiones:

            Para la versión 5:  local http = require “http”

            Para la versión 6:  require “http”


Reglas de ejecución

Todos los scripts tendrán por lo menos una  de las siguientes funciones:

·         prerule()
·         hostrule(host)
·         postrule(host,port)
·         postrule()

Ejemplos de reglas de ejecución

Hay aliases como shortport.http

http = shortport_or_service ({80, 443 , 631 , 7080 , 8080 , 8088 , 5800 , 3872 , 8180 , 8000 }, {“http”,”https”,”ipp”,”http-alt”,”vnc-http”,”oem-agent”})

Una regla para servidores:

posrtrule = shortport.http


Formatos de salida

Nmap soporta distintos formatos de salida de datos XML, greppable ( aunque esta ya en desuso todavia nos puede ser útil en ciertas situaciones )  y normal. Pero solo se guardarán los datos si seleccionamos los formatos XML o normal.

Formato XML

Nmap genera elementos para el escaneo de puertos, detección de servicios y NSE. Anteriormente se guardaba en un elemento llamado ·         EXPOITABLE
·         VULNERABLE
·         NOT_VULN
 
Es muy recomendable asignarlo durante la ejecución:
 
vuln.state = vulns.STAT.VULN
 
Para generar el reporte se utiliza la función vulns.Report.make_output():
 
local report = vulns.Report:new(SCRIPT_NAME,host,port) return report:make_output(vuln_table)
 
 
Referencias:
 
·         https://nmap.org/book/nse.html
·         https://nmap.org/nsedoc/
 
 
Espero que os resulte de interés.
 
 
Happy h@cking.
 

 


-->< script > dentro del atributo ouput.

Al usar la función stdnse.output_table para guardar nuestros datos de salida se auto genera todo el árbol XML.

            Nse:

            local ouput_tab = stdnse.ouput_table()
            ouput_tab.ip = host.ip
            output_tab.hosts = domains

            return output_tab

Reporte de vulnerabilidades

Para realizar un reporte de vulnerabilidades, utilizaremos la librería vulns. La librería tiene una variable que lleva el registro del estado de la vulnerabilidad encontrada:

·         EXPOITABLE
·         VULNERABLE
·         NOT_VULN

Es muy recomendable asignarlo durante la ejecución:

vuln.state = vulns.STAT.VULN

Para generar el reporte se utiliza la función vulns.Report.make_output():

local report = vulns.Report:new(SCRIPT_NAME,host,port) return report:make_output(vuln_table)


Referencias:

·         https://nmap.org/book/nse.html
·         https://nmap.org/nsedoc/


Espero que os resulte de interés.


Happy h@cking.