互联网安全解析:P2P僵尸网络入门。据Fortinet研究,业界排名前五的僵尸程序分别是:ZeroAccess、Jeefo、Smoke、Mariposa和Grum(Tedroo)。其中,Grum网络在2011年7月被打掉了,Mariposa的主C&C服务器在几年前也被拿下。2012年12月下旬,微软联合欧美执法部门断掉了ZeroAccess。
当人们正大肆宣传ZeroAccess被攻克的消息,MalwareTech 博主认为是时候介绍一下P2P僵尸网络(botnets)了。包括僵尸网络的工作原理和应对方法。
传统僵尸网络
传统僵尸网络图例
无论使用HTTP、IRC或是其他协议,传统僵尸网络的构成都是相同的。所有的僵尸主机(bot)都通过一个或多个域名连接到一个或多个服务器。尽管网络结构可能千差万别,或一目了然,或错综复杂,通过各服务器间良好的协作,都可以轻易摧毁僵尸网络。
恢复僵尸主机正常工作最常见的办法,就是夺取它所使用的域名或服务器的控制权。然而有些时候由于某些原因我们无法向僵尸主机发送指令,就需要另一种手段。当然尝试关闭命令与控制服务器(C&C Server)一般情况下都是浪费时间的做法,因为主控者(botmaster)不需要花多少时间,就可以找到另一个服务器,并将域名重定向到它上面。于是我们就只有在域名上做文章来应对了。
高手操纵的僵尸网络通常会使用多个域名,当其中一个被关闭时,僵尸主机会连接到另一个。想要彻底破坏这样的僵尸网络,有两个办法:1、暂时关闭所有和这个僵尸网络相关的域名(需要在短时间内完成,以防主控者操作僵尸主机定向到新的域名);2、把僵尸网络使用的域名定向到一个有特殊功能的服务器(如Sinkhole路由器),使僵尸主机远离正常的控制服务器,从而切断主控者对它们的控制。
P2P
不同于传统僵尸网络在域名或服务器被夺取控制权时表现出的脆弱,P2P僵尸网络会建立一个相对分散的网络环境。思路就是所有的僵尸主机都互相连接并且进行通信,从而不再需要一个中心服务器,但实际上并不单纯是这样。
指令
如果所有的僵尸主机都能互相通信,那么主控者需要确保只有他能向这些主机发送指令,通常的解决办法是数字签名。这个签名是由不对称加密算法生成的,需要两个密钥(公钥和私钥)。如果其中一个密钥用于加密消息,那么必须使用另一个来解密。于是主控者可以自己持有一个密钥(私钥),将另一个(公钥)发放到僵尸主机上。他使用私钥对指令进行加密,然后僵尸主机使用公钥解密。没有私钥,任何人都无法正确加密指令。
网络架构
图1
大部分人眼中P2P僵尸网络的构造和图1类似,所有僵尸主机通过IP地址互相连接,互相发送命令,完全不需要中心服务器或者域名。很遗憾,这种表述是错误的。
那些使用NAT、防火墙,或者代理访问网络的计算机,无法接受连入的请求,它们只能向外发送消息,这会导致大多数僵尸主机无法被另一个直接连接。在传统僵尸网络中,这根本不是问题,因为僵尸主机都是连接到服务器的。因此在P2P网络中,我们仍然需要服务器,只不过形式不同罢了。
图2
把那些可以接受连入请求的僵尸主机(没有使用代理、NAT或防火墙)作为服务器(通常称作节点),同时那些不能连入的主机(通常称作worker,暂译工作机)将向一个或多个节点发起连接,从而获取指令(图2)。尽管这些节点仅仅从技术上可以作为服务器,但是可以利用它们防止僵尸网络被摧毁。办法就是:所有的工作机在节点间是分布式连接的,这使它们在某个节点失效时,能够轻易转移到另一个节点上。有时关闭所有的节点是一件不切实际的事情,于是P2P僵尸网络得以持续工作。不幸的是,这些节点都是合法的普通计算机,它们可不能像服务器一样随意被我们控制。
每个节点都维护着一个IP列表,它包含所有和自身有相同工作机的节点。然后工作机再获取这个列表,于是它们就能够在其中某个节点失效时转向另一个。在这个阶段,数个僵尸主机成为一组,并且连接到许多不同的节点,但整个僵尸网络还无法接受指令。为了使指令能够抵达网络中各台主机,需要僵尸主机连接到多个节点并把接受到的指令发送到其他节点,或者节点之间相互连接同时相互传递指令,亦或者把两者结合起来。
引导增殖
要将一台主机拥入僵尸网络的怀抱,它至少需要获取一个节点的IP地址,这时引导增殖的过程便开始了。僵尸程序里硬编码了一系列可提供自身繁衍所需信息的服务器(暂译引导服务器),当程序第一次在被感染的计算机上运行时,它就会连接到这些服务器。引导服务器的工作就是维护一个海量的节点地址,将其中一部分发放到僵尸主机上(把主机引入僵尸网络)。通常来说,引导服务器使用某种签名,防止被安全人员劫持,也避免提供无效的节点地址。
显然引导服务器是中心要点,就像传统僵尸网络一样,他们可以被破坏,然而这也不算什么大不了的事。如果所有的引导服务器在一瞬间被全部拿下,这也不会影响到已经存在的僵尸主机,只是阻止了新僵尸的加入。主控者可以从容地暂停感染新机器,直到他设置好新的引导服务器。因此这个办法只能算是一个临时措施,去攻击僵尸网络的引导增殖系统意义并不大。
拆解僵尸网络
攻击引导服务器只是临时地阻止了网络的感染,而包含数字签名的指令使得除了主控者以外的人无法操纵僵尸主机,同时节点数量又太多以至于很难同时被击破,那么我们还能做什么呢?
投下慢性毒药
几乎所有的P2P僵尸网络都有一个弱点,那就是所有的对等主机会使用相同的运行机制。像之前描述过的那样,节点主机需要维护包含其他节点的列表,同时共享给工作机,使它们能够分布式地连接到一系列节点上。如果主控者手动为每个节点提供其他节点的地址,将耗费难以估计的时间,甚至是不可能做到的,因此交给节点自动完成。当一个僵尸节点被认定可以接受连入请求时,节点主机便连接到它,并给它共享一个节点列表。
那么如果你引入一台对僵尸网络来说居心叵测的计算机呢,它有条件作为节点主机,并且向其他节点共享一个包含无效IP的列表。很可能效果不是很大,节点会校验新获取的IP以确保它们可用。但是既然想到了这点,离成功也就不远了!
安全人员可以引入许多这样的“恶意”计算机,并非提供无效的节点IP,而是提供它们各自的IP。资源充足的情况下,“恶意”计算机会成为僵尸网络中重要的一部分,并且把僵尸主机和节点主机分离。通过这样的方式,可以使工作机只能获取“恶意”的节点,从而显著降低它们重新成为僵尸网络一员的可能性。在一定的时间内,“恶意”节点会阻止正常节点传播命令,于是工作机也无法接收到指令,打了主控者一个措手不及。这个办法不太可能将所有的工作机分离出来,但已大大削弱了僵尸网络的影响程度。保持“恶意”节点持续运行能够将更多的主机占为己有,也时刻监视着那些可能存有“正常”节点IP地址的僵尸主机。