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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2022-46169 — CVE-2022-46169のステップバイステップ分析:認証バイパスとコマンドインジェクションを介したCactiでの認証なしリモートコード実行。Dockerラボのセットアップと悪用のウォークスルーを含みます。 | Kitploit
ツール/GitHubGitHub/hpt-intern-task-submission/cve-2022-46169
脆弱性分析エクスプロイトウェブアプリケーション悪用コマンド&コントロール認証学習と教育ラボと実践
GitHubhpt-intern-task-submission/cve-2022-46169

CVE-2022-46169

CVE-2022-46169のステップバイステップ分析:認証バイパスとコマンドインジェクションを介したCactiでの認証なしリモートコード実行。Dockerラボのセットアップと悪用のウォークスルーを含みます。

リポジトリを見る
242年前未レビュー

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2022-46169 - Cactiにおける未認証リモートコード実行

Cactiとは何か、そしてその脆弱性とは?

Cactiは、PHP、MySQL/MariaDBで書かれたオープンソースの運用監視ツールであり、使いやすいインターフェースを提供します。

この脆弱性は2022年に発見され、1.2.23より前のすべてのバージョンに影響を与えました。このバグは、RCE(リモートコード実行)を達成するために、認証バイパスとコマンドインジェクションの連鎖を必要とします。

ラボ環境の構築

このCVE分析では、Docker上でCactiを実行し、VSCodeを使用してコード分析を行います。セットアップは非常に簡単です。まず、新しい環境を作成するために docker-compose.yaml ファイルが必要です。以下が docker-compose.yaml ファイルです:

version: '2'

services:

  

cacti:

image: "smcline06/cacti"

container_name: cacti

domainname: example.com

hostname: localhost

ports:

- "8088:80"

environment:

- DB_NAME=cacti_master

- DB_USER=cactiuser

- DB_PASS=cactipassword

- DB_HOST=db

- DB_PORT=3306

- DB_ROOT_PASS=rootpassword

- INITIALIZE_DB=1

- TZ=America/Los_Angeles

volumes:

- cacti-data:/cacti

- cacti-spine:/spine

- cacti-backups:/backups

links:

- db

  

db:

image: "mariadb:10.3"

container_name: cacti_db

domainname: example.com

hostname: db

ports:

- "3307:3306"  # Change host port to 3307

command:

- mysqld

- --character-set-server=utf8mb4

- --collation-server=utf8mb4_unicode_ci

- --max_connections=200

- --max_heap_table_size=128M

- --max_allowed_packet=32M

- --tmp_table_size=128M

- --join_buffer_size=128M

- --innodb_buffer_pool_size=1G

- --innodb_doublewrite=ON

- --innodb_flush_log_at_timeout=3

- --innodb_read_io_threads=32

- --innodb_write_io_threads=16

- --innodb_buffer_pool_instances=9

- --innodb_file_format=Barracuda

- --innodb_large_prefix=1

- --innodb_io_capacity=5000

- --innodb_io_capacity_max=10000

environment:

- MYSQL_ROOT_PASSWORD=User@123

- TZ=America/Los_Angeles

volumes:

- cacti-db:/var/lib/mysql

  

volumes:

cacti-db:

cacti-data:

cacti-spine:

cacti-backups:

ファイルを作成したら、コマンドラインを開いてファイルのディレクトリに移動し、docker-compose up -d コマンドを実行して、ブラウザを開いて localhost:8088 にアクセスします。最初にログインページが表示されます:

login_page

デフォルトの認証情報は admin/admin です。セットアップのプロセスは以下の写真で示されます:

new_password

新しいパスワードを作成

1 2 1 1 1 1 1 1 1 1 1

インストールが完了すると、以下のようなコンソール画面が表示されます

console

それでは、脆弱性の分析を始めましょう。ご存知の通り、脆弱なファイルは remote_agent.php です。ブラウザでこのファイルにアクセスしてみます。

remote_agent

ファイルにアクセスする権限がないと表示されます。ファイルのソースコードを確認する時です。

remote_client_authorized

remote_client_authorized() 関数を呼び出してチェックしています。この関数を詳しく見てみましょう。

remote_client_authorized_dive_deep

まず、サーバーは get_client_addr() 関数を介して私たちのIPアドレスを取得し、次に gethostbyaddr() 関数を使用してIPをホスト名に変換します。その後、サーバーは poller テーブル内の利用可能なすべての pollers を取得し、各 poller's hostname をIPアドレスから変換されたあなたの hostname と比較します。ここにバイパスがあります。get_client_addr() の中身です:

get_client_addr

サーバーが以下のヘッダーのいずれかを介してIPアドレスを取得していることがわかります:

-   X-Forwarded-For
-   X-Client-IP
-   X-Real-IP
-   X-ProxyUser-Ip
-   CF-Connecting-IP
-   True-Client-IP
-   HTTP_X_FORWARDED
-   HTTP_X_FORWARDED_FOR
-   HTTP_X_CLUSTER_CLIENT_IP
-   HTTP_FORWARDED_FOR
-   HTTP_FORWARDED
-   HTTP_CLIENT_IP
-   REMOTE_ADDR

これにより、私たちはIPアドレスの値を完全に制御できます。この場合、X-Forwarded-For ヘッダーを使用して自分のIPを有効なIPに偽装し、認証をバイパスできます。X-Forwarded-For ヘッダーは、クライアントとサーバーの間にプロキシやロードバランサーが存在する場合に、元のIPアドレスを識別するためによく使用されます。しかし、これは攻撃者にとっての攻撃対象となります。Cactiをローカルで実行しているため、localhostに変換されるIPアドレス、つまり 127.0.0.1 を指定する必要があります。

IP_spoofed

これで良さそうですよね?しかし、これは始まりに過ぎません!!! コマンドインジェクションを成功させ、リモートコード実行を獲得するには、さらにコード分析が必要です。認証が完了した後、プログラムはこのコードを実行します。

switch_case_action

サーバーは action パラメータを取得し、Switch/Case に入ります。action の値が pollerdata の場合、プログラムは poll_for_data() を呼び出します。この関数はコマンドインジェクションに対して脆弱であるため、注意深く分析します。

poll_for_data

この関数は、ユーザーのリクエストパラメータ local_data_ids、host_id、poller_id から受け取った3つのパラメータ $local_data_ids、$host_id、$poller_id を受け取ります。パラメータを取得する関数の違いに注目してください。1つは get_filter_request_var で、もう1つは get_nfilter_request_var です。後者の関数には n がもう1つあります。これについては後で詳しく説明します。その後、プログラムは local_data_ids パラメータを指定したかどうかをチェックし、local_data_ids と host_id に基づいて poller_item テーブルからデータを取得するために各IDをループします。このクエリは $items に保存されます。

proc_open

クエリが結果を返した場合、プログラムは $items 内の各 $item をループし、$item['action'] をSwitch値として使用する Switch/Case 文に入ります。多くのケースがありますが、調査すべきケースは POLLER_ACTION_SCRIPT_PHP です。これは action が2に等しいことを意味します。

POLLER_ACTION_SCRIPT_PHP

action が 2 の場合、プログラムは exec() と非常に似ている proc_open() コマンドを実行し、完全に私たちが制御できる変数の1つとして $poller_id を受け取ります。より明確に理解するために、データベースにアクセスして poller_item テーブルの内容を取得し、どのようなものか確認しましょう。

poller_item_table

テーブルから、action = 2 の poller を取得するために local_data_id をブルートフォースする必要があることがわかります。これは実際の攻撃シナリオで適用されます。デフォルトでは、Cactiには action = 2 の poller はありませんが、device のような新しいテンプレートを追加することでこれを実現できます。

create_device_1

create_device_2

create_device_3

新しい device を作成した後、もう一度 poller_item テーブルにアクセスすると、action = 2 の新しい poller があることがわかります。

create_device_4

ツールをダウンロード