Solaris的automountd远程执行漏洞发布时间:1999-10-26 更新时间:1999-10-26 严重程度:高 威胁程度:远程管理员权限 错误类型:输入验证错误 利用方式:服务器模式 受影响系统 Solaris详细描述 由于近来有不少关于利用rpc.statd和automountd攻击的事例,并发现CERT-- (计算机紧急安全抢救中心)于22日又一次发表了有关 rpc.statd和automountd 漏洞的安全公告,本人收集一些资料并整理出有关此漏洞原理的文章,希望 能有所帮助。 automountd的漏洞在1995年第一次被发现,主要存在在 Solaris 2.5中,但后来的 2.5.1,2.5.1补丁,2.6;2.7都存在着此漏洞的威胁。 几年前由于对本地automountd问题的利用代码出现,SUN公司才开发了编号为 #104654-05的漏洞补丁,但是非常有趣的是当此漏洞补丁发布以后,此BUG还可以 被相当容易的被利用。此漏洞补丁SUN是按照使用'execve'调用来代替'popen'调 用,但SUN公司好象忘记了程序中控制的变量和被执行的参数的设定可以通过 AUTOFS_MOUNT调用来传递给automountd。 要远程利用此BUG,我们将要先介绍一下另一个由于SUN的 Solaris操作系统的组合所 导致的远程漏洞。这是个新的漏洞存在于rpc.statd命令中 (此程序在默认状态 下是自动启动),允许远程信息包跳跃到本地操作系统。在看看automountd的细 节,我们知道此程序不接受基于UDP和TCP协议的信息包。但 automountd接受 rpc.statd转送基于TLI的协议的信息包,并允许我们执行发送到rpc.statd的 信息包的远程命令。因此我们可以知道,如果我们发送两个包含SM_MON和 SM_NOTIFY命令的RPC信息包到存在于Solaris 2.5, 2.5.1, 2.5.1 补丁, 2.6, 和2.7的rpc.statd,rpc.statd会允许转送这些信息包到本地操作系统的 automountd守护程序中去。我们可以按照下面的方法来设定参数: struct mon monr; struct status stat; memset(&monr, 0, sizeof(struct mon)); monr.mon_id.my_id.my_name = cache; monr.mon_id.my_id.my_prog = (unsigned long)AUTOFS_PROG; monr.mon_id.my_id.my_proc = (unsigned long)AUTOFS_MOUNT; mon_id.my_id.my_name将存在我们的cache中,将用来告诉rpc.statd把信息包转发 到哪里.通过建立到系统端口23,21能找到远程系统的 cache。cache通常显示在 括弧里面。另一个获得cache的方法是通过查询机器的IP地址和使用返回的主机名。 如:主机名为:pathetic.sun.com,你可以使用'pathetic'或'pathetic.sun.com', mon_id.my_id.my_prog的变量为AUTOFS_PROG 告诉rpc.statd将连接哪一 个RPC服务。 mon_id.my_id.my_proc的变量AUTOFS_MOUNT的作用是让rpc.statd告诉 automountd我们将执行AUTOFS_MOUNT请求。下面是其他的变量设置" monr.mon_id.my_id.my_vers = 1; /* For Solaris 2.5, 2.5.1 */ or monr.mon_id.my_id.my_vers = 2; /* For Solaris 2.6, and 2.7 */ monr.mon_id.mon_name = command; stat.mon_name = command; monr.mon_id.mon_name和stat.mon_name将包含在远程系统中所执行的程 序。到此,通过这些参数的设定,我们能发送我们的RPC信息包到远程系统上。 然而,由于SUN公司在Solaris 2.6和2.7系统的rpc.statd 中使用了叫SMHASH的新函数, 因此我们要必须使用DNS欺骗来完成我们要想执行的命令。因为SMHASH的工作和 RPC参数的工作是经过编码的,当rpc.statd接受到我们的信息包时SMHASH将在它的地址 表中尝试搜寻我们信息包中所带命令,如果SMHASH发现我们命令所带地址不是一个 合法的地址它将拒绝转发信息包,反之SMHASH将返回找到合法地址并转发我们的信 息包。如果你想不使用DNS欺骗来测试,你可以在Solaris系统的/etc/hosts文件上 你想要执行命令的合法主机名和IP。 测试代码 如果pahtetic.sun.com是Solaris2.7并 pathetic作为他的主机名: ./amountdexp pathetic.sun.com pathetic reboot 1 如果pahtetic.sun.com是Solaris2.5.1并pathetic作为他的主机名: ./amountdexp pathetic.sun.com pathetic reboot 0 漏洞源代码可到下面的站点获得: http://www.attrition.org/hosted/cop/index.html 解决方案 检查automountd手册并查看你是否需要它,如果不需要可以 删除此服务。 stard在Solaris 7系统中不作为ROOT来运行,所以 automounter会忽略此请求。 在其他版本中并不包含此守则。一个简单的方法是不以ROOT 身份来重新运行statd, 只要在/etc/init.d/nfs.client做如下所示改变: 28c28 < /usr/lib/nfs/statd > /dev/console 2>&1 --- > su daemon - c /usr/lib/nfs/statd > /dev/console 2>&1 (你必须确定在/etc/rc?.d/[SK]*nfs.client指 向/etc/init.d/nfs.client) 然后在运行如下命令: chown -R daemon /var/statmon chmod -R og-w /var/statmon 在停止和重启动lockd & statd. 补丁代号为#104654-03的2.5.1有此问题,而补丁代号为 #104654-04或更高的将 不受此漏洞影响(但DNS欺骗可能还能使存在漏洞)。 HpUX中临时处理方法把 AutoFS=0 加到: /etc/rc.config.d/nfsconf中去。 相关信息 |