Posted in

OSINT con lenguaje natural: Integrando GPT y Shodan con Python

La Inteligencia Artificial tiene muchos usos hoy en día. Uno de los más conocidos son los chabots que, a través de lenguaje natural, son capaces de ayudarte en casi cualquier cosa que le pidas. Existen varias aplicaciones que tiene este propósito, como ChatGPT, Microsoft Copilot o Deepseek, que por dentro, utilizan un Modelo de Lenguaje Largo (LLM), y pueden ser usados por cualquier persona.

Pero además de poder interactuar directamente con la interfaz del chatbot, también es posible, de forma programática, integrar los modelos con otras herramientas, de tal manera que podamos aprovechar el lenguaje natural, para hacer casi cualquier cosa que se nos ocurra, por ejemplo, mandar notificaciones a alguna aplicación, integrarla con tu bandeja de email, o gestionar las reuniones por ti.

Cuando queremos hacer este tipo de integración, aprovechamos las capacidades de developer (desarrollo) que nos ofrecen las plataformas, de tal manera que a través de APIs, comuniquemos a las aplicaciones y realicemos funciones que, por defecto, están fuera del alcance del chatbot.

En este artículo, integraremos GPT (a través de las APIs de OpenAI) con Shodan, que como ya sabrán aquellos que están especializados en ciberseguridad, es un motor de búsqueda especializado que permite encontrar dispositivos conectados a Internet, como servidores, routers, cámaras de seguridad, sistemas industriales. A diferencia de buscadores tradicionales como Google, que indexan páginas web, Shodan recopila información sobre servicios y dispositivos accesibles en la red, incluyendo detalles como direcciones IP, puertos abiertos y versiones de software

ChatGPT
Página principal de Shodan

Integrando ChatGPT con Shodan:

Quizá la pregunta que debes estar haciéndote es: ¿por qué necesitaría integrar ambas plataformas si puedo preguntárselo directamente a ChatGPT?. La respuesta es sencilla, ChatGPT no realiza directamente la busqueda en Shodan, y tampoco trae los resultados, por lo que si queremos traerlos directamente nos indica que debemos hacerlo de forma manual:

Entonces, existen ocasiones en que es preferible tener de alguna manera resultados rápidos integrando dos soluciones, sobre todo para poder exportar los resultados y tenerlos a la mano como parte de un proceso de pentesting. En este caso, lo mejor es generar algún tipo de interfaz que conecte ambas plataformas, utilizando algún lenguaje de desarrollo de software.

¿Pero para que escribir el código desde 0, si podemos pedírselo a ChatGPT?. Correcto! pidámosle a ChatGPT que genere un código que haga dicha tarea.

Genera un código en python que permita integrar la API de Open AI con la API de Shodan, de tal manera que se pueda hacer una búsqueda de Shodan haciendo uso de lenguaje natural. La API de OpenAI debe recibir el prompt del usuario, y luego debe invocar a la API de Shodan para traer resultados y mostrarlos en pantalla. Has que los parámetros puedan ser ingresados por el usuario mediante CLI. 

Como vemos, ChatGPT nos genera el código fuente que podemos utilizar. El modelo que utiliza es GPT-4, sin embargo, esto podemos ajustarlo según lo que necesitemos.

Teniendo el código, hay que hacer algunos pasos previos para poder hacerlo andar:

  • Lo primero, es generar una API Key en la plataforma OpenAI. Para eso, debes dirigirte al siguiente enlace y crear una cuenta: https://platform.openai.com/
  • Luego, debes ir a la opción Dashboard, y seleccionar la opción API Keys
  • Guarda tu API Key, ya que esta servirá para poder utilizar el modelo GPT a través de las API que Open AI dispone. Recuerda que para poder hacer uso del servicio, debes contar con créditos, ya que esto tiene un costo. Para cargar créditos, puedes ir a la opción de Billing, aquí: https://platform.openai.com/settings/organization/billing/overview
  • Por el lado de OpenAI ya tenemos los que necesitamos. Ahora vayamos a Shodan, ya que ahí también necesitamos generar una API Key. Nos dirigimos al siguiente enlace: https://developer.shodan.io/ y nos autenticamos. Si aún no tienes una cuenta en Shodan, puedes crearla desde aquí: Shodan Account
  • Haremos click en el enlace de la esquina superior derecha «Show API Key» y copiaremos el valor que nos aparece ahí. Esta es la segunda API Key necesitamos.

Ahora que ya tenemos esto listo, vamos a hacer algunas modificaciones al código. Aunque ChatGPT nos da una buena base, a veces es necesario hacer modificaciones para que el código trabaje bien, o para que cambiemos el comportamiento dependiendo de lo que queremos entregar como resultado.

  • Lo primero que debemos tener en cuenta es que el código que nos proporciona ChatGPT podría no estar utilizando las formas de convocar a sus funciones de acuerdo a las últimas versiones de la librería openai. Estas versiones se actualizan constantemente, por lo que es importante saber como llamar a las funciones para conseguir los resultados deseados. Si quieres revisar directamente esta información, puedes consultar la siguiente fuente: https://github.com/openai/openai-python
  • Otro aspecto que podemos modificar es la cantidad de información que queremos que Shodan nos arroje como resultado. En nuestro caso, vamos a devolver la dirección IP del activo encontrado, el puerto, el país al que pertenece y la organización:
  • No olvides que es fundamental que tengas las librerías de Shodan y OpenAI instaladas en el sistema donde ejecutarás el código:
pip install openai
pip install shodan

Ahora, podemos agregar nuestras API Key como variables de entorno, a fin de usarlos en el comando que ejecutaremos dentro de nuestra terminal:

export APIKEY_OPENAI="[TU API KEY DE OPENAI]"
export APIKEY_SHODAN="[TU API KEY DE SHODAN]"

Aunque también las puedes pegar directamente como parámetros a la hora de ejecutar el comando, es más fácil si usamos Linux y las conservamos como variables de entorno.

Ahora, sí, podemos ejecutar nuestra instrucción:

El prompt que hemos ingresado es el siguiente:

Contexto
- Para encontrar resultados con un status específico, se usa el filtro de búsqueda http.status
- Para encontrar resultados con un puerto específico, se usa el filtro de búsqueda port
- Para encontrar resultados con un texto cualquier, no se usan filtros
- Los códigos de país se representan con dos letras únicamente
Tarea:
- Has una búsqueda con los términos Mongo Express. El status de la respuesta debe ser 200 y limita las búsquedas a estados unidos"

El comando que usamos es:

python ShodanAI.py -api_key_openai $APIKEY_OPENAI --api_key_shodan $APIKEY_SHODAN --prompt "[TU PROMPT]"

Te preguntarás por qué ingresamos un prompt tan largo, que incluso tiene un contexto y una orden, teniendo en cuenta que al usar la interfaz GUI de Chat GPT solo debemos darle una instrucción sencilla

Generación de query usando ChatGPT

Al utilizar el código de integración, es usual que se presenten errores de interpretación, los cuales conducen a que se genere una query de shodan que falla, ya sea porque utiliza filtros que no existen o por que la query está mal estructurada. Al ejecutarlo, no obtenemos ningún resultado.

Por lo tanto, acá debemos aplicar nuestras técnicas de Prompt Engineering para obtener mejores resultados. Si ingresamos el prompt anterior, nuestro código funciona y nos devuelve resultados tal como queríamos:

Recuerda que dentro del script, también tenemos el prompt del sistema, el cual puedes modificar a discreción:

 {"role": "system", "content": "Convierte la siguiente consulta en lenguaje natural a un query de búsqueda en Shodan."},

Podemos verificar que los resultados son similares a los que arroja la interfaz gráfica de Shodan:

El código en Python es una versión básica, recuerda que puedes personalizarlo para que arroje mejores resultados, o exportar estos resultados a un documento o tabla que luego puedas utilizar para continuar con tus pruebas de pentesting o documentación. En este punto, el cielo es el límite.

Esperamos que este artículo te sea de utilidad