
مراقبة عمليات لينكس بدون صلاحيات الجذر
pspy هي أداة سطر أوامر مصممة للتجسس على العمليات دون الحاجة إلى صلاحيات الجذر. تسمح لك برؤية الأوامر التي ينفذها المستخدمون الآخرون، ومهام cron، وغيرها أثناء تنفيذها. ممتازة لاستكشاف أنظمة لينكس في مسابقات CTF. كما أنها رائعة لإظهار لزملائك لماذا تمرير الأسرار كوسائط في سطر الأوامر فكرة سيئة.
تجمع الأداة المعلومات من مسح procfs. مراقبو Inotify الموضوعة على أجزاء محددة من نظام الملفات تحفز هذه المسوحات لالتقاط العمليات قصيرة العمر.
احصل على الأداة على جهاز لينكس الذي تريد فحصه. أولاً، احصل على الملفات الثنائية. قم بتنزيل الملفات الثنائية المنشورة هنا:
pspy32 تنزيلpspy64 تنزيلpspy32s تنزيلpspy64s تنزيلالملفات المترجمة بشكل ثابت يجب أن تعمل على أي نظام لينكس لكنها كبيرة جدًا (~4 ميجابايت). إذا كان الحجم مشكلة، جرب الإصدارات الأصغر التي تعتمد على libc ومضغوطة باستخدام UPX (~1 ميجابايت).
إما استخدام Go المثبت على نظامك أو تشغيل عملية البناء المعتمدة على Docker والتي تم تشغيلها لإنشاء الإصدار.
للخيار الثاني، تأكد من تثبيت Docker، ثم قم بتشغيل make build-build-image لبناء صورة Docker، متبوعًا بـ make build لبناء الملفات الثنائية بها.
يمكنك تشغيل pspy --help للتعرف على العلامات ومعناها.
الملخص كالتالي:
الإعدادات الافتراضية يجب أن تكون مناسبة لمعظم التطبيقات.
مراقبة الملفات داخل /usr هي الأكثر أهمية لأن العديد من الأدوات تصل إلى المكتبات داخله.
بعض الأمثلة الأكثر تعقيدًا:
# print both commands and file system events and scan procfs every 1000 ms (=1sec)
./pspy64 -pf -i 1000
# place watchers recursively in two directories and non-recursively into a third
./pspy64 -r /path/to/first/recursive/dir -r /path/to/second/recursive/dir -d /path/to/the/non-recursive/dir
# disable printing discovered commands but enable file system events
./pspy64 -p=false -f
لرؤية الأداة أثناء العمل، فقط استنسخ المستودع وشغّل make example (يلزم Docker).
من المعروف أن تمرير كلمات المرور كوسائط سطر أوامر ليس آمنًا، ويمكن استخدام المثال لتوضيح ذلك.
يقوم الأمر بتشغيل حاوية Debian حيث تقوم مهمة cron سرية، يديرها root، بتغيير كلمة مرور مستخدم كل دقيقة.
يتم تشغيل pspy في المقدمة، كمستخدم myuser، ويمسح العمليات.
يجب أن ترى مخرجات مشابهة لهذا:
~/pspy (master) $ make example
[...]
docker run -it --rm local/pspy-example:latest
[+] cron started
[+] Running as user uid=1000(myuser) gid=1000(myuser) groups=1000(myuser),27(sudo)
[+] Starting pspy now...
Watching recursively : [/usr /tmp /etc /home /var /opt] (6)
Watching non-recursively: [] (0)
Printing: processes=true file-system events=false
2018/02/18 21:00:03 Inotify watcher limit: 524288 (/proc/sys/fs/inotify/max_user_watches)
2018/02/18 21:00:03 Inotify watchers set up: Watching 1030 directories - watching now
2018/02/18 21:00:03 CMD: UID=0 PID=9 | cron -f
2018/02/18 21:00:03 CMD: UID=0 PID=7 | sudo cron -f
2018/02/18 21:00:03 CMD: UID=1000 PID=14 | pspy
2018/02/18 21:00:03 CMD: UID=1000 PID=1 | /bin/bash /entrypoint.sh
2018/02/18 21:01:01 CMD: UID=0 PID=20 | CRON -f
2018/02/18 21:01:01 CMD: UID=0 PID=21 | CRON -f
2018/02/18 21:01:01 CMD: UID=0 PID=22 | python3 /root/scripts/password_reset.py
2018/02/18 21:01:01 CMD: UID=0 PID=25 |
2018/02/18 21:01:01 CMD: UID=??? PID=24 | ???
2018/02/18 21:01:01 CMD: UID=0 PID=23 | /bin/sh -c /bin/echo -e "KI5PZQ2ZPWQXJKEL\nKI5PZQ2ZPWQXJKEL" | passwd myuser
2018/02/18 21:01:01 CMD: UID=0 PID=26 | /usr/sbin/sendmail -i -FCronDaemon -B8BITMIME -oem root
2018/02/18 21:01:01 CMD: UID=101 PID=27 |
2018/02/18 21:01:01 CMD: UID=8 PID=28 | /usr/sbin/exim4 -Mc 1enW4z-00000Q-Mk
أولاً، يطبع pspy جميع العمليات الجارية حاليًا، كل منها مع PID وUID وسطر الأوامر.
عندما يكتشف pspy عملية جديدة، يضيف سطرًا إلى هذا السجل.
في هذا المثال، تجد عملية برقم PID 23 والتي يبدو أنها تغير كلمة مرور myuser.
هذه نتيجة لبرنامج Python النصي المستخدم في crontab الخاص بـ root /var/spool/cron/crontabs/root، والذي ينفذ أمر shell هذا (تحقق من crontab والبرنامج النصي).
لاحظ أن myuser لا يمكنه رؤية crontab ولا البرنامج النصي Python.
مع pspy، يمكنه رؤية الأوامر مع ذلك.
أدناه مثال من الجهاز Shrek من Hack The Box. في هذا التحدي CTF، المهمة هي استغلال مهمة cron مخفية تقوم بتغيير ملكية جميع الملفات في مجلد. الثغرة هي الاستخدام غير الآمن لحرف البدل مع chmod (تفاصيل للقارئ المهتم). يتطلب تخمينًا كبيرًا للعثور عليه واستغلاله. مع pspy، على الرغم من ذلك، فإن مهمة cron سهلة الاكتشاف والتحليل:

توجد أدوات لسرد جميع العمليات المنفذة على أنظمة لينكس، بما في ذلك تلك التي انتهت. على سبيل المثال هناك forkstat. تستقبل إشعارات من النواة حول الأحداث المتعلقة بالعمليات مثل fork وexec.
تتطلب هذه الأدوات صلاحيات الجذر، لكن هذا لا يجب أن يعطيك إحساسًا زائفًا بالأمان.
لا شيء يمنعك من التجسس على العمليات الجارية على نظام لينكس.
الكثير من المعلومات مرئية في procfs طالما أن العملية قيد التشغيل.
المشكلة الوحيدة هي أنك تحتاج إلى التقاط العمليات قصيرة العمر في الفاصل الزمني القصير جدًا الذي تكون فيه حية.
مسح دليل /proc بحثًا عن PIDs جديدة في حلقة لا نهائية يؤدي الغرض لكنه يستهلك الكثير من وحدة المعالجة المركزية.
طريقة أكثر خفاءً هي استخدام الحيلة التالية.
تميل العمليات إلى الوصول إلى ملفات مثل المكتبات في /usr، الملفات المؤقتة في /tmp، ملفات السجل في /var، ...
باستخدام واجهة برمجة التطبيقات inotify، يمكنك الحصول على إشعارات كلما تم إنشاء هذه الملفات أو تعديلها أو حذفها أو الوصول إليها، إلخ.
لا يتطلب لينكس مستخدمين متميزين لواجهة برمجة التطبيقات هذه لأنها مطلوبة للعديد من التطبيقات البريئة (مثل محررات النصوص التي تعرض لك مستكشف ملفات محدث).
وبالتالي، بينما لا يمكن للمستخدمين غير الجذر مراقبة العمليات مباشرة، يمكنهم مراقبة تأثيرات العمليات على نظام الملفات.
يمكننا استخدام أحداث نظام الملفات كمحفز لمسح /proc، على أمل أن نتمكن من القيام بذلك بالسرعة الكافية لالتقاط العمليات.
هذا ما يفعله pspy.
لا يوجد ضمان بعدم تفويت واحدة، لكن الفرص تبدو جيدة في تجاربي.
بشكل عام، كلما طالت مدة تشغيل العمليات، زادت فرصة التقاطها.
الشعار: "بواسطة Creative Tail [CC BY 4.0 (http://creativecommons.org/licenses/by/4.0)]، عبر Wikimedia Commons" (رابط)