僵尸网络(Botnet)已出现多年,对网络安全构成了巨大的挑战。随着攻防技术的发展,除了基于PC和服务器的传统僵尸网络,近年来,还出现了多种形态的僵尸网络,如基于智能手机、IOT设备或者Webshell等等的新型僵尸网络。 Web前端僵尸网络的基本原理本文将介绍一种基于Web前端的僵尸网络。在新的HTML5标准越来越广泛地被使用之后,HTML5的强大功能为构建僵尸网络提供了可能性。由于这种僵尸网络基于支持HTML5的Web前端浏览器,所以其权限很低。不过,基于Web前端的僵尸网络至少可以用作DDOS攻击,如果处理得当,也可以用作对HTTP服务器进行扫描等操作。 下面是本文总结的Web前端僵尸网络的技术基础:
以上三个技术点,合成在一起,为僵尸网络的存在提供了基本条件。下面进行详细介绍。 Web WorkerWeb Worker 是运行在后台的 Javascript,独立于其他脚本,不会影响页面的性能。下面简单列举一下Web Worker能够做什么。
Web Worker增强了浏览器的能力。功能强大了,危险性也随之增大了。 CORS跨域资源共享机制跨域HTTP请求(Cross-site HTTP request)是指浏览器向提供第一个资源不同域名发起的请求。CORS机制可以让Web应用服务器能支持跨站访问控制,从而使得安全地进行跨站数据传输成为可能。 很多文章和资料对CORS机制内部工作原理解释的不够清楚,导致本人一度以为CORS是在跨域请求发出时拦截或者在服务器层次禁止了资源的返回。然而实际上CORS安全机制并没有针对服务器提供任何保护。 本文只针对XMLHttpRequest总结以下几点:
因此,对于服务器来说,假设有10000个XMLHttpRequest同时对某资源发出请求,以上的请求与10000个用户同时用浏览器正常访问这个资源是等价的,因为都是做同样的处理,都是返回同样的内容。这也就是说,使用Web Worker和XMLHttpRequest进行DDOS攻击是可行的。 Web蠕虫Web蠕虫是Web前端僵尸自行传播的方法。这种机制利用的是传统前端漏洞,例如XSS漏洞。 本文没有尝试实现僵尸节点(Web前端)和控制端的交互,这需要更复杂的JS代码,顺便提一下已经实现此类功能的BeEF XSS框架。 这个框架很流行,集成了很多功能,甚至能够结合MSF使用。但是这些不在本文的探究范围之内。本文只对这个框架控制端和僵尸节点的交互进行演示。 Kali Linux系统中集成了这个工具,本文用Kali Linux虚拟机进行演示。 打开BeEF框架之后如图所示,不要关闭这个终端,等待程序加载完成后,一般情况下浏览器会弹出,如果没有弹出,打开浏览器手动输入终端中显示的UI URL。 默认的用户名和密码都是beef。登录成功后的页面如下: 首页上有一些被植入恶意Javascript的Demo。为了演示的方便,使用实体机的Safari浏览器进行访问,将会在左侧显示信息。接下来按照下图点击到如下页面。 点击红色圆圈中的Execute之后,将会在用户浏览器执行上面方框中输入的Javascript代码,给用户的浏览器弹出一个对话框,下图是实体机的Safari浏览器中的效果: 通过这种方式,就可以在用户的浏览器中执行控制端需要僵尸节点执行的代码。有兴趣的朋友可以去读一下BeEF框架中hook.js文件源代码,应该会有很多启发。 僵尸网络节点代码测试(源代码根据《Web前端黑客技术揭秘一书》实例修改)测试的思路是:植入恶意Javascript代码,批量对某网站发送100次XMLHttpRequest,此次尝试的对象是腾讯的网站,因为单个节点的100次请求肯定对腾讯服务器无影响。 攻击url为:http://news.qq.com/photo.shtml,用户访问的url为:http://localhost/botnet/index.html,测试代码见附录。 通过Wireshark和chrome浏览器network开发者工具对测试结果进行分析: Wireshark抓到的tcp流: 详细查看Response: Chrome: 可以看到,Wireshark抓到了Response是有资源数据的,但是Chrome中得到的只有服务器返回的状态信息,这是CORS机制在浏览器层次对于跨域资源做了限制。 但是,Wireshark抓包得到的数据可以证明服务器实实在在地对每个请求都做出了正常的响应。当这样的僵尸节点数目和Web Worker并发数目都增大到一定的等级,理论上就可以形成强大的DDOS攻击了。 总结HTML5时代的Web前端已经不再那么简单。支持HTML5的浏览器,给了僵尸网络足够的生存空间。 附录:测试代码(根据《Web前端黑客技术揭秘》示例代码修改) run_worker.js:当浏览器支持Web Worker的时候,就会根据代码循环建立Worker。利用new worker(worker_loc)方式,创建Worker对象,并利用Worker的postMessage方法向worker发送指令等数据。多个Worker可以实现并发。但是本例只建立了一个Worker。 worker.js:Web Worker可以使用XMLHttpRequest发送跨域请求。这个函数可以使用GET和POST两种方法,一般使用GET方法就可以了,但是POST方法不限制发送长度和字符,有些情况必须要用POST方法。本例中采用GET方法测试。 index.html:index.html几乎没有更改,因为这个网页的内容对恶意Javascript的测试没有影响。 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|