私のところに来た迷惑メールのマルウェアapkで遊んでみた

最近、LINEが流出源と見られる迷惑メールが相次いでいます。
パターンは決まっていて、まずはじめに、[email protected]というアドレスから次のような空メールが来ます。

From:[email protected]
Subject:無題

このメールから数時間後、次のメールが届きます。

From:アンドロイドアップマガジン事務局([email protected])
Subject:テレビで紹介された人気の電池持ち改善アプリを無料ダウンロード!

このメールには、マルウェアのダウンロードサイトのURLが本文中に記載されています。

その後さらに、このようなメールも届きます。

From:nov.9602.qr.1ll.iqr@ezweb.ne.jp
Subject:(空白)
Text:
突然ご連絡さし上げて申し訳ありません。

あなたがよくご存知の、ある方のご紹介で、ご連絡させて頂いております。
(以下略)

本エントリは、この「電池持ち改善アプリ」と称するマルウェアの挙動を見てみるというエントリになります。


f:id:yviscuit:20121209165204j:plain
先日、私のauケータイにこのようなメールが来ました。
あまりにも意味がわかりませんね。送り先考えましょう?って感じです。
さて、このメールが送られてきた原因ですが、情報流出で確定だと思います。
しかし、私はGR○EやM○bageには登録してませんし、m○xiもパソコンのアドレスで登録してあります。
唯一、心あたりがあるのは…LINEです。
私の身の回りではもうLINEによるコミュニケーションが広がっていて、初期の個人情報ダダ漏れの頃から友人達が使っていたのを記憶しています。
当然、私のケータイの電話番号やメールアドレスは登録されているので、流出源はそこでしょうね。
さすがNHN(Korea Corporation)です。


愚痴はともかくとして、せっかくおもしろい餌を運んできてくれたので、遊んでみました。
"このサイト、そしてアプリはなにをしているのか。"

Step.1:配布Webサイト

ケータイからでは手も足も出ないので、まずはiPhoneから見て見ることにします。
私はauのケータイを利用しているので、auone メールにそのまま転送して、iPhoneで受信できるようにしています。auone メールそろそろサービス終了らしいですね。

「電池切れ」を防止するための画期的なアプリ()とやらを配布しているらしいので、ダウンロードをはこちらから、のリンクを踏んでみたところ…
f:id:yviscuit:20121209165454p:plain
403 Forbidden、つまり実行拒否ですね。
多分iPhoneだから悪いのだろうと思い、UAをAndroidに偽装して表示してみました。
f:id:yviscuit:20121209165437p:plain
ずいぶんとPlay Storeに似せたサイトですね。
ダウンロードを押すと、Androidのアプリでお馴染みの*.apkファイルがダウンロードされます。
よく考えたら、普通に使っている人は、Unknown source installを許可していないはずなんですがどういうつもりなんでしょうね。
ページのどこにも、不明なソースからのインストールを許可してくださいという記載がなかったのですが(笑)

Step.2: .apk展開

ここからはiPhoneでは手に負えないので、パソコンを使うことにします。
.apkファイルは、拡張子を.zipに変えるとパッケージを展開できるパターンがあるそうなので試したところ、簡単に出てきてくれました。
すると、これらのファイルが展開されます。
f:id:yviscuit:20121209165711p:plain
この中の、classes.dexというファイルがdalvik VMの中間言語ファイルのようです。
私はバイナリアンではないので、これをソースコードに変換して解析したいと思います。
このファイルを、dex2jarとjadというソフトを通すことで、.javaファイルを生成することができます。
つまんでコマンドをメモすると、

sh dex2jar.sh classes.dex
出力されるclasses_dex2.jar.jarを.zipにし展開
jad -8 -d src -s .java -r ~ **/*.class  

これで、BuildConfig.java, MainActicity.java, R.javaという3つのソースファイルを入手できました。あとはJavaを読むだけです。

Step.3:ソースコードリーディング

一応、このアプリの利用規約はWebページにあったのですが、そこに「リバースエンジニアリングしちゃやーよっ(はぁと」みたいな文はなかったので、少し読ませていただきました。
どうやら、このアプリは"index.html"と"error.html"という2つのhtmlファイルと必要な画像をassetsに置いておき、アプリを起動した時にWebViewにロードし、その間に端末の連絡先から、名前とユーザ名をすべて抜き取って送信するアプリのようです。
また、抜き取ったデータはmicroSD(/mnt/sdcard/)に保存しておくようです。

Step.4:通信データ解析

このままではちょっとおもしろくないので、もう少し挙動解析してみます。
AVDを新規に一つ作り、adbでapkをインストールします。
Permissionを確認すると、以下のものを要求していました。
f:id:yviscuit:20121209165905p:plain

実験のために、連絡先にダミーのデータを1件作ります。
f:id:yviscuit:20121209165849p:plain
f:id:yviscuit:20121209165943p:plain

ここで、アプリをlaunchすると、このように動作対象外というメッセージが表示されます。
f:id:yviscuit:20121209170045p:plain
これがerror.htmlです。実態は.gifファイルを表示しているだけのhtmlですが...

この時のHTTP通信を見てみると、以下の様なHTMLリクエストがありました。
f:id:yviscuit:20121209170139p:plain
なお、ここのGETパラメータであるid?=以後の文字列は、Android_IDと呼ばれる固有値です。
Content-Typeがmultipart/form-data;である通り、先ほど取得したアドレス帳のデータ(list.log)をアップロードしているようです。(当然Not SSL)
転送文字列を見ると、メールアドレスとコンタクト名のペアになっていることがわかります。
転送に成功すると、HTTP Status Code:200が帰ってきて終了という形でした。
ちなみに、list.logのデータはこのような中身です。
f:id:yviscuit:20121209170338p:plain

ソースコード、及びBurpによるHTTP通信キャプチャでは、これ以外の情報の送受信は観測されませんでした。
結論として、このアプリは連絡先にあるメールアドレスと名前をすべて送信してしまうアプリだと考えられます。
なお、メール本文に紹介されているアプリはすべて同じ挙動を示しています。

Step.5:余談
このアプリ、Log.dにいろいろと出力していて面白いです。
今回の実験では、

D/xxx     ( 1687): start
D/xxx     ( 1687): [email protected]
D/xxx     ( 1687): mailaddress get!/mnt/sdcard
D/xxx     ( 1687): java.net.SocketTimeoutException
D/xxx     ( 1687): post end  

というログが出力されていました。
startとかendとか、mailaddress get!なんて出力していて可愛らしいです。

また、なぜメールアドレスだけなのか非常に気になります。
電話番号は不要なのでしょうか?
推測としては、迷惑メールの送信先確保が狙いなのかな、と思います。
一人引っかかれば、100倍近いアドレスになって帰ってくるわけですので(理論上)。

ということで、日曜日の早朝から始めた、ちょっと楽しいお遊びでした。