今回の記事は、「REvil」または「Sodinokibi」と呼ばれるランサムウェアの解析から、「これって、身代金払わなくても復号化できるんじゃね?」といった疑いがある仕組みだったので、「ホントに復号化できるのか?」、「復号化できるとしたら、どのようなハードルがあるのか?」ということをメモってみようかな、という内容です。
これを書いている時点で、まだ解析の途中なので、実際にゴールまで行けるかは分かりません!
解析が遅いのも、私もプライベートの時間のみの解析で時間が限られる、筆者があまり頭が良くなくて解析・分析に時間がかかる、主目的がマルウェアの筆跡鑑定のネタ探しの解析のため解析内容がいちいちクドい、ウ〇娘がヴァルゴ杯真っ盛りで育成に余念がない、などという諸々の事情があるためです。
一方、「REvil」は復号ツールが公開された、という話も耳にしたので、「どのような解析をしたら復号方法を考えられるか?」という考え方と解析方法を記事にしてみようと思いました。
こういった解析を勉強しようとしているが、まだ経験がない人にはチュートリアルになるかも?みたいな軽い内容の予定です。
(少なくとも、今回は研究のための解析をしてたら見つけちゃった系の完全な副産物です。)
解析対象のマルウェアの検体のハッシュ値は以下のとおり。
検証したいという酔狂な方は、以下のハッシュ値と同じ検体を入手してください。
MD5:9CD5E68A49CEEFC94E2E09F9AE9A861A
SHA1:A0FF0573E3167E4E49F91ECFFD6B82D302890E3B
いつものVirusTotalのレピュテーション情報
では、この検体が本当にマルウェアとして検知されるかどうか、VirusTotalで確認してみます。
MD5やSHA1のハッシュ値は検索結果ではSHA2に変換されてしまいますが、Microsoftの検知名が「REvil」のほか、複数のアンチウィルスで「Sodinokibi」という検知名で検知しているので、「REvil」または「Sodinokibi」で分類されているランサムウェアの一つであることは間違いなさそうです。
暗号化されたデータのレイアウト
解析環境で、このランサムウェアの暗号化の処理を追跡しながら、ファイルが暗号化をされるのを観察しました。
そして、暗号化されたファイルを抽出しました。
今回は、このファイルを復元できれば大成功、ということになります。
そうなると、まずはファイルがどのような構造になっているかを知っておく必要があります。
そこで、分析で分かっているファイルのレイアウトを提示します。
ファイルの暗号化では、元のデータを暗号化し、その末尾にサイズ232バイトのデータを追加します。
この末尾のデータがランサムウェアによって追加されたデータになります。
と、いうことは、この中にデータ復号に必要な鍵が含まれているはず、ということになります。
このケースでは、ランサムウェアによる追加パラメータは0x096BFからということになります。
以下、位置はオフセットで表示します。
位置:0x00、サイズ:0x58 (青枠) レジストリの「PtDa3」に格納された値
位置:0x58、サイズ:0x58 (オレンジ枠) レジストリの「jUwVfT」に格納された値
位置:0xB0、サイズ:0x20 (赤枠) 暗号の鍵に使われる値「A」から算出される値「X」
位置:0xD0、サイズ:0x08 (紫枠) 「シードとなる64バイト」に含まれるランダムな値
位置:0xD8、サイズ:0x04 (グレー枠) 値「X」(赤枠)のCRC32計算結果(リトルエンディアン)
位置:0xDC、サイズ:0x04 (黄枠) 0x00411F58に格納されていた値
位置:0xE0、サイズ:0x04 (ピンク枠) 0x00411F5Cに格納されていた値
位置:0xE4、サイズ:0x04 (緑枠) 0x00000000を、「シードとなる64バイト」を用いて初回に暗号化された結果
レジストリについては、次節に記載します。
値「A」、値「X」、 「シードとなる64バイト」は、今回の解析で私が本記事用に暫定で付けた名前です。
これらの値の意味については、次回以降に解説します。今回はこの仮名で「それっぽい値」だと思っておいてください。
0x00411F58、0x00411F5Cは実行時の環境値が入っています。
このファイルに残されているデータは、必要に応じて復号に利用できるパラメータということになります。
レジストリに格納されている値
マルウェアは、実行時にしれっとパラメータをレジストリに格納しています。
私の解析環境では、以下のようにパラメータが格納されていました。
2jp:ランサムウェアの内部データのうち、「pk」でタグ付けされたBASE64データのデコード結果。
7NK5Kro:暗号化されたファイルの拡張子、または脅迫文のファイル名に用いられる文字列
jUwVfT:マルウェア内で計算され生成されるデータ。暗号化されたファイルに含まれる値と同じ。
PtDa3:マルウェア内で計算され生成されるデータ。暗号化されたファイルに含まれる値と同じ。
qZaXlXB3:マシン名、ユーザ名、言語等のデータを文字列化した後、ランサムウェア内の変換関数で変換された結果。
WbTs: 「シードとなる64バイト」に含まれる値を計算するために、値「A」と共に必要となる値。
このレジストリの値は、被害端末に残っているはずです。
このレジストリに残されているデータも、必要に応じて復号に利用できるパラメータということになります。
次回へつづく・・・
今回は、検体のざっくりな情報と、ファイルの復号化に必要な情報として、動的解析や被害端末から見つかるファイル、レジストリの情報について、それらの内容を提示しました。
もしかすると、外部から参照できて復号に使えるパラメータが他にもあるかもしれません。
(今の分析の結果では、これだけあれば、あとは被害端末上であれば復号できる可能があるハズです。)
その場合は、しれっとここに追加しておきます。
次回は、ファイルの暗号化の処理と、その鍵となるパラメータについて書きたいと思います。
値「A」、値「X」、 「シードとなる64バイト」と名付けた値も、どういう値なのかは解説したいと思います。



