
أداة استغلال الطابعات - الأداة التي جعلت الغوص في القمامة قديمًا.
هل طابعتك آمنة؟ تحقق قبل أن يفعل ذلك شخص آخر...
PRET هي أداة جديدة لاختبار أمان الطابعات تم تطويرها في إطار رسالة ماجستير في جامعة الرور في بوخوم. تتصل بالجهاز عبر الشبكة أو USB وتستغل ميزات لغة طابعة معينة. حالياً يتم دعم PostScript و PJL و PCL وهي المستخدمة في معظم طابعات الليزر. وهذا يتيح أشياء رائعة مثل التقاط أو التلاعب بمهام الطباعة، والوصول إلى نظام ملفات الطابعة وذاكرتها، أو حتى إلحاق الضرر المادي بالجهاز. جميع الهجمات موثقة بالتفصيل في ويكي هاكينغ الطابعات.
الفكرة الرئيسية لـ PRET هي تسهيل التواصل بين المستخدم النهائي والطابعة. لذلك، بعد إدخال أمر يشبه يونكس، تقوم PRET بترجمته إلى PostScript أو PJL أو PCL، وإرساله إلى الطابعة، وتقييم النتيجة، وترجمتها مرة أخرى إلى تنسيق سهل للمستخدم. تقدم PRET مجموعة كبيرة من الأوامر المفيدة لهجمات الطابعات والاختبارات العشوائية (fuzzing).

PRET تتطلب فقط مترجم Python2. ولكن للإخراج الملون ودعم SNMP، يلزم تثبيت وحدات طرف ثالث:
# pip install colorama pysnmp
إذا كنت تعمل على وحدة تحكم ويندوز ولا تظهر أحرف Unicode بشكل صحيح، قم بتثبيت وحدة win_unicode_console:
# pip install win_unicode_console
للطباعة التجريبية 'بدون سائق' (انظر أمر print)، يجب تثبيت ImageMagick و GhostScript:
# apt-get install imagemagick ghostscript
usage: pret.py [-h] [-s] [-q] [-d] [-i file] [-o file] target {ps,pjl,pcl}
positional arguments:
target printer device or hostname
{ps,pjl,pcl} printing language to abuse
optional arguments:
-h, --help show this help message and exit
-s, --safe verify if language is supported
-q, --quiet suppress warnings and chit-chat
-d, --debug enter debug mode (show traffic)
-i file, --load file load and run commands from file
-o file, --log file log raw data sent to the target
$ ./pret.py laserjet.lan ps
$ ./pret.py /dev/usb/lp0 pjl
PRET تتطلب هدفاً صالحاً ولغة طابعة كوسائط. يمكن أن يكون الهدف إما عنوان IP/اسم مضيف طابعة شبكة (مع فتح المنفذ 9100/tcp) أو جهاز مثل /dev/usb/lp0 لطابعة USB محلية. لاكتشاف جميع طابعات الشبكة في شبكتك الفرعية بسرعة باستخدام بث SNMP، قم ببساطة بتشغيل PRET بدون وسائط:
./pret.py
No target given, discovering local printers
address device uptime status
───────────────────────────────────────────────────────────────────────────────
192.168.1.5 hp LaserJet 4250 10:21:49 Ready
192.168.1.11 HP LaserJet M3027 MFP 13 days Paper jam
192.168.1.27 Lexmark X792 153 days Ready
192.168.1.28 Brother MFC-7860DW 16:31:17 Sleep mode
لغة الطابعة التي سيتم استغلالها يجب أن تكون واحدة من ps أو pjl أو pcl. ليست كل اللغات مدعومة في كل طابعة، لذا قد ترغب في تبديل اللغات إذا لم تتلق أي ردود. كل لغة طابعة ترتبط بمجموعة مختلفة من أوامر PRET ولها قدرات مختلفة للاستغلال.
--safe يحاول التحقق عبر IPP و HTTP و SNMP ما إذا كانت لغة الطباعة المحددة (PS/PJL/PCL) مدعومة بالفعل من قبل الجهاز قبل الاتصال. على الطابعات غير المتصلة بالشبكة (USB، كابل متوازي) سيفشل هذا الاختبار.
--quit يقوم بقمع تحديد نموذج الطابعة ورسالة الترحيب وبعض الأحاديث الجانبية الأخرى.
--debug يظهر تدفق البيانات المرسلة فعلياً إلى الجهاز والردود المستلمة. لاحظ أن بيانات الرأس وغيرها من النفقات العامة يتم تصفيتها. لرؤية كل حركة المرور، استخدم wireshark. يمكن أيضاً تشغيل/إيقاف التصحيح داخل جلسة PRET باستخدام الأمر debug.
--load filename يقرأ وينفذ أوامر PRET من ملف نصي. هذا مفيد للأتمتة. يمكن أيضاً استدعاء ملفات الأوامر لاحقاً داخل جلسة PRET عبر الأمر load.
--log filename يكتب نسخة من تدفق البيانات الخام المرسلة إلى الطابعة في ملف. يمكن أن يكون هذا مفيداً لبناء ملف مهمة طباعة ضارة يمكن نشرها على طابعة أخرى لا يمكن الوصول إليها مباشرة، مثلاً بطباعته من محرك أقراص USB.
بعد الاتصال بجهاز طابعة، سترى شاشة PRET ويمكنك تنفيذ أوامر مختلفة:
$ ./pret.py laserjet.lan pjl
________________
_/_______________/|
/___________/___//|| PRET | Printer Exploitation Toolkit v0.25
|=== |----| || by Jens Mueller <[email protected]>
| | ô| ||
|___________| ô| ||
| ||/.´---.|| | || 「 cause your device can be
|-||/_____\||-. | |´ more fun than paper jams 」
|_||=L==H==||_|__|/
(ASCII art by
Jan Foerster)
Connection to laserjet.lan established
Device: hp LaserJet 4250
Welcome to the pret shell. Type help or ? to list commands.
laserjet.lan:/> help
Available commands (type help <topic>):
=======================================
append debug edit free id ls open restart timeout
cat delete env fuzz info mirror printenv selftest touch
cd df exit get load mkdir put set traversal
chvol disable find help lock nvram pwd site unlock
close display format hold loop offline reset status version
laserjet.lan:/> ls ../../
- 834 .profile
d - bin
d - dev
d - etc
d - hp
d - hpmnt
- 1276 init
d - lib
d - pipe
d - tmp
laserjet.lan:/> exit
قائمة بأوامر PRET العامة موضحة أدناه:
help عرض الأوامر المتاحة أو الحصول على مساعدة مفصلة باستخدام 'help cmd'.
debug الدخول في وضع التصحيح. استخدم 'hex' لعرض hexadecimal: debug [hex]
load تشغيل الأوامر من ملف: load cmd.txt
loop تشغيل أمر لعدة وسائط: loop <cmd> <arg1> <arg2> …
open الاتصال بجهاز بعيد: open <target>
close قطع الاتصال بالجهاز.
timeout تعيين مهلة الاتصال: timeout <seconds>
discover اكتشاف أجهزة الطابعة المحلية عبر SNMP.
print طباعة ملف صورة أو نص خام: print <file>|"text"
site تنفيذ أمر مخصص على الطابعة: site <command>
exit الخروج من المفسر.
عمليات نظام الملفات العامة مع تنفيذ خاص بلغة PS/PJL/PCL:
┌───────────┬─────┬─────┬─────┬────────────────────────────────────────┐
│ الأمر │ PS │ PJL │ PCL │ الوصف │
├───────────┼─────┼─────┼─────┼────────────────────────────────────────┤
│ ls │ ✓ │ ✓ │ ✓ │ عرض محتويات الدليل البعيد. │
│ get │ ✓ │ ✓ │ ✓ │ استلام ملف: get <ملف> │
│ put │ ✓ │ ✓ │ ✓ │ إرسال ملف: put <ملف محلي> │
│ append │ ✓ │ ✓ │ │ إلحاق بملف: append <ملف> <نص> │
│ delete │ ✓ │ ✓ │ ✓ │ حذف ملف بعيد: delete <ملف> │
│ rename │ ✓ │ │ │ إعادة تسمية ملف بعيد: rename <قديم> <جديد> │
│ find │ ✓ │ ✓ │ │ عرض محتويات الدليل بشكل متكرر. │
│ mirror │ ✓ │ ✓ │ │ عكس نظام الملفات البعيد إلى دليل محلي. │
│ cat │ ✓ │ ✓ │ ✓ │ إخراج الملف البعيد إلى stdout. │
│ edit │ ✓ │ ✓ │ ✓ │ تحرير الملفات البعيدة باستخدام vim. │
│ touch │ ✓ │ ✓ │ │ تحديث طوابع الملفات الزمنية: touch <ملف> │
│ mkdir │ ✓ │ ✓ │ │ إنشاء دليل بعيد: mkdir <مسار> │
├───────────┼─────┼─────┼─────┼────────────────────────────────────────┤
│ cd │ ✓ │ ✓ │ │ تغيير دليل العمل البعيد. │
│ pwd │ ✓ │ ✓ │ │ عرض دليل العمل على الجهاز. │
│ chvol │ ✓ │ ✓ │ │ تغيير الحجم البعيد: chvol <حجم> │
│ traversal │ ✓ │ ✓ │ │ تعيين اجتياز المسار: traversal <مسار> │
├───────────┼─────┼─────┼─────┼────────────────────────────────────────┤
│ format │ ✓ │ ✓ │ │ تهيئة نظام ملفات الطابعة. │
│ fuzz │ ✓ │ ✓ │ │ اختبار عشوائي لنظام الملفات: fuzz <فئة>│
├─ ─ ─ ─ ─ ─┴─ ─ ─┴─ ─ ─┴─ ─ ─┴─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ path - استكشاف هيكل FS باستراتيجيات اجتياز المسار. │
│ write - أولاً وضع/إلحاق ملف، ثم التحقق من وجوده. │
│ blind - اختبارات للقراءة فقط للملفات الموجودة مثل /etc/passwd. │
├───────────┬─────┬─────┬─────┬────────────────────────────────────────┤
│ df │ ✓ │ ✓ │ │ عرض معلومات الحجم. │
│ free │ ✓ │ ✓ │ ✓ │ عرض الذاكرة المتاحة. │
└───────────┴─────┴─────┴─────┴────────────────────────────────────────┘
id عرض معلومات الجهاز.
version عرض إصدار مفسر PostScript.
devices عرض أجهزة الإدخال/الإخراج المتاحة.
uptime عرض وقت تشغيل النظام (قد يكون عشوائياً).
date عرض تاريخ ووقت نظام الطابعة.
pagecount عرض عداد صفحات الطابعة.
lock تعيين كلمة مرور معلمات startjob والنظام.
unlock إلغاء تعيين كلمة مرور معلمات startjob والنظام.
restart إعادة تشغيل مفسر PostScript.
reset إعادة تعيين إعدادات PostScript إلى الإعدادات الافتراضية للمصنع.
disable تعطيل وظيفة الطباعة.
destroy التسبب في ضرر مادي لـ NVRAM الطابعة.
hang تنفيذ حلقة لا نهائية في PostScript.
overlay وضع ملف eps كتراكب على جميع النسخ المطبوعة: overlay <ملف.eps>
cross وضع جرافيتي طابعة على جميع النسخ المطبوعة: cross <خط> <نص>
replace استبدال سلسلة في المستندات المراد طباعتها: replace <قديم> <جديد>
capture التقاط المزيد من المهام المراد طباعتها على هذا الجهاز.
hold تمكين الاحتفاظ بالمهام.
set تعيين مفتاح إلى قيمة في القاموس الأعلى: set <مفتاح=قيمة>
known قائمة بعوامل PostScript المدعومة: known <عامل>
search البحث في جميع القواميس بواسطة المفتاح: search <مفتاح>
dicts إرجاع قائمة بالقواميس وأذوناتها.
resource قائمة أو تفريغ مورد PostScript: resource <فئة> [dump]
dump تفريغ قاموس: dump <قاموس>
القواميس: - systemdict - statusdict - userdict
- globaldict - serverdict - errordict
- internaldict - currentsystemparams
- currentuserparams - currentpagedevice
config تغيير إعدادات الطابعة: config <إعداد>
duplex - تعيين الطباعة على الوجهين.
copies # - تعيين عدد النسخ.
economode - تعيين الوضع الاقتصادي.
negative - تعيين الطباعة السلبية.
mirror - تعيين الانعكاس المرآوي.
ليست كل الأوامر مدعومة في كل طابعة. خاصة أجهزة Brother و Kyocera تستخدم نسخها الخاصة من PostScript – Br-Script و KPDL – بدلاً من ترخيص 'Adobe PostScript' الأصلي. قد لا تكون هذه النكهات من لغة PostScript متوافقة بنسبة 100%، خاصة فيما يتعلق بالميزات الحساسة للأمان مثل التقاط مهام الطباعة. الوصول إلى نظام الملفات مدعوم من قبل معظم الطابعات، لكنه عادة ما يقتصر على دليل محدد ومحمي (sandboxed).
id عرض معلومات الجهاز.
status تمكين رسائل الحالة.
version عرض إصدار البرنامج الثابت أو الرقم التسلسلي (من 'info config').
pagecount التلاعب بعداد صفحات الطابعة: pagecount <رقم>
printenv عرض متغير بيئة الطابعة: printenv <VAR>
env عرض متغيرات البيئة (اسم مستعار لـ 'info variables').
set تعيين متغير بيئة الطابعة: set <VAR=VALUE>
display تعيين رسالة عرض الطابعة: display <رسالة>
offline إخراج الطابعة من الخدمة وعرض رسالة: offline <رسالة>
restart إعادة تشغيل الطابعة.
reset إعادة تعيين إلى الإعدادات الافتراضية للمصنع.
selftest إجراء اختبارات ذاتية مختلفة للطابعة.
disable تعطيل وظيفة الطباعة.
destroy التسبب في ضرر مادي لـ NVRAM الطابعة.
flood إغراق إدخال المستخدم، قد يكشف عن تجاوزات سعة المخزن المؤقت.
lock قفل إعدادات لوحة التحكم والوصول للكتابة على القرص.
unlock فتح إعدادات لوحة التحكم والوصول للكتابة على القرص.
hold تمكين الاحتفاظ بالمهام.
nvram عمليات NVRAM: nvram <عملية>
nvram dump [all] - تفريغ (جميع) NVRAM إلى ملف محلي.
nvram read addr - قراءة بايت واحد من عنوان.
nvram write addr value - كتابة بايت واحد إلى عنوان.
info عرض المعلومات: info <فئة>
info config - تقديم معلومات التكوين.
info filesys - إرجاع معلومات نظام ملفات PJL.
info id - تقديم رقم طراز الطابعة.
info memory - تحديد حجم الذاكرة المتاحة.
info pagecount - إرجاع عدد الصفحات المطبوعة.
info status - تقديم حالة الطابعة الحالية.
info ustatus - سرد متغيرات الحالة غير المرغوب فيها.
info variables - سرد متغيرات بيئة الطابعة.
بعض الأوامر مدعومة حصرياً من قبل طابعات HP، لأن البائعين الآخرين قاموا فقط بتنفيذ مجموعة فرعية من معيار PJL. هذا ينطبق بشكل خاص على الأوامر المستندة إلى PML مثل restart أو reset. يبدو أن تمكين الاحتفاظ بالمهام على المدى الطويل عبر الأمر hold ممكن فقط لبعض أجهزة Epson. الوصول إلى NVRAM عبر الأمر nvram هو ميزة خاصة بطابعات Brother. الوصول المحدود إلى نظام الملفات مدعوم من قبل العديد من أجهزة HP و OKI و Konica و Xerox و Epson و Ricoh.
selftest إجراء اختبار ذاتي للطابعة.
info عرض المعلومات: info <فئة>
info fonts - عرض الخطوط المثبتة.
info macros - عرض الماكروهات المثبتة.
info patterns - عرض الأنماط المعرفة من قبل المستخدم.
info symbols - عرض مجموعات الرموز.
info extended - عرض الخطوط الموسعة.
PCL هي لغة وصف صفحات محدودة جداً بدون إمكانية الوصول إلى نظام الملفات. لذلك تستخدم أوامر get/put/ls نظام ملفات افتراضياً يعتمد على ماكروهات PCL، تم تنفيذه بشكل أساسي من أجل القيمة الاختراقية. يوضح هذا المفهوم أنه حتى الجهاز الذي يدعم فقط لغات بسيطة مثل PCL يمكن استخدامه لتخزين ملفات عشوائية مثل مواد مخالفة لحقوق النشر. على الرغم من أن خدمة مشاركة الملفات هذه ليست ثغرة أمنية بحد ذاتها، إلا أنها قد تنطبق كـ 'إساءة استخدام الخدمة' حسب سياسة الشركة.
pret.py - البرنامج الرئيسي القابل للتنفيذcapabilities.py - الإجراءات الروتينية للتحقق من دعم لغة الطابعةdiscovery.py - الإجراءات الروتينية لإدراج الطابعات باستخدام بث SNMPprinter.py - كود عام لوصف جهاز طباعةpostscript.py - كود خاص بـ PS (يرث من فئة printer)pjl.py - كود خاص بـ PJL (يرث من فئة printer)pcl.py - كود خاص بـ PCL (يرث من فئة printer)helper.py - دوال مساعدة للإخراج والتسجيل والمقابس وغيرهاcodebook.py - جدول ثابت لرموز الحالة/الخطأ في PJLfuzzer.py - ثوابت لاختبارات fuzzing لنظام الملفاتmibs/* - MIBs خاصة بالطابعة لـ SNMPdb/* - قاعدة بيانات للنماذج المدعومةنظراً للميزات والامتدادات الملكية المتنوعة في لغات الطباعة مثل PostScript و PJL، فإن إجراء اختبار اختراق على الطابعات ليس مهمة تافهة. يمكن لـ PRET المساعدة في تأكيد المشكلات المعروفة في اللغة. بمجرد اللعب بالأداة، قد ترغب في إجراء تحليل أمني منهجي للطابعات. نقطة بداية جيدة هي ورقة الغش لاختبار أمان الطابعات.
استمتع بالاختراق!
lpd/* - نصوص برمجية لاختبار fuzzing لـ LPD