
Ferramenta automatizada de enumeração de esquemas GraphQL e extração de dados que itera documentos de introspecção, reconstrói consultas e salva respostas para testes de penetração e avaliações de segurança de API.
Graphicator é um "raspador" / extrator de GraphQL. A ferramenta itera sobre o documento de introspecção retornado pelo endpoint GraphQL alvo e, em seguida, reestrutura o esquema em um formato interno para poder recriar as consultas suportadas. Quando essas consultas são criadas, elas são usadas para enviar requisições ao endpoint e salva a resposta retornada em um arquivo.
Respostas errôneas não são salvas. Por padrão, a ferramenta armazena em cache as respostas corretas e também armazena em cache os erros, assim, ao executar novamente a ferramenta, ela não acessará as mesmas consultas novamente.
Use com sabedoria e use apenas para alvos com os quais você tem permissão para interagir.
Esperamos que a ferramenta automatize seus próprios testes como um testador de penetração e dê um impulso até mesmo para aqueles que ainda não realizam testes GraphQL.
Para aprender como realizar avaliações em 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
Quando a tarefa é concluída, ela compacta os resultados e esse zip é disponibilizado via um servidor web servido na porta 8005. Para matar o contêiner, forneça CTRL+C. Quando o contêiner é parado, os dados também são excluídos. Você também pode alterar a porta do host de acordo com suas necessidades.
python3 graphicator.py [args...]
O primeiro passo é configurar o alvo. Para fazer isso, você deve fornecer uma opção --target ou um arquivo usando --file.
Definindo um único alvo via argumentos
python3 graphicator.py --target https://subdomain.domain:port/graphql
Definindo múltiplos alvos
python3 graphicator.py --target https://subdomain.domain:port/graphql --target https://target2.tld/graphql
Definindo alvos via um arquivo
python3 graphicator.py --file file.txt
O arquivo deve conter uma URL por linha, como a seguir:
http://target1.tld/graphql
http://sub.target2.tld/graphql
http://subxyz.target3.tld:8080/graphql
Você pode conectar a ferramenta a qualquer proxy.
Conectar às configurações padrão do Burp (porta 8080)
python3 graphicator.py --target target --default-burp-proxy
Conectar ao seu próprio proxy
python3 graphicator.py --target target --use-proxy
Conectar via 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 } }
Três pastas são criadas:
O nome do arquivo é o hash que leva em conta a consulta e a URL.
Copyright 2023 Cybervelia Ltd
É concedida permissão, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e dos arquivos de documentação associados (o "Software"), para lidar com o Software sem restrição, incluindo, sem limitação, os direitos de usar, copiar, modificar, mesclar, publicar, distribuir, sublicenciar e/ou vender cópias do Software, e permitir que as pessoas a quem o Software é fornecido o façam, sujeitas às seguintes condições:
O aviso de copyright acima e este aviso de permissão devem ser incluídos em todas as cópias ou partes substanciais do Software.
O SOFTWARE É FORNECIDO "COMO ESTÁ", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM DETERMINADO FIM E NÃO VIOLAÇÃO. EM NENHUM CASO OS AUTORES OU DETENTORES DE DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER RECLAMAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM AÇÃO DE CONTRATO, ATO ILÍCITO OU DE OUTRA FORMA, DECORRENTE DE, OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO SOFTWARE.
A ferramenta foi criada e é mantida por (@fand0mas).
Contribuições também são bem-vindas.