Posted in

¿Nos quedaremos sin trabajo? IA en seguridad ofensiva: PentestGPT

Con el auge del uso de la inteligencia artificial en varias ramas del conocimiento, es inevitable pensar que en algún punto, esta pueda ser de utilidad también para el campo de la ciberseguridad ofensiva.

En ese sentido, quizá más de uno se ha preguntado si en algún momento los pentesters humanos no serán necesarios y serán reemplazados por la IA, o quizá más bien nos servirá como ayuda para acortar los tiempos de nuestras pruebas.

No es una novedad hoy en día que han surgido varias aplicaciones que, a partir de un prompt en lenguaje natural, te pueden dar recomendaciones, generar algún script, o enseñarte en simples pasos como utilizar una herramienta o aplicar una técnica de pentest. Esto no se encuentra implementado por default en las aplicaciones de chat basadas en LLM más usadas, por ejemplo, si utilizamos chatGPT (por defecto), nos daremos cuenta que al aplicarla en tareas de pentesting, no siempre es de ayuda:

Aplicaciones para ayuda en el proceso de pentesting en ChatGPT

Para lidiar con este inconveniente, podemos dirigirnos a https://chatgpt.com/gpts, y hacer una búsqueda simple de herramientas personalizadas basadas en ChatGPT que nos ayude con estas tareas:

Como vemos, existen muy buenas alternativas como PentestGPT de Mariano Somoza, que te ayuda a generar reportes para tus pruebas, o Pentester Assistant de Norbert Willmann y Pentester de Duvan Guzman, que contestan a tus preguntas sobre hacking sin la limitación de ChatGPT

Si hacemos una búsqueda simple de aplicaciones con el término «pentest», encontraremos más de 100 con diferentes propósitos, desde explicarte como funciona una herramienta hasta ayudarte con tus máquinas de Hack the Box. Determinar cuales son las que aportan beneficio, es un tema subjetivo, ya que a ti te podría ayudar alguna que quizá otros consideren innecesaria.

Dicho esto, no todas las aplicaciones están dentro del catalogo de ChatGPT. Existen otras como PentestGPT de Hacker AI LLC, que se encuentran implementados como un servicio independiente. Esta herramienta surge de un proyecto liderado por un equipo de profesionales, en su mayoría de la Universidad Tecnológica de Nangyang en Singapur, cuyo propósito es ayudar en la automatización de las tareas de pentesting y superar el problema de la pérdida de contexto que puede existir si usamos directamente el LLM como GPT3.5 o GPT4.

Si quieres ver el paper completo, puedes hacerlo desde aquí:

  • https://www.usenix.org/system/files/usenixsecurity24-deng.pdf
  • https://arxiv.org/pdf/2308.06782

PentestGPT puede ser usada dese su propio sitio: https://pentestgpt.ai/login, o instalándola de manera local https://github.com/hackerai-tech/PentestGPT.

En nuestro caso, utilizaremos esta herramienta desde el repositorio de uno de los creadores: Geley Deng, instalándola de manera local para usarla a través de CLI (https://github.com/GreyDGL), y también utilizaremos el servicio público de pentestgpt.ai. Nuestro caso ejemplo será con una máquina disponible en VulnHub: Hackable III, que tiene dificultad media; mediremos los resultados y finalmente daremos algunas conclusiones.


Utilizando PentestGPT

Lo primero que tenemos que hacer es tener lista la herramienta. Para el caso de https://pentestgpt.ai/, no hay mucha ciencia, solo tienes que registrarte y luego comenzar a usarla en: https://pentestgpt.ai/c

Utilizaremos la versión gratuita ya que la versión de pago cuesta 29 USD mensuales, y ofrece mejoras significativas, pero para esta demo, no será necesario tener la versión de paga:

Para el caso de la herramienta de GreyDGL, vamos a instalarla desde un equipo con Linux:

  • Lo primero que sugerimos hacer es crear un entorno virtual para poder utilizar pip sin afectar todo nuestro sistema:
python3 -m venv .pentestgpt
source .pentestgpt/bin/activate
pip install git+https://github.com/GreyDGL/PentestGPT

export OPENAI_API_KEY='tu key'
  • Debes contar con una API Key de Open AI, además de créditos para consumo.
  • Cuando hayas terminado de instalar PentestGPT y setear tu key, puedes verificar la instalación con: pentestgpt-connection

Ahora sí, manos a la obra:

  • Lo primero que tenemos que hacer es iniciar la herramienta con el comando pentestgpt:
  • Como puedes ver, nos solicita describir la tarea a traves de línea de comandos, incluyendo la IP, el tipo de tarea, etc. Esta herramienta puede entender nuestro texto en español, pero funciona mucho mejor si le damos instrucciones en inglés. De hecho, todas las respuestas que nos entrega, también serán en inglés:
  • De todas formas, este primer paso lo ha entendido bien. Nuestra máquina víctima está en la IP 192.168.142.33, y le hemos preguntado qué debemos hacer primero. Recordemos que cómo lector de La Bitácora del Hacker, no necesitas esta base, pero el objetivo de este artículo es validar como puede ayudar PentestGPT en un proceso desde cero.
  • La respuesta es clara, hay que iniciar con la fase de reconocimiento, con un full port scan, para eso nos indica el comando:
  • Lo que vemos es que nos manda a escanear todos los puertos abiertos con Nmap, pero en este punto, no optimiza el uso del comando para detectar servicios o para usar escaneos personalizados basados en SYN o TCP, o para escanear especificamente puertos UDP o TCP, que en una prueba de pentesting real es muy útil si queremos ser sigilosos.
  • Ingresaremos el comando «next«, dentro de PentestGPT y seleccionaremos la primera opción «tool», la cual nos pide que peguemos los resultados de la salida del Nmap (no olvides presionar las teclas Shift+ flecha derecha para poder ingresar los resultados):
  • Vemos que la respuesta nos orienta a ir por el servicio HTTP, sin embargo no nos da mayor detalle de lo que deberíamos hacer a continuación:
  • Utilizamos el comando «more», para ver si nos da más opciones de ataque, pero realmente el resultado no varía:
  • Bien, desde la perspectiva de un completo principiante en pentesting, vamos a seguir las indicaciones de PentesGPT. Abriremos un browser y revisaremos el código fuente de la aplicación
  • Hay dos líneas interesantes, una con un enlace a una página de login, y un comentario que nos advierte de un posible port knocking. Pretendamos que no sabemos que significan, y pidámosle a PentestGPT qué debemos hacer, para ello escribiremos el comando «discuss»:
  • Nos dice que coloquemos el enlace el browser para explorar su contenido. Preguntemos también por el comentario.
  • Lo interesante de la herramienta es que va construyendo un árbol de las tareas que debes ir realizando, lo que puede ser muy útil para tener un orden y además para generar un reporte posterior:
  • En este punto seguro te habrás dado cuenta que hasta el momento, PentestGPT no nos ha recomendado hacer un escaneo de directorios, lo cual es un proceso básico en un pentesting de aplicaciones web. Sin embargo, vamos a seguir las instrucciones tal como nos lo indica la herramienta. Abriremos la página de login, la cual muestra un formulario de acceso, y luego discutiremos esto con PentestGPT:
  • Usaremos las credenciales admin/admin, y vemos que la web nos redirige al documento login.php, el cual examinaremos:
  • Aunque en este punto solo debemos apuntar al contenido 3.jpg, sin consultarle nada a PentestGPT, se lo indicaremos de todas formas, para ver que nos sugiere:
  • Las recomendaciones nos sugieren utilizar SQLi y analizar un potencial file inclusion. Le indicaremos a PentestGPT que la página no es susceptible a SQLi (por ahora) y que existe una imagen en el recurso 3.jpg, para ver que nos sugiere:
  • Como vemos, ya nos sugiere en el punto 1.3.2.1.6 que exploremos otras partes de la aplicación web para ver posibles puntos de entrada:
  • Al preguntarle que hacer, la herramienta nos indica que busquemos de manera manual directorios ocultos, o que exploremos el archivo robots.txt o sitemap.xml. Navegaremos hacia el archivo robots.txt y vemos que hay un directorio interesante llamado /config:
  • Encontramos el archivo 1.txt, el cual descargaremos y examinaremos:
  • Le preguntaremos a PentestGPT qué hacer:
  • Ejecutamos el comando sugerido y decodificamos la cadena:
  • Aunque estamos basando todo el proceso en lo que nos sugiere PentestGPT, un poco de lógica siempre ayuda. Hasta ahora, hemos encontrado un archivo con el nombre 3.jpg y otro archivo con el nombre 1.txt, cuyo contenido revela el número 10000.
  • Si recordamos lo que vimos en la página principal, había un comentario que indicaba un potencial port knocking, el cual podemos abrir teniendo la secuencia correcta. Entonces, si ya tenemos el puerto 10000, es posible que exista un segundo archivo, y que el tercero contenga también algo interesante?. Preguntémosle a PentestGPT:
  • En este punto, la herramienta nos sugiere investigar el significado del número 10000, otra vez sin mayor detalle. En el árbol ya podemos ver que hay varias tareas completadas y otras por completar. Vamos a darle una primera ayuda a Pentest GPT y le preguntaremos como podemos automatizar la búsqueda de directorios comunes (ya que nos pide hacerlo de forma manual). Además, le indicaremos que las cabeceras no muestran nada interesante, y que la página de login no e susceptible a File Inclusion, ya que hemos probado ambos ataques de manera manual:
  • Ejecutamos dirb:
  • Revisamos cada carpeta, y en backup, encontramos un archivo llamado wordlist.txt, mientras que en la carpeta css encontramos un archivo llamado 2.txt:
  • Nos apoyaremos nuevamente en PentestGPT para consultarle que hacer con el contenido del archivo 2.txt, ya que en el caso del archivo wordlist, es evidente que es un conjunto de potenciales contraseñas. Ejecutamos «discuss», y le preguntamos por el código del archivo 2.txt:
  • Hay que reconocer que identificó un mensaje codificado en Brainfuck, el cual necesita ser decodificado. Lo decodificamos en un servicio on-line:
  • Le consultamos a PentestGPT que hacer con este dato, y nos dice que le preguntemos al equipo de pentesting!
  • Nuevamente tendremos que ayudar por segunda vez a la herramienta, ya que el archivo 3.jpg podría contener información interesante si utilizamos herramientas de esteganografía, pero nuestro interés es que la herramienta nos conduzca a resolverlo. Le daremos una idea lógica, esperando que nos de la solución:
  • Como podrás ver, al decirle que 10000 y 4444 son probables puertos y preguntarle si 3.jpg puede contener información útil, nos dice que la imagen podría contener data oculta con esteganografía. Vamos a utilizar Steghide para revelarla:
  • Le hicimos caso a PentesGPT y usamos steghide, lo cual reveló el texto porta:65535, lo que confirma que todos los números que hemos encontrado hasta ahora son puertos. Una vez más le preguntaremos que hacer a la herramienta:
  • Al fin nos sugiere que el puerto puede ser usado en una secuencia de port knocking. Así que iremos tras esta sugerencia:
  • Estamos seguros que pusiste atención en el primer escaneo de Nmap, el cual solo arrojó el puerto 80 abierto y el puerto 22 filtrado. Vamos a ejecutar la secuencia sugerida por PentestGPT:
  • Ejecutamos un escaneo nuevamente, y ya podemos ver el puerto 22 abierto:
  • Una vez más, le indicaremos los resultados a PentestGPT para ver que nos recomienda.
  • Desde luego, tal como lo indica el paper, la herramienta no pierde el contexto, por lo que nos sugiere que intentemos acceder vía SSH, utilizando el archivo wordlist.txt que encontramos antes. Le haremos caso, sin embargo, es poco probable que el acceso sea directamente con el usuario root, así que no perderemos tiempo intentándolo. Le preguntaremos nuevamente a PentestGPT cuál cree que es el username, basándonos en toda la información que le hemos proporcionado hasta ahora:
  • Esta respuesta no nos ayuda mucho. Buscar en un diccionario tanto el username como el password, no es la mejor opción. Seguramente ya te habrás dado cuenta, que el username está embebido en el comentario dentro de la página principal, pero esperabamos que PentestGPT lo pueda deducir:
 <!-- "Please, jubiscleudo, don't forget to activate the port knocking when exiting your section, and tell the boss not to forget to approve the .jpg file - dev_suport@hackable3.com" -->
  • Lo que hace que tengamos que tengamos que poner por tercera vez nuestra propia lógica en marcha. Usaremos el usuario jubiscleudo y la lista de passwords en wordlist.txt, pero le pediremos el comando a PentestGPT:
  • Bien, ya tenemos acceso a nivel de usuario:
  • Se lo diremos a PentestGPT (para que sea parte de nuestra felicidad), y veremos que nos sugiere hacer:
  • Lo que nos indica son sugerencias válidas para escalar privilegios. La herramienta deduce que nuestro acceso no es privilegiado por lo que nos sugiere revisar a qué grupos pertenece el usuario, evaluar sus permisos, determinar recursos a los que puede acceder, o revisar archivos de configuración como /etc/sudoers. Algo curioso es que también nos indica que consultemos a un pentester senior sobre qué debemos hacer.
  • Es interesante también mencionar que el árbol se ha actualizado, y ahora tenemos una etapa de post-explotación:
  • En este punto, ya necesitamos un poco de experiencia al menos enumerando Linux desde la perspectiva de un pentester. Si bien la sugerencia de PentestGPT es válida. Hacer cada sub tarea desde el total desconocimiento podría implicar horas de búsqueda sin ningún resultado. Para no hacer este post demasiado largo, vamos a acortar las etapas, y luego le comentaremos los resultados a la herramienta.
  • Dentro de la máquina existe otro usuario llamado hackable_3, las credenciales de acceso se encuentran en el directorio donde está alojado el sitio web, al cual desde luego tiene acceso nuestro usuario jubiscleudo:
  • Le daremos esta información a PentestGPT solo con el objetivo de que marque nuestras sub-tareas como completas
  • Lo que nos sugiere tiene lógica. Ha analizado el contenido que le hemos pasado y nos sugiere que utilicemos las credenciales para analizar la seguridad de la BD Mysql, con lo cual podríamos encontrar una vulnerabilidad en ese servicio que nos ayude a escalar privilegios. Seguramente ya te habrás dado cuenta que lo primero que deberíamos hacer (por nuestro olfato de pentester), es utilizar la credencial para cambiar de usuario, simplemente escalando con un «su». Esto demuestra que la herramienta deduce bien basándose en la lógica, pero, recordemos que el tiempo es un factor clave y a veces pensar fuera de la caja es exactamente lo que necesitamos.
  • Era el camino más corto. Se lo diremos a PentestGPT:
  • En este punto, ha detectado que la potencial vía de escalamiento está en la pertenencia del usuario hackable_3 al grupo lxc. LXC es una tecnología de virtualización utilizada en Linux para crear contenedores, similar a Docker. Vamos a seguir la recomendación de PentestGPT y procederemos a revisar LXC como potencial vector de ataque.
  • Para poder ejecutar correctamente el ataque, sugerimos leer el siguiente artículo: https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/interesting-groups-linux-pe/lxd-privilege-escalation.html. Desde nuestra máquina crearemos una imagen que luego importaremos desde el equipo comprometido
  • Verificamos que no hay ningun contenedor creado, así que iniciaremos LXD y crearemos el contenedor, mapeando ademas el espacio de almacenamiento. Debemos asegurarnos que el contenedor se cree con el flag -c security.priviliged=true, tal como nos sugiere la guía y como nos recomendó PentestGPT:
  • Ahora sí, iniciamos el contenedor y executamos /bin/sh, consiguiendo acceso como root:
  • Aunque en este punto ya no necesitamos a PentestGPT, vamos a contarle sobre nuestros resultados:
  • Las sugerencias son totalmente validas. Dado que tenemos acceso como root, el siguiente paso es poder escanear el sistema en búsqueda de información. Nos hubiera gustado que sugiera utilizar alguna técnica para ganar persistencia, pero por ahora, creemos que ha sido una buena recomendación revisar los directorios y preservar información sensible.

¿Y el servicio de PentestGPT.ai?

Replicamos todo el ejercicio usando el servicio gratuito de pentest.ai, y aquí mostramos las diferencias:

  • Los comandos son sugeridos de una manera más acertada. Además brinda una explicación de los parámetros utilizados para tener un mejor contexto del ataque:
  • Los ataques sugeridos son más precisos. De todas formas, apunta siempre a la solución más lógica posible, sin pensar fuera de la caja:
  • Además puede ayudarte con la ejecución de comandos que necesitan alguna decodificación, aunque no es siempre exacto:
  • Desde luego al usar el servicio, no tenemos un árbol con las etapas que estamos logrando, que nos ayude con el orden y/o secuencia de nuestra cadena de ataques. Asimismo, la mayor limitante está en la cuota de uso:
  • Finalmente, llega nos da sugerencias bastante similares a las que tuvimos con la herramienta instalada de manera local.

Conclusiones:

  • La herramienta es bastante interesante, sobre todo si necesitamos algún tipo de orientación durante nuestros procesos de pentesting.
  • Tal como lo indica el paper, PentestGPT ha sido testeado en máquinas de HTB y otros retos CTF, demostrando su efectividad en los resultados. Esto nos lleva a sugerir que la herramienta puede ser de apoyo cuando te encuentres en este tipo de escenario.
  • La herramienta brinda resultados basados en la respuesta más lógica posible, de acuerdo a lo que nosotros le vamos indicando. Quizá un mejor prompt puede lograr mejores resultados, pero consideramos que el «pensar fuera de la caja», todavía no es una característica madura en PentestGPT.
  • Se necesita aún el raciocinio humano para poder entender por donde conducir el ataque si queremos ganar tiempo. Los escenarios cuando se hace un pentest en un entorno real, no arrojan tantas pistas como en un CTF.
  • No resolveremos todo el pentesting usando la herramienta. Aunque las sugerencias son buenas, necesitamos complementarla con conocimiento previo, buscando técnicas en internet o desarrollando nuestro propio mecanismo de ataque. Incluso en algún punto, la propia herramienta recomienda consultar con un equipo de pentest qué es lo que debemos hacer.
  • Podemos quedarnos tranquilos, PentestGPT no nos reemplazará (por ahora). Nuestra sugerencia es que la incluyas como un copiloto, o como un miembro más de tu equipo de pentesting. Sin embargo, no podemos negar que un futuro cercano, la IA (en general) podría reemplazar la mayor parte de las tareas humanas. Si automatizamos las instrucciones hacia los LLM basadas en las respuestas de las tareas anteriores, e implementamos tecnologías como MCP o A2A para obtener información o ejecutar las herramientas necesarias en múltiples agentes de IA, podría conseguirse un mayor grado de «autonomía» que permita prescindir de la intervención de un actor humano. Este paper aborda de manera interesante este tema:

Es innegable que este tema tiene mucho por evolucionar. ¿Hasta donde podrá llegar?: Solo el tiempo lo dirá.

Te animamos a que puedas poner en práctica esta herramienta y nos dejes tus comentarios

Esperamos que este artículo te haya sido de utilidad.

One thought on “¿Nos quedaremos sin trabajo? IA en seguridad ofensiva: PentestGPT

  1. Muy interesante saber lo que podemos hacer con la IA en temas de ciberseguridad, saber los limitantes entre la acción humana y automática nos da ventaja y nos permite proyectarnos. Buen contenido!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *