
Herramienta automatizada de enumeración de esquemas GraphQL y extracción de datos que itera documentos de introspección, reconstruye consultas y guarda respuestas para pruebas de penetración y evaluaciones de seguridad de API.
Graphicator es un "scraper" / extractor de GraphQL. La herramienta itera sobre el documento de introspection devuelto por el endpoint de GraphQL objetivo, y luego reestructura el esquema en una forma interna para poder recrear las consultas soportadas. Cuando se crean dichas consultas, las utiliza para enviar solicitudes al endpoint y guarda la respuesta devuelta en un archivo.
Las respuestas erróneas no se guardan. Por defecto, la herramienta almacena en caché las respuestas correctas y también los errores, por lo que al volver a ejecutar la herramienta no volverá a realizar las mismas consultas.
Úsala con prudencia y solo en objetivos para los que tengas permiso de interactuar.
Esperamos que la herramienta automatice tus propias pruebas como pentester y dé un impulso incluso a aquellos que aún no realizan pruebas GraphQL.
Para aprender cómo realizar evaluaciones en endpoints GraphQL: https://cybervelia.com/?p=736&preview=true
python3 -m pip install -r requirements.txt
docker run --rm -it -p8005:80 cybervelia/graphicator --target http://the-target:port/graphql --verbose
Cuando la tarea finaliza, comprime los resultados y dicho zip se proporciona a través de un servidor web servido en el puerto 8005. Para detener el contenedor, presiona CTRL+C. Cuando el contenedor se detiene, los datos también se eliminan. También puedes cambiar el puerto del host según tus necesidades.
python3 graphicator.py [args...]
El primer paso es configurar el objetivo. Para ello, debes proporcionar una opción --target o un archivo usando --file.
Configurar un solo objetivo mediante argumentos
python3 graphicator.py --target https://subdomain.domain:port/graphql
Configurar múltiples objetivos
python3 graphicator.py --target https://subdomain.domain:port/graphql --target https://target2.tld/graphql
Configurar objetivos mediante un archivo
python3 graphicator.py --file file.txt
El archivo debe contener una URL por línea de la siguiente manera:
http://target1.tld/graphql
http://sub.target2.tld/graphql
http://subxyz.target3.tld:8080/graphql
Puedes conectar la herramienta con cualquier proxy.
Conectar a la configuración predeterminada de Burp (puerto 8080)
python3 graphicator.py --target target --default-burp-proxy
Conectar a tu propio proxy
python3 graphicator.py --target target --use-proxy
Conectar mediante Tor
python3 graphicator.py --target target --use-tor
python3 graphicator.py --target target --header "x-api-key:60b725f10c9c85c70d97880dfe8191b3"
python3 graphicator.py --target target --verbose
python3 graphicator.py --target target --multi
python3 graphicator.py --target target --insecure
python3 graphicator.py --target target --no-cache
python3 graphicator.py --target http://localhost:8000/graphql --verbose --multi
_____ __ _ __
/ ___/____ ___ _ ___ / / (_)____ ___ _ / /_ ___ ____
/ (_ // __// _ `// _ \ / _ \ / // __// _ `// __// _ \ / __/
\___//_/ \_,_// .__//_//_//_/ \__/ \_,_/ \__/ \___//_/
/_/
By @fand0mas
[-] Targets: 1
[-] Headers: 'Content-Type', 'User-Agent'
[-] Verbose
[-] Using cache: True
************************************************************
0%| | 0/1 [00:00<?, ?it/s][*] Enumerating... http://localhost:8000/graphql
[*] Retrieving... => query {getArticles { id,title,views } }
[*] Retrieving... => query {getUsers { id,username,email,password,level } }
100%|█████████████████████████████████████████████| 1/1 [00:00<00:00, 35.78it/s]
$ cat reqcache/9652f1e7c02639d8f78d1c5263093072fb4fd06c.json
{
"data": {
"getUsers": [
{
"id": 1,
"username": "theo",
"email": "[email protected]",
"password": "1234",
"level": 1
},
{
"id": 2,
"username": "john",
"email": "[email protected]",
"password": "5678",
"level": 1
}
]
}
}
$ cat reqcache-queries/9652f1e7c02639d8f78d1c5263093072fb4fd06c.query
query {getUsers { id,username,email,password,level } }
Se crean tres carpetas:
El nombre de archivo es el hash que tiene en cuenta la consulta y la URL.
Copyright 2023 Cybervelia Ltd
Por la presente se concede permiso, libre de cargos, a cualquier persona que obtenga una copia de este software y de los archivos de documentación asociados (el "Software"), para tratar el Software sin restricción, incluidos, sin limitación, los derechos de uso, copia, modificación, fusión, publicación, distribución, sublicencia y/o venta de copias del Software, y para permitir a las personas a las que se les proporcione el Software hacer lo mismo, sujeto a las siguientes condiciones:
El aviso de copyright anterior y este aviso de permiso deberán incluirse en todas las copias o partes sustanciales del Software.
EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO PERO NO LIMITADO A LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN PROPÓSITO PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO LOS AUTORES O TITULARES DEL COPYRIGHT SERÁN RESPONSABLES POR NINGUNA RECLAMACIÓN, DAÑO U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN CONTRACTUAL, EXTRACONTRACTUAL O DE OTRO TIPO, QUE SURJA DE O EN CONEXIÓN CON EL SOFTWARE O EL USO U OTRO TIPO DE ACCIONES EN EL SOFTWARE.
La herramienta ha sido creada y mantenida por (@fand0mas).
Las contribuciones también son bienvenidas.