Archivo

Archive for 19 febrero 2018

Oferta de formación en Securízame sobre hacking ofensivo (Red Team)

febrero 19, 2018 1 comentario

Seguramente algunos de vosotros habéis visto en medios tales como Twitter o Telegram, que en Securízame se están elaborando una serie de ofertas formativas muy interesantes, que están pensadas no solamente a que podáis obtener unos conocimientos sólidos en seguridad informática sino que además, tengáis la posibilidad de demostrarlo mediante un certificado acreditativo, como es el caso de la certificación recientemente lanzada en Securízame llamada IRCP (hace unos días os contábamos algunos detalles al respecto). No obstante, no solamente se ha pensado en el lado puramente defensivo del hacking, para aquellos que también nos gusta la parte ofensiva y el entender cómo se compone un vector de ataque contra cualquier sistema, se han abierto una serie de convocatorias para cursos completamente prácticos en dichas áreas y yo tengo el enorme placer de ser la persona encargada de llevar a cabo dichas formaciones.

Concretamente tenemos 3 convocatorias abiertas y cada una de ellas se va a impartir en las oficinas de Securízame en Madrid. A continuación os cuento a grandes rasgos qué es lo que haremos en cada una de dichas convocatorias.

Curso básico/intermedio de hacking web y sistemas – 9, 10 y 11 de Marzo:

Se trata de un curso en el vamos a ver algunas de las vulnerabilidades más habituales en entornos web, partiendo de la versión más reciente del OWASP Top 10 que data del año 2017 y con una buena cantidad de casos prácticos para que comprendáis todas y cada una de las vulnerabilidades que se definen en la guía y que adquiráis los conocimientos necesarios para levar a cabo auditorías contra aplicaciones web en entornos reales, como los que os podéis encontrar en una organización de cualquier tipo. Por otro lado, en éste curso también veremos los fundamentos del hacking desde la perspectiva de un atacante, utilizando herramientas de uso común y otras no que no son tan comunes, pero que igualmente tienen una potencia y versatilidad muy interesantes y del mismo modo, en la parte de hacking de sistemas vamos a trabajar con configuraciones (inseguras) aplicadas en routers con el fin de contar con un entorno bastante cercano a la realidad para realizar pruebas de penetración. El objetivo de éste curso es prepararos para asumir retos más complejos y que tengáis una base sólida para que vuestro nivel en temas de seguridad informática y hacking pueda ir subiendo rápidamente. No se trata de un curso “al uso” de los que encontráis en Udemy o gratis en Internet (de hecho, en ocasiones es mejor el contenido gratuito que lo que os encontráis en Udemy). Me he asegurado y le he dedicado varias horas a los contenidos para que no sea un curso en el que aprendáis a lanzar herramientas y ejecutar scripts, NO, lo tengo preparado para que aprendáis cómo funcionan las cosas y podáis tener unos fundamentos sólidos y podáis hacer auditorías de seguridad con o sin herramientas automatizadas, aplicando correctamente cada una de las técnicas más comunes en éste tipo de actividades y permitiéndoos subir de nivel rápidamente.

Enlace con toda la información del curso aquí: https://cursos.securizame.com/courses/curso-presencial-de-pentesting-1-hacking-web-hacking-sistemas-basico/

Curso avanzado de hacking web y sistemas – 6, 7 y 8 de Abril:

En éste curso vamos a ir mucho más allá de lo que normalmente nos encontramos en las pruebas de penetración en entornos web, analizaremos en detalle otros tipos de vulnerabilidades que no sólo no se encuentran en el OWASP Top 10, sino que además, combinadas con varias técnicas y/u otras vulnerabilidades se puede comprometer el servidor web y conseguir la tan apreciada ejecución remota de instrucciones en el servidor. En éste curso también veremos técnicas avanzadas que se suelen aplicar en una campaña de hacking contra un sistema. Veremos cosas como la posibilidad de crear conexiones cifradas entre víctima y atacante para proteger el canal de comunicación y hacer que sea un poco más difícil de identificar qué actividades está llevando a cabo un atacante, así como también la posibilidad de crear puertas traseras persistentes utilizando mecanismos poco convencionales (vamos un poco más allá de lo que Frameworks como MSF nos ofrece) y como no, veremos en detalle la posibilidad de llevar a cabo técnicas de pivoting y port-fowarding, enlanzando varias redes con diferentes niveles de profundidad (usando cada máquina comprometida para saltar a segmentos de red internos/ocultos de cara al atacante), también veremos algunas cosillas chulas sobre malware y evasión de AVs. Estás son solamente algunas de las cosas que veremos en éste curso y que estoy seguro que no quedaréis decepcionados.

Enlace con toda la información del curso aquí: https://cursos.securizame.com/courses/curso-presencial-de-pentesting-2-hacking-web-hacking-sistemas-avanzado/

Entrenamiento de Hacking – 18, 19, 20 de Mayo:

Se trata de una propuesta distinta a los planes de formación a los que estamos acostumbrados, en realidad no se trata de un curso, tal como su nombre indica es un entrenamiento intensivo de un fin de semana entero, en donde cada participante debe enfrentarse a un reto propuesto, un sistema que tiene una serie de vulnerabilidades que pueden ser explotadas remota y localmente. La dinámica del entrenamiento es simple, proponemos un reto, un sistema que se encuentra en una red controlada, los participantes intentan ganar acceso, elevar privilegios sobre dicha máquina y luego extraer toda la información que puedan, después de un tiempo prudencial se procede a explicar la solución dicho reto, enseñando “en vivo” cómo se puede comprometer el sistema en cuestión y explicando las técnicas utilizadas. Este mismo ciclo lo repetimos durante todo el fin de semana y al finalizar, ya habremos explotado más de 20 sistemas vulnerables con diferentes niveles de dificultad.
Se trata de un formato de formación novedoso que a día de hoy no lo vais a encontrar en ningún otro centro de formación destinado a la seguridad informática y el hacking (al menos no que yo sepa). En el año 2017 hicimos 2 convocatorias en Securízame de éste entrenamiento y hemos conseguido un lleno total, rápidamente se agotaron todas las plazas y ésta primera convocatoria del año 2018 va por el mismo camino, aunque mi objetivo a nivel personal no es simplemente cubrir todas las plazas, me resultan mucho más gratificantes los comentarios de las personas que han participado en las ediciones anteriores del entrenamiento y saber que no solamente lo han disfrutado, sino que además les ha parecido intenso e instructivo, ver las muestras de agradecimiento y satisfacción de las personas que han confiado en ti, en algo a lo que le has dedicado innumerables horas y en algunos casos noches enteras, que has diseñado y pulido con esfuerzo y sacrificio constante, no tiene precio.
Para la primera edición de éste año tenemos máquinas nuevas que no se han visto en las 2 ediciones del año 2017, con lo cual podéis estar seguros que si habéis participado en alguna de las anteriores, en ésta nueva edición del 2018 lo vais a pasar igual de bien con retos nuevos con los que os vais a pegar un buen rato y con los que seguro vais a aprender un montón de cosas por el camino.

Enlace con toda la información del entrenamiento aquí: https://cursos.securizame.com/courses/entrenamiento-practico-presencial-de-pentesting-hacking-web-y-de-sistemas/

Esto es todo de momento, espero que os animéis y veros en las oficinas en Securízame, pensad que se trata de una inversión para vuestro futuro profesional y una buena oportunidad para que os cuente algunas cosas que sólo se aprenden “pegándote” con ellas y que no encuentras en la mayoría de cursos disponibles sobre hacking, además, si tenéis la posibilidad, también podéis adquirir el pack completo que incluye ambos cursos más el entrenamiento, tenéis toda la información disponible en el siguiente enlace: https://cursos.securizame.com/courses/pack-curso-presencial-hacking-web-y-de-sistemas-basico-avanzado/

Como siempre, si tenéis cualquier pregunta, podéis contactarme directamente por éste medio, Twitter o Telegram, suelo contestar bastante rápido 🙂

Un saludo y Happy Hack!
Adastra.

Pentesting contra aplicaciones en node.js – Parte 1.

febrero 13, 2018 2 comentarios

En los últimos años nos encontramos con que las aplicaciones desarrolladas en node.js son cada vez más comunes en entornos empresariales y en Internet, lo que inicialmente se construyo como un prototipo para probar el funcionamiento de un modelo “event-loop” hoy en día se ha convertido en un lenguaje bastante popular que se ha hecho un hueco en el competitivo y controvertido mundo de las herramientas, lenguajes y plataformas para el desarrollo de aplicaciones. Node.js plantea una forma distinta de desarrollar plataformas web y por supuesto, también provee los medios necesarios para construir aquellos componentes de software que son comunes en otros lenguajes de programación, sin embargo, como cualquier otro lenguaje de programación, tiene sus limitaciones y en algunos casos es posible que no sea la mejor alternativa. Cuando queremos desarrollar algo, lo más importante y que nunca hay que perder de vista, es que las características funcionales de una aplicación pueden llevar más o menos tiempo dependiendo de cada lenguaje de programación y así como puede suponer más o menos esfuerzo, también es importante valorar el impacto de optar por un lenguaje de programación de cara al desempeño, la escalabilidad y por supuesto, la seguridad.

En este sentido y por lo que he podido ver cuando hablo con algunos desarrolladores de node.js que he conocido, estas premisas se olvidan completamente y se piensa que node.js “vale para todo”, aunque para ser justos, lo mismo me he encontrado con programadores de Java, Python, .Net, etc, etc, etc. Como diría Van Russom, cada lenguaje tiene su propio “Zen” y es importante conocerlo para saber si es la alternativa más adecuada para un problema concreto. Dicho esto, merece la pena recordar el modo de funcionamiento de node.js y el motivo por el cual es considerado un framework flexible, escalable y con buenos niveles de rendimiento, así como también, los motivos por los que no es una buena idea utilizarlo “para todo”.

Las principales características de Node.js son las siguientes:

– OpenSource, independiente de plataforma.

– Desarrollado sobre CJR v8 (Chrome JavaScript Runtime).

– Diseñado para ser rápido y escalable.

– Permite la ejecución de Javascript en el backend.

– El contexto de ejecución de CJR v8 es completamente diferente al contexto del navegador, dado que se ejecuta en el lado del servidor.

– Liviano y eficiente.

Por otro lado, utiliza un modelo de funcionamiento asíncrono basado en eventos y en la ejecución de funciones de “callback”. Se trata de un framework que ha sido pensado para ejecutar operaciones sobre un único hilo de ejecución, por este motivo nos encontramos con que el principal objetivo de node.js con su modelo “single-thread” es el de mejorar el desempeño y escalabilidad de aplicaciones web, ya no tenemos el modelo “one thread per requests” utilizado en las aplicaciones web tradicionales que se despliegan en servidores web como Apache, Ngnix, IIS, entre otros, estamos ante un modelo completamente distinto, enfocado al desarrollo de aplicaciones escalables, asíncronas y con un bajo consumo de recursos debido a que ahora, sobre el proceso servidor ya no se hace un “fork” para atender las peticiones de los clientes en procesos independientes, algo que es habitual en servidores web Apache.

Modelo “Event-loop model” vs “thread per requests”.

Un modelo “Event-Loop” es ideal para aplicaciones en donde la velocidad de respuesta de las peticiones es más importante que las operaciones I/O. p.e: Un proxy inverso/transparente. También, este modelo es remendable cuando se trata de aplicaciones web con un backend ligero, el cual realiza las operaciones de negocio de forma rápida y eficiente. Esto es importante ya que si el backend no cumple con este requerimiento se pueden producir cuellos de botella y afectar el rendimiento general de la aplicación. Un modelo “thread per requests” es más adecuado para procesamientos intensivos con con un número bajo de procesos concurrentes. p.e. Aplicaciones cuyas funciones realizan múltiples operaciones de negocio, conexiones a bases de datos u otros sistemas remotos, así como transacciones complejas que requieren tiempo de procesamiento. Dicho esto, dependiendo del tipo de aplicación un modelo puede ser más recomendable que el otro y en el caso de las aplicaciones node.js que utilizan el modelo “event-loop” es importante que el backend se encuentre lo más fino posible y que todas las operaciones de negocio se realicen de la forma más rápida posible. En el caso de aplicaciones desarrolladas con node.js es común encontrarnos con que es necesario desarrollar el componente “servidor”, típicamente utilizando el modulo “express” en entornos de desarrollo, además de la lógica propiamente dicha de la aplicación.

Dado que todo se ejecuta desde un único hilo de ejecución, la gestión inadecuada de excepciones puede interrumpir por completo el normal funcionamiento del servidor y por este motivo es recomendable tener rutinas de chequeo que se encarguen de verificar en todo momento el correcto funcionamiento del servidor y la disponibilidad del proceso en el sistema.
Como se puede apreciar, es necesario pensar de una forma diferente cuando se trata de aplicaciones que siguen el modelo que implementa node.js y ante todo, tener muy claro que como cualquier otra herramienta o tecnología, sirve para resolver un problema concreto y debe evitarse su uso siguiendo únicamente el criterio “de la moda”, es decir, utilizar node.js porque es lo que se lleva hoy en día. Como cualquier lenguaje de programación, tiene su propia filosofía, su propio “Zen” y es recomendable conocer sus características más relevantes de cada lenguaje con el fin de utilizar la tecnología adecuada para resolver un problema concreto.

OWASP Top 10 y Node.js

Node.js es una tecnología para el mundo web, para el mundo del “http”, por éste motivo todas las amenazas descritas en el OWASP Top 10 aplican igualmente a las aplicaciones basadas en node.js. Nos encontramos con los mismos problemas que afectan a las aplicaciones escritas en los lenguajes más utilizados/tradicionales en Internet como PHP, JSP/JSF/J2EE, ASP.NET, ColdFusion, etc, etc. Desde problemas típicos de Inyección (SQLi, LDAPi, XSS, etc) hasta problemas de fugas de información o ejecución remota de código. No obstante, en el caso de Node.js existen algunas amenazas adicionales que no están incluidas en el OWASP Top 10 y suelen ser bastante comunes en aplicaciones de éste tipo. A continuación se enumeran rápidamente algunas de ellas.

Global Namespace Pollution

Se trata de un problema que tiene relación directa con la calidad del código y buenas prácticas de desarrollo. Tal como se ha explicado anteriormente, el componente “servidor” en una aplicación en Node.js debe ser desarrollado utilizando alguno de los módulos disponibles en el lenguaje, siendo “express” el más común. Dado que se trata de una tarea que deben realizar los desarrolladores, en ocasiones en éste componente “servidor” se incluyen variables y rutinas de código que tienen relación directa con el funcionamiento de la aplicación. Hay que tener en cuenta que cuando se definen éste tipo de elementos (variables o funciones) en el componente servidor de la aplicación node.js, se convierten en elementos globales de toda la aplicación, es decir, que los valores almacenados en las variables y el resultado de la ejecución de las funciones en dicho contexto afecta a todos los usuarios de la aplicación. Por ejemplo, si en el componente servidor se almacena crea una variable de cualquier tipo, el valor de dicha variable puede ser alterado por cualquier cliente de la aplicación y dicha modificación va a ser visible por el resto de clientes que intenten acceder a dicho valor. En la mayoría de lenguajes de programación nos encontramos con 3 contextos para el almacenamiento de valores entre peticiones HTTP, dichos contextos serían “request”, “session” y “application”, siendo éste último el más amplio de todos y el que más se asemeja a los “Global Namespaces” en Node.js

HTTP Parameter Pollution

En la mayoría de plataformas web existen mecanismos estándar para controlar la forma en la que se procesarán los parámetros duplicados (servidorweb/pagina?id=20&id=10&id=pepe&id=abcde), en algunos casos el lenguaje se quedará con el valor de la primera ocurrencia del parámetro o con el último, en algunos casos está característica es incluso configurable, sin embargo en el caso de node.js no se excluye ningún parámetro y si un parámetro se repite varias veces en la misma petición, cuando se intente recuperar el valor del parámetro en cuestión desde la aplicación, node.js se encargará de devolver un “array” con cada una de las ocurrencias del parámetro en cuestión. Esta es una característica del lenguaje y hay que tener en cuenta, ya que casi siempre cuando se desarrolla una aplicación web, se espera recibir un parámetro con un tipo de dato concreto (típicamente una cadena) pero dado que node.js se encarga de envolver todas las ocurrencias de un mismo parámetro en un array, el comportamiento de la aplicación puede ser muy diferente al esperado y en la mayoría de casos se puede producir una excepción no controlada, que tal como se ha mencionado anteriormente, puede generar una condición de denegación de servicio en el servicio.

Uso inseguro de funciones que permiten inyección de código.

Como en muchos otros lenguajes de programación, en node.js existen funciones que permiten la validación de tipos de datos concretos, no hay que olvidar que node.js es un lenguaje de scripting no tipado, lo que significa que, a diferencia de otros lenguajes de programación con tipado fuerte, el tipo de una variable es implícito al valor que se le asigna. Esto quiere decir que si se le asigna una cadena a una variable, el tipo de dicha variable será “str” y si más adelante durante la ejecución del programa, se le asigna una valor entero, el tipo de dato de dicha variable será desde ese momento un “int”. La función “eval” es precisamente una de las funciones más conocidas y utilizadas en node.js para validar tipos de datos en variables e instrucciones de código, lo que significa que la función “eval” lo que hace por debajo es ejecutar las instrucciones enviadas por parámetro de la función, lo que en algunos casos puede producir problemas de inyección de código arbitrario si los valores enviados a “eval” provienen de una petición por parte del cliente y no se validan correctamente. Esta es solamente una de las posibilidades a la hora de inyectar código en una aplicación node.js, sin embargo como se verá en otro post de ésta serie, existen varias formas de hacer lo mismo y en todos los casos, son producidas por malas prácticas de desarrollo o simplemente por desconocimiento.

Regex DoS

El uso de las expresiones regulares es bastante habitual a la hora de validar patrones y se utilizan
con bastante frecuencia a la hora de comprobar los valores ingresados por un usuario en formularios web. Por ejemplo, se pueden utilizar expresiones regulares para validar un correo electrónico, un DNI, número de teléfono o cualquier otro campo que siga un patrón fijo. Aunque se trata de elementos muy potentes, se caracterizan por ser de alto consumo en términos de recursos y tiempo de procesamiento y pueden ser especialmente perjudiciales para el correcto funcionamiento de una aplicación cuando las expresiones aplicadas no se encuentran bien definidas. Es posible que dichas expresiones funcionen correctamente, pero debido a la forma en la que se encuentran declaradas consuman más tiempo y recursos de lo que deberían. En el caso de node.js y especialmente en cualquier plataforma que siga el modelo “event-loop” con un único proceso asociado al servidor, es posible encontrarse con un cuello de botella considerable, lo que al final termina por provocar una condición de denegación de servicio.

NodeGoat de OWASP para pentesting contra node.js

Ahora que se ha explicado a grandes rasgos las principales vulnerabilidades que pueden afectar a una aplicación escrita en node.js, es el momento de llevar todo ésto a la práctica y qué mejor forma de hacerlo que por medio de una aplicación web vulnerable por diseño. Del mismo modo que existen aplicaciones de éste tipo para lenguajes como Java, PHP, .Net, entre otros, en el caso de node.js existe el proyecto NodeGoat de OWASP, el cual se encuentra disponible en el siguiente repositorio de github: https://github.com/OWASP/NodeGoat

Su instalación es muy simple, basta con descargar el proyecto del repositorio con “git clone https://github.com/OWASP/NodeGoat” y posteriormente realizar la instalación de todos módulos necesarios para que la aplicación pueda arrancar. Dichos módulos se instalan rápidamente con el comando “npm install”. Evidentemente es necesario tener node.js instalado en el sistema, en el caso de sistemas basados en Debian, es tan sencillo como ejecutar el comando “apt-get install nodejs”. Una vez instalados todos los módulos de la aplicación, es necesario configurar la base de datos MongoDB, que tal como se indica en el README del proyecto, es posible tirar de una instancia de MongoDB en local o crear una cuenta en MongoLab (https://mlab.com/) y crear una base de datos en dicho servicio, el cual puede tiene un plan gratuito que más que suficiente para trabajar con NodeGoat. Es necesario editar el fichero “<NODEGOAT_DIR/config/env/development.js” y establecer la ruta de conexión con la base de datos que se ha creado en MongoLab o la instancia que se encuentra en ejecución en local, según sea el caso. Antes de iniciar la aplicación, se debe ejecutar el comando “npm run db:seed” para crear toda la estructura de de colecciones en la base de datos, la cual evidentemente es utilizada por NodeGoat. Finalmente, el comando “npm start” se debe ejecutar desde el directorio de NodeGoat y con esto, la aplicación estará preparada para ser utilizada en el puerto 4000. Para poder iniciar sesión en la aplicación, los usuarios se encuentran disponibles en la colección “users” de la base de datos y también se pueden ver en el fichero “README” del proyecto.

Esto ha sido una breve introducción al funcionamiento de node.js y algunos de los problemas de seguridad que se pueden dar por el uso inadecuado de ésta tecnología. En los próximos post se explicará mucho más en detalle y con ejemplos prácticos aquellas cuestiones a tener en cuenta a la hora de hacer un pentest contra aplicaciones web desarrolladas en node.js

Un saludo y happy hack!
Adastra.

A %d blogueros les gusta esto: