前回OSコマンドを実行することができるコンテンツを作成しました。
今回はその環境を使って、実際にOSコマンドインジェクションの検証を行っていきます。
なお、今回の検証は自分の管理する環境で行ってください。
※私であれば自身のローカルで動作しているVMですね。
管理されていない(他人のサーバ等)に対して攻撃を行った場合、犯罪になりますので絶対しないでください。
検証方法の検討
まずはOSコマンドインジェクションが可能である場合、どんなコマンドを入力して検証すればいいでしょうか?
脆弱性の診断を行うことを考える場合は、非破壊で行うということはまずは念頭に置く必要があります。
なので、「rm」コマンドはファイル等を削除してしまうので、取り返しのつかないことになる場合があるのでもちろんダメです。「shutdown」コマンドもサーバ自体を落としてしまうので、推奨されません。
なので、まずは定番の「ls」でディレクトリ内のファイル一覧を表示させることからやってみましょう。
いきなり、コンテンツに直接入力を行うのではなく、コンソールからどんな動作をするか検証してから実際にコンテンツに挿入する方が安全です。
以下のように実際にLinuxのコンソールで試してからやりましょう。最初に「nslookup nekotosec.com」と入力した場合はちゃんと結果が出力されますが、「nslookup nekotosec.com ls」と表示した場合はエラーになります。
エラーを見てみると「lsのアドレスを取得できなかった」となっています。nslookupの入力値の一部として「ls」が扱われてしまっています。
なので、次は「;」(セミコロン)で区切ってやってみましょう。
「nslookup nekotosec.com; ls」ではどうでしょう。
以下のように「nslookup」の結果が主力された後にlsの結果(ディレクトリ内ファイル一覧)が表示されています。
これはうまく行けそうですね。このように、インジェクション系の脆弱性は何かあった時の被害が計り知れない(アプリケーションを破壊してしまう場合もある)ため、きちんと脆弱性の動作を確認し、何を入力すればいいかを検証した上で実施することを推奨します。
実際に入力をやってみる
では実際にアプリケーションへやってみましょう。入力フォームに「nslookup nekotosec.com; ls」と入れてボタンを押します。
すると、先ほどコンソールで入力したときと同様に「nsloookup」の結果が出力されその下に「ls」の結果が出力されました。
これで脆弱性診断であればOSコマンドインジェクション有と判断することができます。
今回は入力結果が画面上に出力されるので、検出は楽でしたが、画面に結果が表示されない場合もあります。
その場合は「sleep」コマンド、「ping」等を使用し、表示される時間を計測するといいでしょう。実際にやってみます。
時間の差分で脆弱性を判断する
時間の差分の計測は実際のデモ等なら、コンテンツ上だけで見せればわかるのですがブログだと時間をお伝えすることが難しいので、プロキシツールの「burp」を使用していきます。
まずは通常はどのくらいで応答があるでしょうか。画面の右下に応答時間が表示されます。
応答時間は「197 millis」です。
次は「nslookup nekotosec.com; sleep 1」(一秒間中断後に結果を表示)と入力してみましょう。
すると応答時間は「1,097 millis」となりました。一秒と少しかかっていることがわかります。
もちろんサーバのタイミングによって時間がかかる場合があるので、今度は「sleep 20」としてみましょう。
今度は応答時間が「20,191 millis」となり、20秒と少し後に応答があり、これでsleepコマンドが有効であることも確認できました。
実際の診断であれば、OSコマンドが動くことから、サーバ内部の情報の取得も可能です。
一例として「cat /etc/passwd」と入力してみましょう。
すると以下のように「/etc/passwd」の中身が表示されてしまいます。
他にも任意のファイル(PHPファイル等)を作成し、バックドアの設置や、wgetで外部から不正なファイルをサーバに置くこともできます。
面白い方法だと出力結果をメールに添付して送信させるとかもあります。
なので、OSコマンドインジェクションが発生した場合は壊滅的な被害になりますので、ちゃんと気を付けてコーディングする必要があります。
最後に
OSコマンドインジェクションについて、検証環境の作成から実際に検出までを3回に渡り解説しましたが、如何でしたでしょうか?
8月の以下秋葉原の勉強会でスピーカーをする際は実際に脆弱性を使用して、ターミナルから操作できるようにするデモを予定しています。
※8月の勉強会は2018/7/22現在まだ告知は行っていません。
興味がある方は是非とも足を運んでみてください。
不明点や要望やこういったこともやって欲しいとの要望があれば、お問い合わせページやコメント、ツイッターからでも結構ですので、気軽にご連絡ください。
コメント