マルウェア解析の現場から-02

 リージョナルトレンドラボでは、毎日たくさんのマルウェアの解析を行なっています。解析した結果はウイルス情報などの形で公開したり、問合せをいただいたお客様に個別に回答したりしますが、解析結果を得るまでにはそこに至る過程があります。解析の結果ではなく、解析の過程で解析エンジニアが感じたことに焦点をあてる本ブログのこのシリーズ。第1回目はお蔭様で好評をいただくことができましたので、同じ形で進めていくことにします。さて、第2回目は・・・

■暗号

 暗号とは、フリー百科事典のウィキペディア(Wikipedia)によれば、
「第三者に通信内容を知られないように行う特殊な通信(秘匿通信)方法のうち、通信文を見ても特別な知識なしでは読めないように変換する表記法(変換アルゴリズム)のこと」
とあります。私は暗号分野を本格的に勉強したことはありませんが、マルウェアを解析していると攻撃者がメッセージを隠すために本来のメッセージを別のメッセージに変換する場面によく出会います。先日解析を終えたばかりの「TROJ_GIBON.D」/「BKDR_GIBON.D」にも、そのようなコードがいくつかありました。マルウェアを実行しただけでは分からないような暗号化/復号の変換アルゴリズムを知ることができるのも、リバースエンジニアリングによる解析の面白みの一つと言えます。例えば、BKDR_GIBON.Dを作成するTROJ_GIBON.Dには、次のコードが含まれていました。

図1 暗号1-アセンブリコード
図1 暗号1-アセンブリコード

 これだけ見ても何が書いてあるのかアセンブリ言語を知らない人には全く理解できないと思いますが、このコードを読める人向けに少し補足すると[ESP+40]は変換アルゴリズムで使用する”xoky4?zps1d9qw6fmt2l/vjc.na&i=5eg7b0ru3h8″という文字列の先頭アドレスを指しています。そして、[ESP+15C]が指している暗号化前の文字列”m=ipz”をこのコードの処理に掛けると別の文字列に変換し、結果を[ESP+70]のアドレスから書き込んでいきます。さて、ここで”m=ipz”はどんな文字列に変換されるでしょう?、、、ってこの簡単な説明だけで変換後の文字列が想像できてしまう人はコード解析や暗号によほど詳しい人ですね。アセンブリが読める人は少ないと思うので、参考にCライクなコードもつけておきましょう。このアセンブリコードはC言語で書くとこんな感じになります。

図2 暗号1-Cコード
図2 暗号1-Cコード

 これだと分かる人がぐっと増えたのではないかと思います。
正解は、”x16x29x28x7x6″。コードを読まずとも、元の文字列”m=ipz”と変換キーとなる文字列”xoky4?zps1d9qw6fmt2l/vjc.na&i=5eg7b0ru3h8″、そしてこの変換後の文字列”x16x29x28x7x6″からだけでもアルゴリズムを想像できるかもしれません。そう、元の文字列の各文字が変換キー中の何文字目に存在しているのかを「”x”+<文字位置>」の形で表しているのです。

■暗号その2

 TROJ_GIBON.Dはこのアルゴリズムを使って暗号化したメッセージをHTTPのGETメソッドを使ってC&Cサーバへ送信します。

 GET ?ddos=x16x29x28x7x6 HTTP/1.0

 送信した後は応答を受信しますが、この応答データには実は別の暗号化が施されています。今回テストした時点では次のデータが返されてきました。

#60.220.590.506#81.238.546.595#00.223.587.68#81.238.540.565#81.238.546.559
#512.568.3.10#00.223.587.61#00.223.587.05#00.223.501.27#00.223.587.03
#00.223.501.26#00.223.501.20#81.238.94.298#81.238.94.291#81.238.94.242
#81.238.94.249#00.223.587.64#00.223.587.67#00.223.587.66#00.223.587.60#

 一見すると4つのオクテットがあるIPアドレスのようですが、よく見ると590とか00とかIPアドレスとしてはありえない数字が含まれています。この文字列を復号するコードは次のようになっています。

図3 暗号2-アセンブリコード
図3 暗号2-アセンブリコード

 これも補足すると、最初のlstrlenAを行なうときのEDIと[ESP+34C]は応答データの文字列の先頭アドレスを指しています。そして、[ESP+18]は”3529476081″を、[ESP+24]は”0123456789″をそれぞれ指しています。さて、どのように変換されるか分かりますか?これはCで書くとこんな感じですが、このコードは機械的に変換されたものなので、文字列の配列とポインタの扱いが見難くなっていて逆に分かりづらいですね。

図4 暗号2-Cコード
図4 暗号2-Cコード

 この応答データをこの変換処理にかけた結果は次のようになります。

#67.227.137.176#89.208.146.131#77.220.185.68#89.208.147.161#89.208.146.113
#192.168.0.97#77.220.185.69#77.220.185.71#77.220.179.25#77.220.185.70
#77.220.179.26#77.220.179.27#89.208.34.238#89.208.34.239#89.208.34.242
#89.208.34.243#77.220.185.64#77.220.185.65#77.220.185.66#77.220.185.67#

 こちらもインプットとアウトプット、そしてキーになっている二つの文字列を見るだけで、どのようなアルゴリズムが使われているのか想像できるかもしれません。そう、これは、特定の文字だけを別の文字に置き換えるという極めて単純なアルゴリズムなのです。こんな単純な暗号化でも、パケットとして見える暗号化された文字列を見ただけでは何が書いてあるかわからないという意味では効果は絶大です。

■暗号その3

 この他に、TROJ_GIBON.Dは最初の暗号化アルゴリズムを使って次のようなメッセージも送信します。

p=com&m=get&pr=2624&w=xp

 これは、テスト時にTROJ_GIBON.Dがオープンしたランダムなポート番号(2624)と実行中のOS種類(”xp”:Windows XP)をC&Cサーバへ通知するところです。この文字列は先ほどのアルゴリズムで暗号化されることによって、次のように送信されます。

GET ?ddos=x7x29x23x1x16x27x16x29x32x31x17x27x7x36x29x18x14x18x4x27x13x29x0x7 HTTP/1.0

 これが送信されると、次の応答が返ってきました。

HTTP/1.1 200 OK
Date: Wed, 25 Nov 2009 07:06:55 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.0 mod_ssl/2.8.16 OpenSSL/0.9.6g
X-Powered-By: PHP/4.3.0
Connection: close
Content-Type: text/html

###404 Page not found

 この応答は、一見すると正常なHTTPのエラー応答のように見えます。でもよく見ると”###”なんて文字列が先頭にあってちょっと変です。実はTROJ_GIBON.Dは応答データに”###”という文字列が存在しているかどうかをチェックして、存在する場合には次の処理に進むという仕組みになっているのです。これは暗号化とは違いますが、一見しただけでは分からないようにするという意味で目的は同じとも言えます。

■暗号その4

 最後にもう一つ。TROJ_GIBON.Dが作成するBKDR_GIBON.Dは、次のアルゴリズムを使って送受信データを暗号化/復号しています。

  • 暗号化キー
  •    ”Poshel-ka ti na hui drug aver”

  • 復号キー
  •    ”reva gurd iuh an it ak-lehsoP” ※暗号化キーの逆順

  • アルゴリズム
  •    1) 変換前データをキー長毎のブロックに分割する。
       2) 各ブロックに対してキーを利用してXORマスクをかける。
       3) マスクしたデータの順序を逆順に並べ替える。
       4) キーの利用が偶数回目の場合はそのブロックのビットすべてを反転(NOT)する。
       5) キー長と合わなかった余り部分はXORマスクを掛けずビット反転(NOT)のみを行なう。

     XORマスクは多くのマルウェアが使う非常に簡単な暗号化の手法ですが、ここでは単純なXORマスクだけでなく、その結果をさらに操作する少し複雑なロジックになっています。ここで重要なのはこのキーとして使用される文字列です。この文字列、実は過去の調査でPushdo/Cutwailというマルウェアが使用していることがわかっており、そのことからこのBKDR_GIBON.DはCutwailと関連があると言えます。このように暗号化のアルゴリズムがわかると、マルウェア同士の関連までわかってしまうのです。

     さて、ここまでTROJ_GIBON.D/BKDR_GIBON.Dを例にマルウェアが使用する暗号化/復号手法をご紹介してきましたが、暗号化/復号のアルゴリズムを解析する面白みを感じていただけたでしょうか。ところで、先ほどのキーの文字列” Poshel-ka ti na hui drug aver”はどのような意味があるのか疑問を持った方もいらっしゃるかもしれません。実はこの文字列、過去の調査によればロシア語だそうです。知らない言語で書かれた言葉はそれだけで暗号のようですね。そしてこの言葉、英語では「Screw you my friend aver」という意味になるとか。この「aver」というのは、AntiVirusに携わっている人たち、そう、私のような解析エンジニアなどを指しているのですね。解析をしているとこんなメッセージを受け取ってしまうこともあります。彼らから見れば我々は彼らを丸裸にしてしまう敵ですからね・・・。それでは、また次回お会いしましょう!

  • 更新履歴
  • – 図2と図4のC言語コードの画像が反対になっていたため修正しました。ご指摘くださった皆さま、ありがとうございました。