
Panoptic est un outil de test d'intrusion open source qui automatise le processus de recherche et de récupération de contenu pour les fichiers journaux et de configuration courants via des vulnérabilités de traversée de chemin.

Panoptic est un outil open source de test d'intrusion qui automatise la recherche et la récupération de fichiers journaux et de configuration courants via des vulnérabilités de traversée de chemin.

--concurrency)FUZZ
dans n'importe quelle valeur --header ou --data--base64)/etc/passwd pour les fichiers du
répertoire personnel, mysql-bin.index pour les fichiers binlog--output-format)--resume-file)--config)httpx[socks], rich, rich-argparse et
tomli sur 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
Dans l'invite de commandes Windows, activez avec .venv\Scripts\activate.bat ; dans PowerShell, utilisez .venv\Scripts\Activate.ps1. L'installation modifiable (editable) maintient Panoptic connecté à ce dépôt pour --update ; conservez donc le répertoire en place. N'exécutez pas pip install panoptic : ce nom PyPI appartient à un projet sans rapport.
Pour le développement :
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
Placez FUZZ n'importe où dans les valeurs --header ou --data pour marquer le point d'injection. Panoptic remplace FUZZ par chaque chemin de fichier pendant l'analyse. Cela permet de tester des points d'injection que --param ne peut pas atteindre :
| Type d'injection | Exemple |
|---|---|
| Valeur de cookie | --header "Cookie: theme=FUZZ" |
| En-tête personnalisé | --header "X-Include: FUZZ" |
Lorsque FUZZ est présent, --param n'est pas requis.
Panoptic prend en charge les fichiers de configuration TOML pour les paramètres persistants :
panoptic --url "http://target/include.php?file=test.txt" \
--config ~/.config/panoptic/config.toml
Emplacement de configuration par défaut : ~/.config/panoptic/config.toml (chargé automatiquement lorsqu'il est présent, même sans --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"]
Priorité : arguments CLI > fichier de configuration > valeurs par défaut intégrées.
La table [defaults] accepte toute option d'analyse, pas seulement le réglage des performances. En particulier, vous pouvez conserver :
url — la cible par défaut (remplacez à chaque exécution avec --url)output_format, output_file — où vont les résultats lisibles par machinelog_file — reflète la sortie console dans un fichierresume_file — emplacement du point de contrôle pour les analyses reprenablesLes artefacts sensibles écrits par Panoptic — le fichier journal, le fichier de sortie des résultats/listes et tous les fichiers enregistrés avec --write-files — sont forcés à des permissions 0600 réservées au propriétaire sur POSIX. Les plates-formes exposant O_NOFOLLOW refusent également atomiquement un lien symbolique préexistant au niveau du composant final du chemin. Sur les plates-formes sans O_NOFOLLOW, Panoptic effectue une vérification de lien symbolique/jonction avant ouverture au mieux, mais cette vérification ne peut pas éliminer une course. Les bits de mode Windows ne configurent pas les ACL NTFS ; utilisez donc un répertoire correctement restreint lorsque des artefacts peuvent contenir des données sensibles.
Chaque drapeau booléen a un équivalent --no-, donc une valeur définie sur true dans le fichier de configuration peut être désactivée pour une seule exécution sans modifier le fichier :
# config.toml sets verbose = true and automatic = true
panoptic --url "http://target/x.php?file=test.txt" --no-verbose --no-auto
Comme un drapeau booléen omis reste non défini (plutôt que de prendre par défaut false), la valeur de configuration est utilisée, sauf si vous passez explicitement le drapeau ou sa forme --no-.
Acheminez le trafic via un 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 résout le DNS via le proxy — utile pour Tor et pour éviter les
fuites DNS locales). SOCKS4 n'est pas pris en charge par le client HTTP
sous-jacent. Le schéma et l'hôte sont validés avant le début de l'analyse.httpx[socks], installé par
défaut.HTTP_PROXY / HTTPS_PROXY / NO_PROXY. Passez --ignore-proxy pour les
contourner et vous connecter directement (cela désactive également tout proxy
configuré par l'environnement).--invalid-ssl lors de l'interception de HTTPS via un proxy
avec sa propre autorité de certification (AC). Cela désactive la vérification
des certificats et est dangereux sur les réseaux non fiables.--all-versions)Certains chemins fournis sont des modèles de version (par exemple les répertoires de version JBoss écrits comme [JBOSS]). Par défaut, ces lignes modèles sont ignorées, car un chemin littéral [JBOSS] ne peut jamais correspondre à un fichier réel. Passer --all-versions développe chaque modèle par rapport à la liste de versions fournie, ajoutant un chemin concret par version connue — une analyse beaucoup plus volumineuse mais bien plus approfondie :
panoptic --url "http://target/x.php?file=test.txt" --auto --all-versions
Panoptic ne classe pas un chemin sur la seule base de l'en-tête Content-Length contrôlé par la cible. Il compare le corps normalisé complet à la référence du chemin invalide. Une limite supérieure de similarité peu coûteuse évite la comparaison complète uniquement lorsqu'elle peut déjà prouver que les corps diffèrent ; les réponses ambiguës utilisent le ratio exact pour éviter les faux négatifs dus à un corps réordonné.
--resume-file PATH enregistre les cas terminés afin qu'une analyse interrompue puisse reprendre là où elle s'est arrêtée :
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
Le point de contrôle stocke uniquement les identifiants des cas terminés plus une empreinte SHA-256 de la définition de l'analyse (URL, paramètres d'injection, options de détection, en-têtes, cookie, User-Agent et l'ensemble exact des cas). Il ne stocke jamais d'identifiants, d'en-têtes ou d'URL en clair.
À la reprise, l'empreinte est recalculée et comparée. Si quoi que ce soit qui changerait le sens de l'analyse diffère — une cible, un paramètre, un en-tête, un cookie, un ensemble de filtres ou une bascule --all-versions différent — le point de contrôle est rejeté avec un avertissement et l'analyse repart de zéro, de sorte qu'un point de contrôle obsolète ne peut jamais ignorer silencieusement des cas d'une analyse différente. Les points de contrôle hérités en liste simple sont acceptés avec un avertissement et limités aux identifiants de cas présents dans l'analyse en cours ; comme cet ancien format n'a pas d'empreinte, les utilisateurs devraient le remplacer par le nouveau format. Les requêtes en échec (erreur réseau) ne sont délibérément pas consignées dans le point de contrôle afin d'être retentées à la reprise.
panoptic --version # print the installed version and exit
panoptic --update # fast-forward update from the official GitHub repo
--update ne fonctionne qu'à partir d'un dépôt git dont le remote origin utilise HTTPS ou SSH et correspond à l'amont officiel (vérifié avant le tirage, pour résister à une configuration distante non sécurisée ou falsifiée). Il effectue un fast-forward de la branche main extraite à partir de la référence main explicite de l'amont. Les installations sans dépôt git peuvent être mises à jour en toute sécurité depuis l'archive GitHub officielle :
python -m pip install --upgrade https://github.com/lightos/Panoptic/archive/refs/heads/main.zip
Lorsqu'il est exécuté depuis un dépôt, la bannière affiche également la révision git courte actuelle.
Panoptic utilise des codes de sortie de processus conventionnels afin de pouvoir être scripté :
0 — Succès : l'analyse (ou --list / --update) est terminée. Les
requêtes individuelles qui épuisent leurs tentatives font l'objet d'un
avertissement et restent éligibles pour une analyse reprise, mais ne font pas
échouer une exécution par ailleurs réussie.1 — Utilisation invalide : arguments manquants ou invalides, ou aucun
paramètre injectable trouvé.2 — Échec opérationnel : connexion impossible, aucun cas de test
correspondant, toutes les requêtes en file ont échoué, ou un travailleur, un
point de contrôle, une écriture de sortie ou une configuration a échoué.130 — Interrompu par l'utilisateur (Ctrl-C / SIGINT).Les contributions sont les bienvenues ! Veuillez ouvrir des issues ou des pull requests sur GitHub.
Pour des tests de bout en bout sûrs et reproductibles, consultez le Panoptic LFI Testbed. Il fournit des points de terminaison volontairement vulnérables couvrant les méthodes d'injection et les transformations de traversée prises en charge par Panoptic.
Ce projet est sous licence MIT — consultez le fichier LICENSE pour plus de détails.
0600 réservées au
propriétaire sur POSIX et protection du lien symbolique du composant final là
où l'OS le prend en charge--update)| Corps JSON | --data '{"template":"FUZZ"}' |
| Valeur imbriquée | --header "Cookie: sid=abc; lang=FUZZ" |