Categorías
Hacking Networking Web Applications

Descubre Nuclei: Herramienta automatizada y personalizable para pentesters y bug bounty hunters

Demostración en vídeo del post

Nuclei es una herramienta que permite ejecutar pruebas de pentesting sobre aplicaciones web y otros servicios pero lo que la convierte en una utilidad realmente interesante es su capacidad de reducir al máximo los falsos positivos. Para conseguir ésto, funciona con un modelo basado en plantillas en las que es necesario declarar cómo se deben realizar las peticiones y qué debería haber en la respuesta devuelta por el servidor para determinar que existe una vulnerabilidad, mala configuración o fuga de información. El binario de Nuclei por si solo «no hace nada», es decir, la potencia de la herramienta se encuentra en las plantillas que se le pasan por parámetro a dicho binario. Se trata de una utilidad que dadas sus capacidades y facilidad de uso, se puede integrar perfectamente en un pipeline orientado al DevSecOps, tal como se explica en el curso de técnicas y herramientas aplicadas a DevSecOps disponible en la plataforma de The Hacker Way

Para crear las plantillas no hace falta aprender un lenguaje de programación ni nada parecido, basta con conocer la sintaxis de una estructura YAML y las posibles secciones/palabras reservadas que componen una plantilla válida. No es un proyecto reciente y de hecho, cuenta con una comunidad de personas que colaboran en la mejora de este framework desde hace algún tiempo, tanto es así que a la fecha de redactar este post existe un repositorio con más de 3600 plantillas que se pueden utilizar libremente.

La instalación de la herramienta consiste en simplemente descargar el binario de Nuclei que se encuentra disponible en la sección de releases y luego, se puede ejecutar con una serie de parámetros en donde como mínimo, se debe  indicar una o varias URL que serán los objetivos del ataque y una o varias plantillas en formato YAML, las cuales procesará Nuclei para verificar si las condiciones definidas en ellas se cumplen en las respuestas devueltas por el servidor.

La primera vez que se ejecuta la herramienta, lo primero que hace es descargar las plantillas desarrolladas por la comunidad y almacenar dichos ficheros en $HOME/nuclei-templates. A partir de este punto, se puede lanzar la herramienta utilizando cualquiera de las plantillas ya existentes o con una nueva.
Hay varias opciones que son interesantes a la hora de ejecutar la herramienta y simplemente leyendo la ayuda se pueden entender fácilmente, sin embargo las más importantes son las siguientes:

-target / -u: Permite indicar una URL sobre la que se van a realizar las pruebas.

-list / -l: Permite indicar un listado de objetivos en un fichero de texto, una URL por cada línea en el fichero.

-automatic-scan / -as: Ejecuta un escaneo automático utilizando Wappalyzer para la detección de la arquitectura del objetivo.

-templates / -t: Listado de plantillas o de directorios que contienen plantillas separado por comas.

-tl: Simplemente lista todas las plantillas que detecta nuclei. Si se ejecuta la herramienta sin la opción «-templates» enseñará las plantillas de la comunidad que como se ha indicado antes, se encuentran en el directorio $HOME/nuclei-templates.

-validate: Valida las plantillas que se han enviado con la opción «-templates» para comprobar que los ficheros YAML se encuentran bien formados.

-et / -exclude-templates: Listado de plantillas o de directorios que contienen plantillas que debe ser ignorado por nuclei separado por comas.

-s / –severity: Indica que las plantillas deben ser ejecutadas en función del campo «severity» de la plantilla, en donde los posibles valores pueden ser: info, low, medium, high, critical, unknown

-o / -output: Fichero de salida en donde se almacenan los problemas/vulnerabilidades descubiertos por la herramienta.

-sresp / -store-resp: Almacena todas las peticiones y respuestas que ha gestionado nuclei en el directorio indicado con la opción «-output».

-silent: No enseña trazas, solamente los problemas descubiertos.

-config: Permite indicar un fichero de configuración personalizado para modificar el comportamiento por defecto de la herramienta.

-update: Actualizar la herramienta

-up / -update-templates: Actualizar las plantillas de la comunidad a la versión más reciente.

-duc / -disable-update-check: Por defecto Nuclei verifica si las plantillas locales se encuentran actualizadas, con esta opción se deshabilita este comportamiento.

Existen muchas más opciones disponibles, el listado anterior solamente incluye algunas que son habituales cuando se ejecuta ésta herramienta. En todo caso, al leer la salida que enseña el comando «nuclei -h» se pueden ver todas las opciones disponibles y no es muy difícil entender para qué sirven. Por otro lado, hay que tener en cuenta que las opciones por defecto de la herramienta se pueden personalizar o bien manipulando el fichero de configuración ubicado en $HOME/.config/nuclei/config.yaml o indicando uno nuevo.

A continuación, en las siguientes imágenes se enseñan algunos ejemplos de uso, aunque puedes ver el vídeo en YouTube que se encuentra al principio de este post para ver los resultados que genera.

Modo básico

Filtros basados en la severidad de los defectos

Ejecución en modo «silencioso».

Filtrado de plantillas por severidad y tags

Nuclei pretende cubrir una necesidad que es evidente cuando se realiza pentesting web:  personalizar y orientar las pruebas a las características concretas de la aplicación que se está auditando. Hay que tener en cuenta que cada aplicación web tiene sus propios modos de funcionamiento y no se puede pretender que herramientas de uso general sean capaces de detectar defectos específicos que se encuentran expuestos en la lógica de negocio de la aplicación, se hace necesario un enfoque manual para detectar fallos de forma mucho más precisa y esto lo han entendido los creadores de esta herramienta ya que es en ese punto donde precisamente Nuclei puede ser de gran ayuda gracias a la «magia» de las plantillas. No obstante y aunque las plantillas de la comunidad pueden ser de gran utilidad, para sacarle un verdadero provecho a esta herramienta se debe conocer la aplicación web a auditar y crear plantillas dirigidas a ella.

Si este post te ha gustado, deja un comentario y comparte. Si ha sido de vuestro interés, escribiré otro en el que explicaré cómo crear plantillas en Nuclei, algo que te vendrá bien para ejecutar pruebas de pentesting sobre cualquier tipo de aplicación.

Un saludo y Happy Hack!
Adastra.

Categorías
automatizacion Hacking

15 herramientas imprescindibles para DevOps y DevSecOps – Parte 2 de 2

Demostración en vídeo del post

En el post anterior se han enseñado 8 herramientas que encajan perfectamente en el pipeline de un DevSecOps y en éste, veremos otras 7 herramientas de uso común.

9. Docker

Se ha vuelto muy popular en los últimos años y es probable que ya conozcas esta tecnología, si no es el caso te recomiendo el siguiente recurso. Sus beneficios son innegables, sin embargo cuando se habla de DevSecOps cobra una especial importancia en las etapas de despliegue y release (liberación). Hay que tener en cuenta que son necesarios ajustes y configuraciones en el propio servicio de Dockerd para poder ejecutar contenedores de forma segura, algo que no viene por defecto en Docker después de instalarlo. Si quieres aprender a securizar imágenes, contenedores y preparar el servicio de Docker para que funcione de forma segura en el pipeline de DevSecOps, te recomiendo el curso de técnicas y herramientas aplicadas a DevSecOps disponible en The Hacker Way

¿Dónde se aplica en el SDLC?: Se implementa desde las etapas de release y deploy.

10. Kubernetes

Se trata de un orquestador de contenedores que cobra importancia en las etapas de release, despliegue, operación y monitorización. Su configuración y posterior securización no son triviales y la curva de aprendizaje puede ser alta para el equipo, pero merece la pena implementarlo ya que ayuda con la automatización de ciertas tareas y mejora considerablemente la disponibilidad de los servicios. La configuración de este orquestador se basa principalmente en el uso de ficheros YAML en donde es posible declarar diferentes tipos de elementos, tales como servicios, deploys, volúmenes de persistencia, redes, etc.

¿Dónde se aplica en el SDLC?: Se implementa desde las etapas de release, deploy, operación y monitorización.

11. ZAProxy

Es uno de los proyectos insignia de la comunidad OWASP e incorpora características que convierten a esta herramienta en un elemento fundamental en la automatización de las pruebas de seguridad. Es un proyecto orientado a pruebas de caja negra y se puede integrar fácilmente en cualquier solución de CI/CD gracias a las imágenes Docker oficiales, las cuales incluyen scripts en Python que se conectan con la API Rest de la herramienta y permiten la ejecución automática de escaneos con configuraciones personalizadas. Si quieres conocer aún más en detalle el uso de esta utilidad te recomiendo los cursos de ZAP básico y ZAP avanzado que se encuentran disponibles en The Hacker Way, si te interesan ambos cursos, tenemos disponible un pack que los incluye
Finalmente, en el curso de técnicas y herramientas aplicadas a DevSecOps encontrarás varias lecciones en las que se enseña cómo encaja esta herramienta en el pipeline de un DevSecOps y su integración con herramientas CI/CD para la automatización de las pruebas.

¿Dónde se aplica en el SDLC?: Se implementa desde las etapas de deploy

 

12. Wapiti

Se trata de otra herramienta interesante que permite ejecutar pruebas de seguridad sobre una URL concreta. Su funcionamiento es sencillo, se basa en una serie de complementos que se encargan de detectar vulnerabilidades típicas, tales como XSS, SQLi, SSRF, XXE, entre otras. Genera informes en formato JSON o HTML y los resultados de las pruebas se guardan en una pequeña base de datos SQLite. Será una herramienta de la que se hablará próximamente en éste blog.

¿Dónde se aplica en el SDLC?: Se implementa desde las etapas de deploy

 

13. Nuclei

Es un proyecto interesante que se basa en el uso de plantillas en formato YAML para declarar de qué forma se deben realizar las pruebas sobre un objetivo determinado. Este funcionamiento ayuda a reducir drásticamente los falsos positivos y a descubrir vulnerabilidades de forma efectiva. Aunque es necesario indicarle una o varias plantillas, existe un repositorio de en el que a la fecha de redactar este post, hay más de 3000 plantillas creadas por la comunidad. Dichas plantillas sirven para dos cosas, por un lado para realizar pruebas con la herramienta y por otro, para entender su funcionamiento y aprender a crear plantillas personalizadas, algo que en realidad no es muy difícil. Será una herramienta de la que se hablará próximamente en éste blog

¿Dónde se aplica en el SDLC?: Se implementa desde las etapas de deploy

14. Jenkins

Es una herramienta del tipo CI/CD y representa el «core» de un pipeline en DevSecOps. Permite crear tareas y automatizar rutinas concretas, como por ejemplo la construcción y despliegue de aplicaciones, así como la ejecución de pruebas SAST y DAST. El los últimos años se ha convertido en la herramienta más popular en el mundo del CI/CD y se encuentra desplegada en miles de empresas en todo el mundo. No obstante, es necesario tener conocimientos sobre su configuración de forma segura y precisamente éste es uno de los puntos que también se abordan en el curso de técnicas y herramientas aplicadas a DevSecOps disponible en The Hacker Way

¿Dónde se aplica en el SDLC?: Se implementa desde las etapas de release, deploy, operación y monitorización

15. Nagios

Es un sistema de monitorización ampliamente utilizado en el mundo empresarial y dadas sus características, se convierte en una pieza clave en las etapas de operación y seguimiento/monitorización. Permite especificar el estado o comportamiento deseado de los componentes disponibles en la infraestructura (tanto hardware como software) y genera alarmas en el caso de que haya algún cambio.

¿Dónde se aplica en el SDLC?: Se implementa desde las etapas de operación y monitorización

 

Y tú, ¿conoces alguna otra herramienta para DevSecOps que consideres imprescindible? te leo en los comentarios.

Un saludo y Happy Hack!
Adastra.

Categorías
Hacking Hacking Python Services - Software

Aprende a simular campañas de phishing de forma fácil y rápida – Parte 2 de 2

Demostración en vídeo de este post:

En el post anterior se han explicado algunas herramientas para simular campañas de phishing, aunque lo cierto es que existen decenas de herramientas que hacen prácticamente lo mismo: scripts en bash con plantillas de servicios comunes y luego un servicio con ngrok.io para recibir lo que el usuario introduce. Esto en la práctica requiere cierto nivel de personalización de dichos scripts y además, definir un pretexto lo suficientemente creíble como para «motivar» al usuario a introducir información tan sensible como las credenciales de un servicio que utiliza con frecuencia. En este post se verán algunas otras herramientas que son sencillas y aunque se parecen en otras de esta misma categoría, se pueden alterar fácilmente y conceptualmente podrían funcionar en campañas de Red Team.

Phisher-man2

Es una herramienta escrita en Python con Flask y a diferencia de otras utilidades similares, ejecuta JPRQ como una alternativa a Ngrok.io. Su funcionamiento es simple, levanta un servidor en el puerto 5000 con Flask y a continuación,  ayuda a levantar un servidor web Apache en la máquina local con un botón que simplemente levanta el servicio de «apache2». En la sección de «scams», se selecciona el servicio que se quiere exponer con JPRQ y copia el directorio donde está el código HTML del servicio seleccionado en /var/www/html.

Hay que tener en cuenta que el Apache tiene que estar levantado antes de pinchar sobre cualquiera de los «scams», ya que al hacerlo, se levantará automáticamente JPRQ con xterm y generará una URL que apuntará a localhost en el puerto 80.

Nexphisher

Es un script muy parecido a ZPhisher, de hecho, en el repositorio oficial se aprecia que las plantillas disponibles en este proyecto se han tomado de ZPhisher, no obstante tiene una ventaja sobre la otra herramienta y es que soporta más servicios de forwarding. Concretamente se puede seleccionar cualquiera de los que se aprecian en la siguiente imagen

Los servicios LocalXpose y LocalHostRun pueden ser una alternativa interesante al clásico Ngrok y ambos se encuentran soportados en esta utilidad. Por lo demás, es un script como muchos otros de esta categoría en donde se genera un enlace, se envía a una víctima potencial y se recogen las credenciales introducidas.

Blackeye-im

En este caso es un script en bash que cuenta con más de 50 plantillas y permite utilizar una personalizada, esto puede ser útil en el caso de clonar un sitio concreto que no está en la lista o que se quiera integrar con una página clonada con SEToolkit, por ejemplo.

Otra ventaja que tiene es que se puede instalar sobre un dispositivo Android con Termux y es capaz de generar URLs acortadas utilizando TinyURL y Bitly.

Como se puede ver, aplicar este tipo de ataques no es nada complicado desde el punto de vista técnico y por ese motivo, es necesario prestar atención a los sitios que accedemos y los enlaces que llegan en correos electrónicos, ya sea de fuentes conocidas o no.

Un saludo y Happy Hack!
Adastra.

Categorías
automatizacion Hacking

15 herramientas imprescindibles para DevOps y DevSecOps – Parte 1 de 2

Demostración en vídeo de este post

Existe un amplio abanico de técnicas y herramientas aplicadas al DevSecOps y cada organización aplica las que considera necesarias dependiendo su propia cultura organizativa y plan estratégico. No es un proceso sencillo dada la amplia variedad de productos disponibles, por lo tanto se necesita una investigación previa para saber cuáles son las herramientas que realmente ayudarán a cumplir con los objetivos marcados, aquellas que aportarán soluciones y no más problemas.
Con esto en mente, encontrarás a continuación una lista de 15 herramientas que puedes aplicar a procesos de DevOps y DevSecOps que te pueden resultar interesantes.

1. JIRA

Es una solución de Atlassian que favorece la gestión ágil de proyectos y permite trabajar en equipo. Cuenta con tableros Scrum y Kanban para la asignación y seguimiento de tareas, así como la gestión de bitácoras para que todos los integrantes conozcan las actividades que se van a desarrollar en el calendario, así como los «issues» que se encuentran abiertos, cerrados y sin asignar. Además, por si fuese poco, para cada proyecto creado en Jira existe la posibilidad de gestionar ciertas etapas del SDLC, tales como los despliegues y las entregas.

¿Dónde se aplica en el SDLC?:
Se implementa desde la etapa de planificación y se utiliza durante todo el ciclo de vida del proyecto.

2. GitLab y GitHub

Ambas son soluciones muy extendidas y es posible que tengas algún repositorio creado en una o ambas. Sin embargo, han ido evolucionando y ahora no solamente son repositorios de fuentes, en el caso de GitLab hay funciones que permiten la integración y despliegue continuo por medio de ficheros de configuración que definen de qué manera se debe construir, probar, desplegar y montorizar. En el caso de GitHub existe GitHub Actions, que también permite realizar estas mismas funciones, aunque es probable que actualmente GitLab CI/CD sea una solución más adecuada que GitHub para entornos empresariales.

¿Dónde se aplica en el SDLC?: Inicialmente en la etapa de construcción para el almacenamiento del código y posteriormente, en las etapas de despliegue y release (liberación)

3. Eclipse IDE

Si la aplicación se encuentra escrita en Java, es posible que los desarrolladores utilicen Eclipse IDE. Es un entorno de desarrollo integrado que lleva más de dos décadas en desarrollo y cada vez es más estable y potente. Cuenta con múltiples integraciones que permiten realizar pruebas SAST sobre el código fuente y por supuesto, también le permite a los desarrolladores subir el código desarrollado a un SCM como GitHub y desplegar localmente las aplicaciones con servidores web integrados. Por otro lado, el IDE no solamente soporta Java, cuenta con complementos que permiten integrar otros lenguajes de programación como Python y C++

¿Dónde se aplica en el SDLC?: En la etapa de construcción y pruebas SAST

4. Visual Studio Code

Es un entorno integrado muy liviano que destaca por su simplicidad de uso y la cantidad de complementos que se pueden instalar, los cuales son los que realmente le brindan una potencia que pocos IDEs tienen. Entre otras cosas, cuenta con complementos que permiten verificar ficheros IaC tales como Dockerfile, Jenkinsfile y ficheros de configuración YAML de Kubernetes, así como otros que permiten la ejecución de programas basados en Python, Ruby o Java sin necesidad de «salir» del entorno.

¿Dónde se aplica en el SDLC?: En la etapa de construcción y pruebas SAST

5.  Apache Maven

Maven es uno de los proyectos más extendidos en las aplicaciones basadas en J2EE y permite, entre otras cosas, ejecutar la compilación, testing y empaquetado de una forma sencilla y ordenada. Probablemente uno de sus principales beneficios es la gestión de dependencias, lo que permiten controlar todas las librerías y sus correspondientes versiones desde un único fichero «pom.xml», con lo cual actualizar o cambiar la versión de una librería o componente resulta tan simple como cambiar dicho fichero.

¿Dónde se aplica en el SDLC?: En la etapa de construcción y pruebas SAST

6. Jasmine

Se trata de una librería muy potente para pruebas unitarias sobre código Javascript, lo cual no significa que solamente esté limitado a los frameworks en el lado del cliente, también es capaz de realizar pruebas sobre aplicaciones basadas en Node.js. Es muy similar a otros frameworks como JUnit o PyUnit, en donde se crean los casos de prueba y se ejecutan con el objetivo de comprobar que el código es capaz de responder a las condiciones declaradas.

¿Dónde se aplica en el SDLC?: En la etapa de pruebas SAST

7. Selenium

Selenium es uno de los proyectos Open Source más extendidos a la hora de ejecutar cualquier tipo de navegador web y ejecutar de forma automática, casos de pruebas que estarán compuestos por peticiones HTTP a uno o varios sitios web. Funciona  como una librería que se puede implementar en múltiples lenguajes de programación tales como Java, Python o Ruby y sobre la que se soportan decenas de herramientas de QA para realizar pruebas en aplicaciones web. De hecho, es una librería que implementan herramientas de pentesting web tales como ZAP (Zed Attack Proxy) a la hora de «levantar» un navegador web controlado por la herramienta y capturar todas las peticiones HTTP que se realizan desde dicho navegador.

¿Dónde se aplica en el SDLC?: En la etapa de despliegue para la ejecución de pruebas de calidad (QA) y DAST.

8. SonarQube

Es una herramienta muy potente que soporta el análisis de código sobre 17 lenguajes de programación. Cuenta con una versión comunitaria, la cual es Open Source y tres versiones comerciales con unas características y soporte añadido. Entre otras cosas, es capaz de analizar el código fuente de la aplicación y detectar vulnerabilidades, defectos y «code smells». Cuenta con una WebUI completa en el que es posible gestionar múltiples proyectos y usuarios, lo que facilita la gestión de los defectos encontrados y la asignación de los mismos a cualquier integrante del equipo.

¿Dónde se aplica en el SDLC?: En la etapa de pruebas SAST

Estas son las primeras 8 herramientas del listado, en el siguiente post se explicarán otras 7 herramientas que son muy habituales en DevOps y DevSecOps.

Un saludo y Happy Hack!
Adastra.

Categorías
Hacking Hacking Python Services - Software

Aprende a simular campañas de phishing de forma fácil y rápida – Parte 1 de 2

Demostración en vídeo de este post:

En los ejercicios de Red Team en algunas ocasiones se deben simular campañas de phishing con el objetivo de comprobar los niveles de seguridad de las personas que trabajan en la organización. Existen muchas herramientas para hacer esto y en éste y el siguiente post, mencionaré algunas de ellas que puede que te resulten interesantes.

Gophish

Es una herramienta de la que ya se ha hablado en el siguiente post, pero merece ser mencionada de nuevo ya que es muy potente y permite configurar campañas de Phishing en cuestión de minutos. La interfaz web es intuitiva y fiable, además se puede configurar de tal manera que múltiples usuarios se pueden conectar para lanzar nuevas campañas o ver el estado de las que se encuentran en ejecución.

Para usar la herramienta basta con seguir un procedimiento sencillo, en primer lugar se debe configurar como mínimo un servidor SMTP para el envío de los correos electrónicos y luego, el pretexto propiamente dicho, es decir, el mensaje de correo junto con otros elementos como imágenes, documentos y landing pages. Una vez preparada la campaña, se debe subir la lista de direcciones de correo y finalmente se lanza. Lo cierto es que no tiene una dificultad alta y prácticamente cualquiera puede configurar campañas de phishing utilizando esta herramienta.

ZPhisher

Cuenta con más de 30 plantillas para servicios de uso común tales como Facebook, Instagram, Netflix, entre otros. Es un script en bash que requiere algunas dependencias mínimas que en prácticamente cualquier sistema Linux ya se encontrarán instaladas y cuando se ejecuta, enseña un menú en el que se puede elegir alguno de los servicios soportados. Una vez se selecciona uno de ellos, en la siguiente pantalla enseña la forma en la que se debe desplegar dicha plantilla, ya se en localhost, Ngrok.io o Cloudflare

Después de seleccionar una de las opciones, la herramienta enseñará un submenú en el que aparecen otras alternativas para la generación de plantillas maliciosas para el servicio seleccionado. El último paso consiste en seleccionar el tipo de servicio para desplegar la plantilla y finalmente, generará una URL a enviar al usuario. En el caso de que la herramienta se ejecute en un servidor público que está específicamente diseñado para realizar las pruebas de phishing, no será necesario indicar un servicio como Ngrok.io o Cloudflare.
La URL generada se puede enviar a los destinatarios, con Gophish por ejemplo. Si alguien accede a dicha URL e introduce sus credenciales, dichos valores serán capturados y la herramienta además de enseñarlos en la terminal, también los guardará en un fichero.

SocialPhish

Aplicación desarrollada en Python que se encarga de clonar en el servidor local una URL indicada. Es de fácil uso y permite capturar la interacción del usuario con el sitio web clonado. Solamente basta con ejecutar el script Python y acceder a la consola de administración, a continuación se introduce la página que se desea clonar y el dominio al que se debe redirigir al usuario cuando activa algún formulario.

Ahora, en cuanto el usuario accede al servidor de SocialFish, el cual se levanta por defecto en el puerto 5000, se enseñará la página clonada y SocialFish capturará su interacción.

Además de lo anterior, en la interfaz de administración también se encuentra habilitado un botón para enviar un correo electrónico, en donde se puede indicar cuál es el servidor SMTP que se utilizará para dicho envío, lo cual sirve como un soporte básico a la campaña de phishing.

Como se puede apreciar, son herramientas simples que permiten simular ejercicios de ciberseguridad orientados al phishing, requieren una personalización para adaptarlos al trabajo habitual de una persona que trabaja en equipos de Red Team, pero es una buena base. Junto con otras herramientas tan potentes como Evilginx2, se pueden conseguir buenos resultados si se elaboran buenos pretextos de ingeniería social.
En el siguiente post se verán más herramientas sencillas y de uso rápido para phishing.

Un saludo y Happy Hack!
Adastra.

Categorías
FileSystem Hacking Hacking Python Programacion

Cómo crear una reverse y bind shell con Python – Parte 3 de 3

Demostración en vídeo de este post

Cómo crear una reverse y bind shell con Python – Parte 1 de 3

Cómo crear una reverse y bind shell con Python – Parte 2 de 3

En esta última entrega veremos cómo crear una bind shell con Python. En realidad es algo que no tiene mucha complejidad ya que se aplican los mismos principios y librerías que se han visto en las dos partes anteriores, solamente que en este caso el sentido de la conexión cambia y es ahora el la víctima quien levanta el servidor y espera una conexión entrante por parte del atacante.
Para crear una bind shell, será necesario utilizar el módulo «socket» y sobre una instancia de la clase «Socket», invocar a los métodos «bind», «listen» y «accept» en este orden.

Lo que se aprecia en la imagen anterior sería perfectamente válido para levantar un servidor TCP plano y aceptar una conexión, aunque evidentemente aún falta implementar más instrucciones.
El siguiente paso consistiría en gestionar la conexión, concretamente los flujos de entrada, salida y error. Dado que lo que se pretende es «recibir bytes» por parte del socket cliente y a continuación, pasar esas cadenas al sistema operativo para que las ejecute en forma de comandos, el flujo de entrada es precisamente lo que interesa gestionar en primer lugar.

En este caso se utiliza la función «select» que representa un envoltorio de la system call «select» en sistemas Unix y se utiliza el file descriptor del socket cliente para recibir los datos que envía el atacante desde su máquina. Finalmente, tal como se ha visto en los dos artículos anteriores, se utiliza la clase Popen con el objetivo de crear un proceso y ejecutar el comando que se está enviando en el socket. En este caso, el programa es capaz de aceptar múltiples clientes y por lo tanto, las referencias de cada uno de ellos se van almacenando en una lista en la que se van añadiendo o eliminando las conexiones entrantes.

En la consola superior se observa la ejecución del script que permite establecer la bindshell y en la consola inferior, desde la máquina del atacante se establece la conexión que permite la ejecución de instrucciones.

Ahora bien, en este caso nuevamente el tráfico no se encuentra cifrado, por lo tanto sería posible capturar dichos paquetes en la red y ver su contenido. La solución a este problema podría ser utilizar Paramiko tal como se ha mencionado en el post anterior a este para establecer conexiones cifradas con SSH, algo que puedes hacer cambiando un poco las instrucciones de los scripts que se han enseñado en la parte dos de esta serie.

Un saludo y Happy Hack!
Adastra.

Categorías
Hacking Hacking Python Networking Programacion

Cómo crear una reverse y bind shell con Python – Parte 2 de 3

Demostración en vídeo de este post

En la parte 1 de esta corta serie se ha explicado el uso del SDK de Python para crear una «reverse shell», algo que se consigue con muy pocas líneas de código, sin embargo la conexión es plana y cualquiera podrá ver el tráfico entre cliente y servidor (víctima y atacante). En esta ocasión, se utilizará la librería Paramiko para conseguir el mismo objetivo, pero cifrando el tráfico con SSH.

En este caso el código es un poco más complejo comparado con lo que se ha explicado en el post anterior, pero perfectamente funcional. En primer lugar, es necesario crear el código correspondiente al servidor SSH, el cual se puede apreciar en la siguiente imagen

El paquete de Paramiko cuenta con una clase llamada «ServerInterface«, que permite implementar un servidor SSH básico y aunque en el ejemplo anterior se utiliza un mecanismo de autenticación basado en un usuario y contraseña incrustados en el código, se podría utilizar otro mecanismo más robusto basado en clave pública si fuese necesario.

Crear una clase que extienda de «ServerInterface» no es suficiente, ahora es el momento de crear un servidor TCP utilizando el módulo socket disponible en Python, aceptar las conexiones por parte de los clientes y a continuación, crear un objeto «Transport» de Paramiko para la gestión y cifrado de dicha conexión TCP. El código sería el siguiente

En este script hay que tener en cuenta que se ha creado antes una clave para el servidor, lo cual se puede conseguir fácilmente con la herramienta ssh-keygen. En este caso, dicha clave se encuentra en el directorio /home/adastra/.ssh/id_rsa, por lo tanto se tendría que cambiar esta ruta si la clave se encuentra en otro sitio. Por otro lado, se puede apreciar que la clase Transport es la que realmente se encarga de iniciar el servidor SSH usando el método «start_server» y a continuación, establece conexiones SSH con los clientes. Este servidor solo aceptará una conexión entrante por simplicidad, pero si hace falta, se puede crear un thread por cada cliente que intente conectarse utilizando el módulo threading.

Este script se ejecutaría en la máquina del atacante y esperará a que un cliente (víctima) se conecte.

Ahora es el momento de implementar el cliente, es decir, el payload que se ejecutará en la máquina de la víctima. En este caso es más sencillo, ya que basta con indicar los datos de conexión del servidor y utilizar nuevamente paramiko para establecer la conexión.

Por simplicidad, se utiliza la función «input» para poder introducir los datos de conexión con el servidor SSH, aunque en una muestra lo habitual sería indicar estos valores directamente en el código. Como se puede ver, basta con crear una instancia de la clase SSHClient y a continuación, establecer la conexión con el método «connect». Finalmente, se procede a abrir un «Channel» para poder enviar y recibir paquetes utilizando la conexión SSH de manera indefinida o hasta que el comando por parte del servidor (es decir, el atacante) sea «exit».

En la imagen anterior se puede ver que en la terminal superior se encuentra el servidor (máquina del atacante) y recibe la conexión por parte del cliente, que se encuentra en la terminal inferior. Una vez establecida dicha conexión, desde el servidor se pueden introducir comandos o instrucciones que se van a ejecutar directamente en la máquina del cliente gracias al módulo subprocess de Python.

Si quieres tener acceso al código, puedes consultar el repositorio en GitHub en donde encontrarás el fichero ssh_server.py y ssh_payload.py

Un saludo y Happy Hack!
Adastra.

Categorías
Hacking Hacking Python Programacion Services - Software

Cómo crear una reverse y bind shell con Python – Parte 1 de 3

Demostración en vídeo de este post

Existen cientos de herramientas que te permiten crear una reverse o bind shell, desde la forma más simple y tradicional que consiste en utilizar Netcat, hasta el uso de herramientas como Chisel, Empire Framework, Merlin, Covenant o Metasploit. Existen muchas formas de hacerlo, sin embargo en este post se explicará cómo utilizar el SDK de Python para crear rutinas que permitan establecer una reverse shell sin tener que usar librerías externas, algo que viene estupendamente cuando se pretende crear rutinas que sean lo suficientemente sigilosas como para evadir mecanismos de seguridad en la víctima. Por norma general, las muestras creadas «a mano», suelen dar mejores resultados en la etapa de evasión, por éste motivo y muchos otros, es fundamental saber programar. Nunca me cansaré de repetirlo 🙂

¿Cómo implementar una reverse shell usando Python?

Como es evidente, hace falta contar con una instalación de Python, lo cual en un sistema basado en Linux no es problema ya que se encuentra instalado por defecto en prácticamente todas las distribuciones, pero si se trata de un Windows es necesario hacerlo manualmente.
Para implementar una reverse shell en Python es necesario  módulo socket el cual incluye todas las funcionalidades necesarias para crear clientes y servidores TCP. Gracias a la la función connect de la clase Socket, es posible establecer una conexión a una IP/dominio y puerto concreto, resulta extremadamente sencillo hacerlo en Python.

En este caso, al ser una reverse shell, es necesario que en la máquina del atacante se encuentre el puerto abierto que será el encargado de recibir la conexión reversa. Se puede utilizar nuevamente Python para ello, basta con crear un servidor TCP plano, pero dado que es la máquina del atacante, se tendrá un total control sobre ella y se puede utilizar una herramienta como socat o netcat para recibir la conexión.
El siguiente paso es el más interesante, ya que es necesario duplicar los fd (file descriptors) correspondientes a los flujos de entrada, salida y error del socket para luego vincularlos a un nuevo subproceso, que será el que genera la shell.

La instrucción os.dup2, es simplemente un envoltorio de la system call «dup» que permite duplicar un file descriptor, que es justo lo que hace falta en este punto para que toda la interacción del programa «/bin/bash» sea enviada al atacante por medio del socket.

Como se puede ver, la creación de una reverse shell en Python no es nada compleja y se puede conseguir en cuestión de minutos, sin embargo en este punto merece la pena mencionar que la conexión es plana, lo que significa que un IDS o cualquiera en la red, podrá ver la interacción entre el atacante y la víctima. El siguiente paso por lo tanto, consiste en crear una reverse shell que tenga algún mecanismo de cifrado que impida que las actividades puedan ser detectadas fácilmente. Esto, se verá en el siguiente post.

Un saludo y Happy Hack!
Adastra.