Solaris服务器防范Rootkit恶意软件攻击全攻略

rootkit这个术语已经存在10多年了。它是由有用的小型程序组成的工具包,使得攻击者能够保持访问计算机上具有最高权限的用户"root"。换句话说,rootkit是能够持久或可靠地、无法检测地存在于计算机上的一组程序和代码。在上述rootkit定义中,关键词是"无法检测"。rootkit所采用的大部分技术和技巧都用于在计算机上隐藏代码和数据。例如,许多rootkit可以隐藏文件和目录。rootkit的其它特性通常用于远程访问和窃听–例如,用于嗅探网络上的报文。当这些特性结合起来后,它们会给安全带来毁灭性的打击。

要取得一个主机的控制权,最简单的当然就是以登录程序(如 login, ssh, telnet 等) 加上猜测密码的程序来尝试进行登入的行为。不过,由于登入程序大部分都有登入次数的限制,因此使用密码猜测程序就不这么流行了。高级的黑客为了系统网络的安全,会撰写一些程序去测试自己主机的服务漏洞, 并且在发现了某些服务的漏洞之后,会通报该服务的维护团体,或者是贡献自己的修补方式,以补足自己系统的安全性。而服务开发/维护团体在接到这样的通报之后,会在最短的时间内进行程序修改, 并且在因特网上面进行通报与释出该漏洞的修补程序。

然而在这个漏洞通报出来之后,与修补程序释出Sun空窗期,某些恶意的黑客就会针对这样的漏洞进行攻击,这些黑客同样是撰写程序来攻击该漏洞,同时取得被攻击主机的控制权,或者是植入木马程序在受攻击的主机上。 这些黑客与高级黑客不同的地方,在于他们会很骄傲的将攻击的成果贴在一些黑客常上的网站,藉以推销自己,同时,也会将他们撰写的恶意程序散播到互联网上面。 有些黑客就会将这些恶意程序收集起来,做成软件包,并使这些程序包更加流行于互联网上面, 这些恶意的程序包就被称为 rootkit 。

rootkit 的类型

我们可将unix和Linux下的 rootkit 分为两大类:应用层级rookit 和内核级别rootkit

1.应用层级 rootkit

应用层级 rootkit 是最常被拿来使用的 rootkit。攻击者以 rootkit 中的木马程序来替换系统中正常的应用程序与系统文件。木马程序会提供后门给攻击者并隐藏其踪迹,攻击者做的任何活动都不会储存在纪录文件中。下面列举了一些攻击者可能取代的文件:

隐藏攻击者踪迹的程序

(1)ls, find, du – 木马程序可以隐藏攻击者文件、欺骗系统,让系统的文件及目录泄露讯息。

(2)ps, top, pidof – 这些程序都是程序监看程序,它们可以让攻击者在进行攻击的过程中,隐藏攻击者本身的程序。

(3)netstat – netstat 是用来检查网络活动的连结与监听,如开放的通讯端口等等。木马程序 netstat 可以隐藏攻击者的网络活动,例如 ssh daemon 或其它服务。

(4)killall – 木马程序 killall 让管理者无法停止程序。

(5)ifconfig – 当监听软件正在执行时,木马程序 ifconfig 不会显示 PROMISC flag,这样可以隐藏攻击者,不被监听软件察觉。

(6)crontab – 木马程序 crontab 可以隐藏攻击者的 crontab 进入情况。

(7)tcpd, syslogd – 木马程序 tcpd 与 "syslog" 不会纪录攻击者的行为。

后门程序

(1)chfn – 提升使用者的权限。执行 chfn,在输入新使用者名称时,只要输入 rootkit 密码,就可以取得 root 的权限。

(2)chsh – 提升使用者的权限。执行 chsh,在输入新 shell 时,只要输入rootkit 密码,就可以取得 root 的权限。

(3)passwd – 提升使用者的权限。执行 passwd,在输入新密码时,只要输入rootkit 密码,就可以取得 root 的权限。

(4)login – 能够纪录任何使用者名称,包含 root 登入的密码。

(5)bd2 – 木马程序 rpcbind 允许攻击者在受害主机上执行任意程序代码。

木马程序程序

(1)inetd – 木马程序 inetd 可以替攻击者打开远程登入的通讯端口,只要输入密码就可以取得 root 的权限。

(2)rshd – 替攻击者提供远程的 shell。

(3)rsh – 透过 rsh 可以取得 root 的密码。

(4)sshd -攻击者以特定账号密码登入就能拥有 root shell 的权限。

监听程序

(1)linsniffer – linux 小型的监听程序。

(2)sniffchk – 这个程序可以检验与确认网络监听程序是否正在执行。

(3)le – Solaris Ethernet 封包的监听程序。

(4)snif – linux 其它封包的监听程序。

(5)sniff-10mb – 这是一个设计来监听 10mbps Ethernet 的监听程序。

(6)sniff-100mb – 这是一个设计来监听 100mbps Ethernet 的监听程序。

其它种类

(1)fix – 安装木马程序时 (例如:ls) 更改的时间戳记与检验封包值的讯息。

(2)wted – wtmp 的编辑程序。可让攻击者修改 wtmp。

(3)z2 – 移除 wtmp/utmp/lastlog。

(4)bindshell – 把 rootshell 与某个通讯端口结合在一起。(预设埠号为 31337)

(5)zap3 – 攻击者会从 wtmp, utmp, lastlog, wtmpx 和 utmpx 移除他们的踪迹 。zap3 通常根据下列目录来找寻纪录文件的位置,例如 /var/log, /var/adm, /usr/adm, 与 /var/run。

2.内核级别rootkit

内核级别rootkit 是比应用层级别 rootkit 功能更强大的 rootkit。内核级别rootkit

透过操作与利用 kernel,已成为最难被发现 rootkit,因为它能够在应用层检查中,建立一条绕过检验的通道。虽然这种软件主要是针对 linux 所制作,但它可能被修改来针对某个通讯端口或者是其它的操作系统来做攻击,一旦被安装在目标主机上,系统就可说是完全被黑客所控制,系统管理员甚至根本找不到黑客隐藏的踪迹。内核级别rootkit 是如何运作的呢? 它基本上是利用 LKM『Loadable Kernel Module』的功能让攻击者做出非法的动作。LKM 在 linux 或其它系统中都是非常有用的工具,支持 LKM 的系统包含 FreeBSD 与 Solaris。操作系统里面有一些函数被系统用来建构 kernel,当这些函数遭到假冒与窜改,主机就不能再被信任了。下面针对内核级别rootkit 的一些运作方式来做介绍:

(1)隐藏程序 – 在 unix 执行过程中,程序的纪录讯息会存放于文件系统中的 "/proc",隐藏程序可以操作 sys_getdents() 系统呼叫函数,在程序的架构里就看不见这些附加且正在执行的程序。

(2)隐藏网络连结 – 类似于隐藏程序,网络连结会纪录在 "/proc/net/tcp" 与 "/proc/net/udp" 这两个文件之中,执行 Kernel rootkit,无论何时读取这两个文件,都会隐藏攻击者的踪迹,不让用户知道。

(3)隐藏 LKM 的信号 – 通常 LKM 的默认值是可被看见的,这样是为了方便其它使用者也可以使用。攻击者必须使用"EXPORT_NO_SYMBOLS" 命令隐藏这些信号,以防止任何信号被泄漏出去。

(4)利用 LKM 传递讯息 – LKM Kernel rootkit 安装完成之后,攻击者若要通知kernel 隐藏另一文件,可透过 Kernel rootkit 来替换 sys_settimeofday()。之后只要透过一些特别的参数,就可以请求系统来完成攻击者想要完成的事情。

(5)改变文件的执行 – 有时攻击者可能想要替换掉某些文件,例如 "login",但并不想要更改文件,此时 Kernel rootkit 可以替换 sys_execve()。这样系统会持续执行 "login" 并泄漏 "login" 程序的版本给攻击者。

目前最流行的内核级别rootkit,包含 linux 上的 knark 与 Solaris 上的Loadable Kernel Module,其中 knark 还包含了以下的程序:

(1)hidef:用来隐藏文件。

(2)unhidef:用来设定执行文件重新导向,使攻击者的木马可以被执行。

(3)nethide:可以隐藏 /proc/net/tcp 与 /proc/net/udp 字符串,这也是netstat 撷取资料的地方,攻击者可以用这个工具将目标主机上使用中的联机讯息隐藏起来。

(4)taskhack:可以改变正在执行中的程序,因此攻击者可以将 /bin/sh 的程序,更改成为 root 的使用者账号。

(5)rexec:可以从远程在 knark 服务器上执行命令,也可以用来支持 ip 造假的功能。

(6)rootme:可以将权限提升到 root。