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

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

サポート情報

ホーム > サポート情報一覧 > PC毎固有の「ハッシュ値」の計算

PC毎固有の「ハッシュ値」の計算

目次へ

 スレッドの処理を解析していくと、「再展開されたプログラムのImportテーブル」を作成した後、MD5のハッシュ値を計算している処理がありました。特徴的な処理であるほか、後々色々と利用しているようなので、ここで触れておきます。中身は結構長い処理ですので、概要をかいつまんで解説しておきます。

 ハッシュ計算は、「再展開されたプログラムのImportテーブル」で発見されたAPIのうち、「CryptAcquireContextW」、「CryptCreateHash」、「CryptHashData」、「CryptHashParam」を利用しています。

 

・CryptAcquireContextW 暗号化サービスプロバイダ(CSP)からハンドル取得する。 
 ・CryptCreateHash データストリームのハッシュ処理の開始。アルゴリズムIDでCALG_MD5を指定している。
 ・CryptHashData ハッシュ化するデータを登録する。
 ・CryptHashParam ハッシュのサイズやハッシュ値を取得する。

 

 

では、MD5を計算するためのデータストリームはどのようなものが指定されているのでしょうか?ここに特徴的なものがあり、実行されるPCで同じハッシュになりにくくする工夫がありました。

 「再展開されたプログラムのImportテーブル」で解説した内容で、APIのアドレスを取得する際に、そのベースになるアドレスを0x004016E0をコールして取得しているため、この関数にブレークポイントを設定して動作を観察していました。すると、ハッシュ処理の前に、頻繁に「RtlQueryEnvironmentVariable_U」をcallしているのが見られました。これは、PCの環境情報を取得するAPIです。そして、取得できた文字列を次々と結合していました。

 「RetQueryEnvironmentVariable_U」で取得していたのは以下の項目です。なお、文字列はUnicodeで取得されていました。

 

 ・COMPUTERNAME
 ・USERNAME
 ・SYSTEMDRIVE
 ・PROCESSOR_IDENTIFIER
 ・PROCESSOR_LEVEL
 ・PROCESSOR_REVISION

 

そして、実際にハッシュ値を作成するのに用いられたのは以下のようなデータ構成でした(カッコ内は【図69-1】のパラメータの対応)。

 

 ・COMPUTERNAME(FORENSIC-PC)
 ・USERNAME(forensic)
 ・PROCESSOR_IDENTIFIER(x86 Family 6 Model 58 Stepping 9, GenuineIntel)
 ・PROCESSOR_LEVEL(6)
 ・PROCESSOR_REVISION(3a09)
 ・プログラム起動時に生成されるデータ領域のパラメータ<2つ>(6および1)
 ・「NtQueryInformationProcess」でプロセス情報クラスが「ProcessWow64Information」の場合に情報が得られれば「1」、得られなければ「0」。(0)
 ・「GetKeyBoardLayoutList」の結果の値を文字列にしたもの。(04110411)

 

以上の文字列(Unicode)をパラメータとし、まずハッシュ値を計算します(【図69-1】参照)。そして、このハッシュ値を、16進数からワイド文字列に変換します。この結果、32文字(64バイト)が得られます(【図69-2、3】参照)。

IDA_Cryptowall_Hash1

【図69-1】ハッシュ値を計算するパラメータ

 

IDA_Cryptowall_Hash2

 【図69-2】ハッシュ値の計算結果

 

IDA_Cryptowall_Hash3

【図69-3】ハッシュ値の計算結果のUnicode文字列化

 

 このランサムウェアでは、このパラメータに対し、さらに文字列を追加した上でハッシュ計算を行っています。以下にデータ構成を示します。

 

 ・「crypto13001」の文字列
 ・上で求められたハッシュ文字列(Unicodeからアスキー文字列に変換して結合)
 ・アドレス0x004150B0以降のサイズ0x800(2,048)バイトのデータストリーム

 

このハッシュ値の取得状況を【図70】に示します。

IDA_Cryptowall_Hash4

【図70-1】ハッシュ値を計算するパラメータ

 

IDA_Cryptowall_Hash5

【図70-2】ハッシュ値の計算結果

 

IDA_Cryptowall_Hash6

【図70-3】ハッシュ値の計算結果のUnicode文字列化

 

 結果は16バイトのバイナリからUnicode文字列への変換までおこなっています。ハッシュ値の計算元になったパラメータをみると、PC名、ユーザー名からCPUやキーボードの情報までを含めてハッシュ計算をおこなっており、これらが全て一致することは、世界中でもそうそう無いと思います。こうして、現実的に衝突が無視できるレベルのハッシュ値を求めているのです。このようにして求められたハッシュ値をCryptoWallでどのように利用しているか、なぜ必要なのか、ということも気になるところです。

 なお、この結果をよくみると・・・大文字と小文字の違いはありますが、「マルウェアを動作させてみる」でRoamingフォルダの下に作成されたフォルダ名(aab3b)と、ランサムウェアのコピーのファイル名(fde08)が含まれていますね。偶然でしょうか?

 では、この処理の後の解析を続けていきましょう。

 

< 再展開されたプログラムのImportテーブル 目 次イベントの登録と別プロセスの起動 >