☠️

4-3. スパイアプリ解析( Metasploit編)

に公開

C2サーバとの通信

最後に、 攻撃者の環境(C2サーバー)との通信を見ていきましょう。「4-1. スパイアプリ解析( Metasploit編)」で書いたとおり、このスパイウェアには、位置情報やSMS情報を盗む機能は備わっておらず、これらの機能を後からLoad(追加)する機能だけを持っていると書きました。

Load(追加)するには、まずもって攻撃者が用意したC2サーバーと通信をすることが必要となります。通信を確保して攻撃に関するコードをLoad(追加)することが可能となります。
その通信の方法が記載された部分が以下です。

通信環境への順応

以下のTCP/IPモデルを参照すると、3のトランスポート層ではTCPやUDPのプロトコルが、4のアプリケーション層ではHTTP、HTTPSなどのプロトコルが使用されています。

興味深いことに、このアプリは通信方法によってif文で条件を分岐させています。
冒頭のif文のブロックは、"tcp"と書いてあります。これは、アプリケーション層のプロトコルを使わず、3のトランスポート層におけるTCPソケット(Raw TCP Socket)を直接開いて通信を行うものです。
この利点は、HTTPのヘッダーなど余計なオーバーヘッドがなく、バイナリデータをそのまま送受信できます。そのため、リバースシェルなどの双方向通信に最適です。

他方で、elseで始まるブロックは、”URL”と書いてあります。これは、4のアプリケーション層におけるHTTPまたはHTTPSプロトコルを使っています。利点としては、ファイアウォールが通常Webトラフィック(HTTP/HTTPS)の通過を許可するため、仮にスマートフォンがファイルウォールで囲まれたネットワーク内で使用されていても、当該ファイアウォールによる防御を回避するのに役立ちます。
つまり、このアプリをインストールしたスマホの環境に合わせて最適な通信ができるよう切り分けが行われています。

a関数の実行にあたっての通信経路の確保

なお、if文ブロックでもelseブロックでも共通する処理は、a関数でして、これは「4-1. スパイアプリ解析( Metasploit編)」で記載した処理です。つまり、tcp通信(if文ブロック)であれ、http/https通信(elseブロック)であれ、C2サーバーとスマホとの間で通信経路を無事確保できたあとは、a関数が発動して不正なコードのダウンロードとその実行がなされます。

ここで、if文の中のa関数を呼び出しを見ていきます。
a(new DataInputStream(socket.getInputStream()), new DataOutputStream(socket.getOutputStream()), h)

socketとは、アプリ側におけるアプリとネットワークとを接続する入り口です。
電球の差し込み口である”ソケット”を思い浮かべると理解しやすいと思います。

このSocketを使って、"DataInputStream(socket.getInputStream())"はアプリがC2サーバからデータを受け取る(Input)仕組みを、"DataOutputStream(socket.getOutputStream()"はアプリからC2サーバへ返信する(Output)仕組みを作成(new)しています。

アプリは、これらの仕組みにより通信経路をしっかり確保した上で、a関数によって不正な命令を構成するデータをC2サーバから受信し、当該命令を実行して、命令結果をC2サーバに返します。

小括

以上がMetasploitの解析でした。
色々とよく考えて作られています。単にjavaでAndroidのアプリを作成する知識だけではなく、通信のプロトコルの理解やAndroidOSが提供している機能への理解なども詰まっています。

スパイアプリの開発者は、ソフトウェアプログラミング、ネットワーク、OS、ハードの知識を持った高度な技術者であることがお察しいただけると思います。さながら、打撃、組み技、寝技が必要とされる総合格闘家ですね。

Discussion