サポート情報 | フォーカスシステムズ サイバーフォレンジックセンター

お問い合わせはこちら
東京証券取引所 プライバシーマーク ISMS JUSE

サポート情報

ホーム > サポート情報一覧 > ランサムウェアの自動起動設定

ランサムウェアの自動起動設定

目次へ

 Explorer上のコードを追跡していきましょう。ここから先は、重要部分の提示しつつ、なるべくかいつまんで説明していきます。

 Explorerプロセス上のCryptoWallのコードは、動的メモリ上に確保された領域を使用しているため、アドレスは再び[ ]でオフセット表記にします。

 スレッドが実行されると、まず、[13BC5]で「再展開されたプログラムのImportテーブル」と「PC毎固有の「ハッシュ値」の計算」と同じ処理を実行します。callのオフセットアドレスが[016F0]であることからも裏付けられます。ransom.exeの実行時のハッシュ値の計算のcallは0x004016F0でしたが、これはプログラム開始位置0x00400000のオフセット[016F0]であるからです。このようにして、解析済みの部分は省力化していくと効率が上がりますね。

 

 次に、[13BD1]でcallを行いますが、ここでCryptoWallのコピーと自動実行設定を行っていました。特徴的な動作なので、少し触れておきます。処理の概要は以下のとおりです。

 

ハッシュ値から5文字取り、「FDE08.exe」、「AAB3B」の文字列を生成する。さらに、小文字に変換する。 
 実行プロセスのトークンを取得し、そのトークンからSIDのUnicode文字列を取得する。
 レジストリを開き、「\Registry\User\(SID)\SOFTWARE\Microsoft\Windows\CurrentVersion\Exploler\User Shell Folders」のパスから名前が「appdata」のデータを取得する。
 環境情報から、「USERPROFILE」をキーとしてログインユーザーのベースフォルダ名を取得する。
 USERPROFILE、レジストリの値、「aab3b」でフルパス名を生成し、フォルダを作成する。
・  起動されたCryptoWallのパスから、CryptoWallをファイルリードして読み込む。
 USERPROFILE、レジストリの値、「aab3b」、「fde08.exe」でフルパス名を生成し、読み込んだCryptoWallをファイル出力する。
 「\Registry\User\(SID)\Software\Microsoft\Windows\CurrentVirsion\Run」文字列を生成し、「aab3b」の名前で出力したファイルのフルパス名を設定する。
 最初に実行したransom.exeを消去する。

 

 各個の項目について、パラメータを交えて説明します。

 まず、ハッシュ値から5文字取り出し、ファイル名、フォルダ名にしています。ファイル名はハッシュ値の開始位置から、フォルダ名は開始位置よりオフセット0x24(36バイト)後ろの位置からの文字列をそれぞれ5文字分取得しています。

 小文字化する処理は、1バイトの文字コードを参照し、0x41~0x5Aの間の値だった場合、0x20を加算しているだけでした。半角英数字は、Unicodeでも0x00を間に付与しただけで、あとはASCIIコードと一致する性質を利用しています(【図81】参照)。

 こうしてフォルダ名、ファイル名を作ることによって、同じ環境で同じユーザーでこのプログラムが実行された場合、必ず同じ名前のフォルダ名、ファイル名になるような仕組みにしています。これは、ランダムで作ってしまうと、起動する度に自動実行されるファイルが作られてしまうことや、削除の処理での識別を容易にするための意図があると考えられます。「PC毎固有の「ハッシュ値」の計算」で「偶然でしょうか?」と書きましたが、しっかり解析すると必然であることが分かり、その意図も透けて見えるものです。

 一方で、色々なパラメータを元に算出したハッシュ値を用いることで、実行する端末やユーザーごとにフォルダやファイル名が変わることも見逃せません。これは、端末やユーザー毎に名前が変わることで、少なくとも名前による機械的な検知が難しくなる、ということを示しています。コードの中に含まれないため、Stringsによる検知もできません。こういったことをしっかり考えられたプログラムであることが分かります。

IDA_Cryptowall_MakePath1

【図81-1】ハッシュ値から文字列を抽出して小文字に変換(元のハッシュ値)

 

IDA_Cryptowall_MakePath2

【図81-2】ハッシュ値から文字列を抽出して小文字に変換(FDE08.exe)

 

IDA_Cryptowall_MakePath3

【図81-3】ハッシュ値から文字列を抽出して小文字に変換(AAB3B)

 

 次に、実行プロセスのトークンを取得し、そのトークン情報からSIDのUnicode文字列を取得しています(【図82】参照)。このSIDは、ユーザーの情報をレジストリから取得したり、レジストリに書き込んだりするために、キーを作成するのに必要になるため取得しています。

IDA_Cryptowall_SID1

【図82】SIDの取得

 

 そして、取得したSIDを用いてレジストリキーを作成し、レジストリから値を得ています(【図83】参照)。これにより、各ユーザーのフォルダ配下のExplorerが使用しているappdataのパスを取得しています。

IDA_Cryptowall_RegistryKey1

IDA_Cryptowall_RegistryKey2

【図83】レジストリからパラメータの取得

 

 レジストリから得られたパラメータの中に、「%USERPROFILE%」という値があります。このパラメータは、ログインユーザーや設定などによって変わるパラメータです。そのため、環境情報から、USERPROFILEのパスを取得しています。そして、文字列処理で結合し、出力先のフォルダへのフルパス名を生成しています(【図84】参照)。さらに、NtCreateFileにより、フォルダの作成を行っています。

IDA_Cryptowall_QueryEnvironment1

IDA_Cryptowall_MakePath4

【図84】CryptoWallのコピー先のフォルダ名生成

 

 この後、コピーをするために、CryptoWallの本体ファイルの読み込みを行っています(【図85】参照)。

IDA_Cryptowall_ReadFile1

【図85】CryptoWallファイルの読み込み

 

 そして、読み込んだファイルを出力します。NtCreateFileで「fde08.exe」のファイルを作成し、NtWriteFileで先ほど読み込んだデータをファイルへ出力します(【図86】参照)。

IDA_Cryptowall_CreateFile1

【図86-1】CryptoWallファイルの出力(ファイル作成)

 

IDA_Cryptowall_WriteFile1

【図86-2】CryptoWallファイルの出力(ファイル書き込み)

 

 さらに、自動実行するための設定をレジストリに出力します。ログインユーザーでログインしたときに実行させるため、再びSIDを用いたレジストリキーを作成します。そして、先ほど作成したファイルへのパスを指定して登録しています(【図87】参照)。

IDA_Cryptowall_RegistryKey3

IDA_Cryptowall_SetRegistryKey1

【図87】自動実行のためのレジストリ登録

 

 最後に、プログラムを起動したransom.exeを消去します。今回は、プログラムの解析のためにデスクトップに実行ファイルが置かれていますが、実際には感染原因となった通信に関連するフォルダに存在することになります。Webブラウザのダウンロードの一時フォルダやメール添付ファイルを実行するときの一時フォルダがそれにあたります。これは、なるべく痕跡を残さないようにするための処理と考えられます。

 処理としては、先ほど読み込んだファイルパスに対し、NtDeleteFileを行う単純なものです(【図88】参照)。

IDA_Cryptowall_DeleteFile1

【図88】ransom.exeの削除

 

 これで、今回解析しているCryptoWallの自動実行のための感染方法の全貌を知ることができました。

 今回はランサムウェアをターゲットにしていますが、こういった挙動はマルウェア全般で多く見られます。その挙動を解析することで、どこに、どのような痕跡が残っているか、が分かるようになります。

 そして、その痕跡の特徴を検知できれば、マルウェアが組織内で横展開されているかを判定することができるようにもなります。組織内の横展開状況を調査できるようにするためには、こういった解析の結果を元に、セキュリティのエンタープライズ製品を用いる必要があるでしょう。例えば、CounterTackのSentinelでは、各PCの挙動情報を保存しておくような設定をしておくことで、後から挙動のルールを作成して検索することで、感染が疑われるPCを抽出することが可能です。

 

 一つ気になるのは、ランサムウェアによる暗号化を行っている途中にログオフやシャットダウンをしたときの対策のために自動実行を設定していますが、これにより再度暗号化をする場合、鍵などはどのように扱っているのでしょうか?「ちゃんと復号できる仕組み」にするのであれば、同じ鍵を使いたいはずですが、起動時に毎回同じ鍵をダウンロードする仕組みなのでしょうか?こういった部分の疑問も、先々の解析で解明できれば、と思います。

 

< 作成されたプロセス上のランサムウェアの追跡 目次svchostの起動とVolume Shadow Copyの消去 >