Automatizando desafíos javascript con nodeJS y python

Inicio/Blog de ciberseguridad/Automatizando desafíos javascript con nodeJS y python

Buscar por:

Automatizando desafíos javascript con nodeJS y python

Para evitar ataques de fuerza bruta, algunas páginas implementan un sistema de protección híbrido que incluye desafíos javascript (javascript challenge). Esta protección se basa en la idea de que para para realizar ataques de fuerza bruta no se usa un navegador con javascript activado y de este modo se limita la realización de pruebas automáticas en ataques de fuerza bruta y la realización de auditorías de seguridad web con herramientas como Burp Suite.

Mediante la inclusión de un desafío javascript se incorpora una lógica en javascript al cliente que deberá ejecutar una función cuyo resultado se enviará como parámetro adicional y se comprobará su validez en el servidor. Esta función puede tener como entrada la fecha actual, números aleatorios, los propios datos que se van a enviar o cualquier otro valor. Si además la ofuscamos, analizar esta función se convierte en un dolor de cabeza para el atacante porque esta función será mucho más difícil de comprender y replicar su funcionamiento.

Esto no quiere decir que se deba confiar ciegamente en este método como medida de seguridad, es más una medida disuasoria puesto que esta lógica sigue siendo replicable, solo que requiere de más recursos para ello.

Imitación de un navegador con javascript activado usando node y python.

Es aquí donde el entorno de ejecución de NodeJS puede sernos útil evitando el tiempo que tardaríamos en comprender y replicar la lógica del desafío javascript en cualquier otro lenguaje. Usando NodeJS podemos ejecutar directamente el código javascript sin modificarlo y obtener una respuesta correcta. A su vez, este código javascript podrá ser llamado desde cualquier lenguaje de programación mediante la llamada system (o equivalentes) como si se tratase de cualquier otro comando, de manera que su integración sea sencilla.

Para poner un ejemplo práctico vamos a suponer que en una llamada se envían el mensaje de un usuario y una string de validación que se obtiene como resultado de ejecutar el siguiente código javascript en el navegador del usuario:

eval(function(p,a,c,k,e,d){e=function(c){returnc};if(!''.replace(/^/,String)){while(c--){d[c]=k[c]||c}k=[function(e){returnd[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(newRegExp('\\b'+e(c)+'\\b','g'),k[c])}}returnp}('5 12=18(4,3){7(3<0)13 12(4,3+10);5 8=\'\';16(5 2=0;2<4.17;2++){5 6=4[2];7(6.19(/[20-24]/2)){5 1=4.25(2);7((1>=9)&&(1<=23))6=14.15(((1-9+3)%10)+9);21 7((1>=11)&&(1<=22))6=14.15(((1-11+3)%10)+11)}8+=6}13 8};',10,26,'|code|i|amount|str|var|c|if|output|65|26|97|caesarShift|return|String|fromCharCode|for|length|function|match|a|else|122|90|z|charCodeAt'.split('|'),0,{}))

Para la ejecución de la función se puede crear el siguiente script en NodeJS:


functiondoit(str,n){eval(function(p,a,c,k,e,d){e=function(c){returnc};if(!''.replace(/^/,String)){while(c--){d[c]=k[c]||c}k=[function(e){returnd[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(newRegExp('\\b'+e(c)+'\\b','g'),k[c])}}returnp}('5 12=18(4,3){7(3<0)13 12(4,3+10);5 8=\'\';16(5 2=0;2<4.17;2++){5 6=4[2]; 7(6.19(/[20-24]/2)){5 1=4.25(2);7((1>=9)&&(1<=23))6=14.15(((1-9+3)%10)+9);21 7((1>=11)&&(1<=22))6=14.15(((1-11+3)%10)+11)}8+=6}13 8}; ',10,26,'|code|i|amount|str|var|c|if|output|65|26|97|caesarShift|return|String|fromCharCode|for|length|function|match|a|else|122|90|z|charCodeAt'.split('|'),0,{}))returncaesarShift(str,n);}console.log(doit(process.argv[2],process.argv[3]));

Y este desafío javascript podría ser ejecutado  así:

$ node token-gen.js abcdefghijk 4 eoyiscmwgqa

Con esta técnica nuestro script en Perl/python/ruby podría invocar código javascript evitando así tener que comprender toda la complicada lógica que hay detrás de un algoritmo de cifrado o de hashing. En el ejemplo se ha utilizado una implementación del cifrado Cesar, pero en un escenario real podría llegar a ser mucho más complejo.

De este modo se podrá automatizar en una revisión de seguridad web la generación de desafíos y tokens javascript rápidamente sin necesidad de analizar la implementación del algoritmo de protección utilizado.

By | 2017-02-25T21:49:48+00:00 7 Dic. 2016|0 Comments

Deja un comentario