Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
HiveV5_keystream_decryptor — 悪者による悪いもの | Kitploit
ツール/GitHubGitHub/reecdeep/hivev5_keystream_decryptor
暗号化/復号化ツールリバースエンジニアリングデータ復旧マルウェア分析デジタルフォレンジック暗号化バイナリ解析
GitHubreecdeep/hivev5_keystream_decryptor

HiveV5_keystream_decryptor

悪者による悪いもの

リポジトリを見る
499164年前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

HiveV5 キーストリーム復号化ツール PoC

はじめに

この文書で分析・参照されているHiveサンプルは、@rivitnaによって作成されたこのリストからランダムに選ばれたものです。@rivitna氏に心より感謝します。アーティファクトはVirusTotalプラットフォームで入手できます。

この文書では、ファイル a0h2uih3d2.exe を参照として採用しています。

MD5: 15CF5E0DA094ACDD751A513402A8C941
SHA-1: 72E15AC4473903C814E65E3C06F54EB0399580AA
SHA-256: 335D2E4A743D059955760ECF2EC25EE86D36AA60B096C9180E860C64EF78EE55

このランサムウェアの複雑さを理解するには、Microsoft Threat Intelligence Center(MSTIC)によって公開されたこちらの分析をご覧ください。

コードをいじり始める前に、文書全体を注意深くお読みください!

Hive v5の簡単な概要

ここ数ヶ月、私はHive v5の暗号化アルゴリズムの研究とリバースエンジニアリングにほとんどの力を注いできました。私は、過去にHiveの以前のバージョンを分析し、その暗号化メカニズムに関するコードとPoCを公開してきた、偉大なマルウェアアナリスト兼リバースエンジニアである@rivitnaと協力する機会を得ました。彼は、RUSTで書かれているために分析がより困難になっているHive v5の暗号化操作に関与するコンポーネントの特定に、(少なからず)貢献しました。私は、2021年6月にソースコードが公開された、もう一つの非常に重要なランサムウェアであるBabukとの共通点を見つけました:

  • 鍵交換アルゴリズム;
  • 1256の暗号化スレッドを開始する前に終了するプロセスのリスト。

被害者システム上で実行されているHiveランサムウェアv5は、QueryPerformanceCounter および QueryPerformanceFrequency Windows APIに基づく、以下の証拠にあるアルゴリズムを使用して2つのクリアテキスト鍵を生成します。

QueryPerformanceCounter APIの詳細についてはこちらのMicrosoftページを、QueryPerformanceFrequency についてはこちらを参照してください。

QueryPerformanceCounter は非常に精度の高い時間カウンタです。呼び出されると、PCが最後に起動されてからの経過時間を返します。

QueryPerformanceFrequency はパフォーマンスカウンタの値(周波数)を返します。固定値は0x989680です。つまり、QueryPerformanceCounter の値は毎秒0x989680回、すなわち10,000,000回更新されることを意味します。

2つのクリアテキスト鍵は0xCFFF00バイトのサイズで、一度に1バイトずつ生成されます。以下は、Hiveが被害者のPC上のファイルを暗号化する際に使用する、いわゆるクリアテキスト鍵の大部分を構成する0xA00000バイトの配列の作成を可能にするスニペットです。

snippetGenKeyCleartext

鍵の各バイトは、ALレジスタの値を取得することによって得られます。EAXレジスタには、createByte というラベルに改名された0044ADE0関数の結果が含まれています。この関数は、call_to_QueryPerformanceCounter というラベルに改名された関数0044A850の最初の呼び出し時に計算された初期シード値と現在の時刻との差を実装しています。

以下は、クリアテキスト鍵を生成するためのC++で書かれたコードです:

c++GenKeyCleartext

アルゴリズムは非常に単純ですが、0044ADE0関数内には、クリアテキスト鍵の生成中にコードの実行時間を遅延させようとして、冗長な操作やさまざまな条件付きジャンプを実行する命令が挿入されています:

useless-conditions

HiveRansomwareV5_custom_keygen_PoC フォルダには、分析したHive v5サンプルからリバースした生のコードがあります。これはマルウェアにあるような最適化されたコードではありません。コンパイル済みバージョンのコードを1行も見逃さないようにする必要があったからです。

HiveRansomwareV5_custom_keygen_PoC-optimized フォルダには、上記の生のコードから派生した最適化コードがあります。このバージョンでは、実装されている機能を理解するために、生のコードよりもはるかに読みやすくなっています。

両方のバージョンは、生成されたクリアテキスト鍵をデスクトップに保存するために、実行前にご自身のユーザー名に合わせてカスタマイズする必要があります。

両方のクリアテキスト鍵は同じアルゴリズムを使用して生成されます。
クリアテキスト鍵は0xA00000の安全にランダム生成されたバイトで構成されています。次に、最初の0x2FFF00バイトが最後にコピーされ、最終的に0xCFFF00バイトのクリアテキスト鍵が作成されます。

memcpy2FFF00

その後、Hiveは生成された2つの鍵を使用してファイルを暗号化しますが、まず最初にHiveランサムウェアv5は、生成された鍵をカスタム構造体(以下、キーストリームと呼びます)に暗号化し、.key拡張子を使用して、暗号化する各ドライブのルートに配置します。例えば、システムにCドライブとDドライブの両方がインストールされている場合、暗号化されたキーストリームは各ドライブのルートに存在します。

keysAtRoot

Hiveランサムウェアv5は、生成されたクリアテキスト鍵を使用してXOR命令でファイルを暗号化します。つまり、最新のx86/x64 CPU上では非常に高速な対称暗号化です。

Hive v5がどのように自身を保護するか、クリアテキスト鍵がどのようにキーストリームになるか

Hiveランサムウェアv5は、生成されたクリアテキスト鍵を2回暗号化して保護する必要があります。以降、これをラウンドと呼びます。最終的なキーストリームを得るには、2ラウンドの暗号化が必要です。

これを実現するために、各ラウンドで以下の手順が実行されます:

  1. 鍵の各バイトを作成するのと同じアルゴリズムを使用して、32バイトの秘密鍵を生成;
  2. Diffie-Hellman鍵交換用のCurve25519楕円曲線アルゴリズムを使用して、Hiveは生成したばかりの秘密鍵から公開鍵を導出;
  3. Curve25519を再度使用して、Hiveは生成したばかりの秘密鍵とHiveアフィリエイトの公開鍵(Hive v5のすべての検体で異なります)から共有鍵を生成;
  4. 秘密鍵とクリアテキスト鍵と同じアルゴリズムを使用して、一種のIVのような24バイトのナンスを生成;
  5. HChaCha20アルゴリズムを使用して、生成されたクリアテキスト鍵を暗号化する鍵を導出;
  6. ステップ5で作成した鍵とステップ4で作成したナンスを使用して、HiveはXChaCha20アルゴリズムを使用してクリアテキスト鍵を暗号化します。この操作により、暗号化プロセスの整合性を保証するための16バイトのMAC(メッセージ認証コード)も生成されます。

ステップ3は、暗号化中にHiveが生成した秘密鍵と、Hiveアフィリエイトが私たちのためにランサムウェアをコンパイルしたときに生成した秘密鍵の2組のペアによって開くことができるキーストリームの作成を保証します。

keystreamCreation

ブルートフォースの背後にあるアイデア

この説明の終わりには、1つの特定の点が明らかです:クリアテキスト鍵、秘密鍵、および両ラウンドの暗号化に使用されるナンスは、すべて上記の同じ関数(0044ADE0、別名 createByte)によって生成されます。関数0044ADE0は、forループ内で呼び出されるコードの実行にCPUが要する時間によって条件付けられています。

2ラウンドの暗号化後のキーストリーム構造を強調した上図を見ると、自由にアクセスできるのはナンスだけであることは明らかです(そうでなければ、Hiveアフィリエイトはファイルを復号化する方法を知ることができないでしょう)。

では、24バイト長のナンスに注目しましょう:

NONCE: 40 A4 08 6C D0 D0 34 98 FC 60 C4 28 8C F0 F0 54 B8 1C 80 E4 48 AC AC 10

ナンスのあるバイトと次のバイトの差(絶対値)は、ある反復と次の反復の間の経過時間を表します。この定義をもって、フィンガープリントの概念を導入します。

NONCE FINGERPRINT: 64 9c 64 64 00 9c 64 64 9c 64 9c 64 64 00 9c 64 9c 64 64 9c 64 00 9c

得られた値を分析すると、コードの実行時間はほぼ同一であり、特に使用中のプロセッサのテクノロジーによるわずかな変動があることがわかります(私のテストでは第10世代のi7プロセッサと第5世代のi5を使用しました。他のシステムではこのフィンガープリントは異なる可能性があります)。

この発見は、ナンスがクリアテキストの鍵、そして何よりも秘密鍵を生成するのと同じ関数によって生成されることを考えると、非常に重要です。前述の値もこの原理に従うため、つまりナンスの個々のバイト間の差が予測可能であるならば、秘密鍵とクリアテキスト鍵の値も予測可能になります。

しかし、分析により、Hiveが計算したクリアテキスト鍵と同じ元のバイトを得ようとして0xA00000文字の配列を生成することは非常に困難であることが示されています:CPUとメモリの負荷の変動はコードの実行速度に影響を与え、多くの場合、Hive PEによって計算された元のクリアテキスト鍵は、私たちが計算した鍵とは(ほんの数バイトだけでも)異なります。

このナンスのフィンガープリントを使用して、0xA00000バイト長の可能な辞書の生成から得られたフィンガープリントと比較します(この数値は経験的に固定されました。一連のテストの後、統計的にこのバイト数の中に、2ラウンドの暗号化に必要な各32バイトの2つの秘密鍵が存在することが確認されました)。ナンスのフィンガープリントが辞書のフィンガープリントに含まれている場合、両方の秘密鍵のブルートフォースを開始するための正しい辞書が見つかったことになります。

ここで終わりではありません。ナンス、クリアテキスト鍵、そして秘密鍵の生成に関して実施された動的分析から、最初のバイトは、ほぼ均一な値を持つ他のすべてのバイトと比較して、2番目のバイトとの平均距離が異なることが検証されています。詳細を見てみましょう:

hivePrivateKeyFingerprint

ご覧のとおり、最初のバイトに続くフィンガープリントの値はごくわずかな変動しか受けません。つまり、秘密鍵の最初のバイトと2番目のバイトの間の絶対値の距離は、ほとんどの場合、フィンガープリントの残りの部分に存在する値の範囲外の値を持ちます。

おそらくこれは、forループの最初の反復後にコードの実行を高速化する、CPUに存在するいくつかの最適化アルゴリズムによるものです。

考えられる解決策

提案されたコードは、各キーストリーム暗号化ラウンドのナンスを読み取り、そのフィンガープリントを決定し、可能性のある秘密鍵を含む可能性のある鍵辞書のリストを生成します。

常に鍵の残りの部分と異なるフィンガープリントの最初のバイトに関する問題を解決するために、私は次の方法を考えました:

  1. 生成された辞書の最初の0x110バイトの一意の値を取得して、可能な先頭バイトの辞書を作成;
  2. 生成された辞書の2番目のバイトから始まるすべての可能な組み合わせを取得して、31バイトのリストを作成;
  3. 最初のバイトと残りの生成された31バイトの組み合わせを作成して、可能な32バイトの秘密鍵の組み合わせを作成し、キーストリーム内に存在する私たちが所有する公開鍵と比較して公開鍵を導出します。

2つの公開鍵が一致した場合、2番目(最後)の暗号化ラウンドが暗号化された秘密鍵が見つかったことになります。ここまで説明した操作を再度繰り返すことで、1ラウンド目の暗号化されたキーストリームを復号化する秘密鍵が得られ、最終的に元のクリアテキスト鍵を抽出できます。

使用方法

HiveRansomwareV5-keystream_decryptor フォルダには、VS 2017のslnと、monocypher のカスタマイズされたライブラリがあります。プログラムでは、実行する操作を選択できます。

programOptions

オプション"1"は、PCのプロセッサに合わせた"オーダーメイド"のバイトの辞書を作成できるため、最初に選択すべきものです。したがって、暗号化されたマシン上で実行する必要があります。キーストリーム内に存在する値と等しい値が得られる可能性がはるかに高いためです。

programOption1

または、最初のオプションが機能しない場合は、デバッガでマルウェアを(すでに感染している同じPC上で)クリアテキスト鍵の生成が終わるまで(forループを抜けた直後)実行し、クリアテキスト鍵を含むメモリの内容を保存して、独自の辞書を生成します。この場合、オプション“3”を使用して辞書を検証できます:

programOption3

キーストリームに適した辞書を入手したら、オプション"2"はより強力なコンピュータでも実行できます。バイトの組み合わせをブルートフォースするために必要な時間を短縮でき、秘密鍵のバイトの値にはまったく影響を与えません。

ツールをダウンロード