
Panoptic — это инструмент для тестирования на проникновение с открытым исходным кодом, который автоматизирует процесс поиска и получения содержимого распространённых файлов журналов и конфигурационных файлов через уязвимости path traversal.

Panoptic — инструмент тестирования на проникновение с открытым исходным кодом, автоматизирующий поиск и получение распространённых лог- и конфигурационных файлов через уязвимости обхода пути (path traversal).

--concurrency)FUZZ
в любое значение --header или --data--base64)/etc/passwd, файлов binlog из mysql-bin.index--output-format)--resume-file)--config)httpx[socks], rich, rich-argparse и
tomli на 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
В командной строке Windows активируйте через .venv\Scripts\activate.bat;
в PowerShell используйте .venv\Scripts\Activate.ps1. Редактируемая установка
сохраняет связь Panoptic с этим каталогом для --update, поэтому не удаляйте
каталог. Не выполняйте pip install panoptic: это имя на PyPI принадлежит
не связанному проекту.
Для разработки:
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
Поместите FUZZ в любое место значений --header или --data, чтобы указать
точку инъекции. Panoptic заменяет FUZZ на каждый путь к файлу в процессе
сканирования. Это позволяет тестировать точки инъекции, недоступные для
--param:
| Тип инъекции | Пример |
|---|---|
| Значение cookie | --header "Cookie: theme=FUZZ" |
| Пользовательский заголовок | --header "X-Include: FUZZ" |
При наличии FUZZ параметр --param не требуется.
Panoptic поддерживает TOML-конфиги для постоянных настроек:
panoptic --url "http://target/include.php?file=test.txt" \
--config ~/.config/panoptic/config.toml
Расположение конфига по умолчанию: ~/.config/panoptic/config.toml
(загружается автоматически при наличии, даже без --config).
[defaults]
# Здесь принимается любое длинное имя опции (с дефисами в виде подчёркиваний),
# включая цель и пути вывода.
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"]
Приоритет: аргументы CLI > файл конфигурации > встроенные значения по умолчанию.
Таблица [defaults] принимает любую опцию сканирования, а не только настройку
производительности. В частности, можно сохранить:
url — цель по умолчанию (переопределяется при каждом запуске через --url)output_format, output_file — куда направляются машиночитаемые результатыlog_file — зеркалирование вывода консоли в файлresume_file — расположение контрольной точки для возобновляемых скановЧувствительные артефакты, записываемые Panoptic — файл журнала, файл вывода
результатов/списка и любые файлы, сохранённые через --write-files, — на POSIX
принудительно получают права 0600 только для владельца. На платформах с
O_NOFOLLOW также атомарно отклоняется уже существующая символьная ссылка в
конечном компоненте пути. На платформах без O_NOFOLLOW Panoptic выполняет
проверку символических ссылок/junction до открытия файла с максимально
возможным качеством, но такая проверка не устраняет состояние гонки. Биты
режима в Windows не настраивают ACL NTFS, поэтому используйте соответствующий
ограниченный каталог, если артефакты могут содержать чувствительные данные.
У каждого булева флага есть парный --no-, поэтому значение, установленное
в true в файле конфигурации, можно отключить для одного запуска без
редактирования файла:
# config.toml задаёт verbose = true и automatic = true
panoptic --url "http://target/x.php?file=test.txt" --no-verbose --no-auto
Поскольку опущенный булев флаг остаётся неустановленным (а не принимает
значение по умолчанию false), значение из конфига используется до тех пор,
пока вы явно не передадите флаг или его форму --no-.
Направляйте трафик через HTTP(S) или SOCKS-прокси:
panoptic --url "https://target/x.php?file=test.txt" \
--proxy "socks5://127.0.0.1:9050"
http://, https://, socks5://, socks5h://
(socks5h выполняет разрешение DNS через прокси — полезно для Tor и для
предотвращения утечек DNS в локальной сети). SOCKS4 не поддерживается
базовым HTTP-клиентом. Схема и хост проверяются до начала сканирования.httpx[socks], которое
устанавливается по умолчанию.HTTP_PROXY / HTTPS_PROXY / NO_PROXY. Передайте --ignore-proxy, чтобы
обойти их и подключиться напрямую (это также отключает прокси, заданные
окружением).--invalid-ssl при перехвате HTTPS через прокси с
собственным CA. Это отключает проверку сертификатов и небезопасно
в недоверенных сетях.--all-versions)Некоторые встроенные пути являются шаблонами версий (например, каталоги
релизов JBoss, записанные как [JBOSS]). По умолчанию такие строки-шаблоны
пропускаются, поскольку буквальный путь [JBOSS] не может соответствовать
реальному файлу. Передача --all-versions разворачивает каждый шаблон по
встроенному списку версий, добавляя по одному конкретному пути на каждую
известную версию — это гораздо более масштабное, но и более тщательное
сканирование:
panoptic --url "http://target/x.php?file=test.txt" --auto --all-versions
Panoptic не классифицирует путь только по заголовку Content-Length,
контролируемому целью. Он сравнивает полное нормализованное тело ответа с
базовым ответом для несуществующего пути. Дешёвая верхняя граница сходства
позволяет избежать полного сравнения только тогда, когда уже можно доказать,
что тела различаются; неоднозначные ответы используют точное отношение, чтобы
избежать ложноотрицательных результатов из-за перестановки частей тела.
--resume-file PATH записывает выполненные случаи, чтобы прерванный скан мог
продолжиться с места остановки:
panoptic --url "http://target/x.php?file=test.txt" \
--resume-file scan.checkpoint
# ... прервите с помощью Ctrl-C, затем повторно выполните ту же команду для возобновления
Контрольная точка хранит только идентификаторы завершённых случаев и SHA-256 отпечаток определения скана (URL, параметры инъекции, параметры обнаружения, заголовки, cookie, User-Agent и точный набор случаев). Она никогда не хранит учётные данные, заголовки или URL в открытом виде.
При возобновлении отпечаток пересчитывается и сравнивается. Если что-либо,
способное изменить смысл скана, отличается — другая цель, параметр, заголовок,
cookie, набор фильтров или переключатель --all-versions, — контрольная точка
отклоняется с предупреждением, и скан начинается заново, поэтому устаревшая
контрольная точка никогда не приведёт к молчаливому пропуску случаев из другого
скана. Устаревшие контрольные точки в виде простого списка принимаются с
предупреждением и ограничиваются идентификаторами случаев, присутствующих в
текущем скане; поскольку в этом старом формате нет отпечатка, пользователям
следует заменить его на новый формат. Неудачные (из-за сетевой ошибки) запросы
намеренно не заносятся в контрольную точку, поэтому они повторяются при
возобновлении.
panoptic --version # вывести установленную версию и завершиться
panoptic --update # быстрое обновление из официального GitHub-репозитория
--update работает только из git-копии, чей удалённый origin использует HTTPS
или SSH и совпадает с официальным вышестоящим репозиторием (проверяется до
загрузки, чтобы противостоять небезопасной или подменённой конфигурации
удалённого репозитория). Он выполняет fast-forward ветки main из явной
вышестоящей ссылки main. Установки вне git-копии можно безопасно обновить из
официального GitHub-архива:
python -m pip install --upgrade https://github.com/lightos/Panoptic/archive/refs/heads/main.zip
При запуске из git-копии баннер также показывает текущую короткую ревизию git.
Panoptic использует стандартные коды завершения процессов, что позволяет использовать его в скриптах:
0 — Успех: скан (или --list / --update) завершён. Отдельные запросы,
исчерпавшие попытки, отмечаются предупреждением и остаются доступными для
возобновлённого скана, но не приводят к сбою в остальном успешного запуска.1 — Некорректное использование: отсутствуют или недопустимы аргументы,
либо не удалось найти инъекционный параметр.2 — Эксплуатационный сбой: невозможно подключиться, нет подходящих тестовых
случаев, все поставленные в очередь запросы завершились ошибкой, или возник
сбой воркера, контрольной точки, записи вывода или конфигурации.130 — Прервано пользователем (Ctrl-C / SIGINT).Вклад приветствуется! Пожалуйста, открывайте issues или pull requests на GitHub.
Для безопасного, воспроизводимого сквозного тестирования см. Panoptic LFI Testbed. Он предоставляет намеренно уязвимые конечные точки, покрывающие поддерживаемые Panoptic методы инъекции и преобразования обхода пути.
Этот проект лицензирован по лицензии MIT — подробности см. в файле LICENSE.
0600 только для владельца на
POSIX и защитой от символьных ссылок в конечном компоненте там, где ОС это поддерживает--update)| JSON-тело | --data '{"template":"FUZZ"}' |
| Вложенное значение | --header "Cookie: sid=abc; lang=FUZZ" |