Cute FTPへの嬉しくない攻撃

スピアフィッシング攻撃は現在増加を続けており、FBIも複数の組織を標的にするその能力を懸念し、一般に向けて警告を出しています。これらの攻撃は、組織のネットワーク内に足掛かりを得ようと試みるAPT攻撃(Advanced Persistent Threats)の一部と見なされています。

先日、私のメール受信ボックスに、怪しげな添付ファイルが付いたスパムメールが2件届きました。以下がそのうちの1つのスクリーンショットです。


図1: スパムメール

2件のメールの添付ファイルを見てみると、2つが同じファイルであることがわかりました。フォーティネットではこれを、FTPクライアントを標的とするトロイの木馬、W32/Tepfer.D8A1!trとして検出しています。FTPクライアントはセキュアファイル転送のために多くの企業で用いられており、要するに今回のマルウェアは機密情報を盗み出すためにこれらを狙っているのです。

このタイプのトロイの木馬はすでに以前の記事で紹介しています。今回のブログ記事では、このマルウェアがWindowsの特定のAPI関数を使ってFTPソフトウェアからユーザー情報を盗み出す方法を解説しましょう。

CuteFTP: データファイル「sm.dat」を盗み出す

W32/Kryptik.AX!trと同様、このマルウェアはさまざまなFTPソフトウェアを標的にしますが、ここではこのマルウェアが最初に攻撃を仕掛けたCuteFTPというFTPクライアントへの攻撃について解説します。

メールに添付されていたマルウェアのサンプルには圧縮がかけられていました。解凍してみると、すべてのデータ列と関数が明らかになりました。


図2: FTPソフトウェアに関連した文字列

上記のデータ列を見ると、このマルウェアは「site manager data」を表す「sm.dat」ファイルを探すだろうということがわかります。このファイルにはユーザーのFTPサイトに関する情報、ログイン時のユーザー名、パスワードが含まれているため、こうした文字列を探すところを見ると、このマルウェアの企みがよくわかります。

実際にどのようにしてこのファイルを狙うかをご覧いただくため、私は自身のサンドボックスにCuteFTPをインストールし、このファイルが置かれている場所を確認してみました。


図3: CuteFTPのパス

インストール後、InstallWatchがこのファイルのパスを示してくれました。このファイルの中身を取り出すためには、マルウェアはなんとかしてこの場所までたどり着かなければなりません。

パスを見つけ出す方法は基本的に2つあります。UninstallStringデータをパースする方法と、SHGetFolderPathを呼び出す方法です。

レジストリキー、「UninstallString」クエリ

コントロールパネルの「プログラムの追加・削除」を見ると、現在インストールされているプログラムを確認することができます。これらのプログラムは、アンインストーラのパスを含む「\Uninstall」というレジストリキーを使って削除することが可能です。

このマルウェアは、「sm.dat」ファイルは同じパスに置かれているものと想定しており、下のように各Uninstallキーのレジストリ値のクエリを実行します。


図4: レジストリをチェック

いくつかのルーチン後に、このマルウェアは下のようにすべての値を回収し、それをメモリへ格納します。


図5: メモリ内のアンインストール情報

その後、このマルウェアはアンインストール パスの文字列をパースし、文字列パターン「CUTEFTP」を探します。これが、このデータファイルが置かれているディレクトリの名前であるとこのマルウェアは考えているのです。こうして、下のように文字列内の特定のパターンを探すStrStrIA関数を呼び出します。


図6: 「CUTEFTP」を検索

InstallShieldツールは、このツールのパスにアンインストーラを格納します。私のシステムにはこのツールを使ってCuteFTPがインストールされているため、マルウェアはこのパターンを見つけることはできませんでした。

ですが、このマルウェアは場所の特定を行うために次のステップに進みます。

CSIDL(Constant Special Item ID List)でSHGetFolderPathを呼び出す

次のステップではAPI関数SHGetFolderPathを使用することになります。これはCSIDL(contant special item ID list)値に応じて必要となるフォルダのパスを得るため、多くのアプリケーションが用いられているものです。


図7: SHGetFolderPathを呼び出す

上の図に示されているように、ルーチンに対する各呼び出しに対してプッシュされた値0x1A、0x23、0x1C、0x26があります。これらの数字はCSIDL(constant special item ID list)値を表しています。この値の定義は下の表に示す通りです。


表1: CSIDL値

1つ目のCSIDLの16進値である0x1Aは、マルウェアが最初に着手するのに適しているようです。このデータファイルはApplication Dataフォルダに置かれているからです。この値を使ってShGetFolderPath関数を呼び出すことで、このマルウェアは下のようにパスを取り出します。


図8: Application Dataフォルダ

そして、「lstrcat」関数を呼び出して、事前定義されたデータ列「\GlobalSCAPE\CuteFTP」を追加します。このデータ列は「sm.dat」ファイルを見つけることができるフォルダだと想定されています。


図9: パスを形成

その後、「\sm.dat」を追加します。


図10: パスを形成

このファイルへのパスが設定されたので、マルウェアは下のようにCreateFileA関数を呼び出してファイルを開きます。


図11: 「sm.dat」を開こうと試みる

残念ながら、これではファイルは見つかりません。なぜならこのファイルは実際には図2に示されているように「9.0」という名前のサブフォルダに置かれているからです。

ですが、ターゲットまであとフォルダ1つのところまで来ているわけですから、マルウェアは検索を諦めません。今度はFindFirstFileA関数を呼び出し、現在のパス上で可能性のあるフォルダを探し出そうと試みます。


図12: 正しいパスを探す

「9.0」というフォルダを探し出した後、マルウェアはCuteFTPのパスへ文字列を追加し、ファイルを検索するために再度「\sm.dat」を追加します。


図13:「sm.dat」を探す

そして、ファイルを開くために再びCreateFileAを呼び出します。


図14: 「sm.dat」ファイルを開く

この呼び出しが成功すると、開くことができたファイルのハンドルが返されます。


図15: 開くことに成功したファイルのハンドル

このハンドルを使い、マルウェアは最後にCreateFileMappingとMapViewOfFileという関数を呼び出して、このファイルをメモリへマップします。


図16: ファイルをメモリへマップ

MapViewOfFileがマップされたファイルのメモリアドレスを返します。このファイルにはこの時点で「sm.dat」の中身が含まれています。

今回の分析のため、私は偽のFTPサイトをログイン情報とともに作成していましたので、下に示すようにこれがメモリ内で閲覧可能になりました。


図17: 偽のFTPサイトとサイトマネージャのデータ

このデータファイル内のログイン情報を使えば、このマルウェアの作成者は自身の目的のためにFTPサイトへのログインを試みることができるのです。

同じ方法で、このマルウェアはFireZillaやFlashFXPなどの他のFTPクライアントソフトウェアのデータファイルを探して機密情報を摘出します。

もちろん、このようなマルウェアによるデータの漏えいを避ける方法はあります。図17にあるように、CuteFTPの設定のために私が入力したユーザー名とパスワードは、データファイルの中ではヒューマンリーダブルな状態ではありません。マルウェアの作成者が実際のログイン情報を入手するためには、バイナリをデコードしなければなりません。また、下の図18にあるように、CuteFTP 9.0にはサイトマネージャを暗号化するセキュリティオプションが付いており、パスワード保護のオプションもあります。


図18: CuteFTP 9.0のGlobal Options Securityのウィンドウ

これらのオプションが使われれば、マルウェア作成者が盗んだデータを使って足掛かりを得るのはさらに難しくなるでしょう。

また、このマルウェアは上の表1に示すようにCSIDL値を使って特定のディレクトリを探すので、ソフトウェアが提供するセキュリティオプションを使用するだけでなく、サイトマネージャのパスに異なるフォルダを使うのも有効かもしれません。

要するに、どのような組織においてもサイバー犯罪者に標的にされるのは避けられないことであると認識すべきであり、こうした攻撃の成功を避けるため、必要な予防措置を講じるべきなのです。

Danny ChoiはFortiGuard Labsのアンチウイルスアナリストです。

Margarette Jovenより追加コンテンツ提供