
أداة Python3 لإنشاء ملفات zip تقوم بتهريب بيانات إضافية لاستخراجها لاحقًا
أداة بايثون هذه تنشئ ملفات zip تحتوي على بيانات إضافية مضمّنة داخل بنية الملف. هذه البيانات الإضافية غير مرئية/لا تظهر عند فحص ملف zip أو فك ضغطه، ولكن يمكن استرجاعها باستخدام powershell عبر ملف اختصار ويندوز (LNK) داخل ملف zip.
تتطلب البرنامج النصي اسمًا لملف zip / ملف الاختصار / الملف المُهرَّب، بالإضافة إلى الملف/البيانات التي ترغب في تهريبها:
python3 zip_smuggle.py important_data /home/ubuntu/zip_smuggling/testdata.txt
سينتج هذا ملف important_data.zip داخل مجلد البرنامج النصي. انقل ملف zip هذا إلى جهاز ويندوز، وانقر نقرًا مزدوجًا داخل ملف zip أو فك ضغطه، ثم انقر على الاختصار الموجود بداخله. سيتم استرجاع البيانات التي قدمتها لتهريبها من ملف zip، وحفظها على القرص، وفتحها كملف نصي.
يستفيد هذا المشروع من مشروع قديم لي، lnk_generator، والذي يتيح لك إنشاء ملفات اختصار عشوائية باستخدام قالب معد مسبقًا. راجع هذا المستودع لمزيد من التفاصيل / نصوص برمجية أكمل وملاحظات حول إنشاء ملفات الاختصار.
يتم وضع البيانات المُهرَّبة بين بيانات الملفات الموجودة داخل الأرشيف والدليل المركزي للأرشيف، والذي يعمل كنوع من جدول محتويات ملف zip. يحتوي هذا الدليل المركزي على إزاحات (offsets) الملفات داخل الأرشيف، لذلك وعلى الرغم من وجود بياناتنا المحقونة داخل ملف zip، إلا أنها غير متتبعة أو مفهرسة بواسطة الدليل المركزي وبالتالي لا يمكن عرضها أو استخراجها بسهولة. يجد البرنامج النصي ببايثون إزاحة "End of Central Directory" داخل ملف zip ويحدّثها بموقع الدليل المركزي الجديد بعد حقن البيانات المُهرَّبة. يعرض الرسم التالي البنية العامة لملف zip على اليسار، ومكان إدراج بياناتنا على اليمين:

يتم استخراج البيانات المُهرَّبة باستخدام أمر powershell:
powershell.exe -w 1 -c "$name = \"testing\";$file = (get-childitem -Pa $Env:USERPROFILE -Re -Inc *$name.zip).fullname;$bytes=[System.IO.File]::ReadAllBytes($file);$size = (0..($bytes.Length - 4) | Where-Object {$bytes[$_] -eq 0x55 -and $bytes[$_+1] -eq 0x55 -and $bytes[$_+2] -eq 0x55 -and $bytes[$_+3] -eq 0x55 })[0] + 4;$length=12;$chunk=$bytes[$size..($size+$length-1)];$out = \"$Env:TEMP\$name.txt\";[System.IO.File]::WriteAllBytes($out,$chunk);Invoke-Item $out"
يقوم هذا الأمر بـ:
0x55/0x55/0x55/0x55) الذي يحدد بداية البيانات المُهرَّبةتم ترك هذا المفهوم الإثباتي (POC) عامًا إلى حد كبير / تحويله إلى أداة لاستخدام أنواع ملفات أخرى / وما إلى ذلك سيُترك كتمرين للقارئ.