Categorías
Hacking Programacion Web Applications

Las mejores utilidades para Hacking web

Vídeo en YouTube

El hacking web no es sencillo, requiere tener un conocimiento profundo de la aplicación que auditas y las vulnerabilidades que se pueden producir.

Creo que una habilidad importante para poder descubrir problemas, consiste en fijarse en los detalles, tener “olfato” cuando se analizan las peticiones y respuestas HTTP, además, tener conocimientos en desarrollo web en mi opinión es altamente recomendable.

A diferencia de otros contextos del pentesting, este es uno de los más complejos y da mejores resultados cuando se aplica un enfoque semiautomático, lo que significa que muy probablemente no te va a servir de nada lanzar herramientas sin saber muy bien qué es lo que hacen, hay que intervenir en el proceso y realizar las pruebas a mano. Ahora bien, esto no implica que tengas que hacer todo con CURL o cualquier cliente HTTP, existen algunas herramientas que son muy útiles y que si te quieres dedicar al pentesting web, te recomiendo dominar.

  • Burp y ZAP

    Aunque funcionan por separado, los beneficios de integrar ambas herramientas en tu proceso de pentesting son innegables. Ambas permiten interceptar las peticiones HTTP por medio de un proxy y, a continuación, hacer lo que quieras con dichas peticiones, todo al vuelo o utilizando el historial de peticiones capturadas anteriormente. En ambas herramientas, destaca la cantidad de complementos y extensiones que facilitan ciertas labores de pentesting. Si bien ZAP es una herramienta opensource muy completa, si te dedicas al pentesting web profesional, es altamente recomendable tener una licencia de Burp Suite PRO

  • Nuclei Framework

    Esta herramienta es perfecta para ejecutar pentesting semiautomático. Se basa en un modelo de plantillas, en donde indicas la forma en la que la herramienta debe ejecutar las peticiones y de qué manera se deben interpretar las respuestas. Con Nuclei, puedes usar las plantillas que ya han sido creadas por la comunidad o crear las tuyas, siempre empleando una sintaxis sencilla basada en ficheros YAML.

  • Postman

    Es uno de los clientes HTTP más potentes que se encuentran disponibles actualmente. Cuenta con la posibilidad de crear colecciones de peticiones HTTP y definir características comunes a todas ellas. Es ideal para probar APIs Rest y levantar servidores locales (fake) para realizar pruebas con las colecciones.

  • WPScan y JoomScan

    Si tienes que analizar un sitio web que tiene algún CMS, es posible que te interese utilizar alguna de estas herramientas, ya que, entre otras cosas, son capaces descubrir configuraciones inseguras o complementos vulnerables en WordPress y Joomla.

  • Complementos en el navegador: Hack-Tools, Wappalyzer, FoxyProxy y DNSLytics

    El navegador siempre será una de las herramientas más usuales cuando haces pentesting web. No solamente por el hecho de que te permite explorar un sitio web, además, los navegadores modernos soportan cientos de extensiones que te aportan información sobre la página que estás analizando. Estas son solo algunas de las extensiones más interesantes para recolección de información y pentesting con Firefox y Chrome, pero hay muchas más, deja un comentario si quieres compartir alguna otra que tengas instalada.

  • Scripts NSE de Nmap y Módulos auxiliares de Metasploit Framework

    Tanto Nmap como Metasploit Framework son utilidades habituales en pentesting en entornos de red, pero también cuentan con rutinas muy interesantes para descubrir características de un servidor web y las aplicaciones que se encuentran alojadas en él. En el caso de Nmap, viene por defecto con ciertos de scripts NSE, muchos de ellos orientados al mundo web y en el caso de MSF, existen varios módulos auxiliares que te permiten descubrir vulnerabilidades en servidores y aplicaciones web.

Estas las que más utilizo, no obstante, hay muchas otras que están disponibles y que son muy chulas. Deja un comentario indicando alguna otra herramienta que no está en esta lista y que consideras que debería estar.


Recuerda que puedes registrarte en la comunidad THW: https://comunidad.thehackerway.es/registro

En este sitio web recibirás anuncios sobre ofertas de trabajo y novedades del sector, además podrás participar en los foros y ganar premios por ello.
Puedes acceder a los cursos cortos y artículos con una suscripción: https://comunidad.thehackerway.es/suscripcion
Los contenidos a los que tendrás acceso te serán útiles para comprender por qué no consigues trabajo en el sector o mejoras profesionalmente y, por supuesto, proponerte ideas para mejorar esa situación.

Por otro lado, también tienes todas las formaciones y packs de The Hacker Way. Las mejores formaciones en castellano que podrás encontrar. Y no lo digo yo, puedes ver las reseñas en el sitio web. Más de 500 alumnos han aprovechado los cursos online en THW y tú también podrías ser uno de ellos: https://thehackerway.es/cursos

¡Un saludo y Happy Hack!
Adastra.

Categorías
Hacking Hacking Python Networking Programacion Services - Software

Cómo crear una reverse shell cifrada

Demostración en vídeo del post:

Las reverse shell representan uno de los payloads más comunes, se trata de un tipo de rutina que le permite a un atacante recibir una conexión desde el sistema comprometido y sobre ésta, ejecutar instrucciones en dicha máquina. Existen decenas de alternativas a la hora de crear este tipo de payloads, desde la posibilidad de utilizar un programa tan conocido como «netcat» hasta la creación de rutinas en un lenguaje de programación como Python.

No obstante, una de las cosas que en ocasiones olvidamos es que estas conexiones suelen ser planas y fáciles de detectar por cualquier IDS. Por este motivo es una buena idea conocer alternativas que permitan cifrar la conexión que se establece en una bind o reverse shell.

¿Cuál es el problema?

Para ver claramente lo que pasa cuando se establece una conexión reversa con netcat u otra utilidad, se puede iniciar un sniffer y capturar el tráfico. Si la herramienta o rutina utilizada no implementa algún mecanismo de cifrado, se podrán ver en los paquetes de datos los comandos enviados por el atacante y las respuestas devueltas por la víctima.

Esto por supuesto que no es bueno, pero tiene fácil solución si cuando creas tu shell con Python u otro lenguaje, utilizas alguna librería o protocolo de cifrado.

Cifrar la conexión con OpenSSL

La primera opción que se nos puede ocurrir es utilizar OpenSSL, ya que además de generar claves y certificados, también permite el establecimiento de conexiones mediante SSL/TLS.

Lo primero que se debe hacer es crear la clave privada y luego el certificado con el que se establecerá la conexión

openssl req -newkey rsa:2048 -nodes -keyout atacante.key -x509 -days 1000 -subj ‘/CN=thehackerway.com/O=The HackerWay’ -out atacante.crt

Se puede generar un PEM partiendo de la clave privada y certificado generado previamente, para ello basta con copiar los contenidos del fichero «atacante.key» y «atacante.crt» en un nuevo fichero llamado «atacante.pem».

Ahora es posible levantar el componente servidor en la máquina del atacante y finalmente, establecer la conexión desde la máquina víctima.

Socat con OpenSSL

Partiendo del fichero PEM generado anteriormente, otra alternativa que puede ser interesante consiste en utilizar Socat. El procedimiento también es muy sencillo, aunque en la máquina comprometida tiene que estar instalada dicha herramienta y este requisito no siembre se cumple. En todo caso, es otra opción que merece la pena conocer y tener en cuenta.

Cifrar la conexión con Ncat

Ncat ha sido desarrollada con la idea de evolucionar Netcat y soportar protocolos como TCP y UDP sobre IPv4/IPv6. Partiendo de esta idea, es tan potente como Socat y permite establecer todo tipo de conexiones siguiendo el modelo cliente-servidor. Una de alternativas de uso de Ncat consiste en el cifrado de la conexión, sin embargo, tal y como ocurre con Socat, la herramienta debe estar instalada tanto en el cliente como en el servidor.

He explicado algunas alternativas, aunque lo cierto es que hay muchas más que sirven para lo mismo. En el siguiente post mencionaré algunas dos más, incluyendo un proyecto que ha sido publicado recientemente y que tiene buena pinta 🙂

Un saludo y Happy Hack!
Adastra.

Categorías
Hacking Hacking Python Programacion Services - Software

Cómo crear scripts en Python que utilicen la red de TOR: Parte 1 de 2

Demostración en vídeo de este post:

La red de TOR es ampliamente difundida y permite evadir restricciones de acceso a redes o sitios censurados, así como navegar de forma anónima por la darknet o clearnet. Por otro lado, en ocasiones es necesario automatizar algunas actividades, ya sea para realizar labores de pentesting, spidering, scrapping, etc. Si por el motivo que sea, estas actividades se deben llevar a cabo de forma anónima, resulta conveniente saber qué alternativas tenemos disponibles para realizar conexiones de red desde Python pasando por el servicio SOCKS que levanta cualquier instancia de TOR. En éste y el siguiente post, te enseñaré algunas librerías disponibles para esto y los beneficios que aportan.

Peticiones HTTP utilizando Requests

Requests es probablemente la librería más conocida entre aquellos desarrolladores que necesitan utilizar Python para ejecutar peticiones HTTP. Destaca por su versatilidad y facilidad de uso, con muy pocas instrucciones se pueden crear clientes HTTP completos para hacer cosas tan simples (o complejas) como ejecutar procesos de análisis de peticiones y respuestas o consumir de forma programática una API Rest. No obstante, si lo que se pretende es que las peticiones HTTP que realiza Requests pasen por TOR sin exponer la identidad real del cliente (dirección IP), es necesario indicarle a la librería la configuración del proxy SOCKS. Como prácticamente todo en Requests, configurar un proxy SOCKS no es complicado, basta simplemente con pasarle un diccionario con los detalles necesarios.

Como se puede apreciar en la imagen anterior, con muy pocas líneas de código se puede establecer una conexión a un sitio web en Internet utilizando una instancia de TOR en ejecución. Solamente hay que tener en cuenta que en este caso el proxy SOCKS se encuentra en levantado en el puerto 9150, ya que éste puerto es el valor por defecto de TorBrowser. A la hora de realizar la petición HTTP solamente es necesario tener en cuenta que se debe enviar el parámetro «proxies» con el diccionario declarado previamente. Este parámetro se encuentra definido en todas las funciones del módulo «requests» para hacer peticiones HTTP, tales como «get», «post», «put», «delete», etc.

Ahora bien, cuando se utiliza Requests la cabecera «User-Agent» de la petición no corresponde a la de cualquier navegador web de uso común, con lo que es fácilmente identificable que la petición HTTP se está llevando a cabo desde un script o bot. Para evitar esta situación, es habitual utilizar una librería como fake_useragent, la cual se encuentra disponible en el PYPI y se puede instalar con «pip install fake_useragent«.

Iniciar una instancia de TOR desde Python

En los párrafos anteriores se asumía que ya estaba levantada la instancia de TOR, en este caso concreto utilizando TorBrowser, sin embargo es probable que se quiera levantar una instancia de TOR aislada sin el navegador web de TorBrowser, es decir, solamente el programa de TOR y su proxy SOCKS sin más componentes añadidos. En este caso, es recomendable utilizar una librería como TxTorCon o Stem, en cualquiera de estas librerías se iniciará una instancia de TOR con la configuración que se le quiera pasar. El proceso es muy sencillo y puede venir bien cuando sea necesario ejecutar la instancia de TOR y el script de Python en un sistema que no cuente con un entorno gráfico (como un servidor basado en Unix). Eso sí, es necesario instalar la instancia de TOR manualmente.

Como se puede ver en la imagen anterior, se levanta una instancia de TOR que previamente ha sido descargada y compilada desde torproject.org y a continuación, se le envía un diccionario con la configuración que deberá utilizarse. Se envía una función de callback como parámetro de la función «launch_tor_with_config» para ver todos los eventos producidos y a partir de este punto, se podrían ejecutar peticiones con Requests tal como se ha explicado previamente, lo único que habría que cambiar es el puerto donde se ha iniciado la instancia de TOR que en este caso, se encuentra definido en el script.

Si bien en este post se ha visto cómo realizar peticiones HTTP con Requests utilizando TOR, existe una alternativa que permite gestionar mucho mejor las peticiones y evitar los «DNS Leaks», concretamente usando el objeto «Session» de Requests, algo que explicaré en el siguiente post. Espero que éste te haya gustado y si ese es el caso, puedes dejar un comentario y compartirlo con tus amigos o colegas.

Un saludo y Happy Hack!
Adastra.

Categorías
automatizacion devsecops Hacking Programacion

10 plugins para Jenkins que pueden ayudar a definir tu DevOps y DevSecOps – Parte 1 de 2

Demostración en vídeo del post

Jenkins es una de las herramientas más utilizadas en el mundo del CI/CD y por supuesto, del DevSecOps. Sus características le han permitido ganar una cuota de mercado amplia, a la fecha de redactar este post es posiblemente la solución más extendida en equipos de DevOps en las empresas españolas. Por este motivo, merece la pena conocer sus funcionalidades y en esta ocasión, os traigo 10 complementos para Jenkins que soportan las actividades del SDLC, DevOps y DevSecOps. Además, te recuerdo que tienes disponible el curso Técnicas y herramientas aplicadas a DevSecOps en el que aprenderás a realizar procesos de CI/CD con Jenkins y la integración de un amplio conjunto de herramientas del tipo SAST y DAST.

1. Kubernetes

Se trata de un complemento interesante que permite ejecutar múltiples agentes de Jenkins dentro de un cluster de Kubernetes. Su funcionamiento consiste en la creación de un POD en Kubernetes para cada agente que se quiera desplegar en el enjambre y se encarga de detenerlo después de cada construcción.
Los agentes se lanzan como «inbound agents», por lo que el contenedor se conectará automáticamente al servidor central de Jenkins cuando sea necesario ejecutar una job de estilo libre o pipeline. Cuando dicho job finaliza, el contenedor se destruye automáticamente.

2. Monitoring

JavaMelody es una aplicación muy conocida entre desarrolladores de J2EE y sirve para monitorizar las aplicaciones que se despliegan en un servidor web para detectar picos de carga y posibles problemas de rendimiento, así como ejecutar algunas otras operaciones de gestión del desempeño básicas. Jenkins está desarrollado en Java, por lo que resulta natural que este plugin se encuentre disponible en la plataforma para medir el rendimiento y generar métricas sobre su uso.

3. Nuclei

Entrando en el terreno del DevSecOps, existe un complemento que permite integrar Jenkins con Nuclei. Si bien es algo que se puede hacer utilizando un pipeline de Jenkins, tal como se enseña en el curso de Técnicas y herramientas aplicadas a DevSecOps, este complemento puede ser una alternativa. Su funcionamiento es simple, descarga el binario de nuclei desde el repositorio oficial y a continuación, hace lo mismo con las plantillas incluidas en el repositorio de nuclei-templates. Finalmente, le permite al usuario crear un job de estilo libre en el que uno de los pasos de ejecución puede ser un escaneo con nuclei, en donde solo hace falta indicar la URL de la aplicación web que se debe escanear.

4. Probely Security

Probely es otra herramienta que permite el análisis de vulnerabilidades en aplicaciones web en ejecución, es decir, una herramienta del tipo DAST en un pipeline de DevSecOps. A diferencia de Nuclei que se ejecuta localmente, Probely se ejecuta en un servicio online que ejecuta el proceso de escaneo de forma automática cuando recibe una orden de ejecución. Para integrar Jenkins con esta herramienta, es necesario dirigirse a la sección de «integraciones» disponible en  dicho servicio y a continuación, generar un token que deberá ser incluido en la sección de credenciales de Jenkins. Este plugin permite la ejecución de Probely sobre una aplicación concreta desde un job de estilo libre o un pipeline.

5. Uleska

Por otro lado nos encontramos con Uleska. Un servicio interesante que ejecuta múltiples herramientas del tipo DAST y SAST sobre una aplicación web, a continuación hace un «merge» de los descubrimientos de cada una de ellas y finalmente enseña un informe. Se puede integrar en Jenkins y otras soluciones de CI/CD, por lo que representa una plataforma interesante y que llama poderosamente la atención cuando nos fijamos en la cantidad de herramientas que integra. La versión gratuita permite un máximo de 100 peticiones al mes, lo cual suele ser suficiente para hacer algunas pruebas y hacerse con una idea sobre cómo funciona y a partir de ese punto, es posible que resulte interesante adquirir un plan de pago en el que no se tengan tantas restricciones de uso.

Hemos visto 5 plugins para Jenkins que vienen muy bien cuando se trabaja siguiendo la cultura de DevOps/DevSecOps y el próximo articulo te enseñaré 5 más, no obstante, en tu opinión ¿qué otro plugin para Jenkins podríamos incluir en esta lista?

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.

Categorías
automatizacion Hacking Hacking Python Programacion

Python y Scanless: Escaneos automáticos usando servicios online

Demostración en vídeo de este post:

Una alternativa a la hora de automatizar los escaneos con Nmap es por medio de la integración entre Python y Nmap usando librerías como python-nmap, sin embargo, existen otras alternativas que también pueden ser interesantes. En este post vamos a hablar de Scanless.

Tal como se describe en el proyecto de Github, se trata de una herramienta que se puede ejecutar desde una terminal o como una librería para Python y utiliza servicios en Internet para ejecutar escaneos. Esto significa que se puede obtener información sobre los puertos abiertos en un objetivo concreto sin interactuar directamente con él, serían actividades semipasivas y que pueden encajar en lo que conocemos como técnicas OSINT.

A la fecha de redactar este post soporta los siguientes servicios online:

Tanto el uso de la librería como de la utilidad por línea de comandos es muy simple, en primer lugar se debe instalar con el comando «pip install scanless» y a continuación, se puede lanzar el comando «scanless» desde la terminal.

Cuenta con pocas opciones, las suficientes para poder lanzar escaneos con el servicio adecuado. Concretamente con «-l» se listan los servicios que soporta, con «-s» se puede indicar el nombre de uno de dichos servicios y con «-t» el objetivo que se pretende analizar.

Esto es todo, se ha ejecutado un escaneo utilizando la plataforma de un tercero. Además de esto, tal como se mencionada antes, scanless también cuenta con una API para Python muy simple que permite automatizar este proceso.

Como se puede apreciar, en primer lugar se importa el módulo «scanless», a continuación se crea un objeto del tipo «Scanless» y partiendo de dicho objeto, se ejecuta un escaneo con el servicio y objetivo indicados en el método «scan». El resultado es una estructura del tipo «dict», la cual permite acceder de forma ordenada a cada uno de los resultados del escaneo. Finalmente, como ocurre con todos los objetos dict en Python, se puede convertir a una estructura en formato JSON y si es necesario, enviar estos contenidos a un servicio Rest o guardarlos en una base de datos no relacional, lo importante es que ya se cuenta con la información y se puede procesar como resulte conveniente desde un script en Python.

Es una librería sencilla que ayuda en las primeras etapas de un pentest y que sin duda, se debería tener muy en cuenta en las primeras etapas de una auditoría externa. No te va a costar mucho, así que animate a probarla si no la conoces 🙂

Un saludo y Happy Hack!
Adastra.

Categorías
Hacking Hacking Python Programacion

Integración de Python con Nmap

Demostración en vídeo de este post:

Me atrevería a afirmar que Nmap es la herramienta más difundida en el mundo del pentesting y el Hacking, gracias al tiempo que lleva en desarrollo, cuenta con funcionalidades que son ideales para las primeras etapas de una auditoría de seguridad y por lo tanto, es fundamental conocerla en profundidad. No obstante, en ocasiones resulta interesante crear scripts y rutinas que permitan automatizar la ejecución de ésta y otras herramientas y una buena forma de hacerlo es con Python que gracias al amplio conjunto de librerías existente, facilita mucho esta tarea.

En primer lugar, hay tener en cuenta que existen muchas formas de integrar un lenguaje de programación como Python (o cualquier otro) con una utilidad como Nmap, por ejemplo se podría ejecutar la herramienta desde un script con la función os.system o con Popen y luego «parsear» la salida incluida en el flujo de STDOUT, pero este enfoque puede que no sea el más limpio u optimo. Es mejor utilizar alguna librería que ya incluya estas rutinas en lugar de «reinventar la rueda» y en este sentido, tenemos python-nmap.

Uso de Python-nmap

Se puede instalar con el comando «pip install python-nmap» y a continuación, es posible utilizar su API en un script o desde el interprete de Python. Por ejemplo:

La clase PortScanner se encarga de ejecutar el comando «nmap», por lo tanto la herramienta se debe encontrar instalada en el sistema y su directorio de instalación, ubicado en la variable de entorno PATH.
Por otro lado, cuando el escaneo finaliza los resultados se almacenan en un objeto del tipo «dict» lo que facilita trabajar con los datos al encontrarse estos en una estructura ordenada. Además, un objeto del tipo PortScanner cuenta con varios métodos que ayudan a obtener información sobre el escaneo que se ha realizado

Aunque la clase PortScanner es la que se suele utilizar con más frecuencia, también es posible ejecutar el escaneo en un segundo plano mientras el script realiza otras actividades, esto se consigue con la clase PortScannerAsync

Además de las clases PortScanner y PortScannerAsync, hay otro elemento que permite ejecutar escaneos con Nmap, en este caso de forma progresiva. La clase PortScannerYield se encarga de ejecutar el escaneo con Nmap y devolver cada resultado que la herramienta va generando. Esto es especialmente útil cuando se analiza un entorno de red completo y no se quiere esperar a ver resultados hasta que el escaneo termine sino de forma progresiva en la medida en la que Nmap va generando información.

Finalmente, para acceder a los resultados del escaneo es necesario recorrer la estructura, que como se ha mencionado anteriormente, es un objeto del tipo «dict». En este punto, es necesario consultar las claves de cada sección de la estructura e ir extrayendo la información que se necesita.

Como has podido comprobar, se trata de una librería sencilla y que permite ejecutar Nmap desde cualquier script en Python, aunque python-nmap es una buena alternativa, no es la única librería que hace esto, conviene revisar el Pypi para ver otras alternativas que pueden resultar igualmente interesantes.

Un saludo y Happy Hack!
Adastra.

Categorías
Hacking Hacking Python Programacion

PyScript: Ejecuta scripts en Python en tu navegador web – Parte 2 de 2

Demostración en vídeo de este post

En el post anterior que puedes leer en el siguiente enlace, se han explicado las características de PyScript y los motivos por los que resulta un proyecto interesante, aunque aún en desarrollo y habría que ver cómo evoluciona en los próximos meses. Una de las limitaciones que tiene es que no parece contar con rutinas que permitan la carga de otras librerías diferentes a las que ya se encuentran definidas en el proyecto, algo que a la fecha de redactar este post no se encuentra documentado en ningún sitio en el proyecto. No obstante, el «core» de Python puede ser suficiente para las operaciones que se ejecutarían en el contexto de un navegador web. Precisamente con el core del lenguaje se pueden hacer muchas cosas, como por ejemplo realizar peticiones HTTP a sitios web o establecer conexiones TCP. Se trata de operaciones que habitualmente se llevan a cabo en procesos de pentesting con Python y por supuesto, se pueden probar con PyScript.

Peticiones a sitios remotos desde PyScript

En este caso, no se cuenta con librerías como requests, pero se puede utilizar el módulo «urllib» y aunque son bien conocidas sus limitaciones puede valer para hacer las pruebas. El siguiente bloque de código se incluye en la etiqueta <py-script> para comprobar si efectivamente, es posible establecer una conexión.

Como cualquier petición HTTP, requiere el establecimiento de una conexión TCP con el host destino, en el caso de la imagen anterior es httbin.org. Al intentar ejecutar este código con PyScript, ocurre lo mismo que con un runtime de Pyodide en cualquier navegador web, es decir, el navegador impide el establecimiento de la conexión tal como se enseña en la siguiente imagen.

Esto ocurre al intentar ejecutar una petición HTTP pero, ¿qué pasa si se intenta establecer una conexión TCP directa? pues más o menos lo mismo como se verá a continuación.

Reverse y bind shells desde PyScript

Se utiliza el siguiente código, el cual corresponde al establecimiento de una bindshell con Python. Es una rutina sencilla que funciona sobre cualquier sistema operativo que tenga Python instalado y en dicho escenario, el puerto indicado se abrirá sin problema, pero en este caso es el navegador web es el que debe realizar dicha operación.

Aunque el código indicado anteriormente es correcto, la operación no se puede llevar a cabo debido a las restricciones que impone el navegador web sobre el runtime de Pyodide, es decir, que no será posible abrir el puerto aunque el usuario con el que se está ejecutando el proceso del navegador tenga permisos para hacerlo.

¿Con una reverse shell ocurre lo mismo? con la explicación anterior se puede deducir que sí, pero como siempre, se debe probar por si «hay suerte» y se consigue algún resultado positivo. El siguiente código representa el payload de una reverse shell en Python muy simple, utilizando unicamente los elementos disponibles en la librería estándar de Python.

Antes de ejecutar este script en la página HTML, sería necesario levantar el puerto 4444 en la máquina local, usar Netcat será suficiente y lo más sencillo. A continuación, tal como se puede comprobar en la siguiente imagen, se produce un error ya que en este caso, aunque se establece una conexión HTTP, el runtime de pyodide se encarga de realizar una petición  WS (Web Sockets) al destino y evidentemente, Netcat no está preparado para tratar adecuadamente dicha petición, simplemente enseña por la terminal la petición HTTP y sus correspondientes cabeceras.

En este punto parece claro que si se desea establecer una reverse shell es necesario crear un servidor que admita peticiones con WebSockets y un cliente personalizado, algo que por supuesto, es posible hacer en Python con la librería «websockets». En el lado del servidor sería tan simple como instalar con «pip install websockets» y junto con el módulo «asyncio» levantar el handler correspondiente, sin embargo, también habría que crear el cliente, algo que con Javascript se puede hacer sin ningún problema ya que está preparado para ello, pero en este caso concreto la API core de Python no cuenta con librerías especificas para crear este cliente, es necesario instalar el paquete «websockets» y como ya se ha mencionado anteriormente, de momento PyScript no permite la instalación de otros módulos distintos a los que ya vienen incluidos en el propio proyecto.
En conclusión, aunque puede parecer se contará con todo el poder de Python al navegador web y será posible ejecutar rutinas complejas, con simplemente un fichero HTML, en la práctica no resulta tan sencillo.  En este post se han enumerado algunas de las pruebas realizadas, sin embargo en el vídeo que tienes justo al inicio de este post también se explican algunas otras pruebas que han dado resultados muy parecidos. Como decía antes, hay que ver cómo evoluciona el proyecto y la aceptación que tiene por parte de los desarrolladores de Python, es posible que nos encontremos ante una alternativa interesante, pero desde luego aún es pronto para saberlo.

Un saludo y Happy Hack!
Adastra.