设计并实现一个大规模分布式BOTNET系统(一)

来源:互联网 发布:收银机软件免费 编辑:程序博客网 时间:2024/06/05 10:56


    前天早上,美国DNS服务商Dyn宣布,该公司在当地时间周五早上遭遇了一次DDoS(分布式拒绝服务)攻击,从而导致许多网站在美国东海岸地区宕机,如Netflix、Twitter、Spotify和Reddit等。

Twitter、Tumblr、Netflix、亚马逊、Shopify、Reddit、Airbnb、PayPal和Yelp等诸多人气网站无一幸免。  





这次攻击是很不寻常的,攻击者盯上的目标不是单纯的一个两个网站,而是电信运营商的DNS服务器。击垮DNS服务器,足以让一个区域内的网络设备之间的通信处于混乱状态。

DDOS攻击最近是越来越猖獗了,网上探讨DDOS攻防的书也有很多,本文换一个角度,从开发者的视角去探讨DDOS攻防。站在攻击开发者的角度,我们看看如何设计并搭建一个DDOS系统-BOTNET.


所谓的BOTNET,即机器人(僵尸)网络,正如电影中的僵尸/机器人大军一般,得到一条指令的情况下,向着同一个目标连续不断地发动洪水攻击。


一个典型的僵尸网络的示意图如下所示: 





攻击者机(最右边)向C&C(Command&Control) Server 下达攻击指令,C&C服务器将攻击者指令传达给僵尸机群(图左),僵尸机群执行攻击指令。

仔细分析一下上图,就会发现,真正实施攻击的是数量极大的BotClients僵尸机,

而不是C&C Server或者攻击者自身,因而DDOS攻击具有一定的隐蔽性。要想打破这个系统也非常容易,这个系统的核心正是C&C服务器。如果能将C&C服务器到僵尸机群的通信链路或攻击者到C&C服务器的通信链路中任意一端阻断就可以彻底摧毁这样一个僵尸网络。

为了增强BOTNET的可靠性,很容易设想到的一个改进方法是——增加多个C&C服务器,各个服务器的地位是对等的,这样,在其中一台C&C服务器出问题后,另一台服务器可以立即接管它管辖下的僵尸机群。

拓扑结构如图所示:




当然这样的设计亦存在弊端,当一台僵尸机上的控制程序被防御方破解后,所有中控C&C服务器的IP地址又会全部暴露出来。这时候,只需要依次阻断这些个C&C服务器,就可以解散这个僵尸网络了。


攻击者能想到的最直接办法就是:进一步提升C&C服务器的数目。10台C&C服务器能够被掐断,100台1000台10000台的话,全部掐断这些C&C服务器变得几乎不可能完成。当然,这也意味着管理这个庞大的僵尸网络变得困难起来。于是很自然的,出现了分布式C&C服务器组。如下图所示:

 


在这样的树形结构下, 即便一台二层服务器被掐断,整个僵尸网络只会损失一小部分僵尸机,大部分僵尸机不会被损失掉。这样的设计立刻加大了防御方的防御难


度,即便破解了许多台僵尸机,也只能获得很少一部分次级控制服务器的IP地址,短时间内破坏整个僵尸网络成为一件几乎不可能实现的事情。


BOTNET的最高级别就是去中心化的设计思路,拓扑中的每一台僵尸机都可以作为中控服务器向拓扑中的其他僵尸机广播指令,当然这势必会增加僵尸机受控端的设计复杂度,增加很多关于通信与控制指令接收的设计,并且会影响攻击指令下达的速度,造成一定的传输时延。

因此,究竟采取哪种设计模式,取决于僵尸网络的规模和应用需求。


下面我们主要从三个部分讨论应该怎样设计一个大规模的分布式BOTNET应用。


1、受控端控制程序

2、通信

3、C&C服务器


先从僵尸机控制程序说起。

(此部分不讨论通过何种手段获取僵尸机的控制权,只讨论获取控制权之后部署控制程序的种种问题。)

假设我们现在拥有了10万台僵尸机的控制权,该权限允许我们在机器上执行正常用户所能执行的基本功能,假设允许我们能够执行一个可执行程序,对部分目录进行读写。

在很多人眼里,这样的控制程序其实就等同于一个木马,然而,这样的控制程序势必要拥有高于木马的执行力、隐蔽性、反杀毒软件查杀的能力。在我看来,它接近于rootkit,甚至在某些方面的设计必须考虑的比rootkit还要细致。


从以下几个方面简单讨论一下僵尸机控制程序所要考虑的核心问题:


1、跨平台

2、可靠加密通信

3、访问维持

4、免杀与防火墙穿越

5、动作规约

6、反取证及反逆向

7、远程获取更新和辅助攻击动作模块

8、核心代码去本地化




1、跨平台


这个问题是部署受控端程序时所必须考虑到的问题,受控端的操作系统、处理器架构千变万化,基本涵盖了当下各式各样的计算机,如果不采用一种可移植性高的语言,例如使用c编写的软件,不经过交叉编译是无法同时运行在arm和x86这两种处理器架构上的。考虑到这一点,我最终选定python这种脚本语言作为开发受控端程序的基础语言,辅以某些C模块获取系统底层权限以提供维持访问等功能。不仅仅是因为在安装了解释器的任意计算机系统上都可以直接地运行python程序,没有安装解释器的系统可以针对其进行简单打包,更是考虑到了python语言几个比较重要的可以利用的特性,下文会详细阐明。


2、可靠加密通信:


为了防止受控僵尸机和C&C服务器的通信被截获破译,必须要对通信流量作一定的约束和强加密。


通信约束方面:

可以设计一个简单协议,在该简单协议上应用信息隐写方案,以固定格式从C&C服务器发送来的数据报中提取出攻击指令并执行,将状态信息等以类似的隐写方式传达给C&C服务器。


通信加密方面:

初步设想采用 

AES128+BASE64+Salt值+AES128+BASE64加密;

符合通信协议的数据报经过两轮AES加密后的传送出去。这其中的一个重点问题是:秘钥的分发与保存。

两轮AES的秘钥以及Salt值需要拆分成不同部分,从多于6个不同位置的控制节点获取后拼接成两份秘钥和Salt值。

然而考虑到这种架设在不可信终端系统上的应用程序,其通信的保密性在理论上都是可以破解的,其签名在理论上也都是可以伪造的,因而核心问题是如何避免重要信息的破译:比如攻击指令下达、新的模块传入等信息,以及避免中央控制节点的暴露。对于前者的解决方案,我考虑重点在于通信规约,也就是充分利用信息隐写的种种技巧,将攻击指令隐藏在图片像素点阵的某些约定位置等等。然而破译难易与否完全取决于攻击BOTNET的攻击者能否快速找到2组秘钥和Salt值及对僵尸机控制程序的逆向程度以及。。破译隐写信息的能力了(很拼智商的一件事) = =。

对于后者的解决方案,比较流行的方式多采取流量重定向劫持方案:即与中央节点通信的数据报头填写update.microsoft.com种种;在目标出口路由处劫持该数据报并转发给真正的中央控制节点。



3、访问维持


这个可以说是后漏洞利用阶段所要考虑的第一个问题。为了做到长久维持对僵尸机控制程序的访问权限,必须确保在多种情形下僵尸机控制程序不会掉线。比如僵尸机经过了休眠、重启等情形后,依旧保持对其的访问控制权是很重要的。这要求对应不同的系统,僵尸机控制程序需要做出不同的动作去获取开机启动权、睡眠唤醒权限、计划任务定期启动权等等。僵尸机控制程序被部署之后,首先探测取得目标系统的详细版本号,针对不同的系统类型和版本,尝试采用不同的办法将自己的引导模块写入某些目录中是解决访问维持问题的出发点。以Windows系统为例,将引导启动僵尸机控制程序的模块写入Windows计划任务事项列表是一种选择,这样可以保证定期触发执行一次僵尸机控制程序,但是其也有严重的缺陷,那就是隐蔽性较差,有经验的系统管理员会较经常查看是否有异常计划任务添加;高级一点的维持访问方法离不开一个词:劫持。通过劫持系统服务、劫持桌面快捷方式、劫持驱动程序和以调试为目的存在的映像,劫持DLL,部署一些钩子等等。再高级一点,劫持MBR。。将自身写入启动设备引导区种种,往往需要配合一些特定的0dayexp提权或补丁ring0内核函数才能进行。


第一篇就到这里了~

BOTNET的作用有很多,并不局限于发动DDOS攻击这样的恶意行为,所有需要分布式系统的任务利用BOTNET都可以高效地完成。


第二篇内容相关:

通过坚固地通信加密和访问维持等手段,可以确保BOTNET的健壮性,利用模块即用即销毁,随时随地任意更新僵尸机控制程序,可以最大化BOTNET的灵活性。反向链接穿越防火墙,动作规约避开杀软。


该项目的源码存至:https://github.com/0xcc-Since2016/BotNetPrj

欢迎有兴趣的各位联系wanderror@yahoo.com


0 0
原创粉丝点击