脆弱性についてまとめるぼっちアドカレ5日目の記事です!
OSコマンドインジェクションについて
OSコマンドインジェクションとはバックエンドでシェルコマンドを使っている場合に発生しうる脆弱性です。
下記のようにGETパラメーターで指定されたドメインのwhoisを返すサイトがあったとします。
<?php
system("whois " . $_GET['domain']);
?>
このようなサイトに対してchikachan.com; whoamiなどと;で区切って他のコマンドを入力したら実行されてしまいます。
影響について
OSコマンドインジェクションではコマンドを実行するユーザーにもよりますが情報漏洩やデータ改竄のほか他のサービスや企業に対しての攻撃に使われる可能性まであります。
またたとえ実行するユーザーの権限が低くてもprivilege escalationによりrootが取られる可能性もあります。
対策について
基本的にOSコマンドを利用せずライブラリやAPIで実装することが望ましいです。
万が一OSコマンドを利用したい場合シェルを起動しコマンドを実行するタイプではなく直接プロセスを作成するタイプにすることで意図しないコマンドの実行を防ぐことができます。しかしコマンドの中には引数を活用することでほかコマンドを実行したりファイルの内容を出力できてしたりしてしまうものがあるのでやはりOSコマンド自体利用しないことが大切です。
活用する際に気にすること
うまい言葉が見つかりませんでしたがOSコマンドインジェクションを探す際に留意する点を軽くまとめてみました。
まずはコマンドの実行結果が必ずしも返ってくるわけではないことです。実際バックエンドでコマンドを実行できてもレスポンスが帰ってくるとは限りません。なので他の方法で実行できているか確認するようにしましょう。
フィルターを回避するため代表的なシェルのコマンド内でコマンドをを実行する方法をまとめます。
まずは;ですがこれはコマンドの成功可否に関わらずその後のコマンドが実行されます。
次は&&ですがこれは前のコマンドが成功つまりステータスコードが0になった場合に後のコマンドが実行されます。
次は&ですがこれは&&と混合されそうですが一つの場合は複数のコマンドが並列で実行されます。順序は保証されないので気をつけてください。
次は||ですがこれは&&の真逆で前のコマンドが失敗したら実行されます。
|は主に標準入出力の連携に利用されますが前後のコマンドは同時に実行されます。
ここまでは連結系でしたが次は展開系です。
&()はカッコに挟まれたコマンドを実行し結果を代入します。
``は&()と似たような感じですが少し差があります。細かいですが``は内容がエスケープされます。
HackerOneレポート
Potential pre-auth RCE on Twitter VPN
リンク: https://hackerone.com/reports/591295
このレポートはTwitterに対してのレポートです。
Twitter社が利用しているSSL VPNが複数の脆弱性を公表していたにも関わらず対策をしていなかったためOSコマンドの実行を許しました。
実際一部のファイルに対してはアクセスできてしまったようです。報奨金が$20,160出てて夢がありますねこの脆弱性はDefConでも発表されたようです。
Exposed Kubernetes API - RCE/Exposed Creds
リンク: https://hackerone.com/reports/455645
このレポートは要約しか公開されいませんでしたがSnapChatの内部で利用していたk8sのインスタンスの一つが非公開のAPIを公開しておりそこからクラスターの管理者が取れ他のインスタンスへの管理者としてのアクセスを許してしまいました。
OSコマンドインジェクションはやはり重要度が高いものが多くこの脆弱性に対しても$25,000の報奨金が出ていました。今回はスキャナーを利用して見つけていたようで少しびっくりしました。
Webshell via File Upload on ecjobs.starbucks.com.cn
リンク: https://hackerone.com/reports/506646
このレポートでは中国のスターバックスの履歴書のアップロードサイトにて画像以外のアップロードも許してしまいwebshellがアップロードされ結果的にOSコマンドインジェクションが成功しました。
ファイルの検証の不備は脆弱性としてはよくあることなので気をつけなければならないと思い出させられますね。
個人的に感じたのはStarbucksはよく大きめのレポートを出してますね。パブリックでやっててかつレポートの公開をしっかりやっているプログラムが少ないからだと思いますが個人的には自分も調べてみたいなって思いました。
参考文献
- https://www.ipa.go.jp/security/vuln/websecurity/os-command.html
- https://jvndb.jvn.jp/ja/cwe/CWE-78.html
最後に
やっぱりOSコマンドインジェクションはインパクトが大きいものが多く報奨金も出やすいですね。
脆弱性についてまとめるってしてますがここら辺用語難しすぎてRCEとの区別とかが難しかったです。CWEも個人的に苦手で概念把握するのにまぁまぁ時間かかりました。
こうやっていろんなバグバウンティの事例みてるとほんと自分でも見つけれそうって思うのに実際全く見つからないのちょっと悲しくなりますよね。今月は学校のレポートとぼっちアドカレの同時進行でなかなかバグバウンティできてないのでもうまとめまくってまとまった時間できた時にほんと見つかるまでパソコンから離れない位の勢いで探したいっすね。