代码地址:Aoyama-master:https://github.com/Leeon123/Aoyama
另外一个找不到了。。。
一、背景意义
- 研究背景:
僵尸网络主要由3部分组成:僵尸主机(bots)、僵尸网络的控制者(botmaster)和命令控制通道(command and control,C&C),是攻击者出于恶意目的,传播僵尸程序控制大量主机,可以实现多种恶意活动,如分布式拒绝服务攻击(Distributed Denial of Service,DDoS)、垃圾邮件(Spare)、钓鱼网站(Phishing)、信息窃取(Information theft)等。僵尸网络是从传统恶意代码形态包括计算机病毒、网络蠕虫、特洛伊木马和后门工具的基础上进化,并通过相互融合发展而成的目前最为复杂的攻击方式之一。由于僵尸网络灵活机动和远程调度的特点,僵尸网络得到了攻击者的青睐和进一步的发展,从而已成为因特网最为严重的威胁之一。
僵尸网络带来的严重安全威胁引起了国际上的广泛关注。在学术界,USENIX协会从2007年开始举办僵尸网络专题研讨会HotBots(Workshop on Hot Topics in Understanding Botnets),2008年,W0RM与HotBots合并为LEET(Workshop on Lager-scale Exploits and Emergent Threats),专门探讨僵尸网络、间谍软件和蠕虫。同时,近年来在USENIX Security Symposium,NDSS,CCS,RAID等著名会议上发表的僵尸网络研究成果呈明显增多趋势。在工业界,微软公司在2004年发起了国际反僵尸网络工作。在政府部门,2006年6月美国陆军研究办公室ARO、国防高级研究计划署DARPA和国土安全部DHS 3个部门联合在GA Tech举办了名为“ARO—DARPA—DHS Special Workshop onBotnet”的僵尸网络专门研讨会,对这一严重安全威胁进行了深入探讨。
- 研究意义
DDOS攻击被视为最恐怖的攻击,其中僵尸网络在现代的DDOS攻击中发挥了巨大的作用,由于其产生的巨大危害性,以及现在对于此攻击的防护手段难以产生有效的作用,本文希望通过研究攻击来达到提高防御的效果。通过对GitHub中的两个开源项目Aoyama-master、Botnet-master的学习,来模拟僵尸网络中的DDOS攻击,以达到将该攻击的基本流程和结构框架深入研究的目的,将攻击具体化、细节化的呈现出来,方便更多专业的安全人士对症下药,以实现更好的防护手段。
- 研究内容
通过调研僵尸网络和DDOS攻击原理,分析Aoyama-master、Botnet-master等演示代码,复现基于僵尸网络的DDOS攻击,设计实现HTTP flood、UDP Flood 等攻击行为,为针对僵尸网络DDOS攻击的防护手段提供技术支持。
- 技术说明
(一)Botnet-master项目
- 项目简介
该项目主要由Master.py(僵尸主机的控制者),Bot.py(僵尸主机),TragetServer.py(目标服务器)三部分构成,还包含一个Util.py,具有其他文件可以调用的各种实用函数。Botnet-master项目拟模拟一种最简单的DDOS攻击,为了解DDOS攻击的流程方法提供了较好的实例。
图1 botnet-master 攻击流程示意
该项目具体的攻击流程实现如下:
第一步:控制者与僵尸主机验证身份并顺利连接,通过与僵尸主机的信息交互告知僵尸主机发起攻击的目标地址、端口号、时间。
第二步:僵尸主机获取攻击信息后,休眠至指定的时间后对目标服务器发起攻击,连续发送30秒的无用数据。
第三步:目标服务器为每一个侦听到的客户端创建一个线程进行处理,在接收30秒的数据后断开连接。
- TragetServer.py
TragetServer.py 的主要功能是在指定端口上运行一个虚拟服务器,通过调用多线程的方法对每个客户端进行处理,并将产生的日志文件写入到log.txt中。主要函数分析如下:
(1)log()函数
图2 log函数
由于目标服务器调用了多线程处理客户端,因此避免冲突是必要的。log函数首先通过filebusy变量对当前log.txt文件的使用状态进行判断,若存在线程正在进行写的操作,则休眠0.5秒后再进行判断,如此往复,避免了多个线程对文件写的冲突。通过以 ‘a’ 的形式打开log.txt ,并在文件不存在时自动创建,将日志写入该文件,以达到记录运行日志的目的。
(2)shutdown()函数
图3 shutdown函数
该函数起到关闭服务器的功能。通过globals()函数检查全局变量中是否存在‘server’字符来判断server服务,从而进行逐一关闭。
(3)handle()函数
图4 handle函数
该函数对每个连接的客户端进行处理。生成日志数据并调用log函数,通过while循环持续接受客户端传输的数据。
(4)多线程
图5 多线程处理
服务器启动一个线程运行在本地的端口,该线程负责为每个侦听的客户端启动一个线程进行数据传输的处理。
- Bot.py
Bot.py在指定端口上创建一个套接字,并开始侦听控制者。建立连接后,首先使用握手过程对其进行身份验证,如果身份验证成功,僵尸主机将向控制者发送当前时间。控制者返回信息,包含目标服务器的主机名和端口号,以及攻击时间,同时考虑到僵尸主机和主服务器之间的时间差。
僵尸主机进行休眠,直到指定的攻击时间后,连接到指定端口上的目标服务器,并持续发送消息30秒,即模拟DoS攻击。一旦 30 秒结束即攻击完成,僵尸主机就会断开与目标服务器的连接并退出。
主要内容分析如下:
(1)signal信号捕捉
图6 signal信号
SIGINT /* interrupt */ ,该函数实现捕捉SIGINT信号,即程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl+C)时发出,用于通知前台进程组终止进程。实现SIGINT信号和shutdown函数的绑定。
(2)Socket 属性设置
图7 设置socket属性
setsockopt函数用于设置套接字描述符的属性。服务端程序的端口释放后可能会处于 TIME_WAIT 状态(等待),要等待两分钟后才能被再次使用,可以通过设置地址复用,即设置 SO_REUSEADDR 选项,让端口释放后立即可以被再次使用。
(3)listenForMaster()函数
图8 listenForMaster函数
Bot首先与Master建立连接,然后通过信息的交互验证身份。Bot接收Master的验证消息,若等于Util.MASTER_PASSPHRASE字符串,则发送自己的验证消息——Util.BOT_PASSPHRASE字符串,待双方都验证通过后才保持连接。
(4)attack()函数
该函数实现对于攻击时间的判断和发起30秒的持续攻击。
图9 计算等待时间
如果现在的时间加上偏移时间未达指定的攻击时间,Bot会休眠一段时间,待达到攻击时间后发起攻击。
图10 攻击30秒
通过while循环和time()函数判断攻击时间是否达到了30s,持续发送字符串进行模拟攻击。
4.Master.py
控制者读取包含僵尸主机信息的文本文件,然后循环遍历每个僵尸主机。对于每个僵尸主机,它在指定的端口进行连接,并通过握手过程对自身进行身份验证。控制者向僵尸主机询问其当前时间,并确定自身与僵尸主机之间的时差。控制者向僵尸主机发送目标服务器的主机名、攻击端口、攻击时间、时差。
(1)readBotsFile()函数
图11 readBotsFile函数
控制者通过该函数打开bots_list.txt 文件获取Bot的地址和端口号,以便于进行控制和通信。
(2)connectToBots()函数
该函数主要功能为与Bot建立连接并进行验证,同时对时间进行处理,得到并发送具体的攻击时间。
图12 Master 的验证
与Bot一样,Master也具有验证身份的代码段,身份验证通过后才能保持稳定的连接。
图13 时间差处理
由于相互发送消息的延迟和不同机器时间的差异,会造成攻击时间的不确定性,因此Master对时间差进行了处理。得到一个delta时间作为Bot 的延迟时间。消除时间的差异性,进而精准的设置攻击时间。
(二)Aoyama-master项目
1.项目简介
该项目主要由cnc.py和client.py组成,cnc.py模拟僵尸主机的控制主机,包括发送控制信息,建立telnet远程连接服务等功能,client.py模拟僵尸主机,用于向目标服务器发起DDOS攻击,包括HTTP flood,UDP/STD flood , slowloris 等攻击手段。为方便读者阅读,下面先介绍DDOS攻击的相关知识。
DDOS攻击,分布式拒绝服务攻击,指通过大规模互联网流量淹没目标服务器或其周边基础设施,以破坏目标服务器、服务或网络正常流量的恶意行为。用一个比喻形容,将互联网上的服务器看作一个商店,将访问的客户当作购物的客人,DDOS攻击就相当于让一群小混混闯进商店,不仅不买东西还赖着不走,让正常的客人无法进入购物。DDOS攻击通过互联网进行,僵尸网络就是最好的载体,控制者通过C&C服务器远程控制僵尸主机发起攻击,以造成资源拥塞等问题。
该项目的特点:
- 通过建立telnet远程服务模拟C&C服务器,由本机模拟僵尸网络的控制者,通过C&C服务器向控制主机发送命令,模拟现实应用场景。
- 模拟多种DDOS攻击,更具有研究意义。
- 通过笔者建立的服务器来检验攻击效果,生动形象。
项目启动后,cnc主机会自动检测client.py创建的僵尸主机并与其验证连接,此时cnc主机等待接受C&C Server的指令。控制者通过telnet远程登录到cnc主机,模拟C&C Server向cnc主机发送攻击指令,僵尸主机按照指令对目标服务器发起DDOS攻击。
图14 Aoyama-master 攻击流程示意图
2.cnc.py
cnc.py主要负责开启telnet服务、对用户进行验证登录和向僵尸主机发送攻击指令。
(1)commander()函数
图15 commander函数
该函数根据用户输入的用户名和密码与log.txt中的正确用户名和密码进行比较,若不一致则关闭连接。
图16 加载Server
验证成功后,出现加载视图,加载完毕后即可输入指令进行操作,指令将被发送至僵尸主机进行攻击。
图17 C&C Server 视图
(2)handle_bot()函数
该函数通过cnc主机与僵尸主机进行信息的交互获取僵尸主机存活信息,并与不能进行信息交互的僵尸主机(已损坏)断开连接。
图18 handle_bot函数
cnc主机向僵尸主机发送加密后的‘ping’字符串,僵尸主机接收此字符串并解密后会回复加密后的‘pong’字符串,以此达到信息交互即检验存活主机的目的。
(3)xor_enc、xor_dec函数
xor_enc、xor_dec函数主要负责对cnc主机和僵尸主机之间信息交互时的流量加解密,原理为简单的异或运算。
图19 流量加解密函数
2.client.py
该函数通过指令处理函数对cnc主机攻击指令进行解读,从而调用相应的攻击函数进行DDOS攻击。
(1)handle()函数
图20 handle函数
若输入指令的第一个字符为‘!’,则该指令为攻击指令,继续识别字符,若遇到‘http’则为http flood攻击,函数会将后续的IP 地址、端口号、进程数、路径交付给http攻击函数,攻击函数利用相应的攻击信息进行攻击。
(2)HTTP()函数
大部分Flood攻击都需要攻击者以root权限控制大批量的傀儡机。收集大量root权限的傀儡机很花费时间和精力,而且在攻击过程中傀儡机会由于流量异常被管理员发现,攻击者的资源快速损耗而补充缓慢,导致攻击强度明显降低而且不可长期持续。HTTP Flood攻击则不同,攻击者并不需要控制大批的傀儡机,取而代之的是通过端口扫描程序在互联网上寻找匿名的HTTP代理或者SOCKS代理,攻击者通过匿名代理对攻击目标发起HTTP请求。HTTP Flood攻击会引起严重的连锁反应,不仅仅是直接导致被攻击的Web前端响应缓慢,还间接攻击到后端的Java等业务层逻辑以及更后端的数据库服务,增大它们的压力,甚至对日志存储服务器都带来影响。
HTTP()函数通过自己的字符串列表随机组装HTTP请求报文,包括连接类型、浏览器版本,同时随机化的添加一些字符串进行请求报文的差异化,达到一定的避免识别的目的。在攻击端口为443端口时,由于443端口主要是用于HTTPS服务,是提供加密和通过安全端口传输的另一种HTTP,函数会调用SSLContext函数对socket进行更高级的安全性设置,如数字证书等等。
![](https://img-blog.csdnimg.cn/5f7efaa8ae8e4651aeffcacb0b07afdf.png)
图21 HTTP Flood攻击函数
(3)UDP/STD ()函数
由于UDP协议排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使传输速度得到了保证,使得UDP协议得到广泛应用,为黑客们发动UDP Flood攻击提供了平台。UDP Flood属于带宽类攻击,黑客们通过僵尸网络向目标服务器发起大量的UDP报文,这种UDP报文通常为大包,且速率非常快,通常会造成以下危害:
- 消耗网络带宽资源,严重时造成链路拥塞。
- 大量变源变端口的UDP Flood会导致依靠会话转发的网络设备,性能降低甚至会话耗尽,从而导致网络瘫痪。
UDP()函数通过200个循环,持续发送由_urandom随机生成的指定大小的数据包对目标进行模拟攻击,占用了大量的服务器资源。
图22 UDP函数
STD()函数与UDP函数类似,区别是将内容替换为垃圾字符串。
图23 STD函数
(4)slowloris 攻击
HTTP协议规定,HTTP Request以\r\n\r\n结尾表示客户端发送结束,服务端开始处理。Slowloris就是利用这一点发起DDoS攻击的。攻击者在HTTP请求头中将Connection设置为Keep-Alive,要求Web Server保持TCP连接不要断开,随后缓慢地每隔几分钟发送1个key-value格式的数据到服务端,如a:b\r\n,导致服务端认为HTTP头部没有接收完成而一直等待。如果攻击者使用多线程或者僵尸主机来做同样的操作,服务器的Web容器很快就被攻击者占满了,TCP连接而不再接受新的请求。
由于测试后该项目中的slowloris函数不起作用,因此笔者自行上网查找了一个成功的代码——slowloris.py,分析如下:
图24 init_socket函数
init_socket函数创建socket并对目标服务器进行畸形连接,即不发送最后的‘\r\n’,迫使服务器不能断开连接,占用资源。
图25 半包请求
为使连接持续建立,僵尸主机会持续发送key:value形式的半包请求,并随机填充内容。僵尸主机定期检查socket连接状况,若发现某socket断开,则重新建立socket并重新连接,保证攻击的持续有效。
- 演示说明
(一)环境搭建
本文的两个项目均在Linux下的环境中运行,因此笔者采用了Vmware虚拟机下的Ubuntu系统进行实验。
(二)测试内容
1.Botnet-master项目
该项目运行在python2的环境中,先在8081端口启动目标服务器
图26 启动TragetServer
再通过demo.py启动4个Bot僵尸主机,demo.py包含启动4个僵尸主机的指令
图27 demo.py
图28 启动4个Bot
最后运行控制者的程序,控制者向僵尸主机发送攻击信息,僵尸主机对目标服务器发起攻击,此时目标服务器会接受30s的无用消息,达到攻击效果。
图29 攻击效果示意
2.Aoyama-master项目
(1)创建僵尸主机
创建两个僵尸主机client.py ,client2.py ,准备与cnc主机建立连接。
图30 client僵尸主机
(2)创建cnc主机
开启cnc主机,自动检测到等待连接的两台僵尸主机。
图31 cnc主机
(3)telnet 远程连接
telnet登录到cnc主机,输入用户名和密码,验证后成功登录。
图32 telnet登录
登录成功后,进入加载C&C Server页面,加载完毕后输入bots 指令查看当前建立连接的僵尸主机数量。
图33 C&C Server模拟
(4)利用Flask库建立TCP服务器
在本地5000端口的’/’和’/http’路径下开启TCP服务器并进行监听。
图34 flask服务器代码
图35 开启TCP服务器
图36 TCP服务器页面
(5)HTTP Flood
在C&C Server 输入!http 127.0.0.1 5000 1000 /http 对/http路径下的网页进行HTTP Flood 攻击。
图37 发动HTTP Flood指令
在终端可以监听到有大量的HTTP请求涌入/http网页。
图38 大量HTTP请求
再次尝试登录127.0.0.1:5000/http 网页,发现加载长时间无反应,攻击成功,造成Web前端响应缓慢。
图39 网页响应缓慢
(6)Slowloris 攻击
运行slowloris.py进行攻击,-p指定攻击端口,-s指定攻击线程。
图40 发动slowloris攻击
发起攻击后可以看到运行了1021个sockets线程进行攻击,猜测该web页面最多同时响应1021个请求,我们在浏览器访问该页面,发现无法加载,攻击成功。
图41 web页面无法加载
攻击进行时,没有监听到HTTP请求,停止攻击后,终端监听到1021个HTTP请求。由此得出,slowloris攻击实现作用。
图42 停止攻击后监听到请求
(7)建立UDP服务器
运行udp.py在本地6000端口建立UCP服务器。
图43 建立UCP服务器
图44 udp.py
运行udp2.py与udp服务器建立连接并发送关闭消息,udp服务器接收消息后关闭服务器,模拟udp服务环境。
图45 udp2.py
图46 udp服务器成功关闭
(8)UDP/STD Flood
输入指令发动UDP Flood 攻击,1000个线程,UDP数据包的大小为555bit。
图47 发动UDP Flood
图48 服务器接收UDP数据包
尝试运行udp2.py与服务器进行连接并将服务器关闭,发现无法建立连接并发送数据,体现出UDP Flood攻击成功,造成链路拥塞,网络瘫痪。在停止攻击后,重新运行udp2.py,成功关闭服务器。
图49 udp2.py无法与服务器建立连接
同理,可以成功发动STD Flood,僵尸主机发送垃圾字符串,造成链路拥塞。
图50 STD Flood攻击
(三)实验结论
本实验通过Aoyama-master、Botnet-master两个项目演示了利用僵尸网络发动DDOS攻击的场景,模拟了HTTP Food,Slowloris,UDP/STD Flood攻击的具体实现,检验了利用僵尸网络发起DDOS攻击的可行性,展示了僵尸网络发动攻击的严重危害。通过本实验,僵尸网络的危害性显而易见,对于如何有效抵御由僵尸网络发起的分布式拒绝服务攻击的研究迫在眉睫,笔者有一些思考:通过防火墙对非正常流量进行限流,若某段会话的报文速率超过某个阈值,防火墙可以锁定该会话,待到流量正常时,解锁会话。此外,客户端可以通过分析学习Flood攻击流量的共同特点来判断是否产生攻击,即指纹学习技术。
- 应用场景
(一)模拟僵尸网络环境
在进行僵尸网络的学习教育中,笔者认为不仅仅需要从理论上了解僵尸网络,了解僵尸网络的历史,构造,发展和现状后,更应该亲自动手实践,从环境的搭建开始,去感受僵尸网络的实际效果。实践是检验真理的唯一标准,通过本文的两个项目,学者可以更好的体会僵尸网络,继而去研究如何进行有效的防护,并在本项目的基础上进一步的完善,笔者认为可以开发一个针对僵尸网络DDOS攻击的项目,并在本项目上进行实践,验证效果。
(二)项目拓展
本文的两个项目都是在本地模拟环境下实现的僵尸网络攻击,若要进行进一步的、更深入的去研究僵尸网络,笔者认为可以在两个项目的基础上进一步完善,扩展到局域网、互联网环境下的僵尸网络,同时僵尸主机也不要仅限于本地端口,可以利用一些简单的漏洞和病毒去操控真实的主机。在更真实,贴近于现实的环境下,可以带来更好的参考价值。
版权归原作者 看海就会失去海 所有, 如有侵权,请联系我们删除。