
Panoptic é uma ferramenta de teste de penetração de código aberto que automatiza o processo de busca e recuperação de conteúdo de arquivos de log e configuração comuns por meio de vulnerabilidades de path traversal.

O Panoptic é uma ferramenta de teste de penetração de código aberto que automatiza a busca e a recuperação de arquivos comuns de log e configuração através de vulnerabilidades de path traversal.

--concurrency)FUZZ
em qualquer valor de --header ou --data--base64)/etc/passwd em busca de arquivos
do diretório home, mysql-bin.index em busca de arquivos binlog--output-format)--resume-file)--config)httpx[socks], rich, rich-argparse e
tomli no Python 3.10git clone https://github.com/lightos/Panoptic.git
cd Panoptic
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -e .
panoptic --version
No Prompt de Comando do Windows, ative com .venv\Scripts\activate.bat;
no PowerShell, use .venv\Scripts\Activate.ps1. A instalação editável mantém
o Panoptic conectado a este checkout para --update, portanto mantenha o
diretório no lugar. Não execute pip install panoptic: esse nome no PyPI
pertence a um projeto não relacionado.
Para desenvolvimento:
python -m pip install -e ".[dev]"
panoptic --url "http://target/include.php?file=test.txt"
panoptic --url "http://target/include.php?file=test.txt"
panoptic --url "http://target/include.php?file=test.txt&id=1" \
--param file
panoptic --url "http://target/include.php" \
--data "file=test.txt&id=1" --param file
panoptic --url "http://target/view.php/test.txt" --path-based
panoptic --url "http://target/load.php?file=dGVzdC50eHQ=" \
--base64 --auto
panoptic --url "http://target/page.php" \
--header "Cookie: lang=FUZZ" --auto
panoptic --url "http://target/api/load" \
--data '{"file":"FUZZ"}' --auto
panoptic --url "http://target/page.php" \
--header "X-Template: FUZZ" --auto
panoptic --url "http://target/view.php?file=test&type=txt" \
--param file --ext-param type
panoptic --url "http://target/filtered.php?file=test.txt" \
--prefix "....//....//....//....//"
panoptic --url "http://target/include.php?file=test.txt" \
--os "*NIX" --type conf
panoptic --url "http://target/include.php?file=test.txt" \
--software PostgreSQL
panoptic --url "http://target/include.php?file=test.txt" \
--output-format json --output-file results.json \
--resume-file scan.checkpoint
panoptic --url "https://target/include.php?file=test.txt" \
--proxy "socks5://127.0.0.1:9050" --invalid-ssl
panoptic --list software
panoptic --list category
panoptic --list os
panoptic --url "http://target/include.php?file=test.txt" \
--auto --all-versions --concurrency 8
Coloque FUZZ em qualquer lugar nos valores de --header ou --data
para marcar o ponto de injeção. O Panoptic substitui FUZZ por cada
caminho de arquivo durante a varredura. Isso permite testar pontos de
injeção que --param não consegue alcançar:
| Tipo de injeção | Exemplo |
|---|---|
| Valor de cookie | --header "Cookie: theme=FUZZ" |
| Cabeçalho personalizado | --header "X-Include: FUZZ" |
Quando FUZZ está presente, --param não é necessário.
O Panoptic suporta arquivos de configuração TOML para configurações persistentes:
panoptic --url "http://target/include.php?file=test.txt" \
--config ~/.config/panoptic/config.toml
Local padrão do config: ~/.config/panoptic/config.toml (carregado
automaticamente quando presente, mesmo sem --config).
[defaults]
# Any long option name (with dashes as underscores) is accepted here,
# including the target and output destinations.
url = "http://target/include.php?file=test.txt"
concurrency = 8
verbose = true
automatic = true
all_versions = true
output_format = "json"
output_file = "results.json"
log_file = "scan.log"
resume_file = "scan.checkpoint"
[proxy]
url = "socks5://127.0.0.1:9050"
[headers]
user_agent = "Mozilla/5.0"
cookie = "sid=foobar; auth=1"
values = ["X-Forwarded-For: 127.0.0.1"]
Prioridade: argumentos de CLI > arquivo de configuração > padrões embutidos.
A tabela [defaults] aceita qualquer opção de varredura, não apenas
ajuste de desempenho. Em particular, você pode persistir:
url — o alvo padrão (substituível por execução com --url)output_format, output_file — onde os resultados legíveis por máquina são gravadoslog_file — espelha a saída do console em um arquivoresume_file — local do checkpoint para varreduras retomáveisArtefatos confidenciais gravados pelo Panoptic — o arquivo de log, o arquivo
de saída de resultados/lista e quaisquer arquivos salvos com --write-files —
são forçados a permissões 0600 somente do proprietário no POSIX. Plataformas
que expõem O_NOFOLLOW também recusam atomicamente um symlink pré-existente
no componente final do caminho. Em plataformas sem O_NOFOLLOW, o Panoptic
realiza uma verificação de symlink/junction pré-abertura de melhor esforço,
mas a verificação não elimina uma condição de corrida (race). Os bits de modo
do Windows não configuram ACLs NTFS, portanto use um diretório devidamente
restrito quando os artefatos puderem conter dados confidenciais.
Cada flag booleana tem um equivalente --no-, portanto um valor definido
como true no arquivo de configuração pode ser desativado para uma única
execução sem editar o arquivo:
# config.toml sets verbose = true and automatic = true
panoptic --url "http://target/x.php?file=test.txt" --no-verbose --no-auto
Como uma flag booleana omitida fica não definida (em vez de assumir o padrão
false), o valor do config é usado a menos que você passe a flag ou sua
forma --no- explicitamente.
Roteie o tráfego por um proxy HTTP(S) ou SOCKS:
panoptic --url "https://target/x.php?file=test.txt" \
--proxy "socks5://127.0.0.1:9050"
http://, https://, socks5://, socks5h://
(socks5h resolve DNS através do proxy — útil para Tor e para
evitar vazamentos locais de DNS). O SOCKS4 não é suportado pelo cliente
HTTP subjacente. O esquema e o host são validados antes do início da varredura.httpx[socks], que é instalado
por padrão.HTTP_PROXY /
HTTPS_PROXY / NO_PROXY. Passe --ignore-proxy para ignorá-las
e conectar diretamente (isso também desativa qualquer proxy configurado por ambiente).--invalid-ssl ao interceptar HTTPS através de um proxy
com CA própria. Isso desativa a verificação de certificado e é inseguro
em redes não confiáveis.--all-versions)Alguns caminhos inclusos são modelos de versão (por exemplo, diretórios
de release do JBoss escritos como [JBOSS]). Por padrão, essas linhas de
modelo são ignoradas, porque um caminho literal [JBOSS] nunca pode
corresponder a um arquivo real. Passar --all-versions expande cada
modelo contra a lista de versões inclusas, adicionando um caminho concreto
por versão conhecida — uma varredura muito maior, porém muito mais completa:
panoptic --url "http://target/x.php?file=test.txt" --auto --all-versions
O Panoptic não classifica um caminho apenas pelo cabeçalho Content-Length
controlado pelo alvo. Ele compara o corpo normalizado completo com a linha
de base do caminho inválido. Um limite superior barato de similaridade evita
a comparação completa apenas quando já consegue provar que os corpos diferem;
respostas ambíguas usam a proporção exata para evitar falsos negativos por
corpo reordenado.
--resume-file PATH registra os casos concluídos para que uma varredura
interrompida possa continuar de onde parou:
panoptic --url "http://target/x.php?file=test.txt" \
--resume-file scan.checkpoint
# ... interrupt with Ctrl-C, then re-run the same command to resume
O checkpoint armazena apenas os IDs dos casos concluídos mais uma impressão digital SHA-256 da definição da varredura (URL, parâmetros de injeção, opções de detecção, cabeçalhos, cookie, User-Agent e o conjunto exato de casos). Ele nunca armazena credenciais, cabeçalhos ou URLs em texto puro.
Ao retomar, a impressão digital é recalculada e comparada. Se qualquer coisa
que mudaria o significado da varredura diferir — um alvo, parâmetro,
cabeçalho, cookie, conjunto de filtros ou alternância de --all-versions
diferente — o checkpoint é rejeitado com um aviso e a varredura começa do
zero, para que um checkpoint desatualizado nunca pule silenciosamente casos
de uma varredura diferente. Checkpoints legados de lista simples são aceitos
com um aviso e restritos aos IDs de casos presentes na varredura atual;
como esse formato antigo não tem impressão digital, os usuários devem
substituí-lo pelo formato recém-escrito. Requisições com falha (erro de rede)
são deliberadamente não registradas em checkpoint para serem repetidas
na retomada.
panoptic --version # print the installed version and exit
panoptic --update # fast-forward update from the official GitHub repo
--update só funciona a partir de um checkout git cujo remoto origin usa
HTTPS ou SSH e corresponde ao upstream oficial (verificado antes do pull,
para resistir a configuração remota insegura ou adulterada). Ele faz
fast-forward do branch main verificado a partir da ref explícita main
do upstream. Instalações fora de checkout podem ser atualizadas com segurança
a partir do arquivo oficial do GitHub:
python -m pip install --upgrade https://github.com/lightos/Panoptic/archive/refs/heads/main.zip
Quando executado a partir de um checkout, o banner também mostra a revisão curta atual do git.
O Panoptic usa códigos de saída de processo convencionais para que possa ser usado em scripts:
0 — Sucesso: a varredura (ou --list / --update) foi concluída.
Requisições individuais que esgotam suas tentativas geram avisos e
permanecem elegíveis para uma varredura retomada, mas não falham uma
execução que, de outra forma, foi bem-sucedida.1 — Uso inválido: argumentos ausentes ou inválidos, ou nenhum
parâmetro injetável encontrado.2 — Falha operacional: não foi possível conectar, nenhum caso de teste
correspondente, todas as requisições enfileiradas falharam, ou um worker,
checkpoint, gravação de saída ou configuração falhou.130 — Interrompido pelo usuário (Ctrl-C / SIGINT).Contribuições são bem-vindas! Abra issues ou pull requests no GitHub.
Para testes ponta a ponta seguros e reproduzíveis, consulte o Panoptic LFI Testbed. Ele fornece endpoints deliberadamente vulneráveis que cobrem os métodos de injeção suportados pelo Panoptic e as transformações de traversal.
Este projeto é licenciado sob a Licença MIT — consulte o arquivo LICENSE para obter detalhes.
0600 somente do
proprietário no POSIX e proteção de symlink no componente final onde
o SO suporta--update)| Corpo JSON | --data '{"template":"FUZZ"}' |
| Valor aninhado | --header "Cookie: sid=abc; lang=FUZZ" |