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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2023-24329-lab — Автономная Docker-лаборатория, демонстрирующая CVE-2023-24329 — различие в парсере urllib языка Python, которое обходит фильтры схемы URL и хоста, с уязвимым и исправленным окружениями для практического обучения безопасности. | Kitploit
Инструменты/GitHubGitHub/jithinodattu/cve-2023-24329-lab
Анализ уязвимостейЭксплуатацияВеб-безопасностьCTFТестирование на ПроникновениеОбучение и ОбразованиеЛаборатории и Практика
GitHubjithinodattu/cve-2023-24329-lab

CVE-2023-24329-lab

Автономная Docker-лаборатория, демонстрирующая CVE-2023-24329 — различие в парсере urllib языка Python, которое обходит фильтры схемы URL и хоста, с уязвимым и исправленным окружениями для практического обучения безопасности.

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

Популярное

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

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

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

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

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

CVE-2023-24329 — Лаборатория дифференциала парсера

Только для образовательных целей. Эта лаборатория существует для демонстрации реальной уязвимости в безопасной изолированной среде. Никогда не запускайте это на системах, которые вам не принадлежат. Никогда не используйте намеренно сломанный код фильтра в любой производственной системе.

Автономная Docker-лаборатория, демонстрирующая CVE-2023-24329 — дифференциал парсера в urllib.parse.urlparse() Python, который позволяет обойти фильтры схемы URL и хоста на Python < 3.11.4.

Лаборатория показывает API, который явно блокирует URL file:// и внутренние имена хостов, но может быть обманут для чтения /etc/passwd из собственного контейнера и доступа к частному внутреннему сервису — а затем доказывает, что тот же эксплойт не работает на исправленном Python.


Уязвимость

urlparse() в Python и нижележащие HTTP/файловые загрузчики расходятся в том, как обрабатывать URL с ведущими пробелами. На уязвимых версиях:

root@kitploit:~
from urllib.parse import urlparse

urlparse(" file:///etc/passwd").scheme   # → ""   (пустая — фильтр пропускает)
urlparse(" file:///etc/passwd").hostname # → None (пустая — фильтр пропускает)

Но urllib.request.urlopen(" file:///etc/passwd") удаляет пробел и всё равно загружает file:///etc/passwd.

Этот разрыв между тем, что видит парсер, и тем, что делает загрузчик — это и есть уязвимость.

Python 3.11.4 исправил это, удаляя ведущие пробелы/управляющие символы перед синтаксическим анализом, закрывая разрыв.


Демонстрация — три этапа

ЭтапЧто вы видитеЧему учит
1 — Базовыйfile:///etc/passwd → 403 blocked schemeФильтр выглядит разумным
2 — ЭксплойтТот же URL с пробелом в начале → 200 + содержимое /etc/passwd и внутренний секретОдин пробел обходит весь фильтр
3 — ПатчТа же нагрузка на Python 3.11.4 → 403 blockedИсправленный urlparse удаляет пробелы первым; фильтр корректно срабатывает

Архитектура

Четыре сервиса в изолированной сети Docker bridge (cve-lab-net):

СервисВерсия PythonРольХост-порт
vulnerable-api3.11.3Целевой API с наивным фильтром URL8000
fixed-api3.11.4Тот же код, исправленный интерпретатор8000
internal-service3.12Фейковая внутренняя метаданная точканет
attacker3.12Драйвер эксплуатациинет

internal-service не имеет сопоставления портов хоста — он доступен только изнутри Docker-сети, имитируя реальную границу доверия.


Предварительные требования

  • Docker Desktop (или Docker Engine + плагин Compose)
  • ~500 МБ дискового пространства для образов

Быстрый старт

root@kitploit:~
git clone <repo-url>
cd CVE-2023-24329-lab

Этап 1 — Базовый: фильтр должен срабатывать

root@kitploit:~
docker compose -f docker-compose.vulnerable.yml up --build -d
docker compose -f docker-compose.vulnerable.yml exec attacker python exploit.py baseline

Этап 1 — базовый фильтр срабатывает

Этап 2 — Эксплойт: обход фильтра

root@kitploit:~
docker compose -f docker-compose.vulnerable.yml exec attacker python exploit.py exploit

Этап 2 — обход успешен, /etc/passwd и внутренний секрет раскрыты

Этап 3 — Патч: та же нагрузка, исправленный Python

root@kitploit:~
docker compose -f docker-compose.vulnerable.yml down
docker compose -f docker-compose.fixed.yml up --build -d
docker compose -f docker-compose.fixed.yml exec attacker python exploit.py verify

Этап 3 — патч срабатывает на Python 3.11.4

Завершение

root@kitploit:~
docker compose -f docker-compose.fixed.yml down

Структура каталога

root@kitploit:~
CVE-2023-24329-lab/
├── docker-compose.vulnerable.yml   # Python 3.11.3 (уязвимый)
├── docker-compose.fixed.yml        # Python 3.11.4 (исправленный)
├── vulnerable-api/
│   ├── app.py                      # Flask API с наивным фильтром
│   ├── requirements.txt
│   └── Dockerfile
├── internal-service/
│   ├── app.py                      # Фейковая внутренняя метаданная точка
│   ├── requirements.txt
│   └── Dockerfile
└── attacker/
    ├── exploit.py                  # Драйвер демонстрации (baseline / exploit / verify)
    ├── requirements.txt
    └── Dockerfile

Уязвимый и исправленный API-сервисы используют один и тот же исходный код — различается только версия Python в базовом образе. Это ключевое свойство научного контроля лаборатории.


Как работает обход

Упрощённый фильтр уязвимого API:

root@kitploit:~
parsed = urllib.parse.urlparse(url)

if parsed.scheme.lower() in {"file", "gopher", "ftp", "data"}:
    return 403  # blocked

if parsed.hostname in {"localhost", "127.0.0.1", "internal-service"}:
    return 403  # blocked

urllib.request.urlopen(url)  # fetch the original, unmodified string

Нагрузка обхода — это один ведущий пробел:

root@kitploit:~
 file:///etc/passwd
^
пробел (0x20)

В Python ≤ 3.11.3 urlparse видит пустую схему и отсутствие имени хоста → фильтр пропускает. urlopen удаляет пробел → загружает file:///etc/passwd.

В Python ≥ 3.11.4 urlparse сначала удаляет пробел → корректно видит scheme=file → фильтр блокирует с кодом 403.


Исправление (что делает исправленный Python)

CPython issue #102153 — исправление удаляет управляющие символы C0 и пробелы с начала URL перед синтаксическим анализом. После патча и парсер, и загрузчик согласуются в том, что представляет собой URL, поэтому фильтр не может быть обойдён таким образом.

Правильный защитный шаблон независимо от версии Python:

root@kitploit:~
# Parse → reconstruct from parts → pass the rebuilt URL downstream.
# Both the filter and the fetcher then operate on the same string.
parsed = urllib.parse.urlparse(url)
safe_url = parsed.geturl()  # rebuilt from components
urllib.request.urlopen(safe_url)

Ключевые учебные моменты

  1. Дифференциалы парсера — это класс уязвимостей, а не разовая ошибка. Та же идея лежит в основе HTTP-смагглинга, атак путаницы SAML и обходов ${jndi:...} в log4j.
  2. Блок-листы терпят неудачу, когда парсер лжёт вам. Перечисление плохих входных данных — проигрышная стратегия.
  3. Проверяйте восстановленный URL, а не исходную строку ввода.
  4. Одна незначительная версия, один крошечный патч, огромные последствия. Исправление CPython — всего несколько строк.

Ссылки

  • NVD: CVE-2023-24329
  • Issue CPython: github.com/python/cpython/issues/102153
  • Первоначальное раскрытие: Yebo Cao — поищите "CVE-2023-24329 Yebo Cao"
  • Более широкий класс: PortSwigger — методы обхода фильтра SSRF
  • Более широкий класс: James Kettle — HTTP Desync Attacks

Ограничения

  • Никогда не открывайте порты internal-service для хоста.
  • Никогда не запускайте эту лабораторию на машине, подключённой к производственной сети.
  • Код фильтра в vulnerable-api/app.py намеренно сломан для учебных целей — не копируйте его в любую реальную систему.

Лицензия

MIT — можно свободно использовать, распространять и адаптировать в образовательных целях с указанием авторства.

Скачать инструмент