← Todas las herramientas

Introspector

Framework de operaciones out-of-band · Python · AGPL-3.0

Qué es

Un servidor de callbacks te dice que algo llegó. Introspector te dice cuál de tus inyecciones llegó. Cada payload que reparte lleva su propio token, así que cuando entra un callback sabes exactamente cuál de los veinte parámetros que probaste fue el que disparó.

Por qué lo construí

Auditando SSRF ciego y XXE ciego se repetía el mismo problema: llegaba un callback y no podía saber qué payload lo había producido. Con cuatro puntos de inyección se lleva; con veinte es adivinar. Todo lo demás salió de resolver eso.

Qué hace

  • Callbacks HTTP y DNS capturados juntos. El DNS importa porque muchas redes bloquean el HTTP saliente pero nunca el DNS: los resolvers internos lo necesitan.
  • Decodificación de exfiltración por DNS. Los datos escondidos en las etiquetas del subdominio se decodifican (base32, hex, base64) y se reensamblan entre consultas: una consulta carga ~50 caracteres, así que cualquier cosa real llega partida.
  • Un exploit server donde escribes la respuesta a mano, cabeceras y cuerpo, y persiste entre sesiones.
  • Respuestas byte a byte en un modo aparte, para lo que un servidor HTTP real se niega a enviar: cabeceras duplicadas, líneas de estado inválidas, un Content-Length que miente.
  • OPSEC. Responde a todo lo que no sea una trampa con la página de nginx por defecto, y deja el ruido de escáneres fuera del log: una IP pública la encuentra Shodan en horas.
  • Sesiones como los proyectos de Burp, con un modo temporal que no escribe nada en disco.

Lo que más costó

Reensamblar la exfiltración por DNS. Mi primera versión decodificaba cada consulta por separado, y parecía correcta hasta que la probé con datos reales: 50 caracteres base32 no son un número entero de bytes, así que todas las fronteras entre fragmentos salían corruptas y las piezas que no pasaban la comprobación se descartaban en silencio. La solución fue concatenar los fragmentos codificados y decodificar una sola vez al final.

Stack

Python 3.10+, FastAPI y uvicorn: el listener y el panel son asíncronos, así que una sonda de retardo de 300 segundos cuesta una corrutina en vez de un hilo bloqueado. SQLite para el almacenamiento, dnslib para el listener DNS. 169 tests.

GitHub →