NECサイバーセキュリティ戦略本部セキュリティ技術センターのmuu(ハンドルネーム)です。今回は、ペネトレーションテストのスキル向上に役立つセキュリティ学習プラットフォーム「PentesterLab」[1]と、学習用コンテンツを1つ取り上げてご紹介します。
PentesterLabとは
「PentesterLab」とは、セキュリティ(特にペネトレーションテスト)に関する技術を学ぶことができるオンライン学習プラットフォームです。PentesterLabには、トピック毎にエクササイズが用意されており、脆弱性に対する攻撃手法などを学習することができます。
学習方法はBootcamp、Progressの2種類が用意されています。Bootcampはエクササイズを始める前に習得しておくべきスキルを座学ベースで学習できます。基礎的な知識から学ぶことができるため、ペネトレーションテスト初心者の方はBootcampから始めることをおすすめします。また、Progressでは各エクササイズをカテゴライズし、効果的に学べるよう学習のルートが示されています。
この他、PentesterLabでは無償版のほかに有償版となるPentesterLab Pro($19.99/月)も用意されています。以下に有償版と無償版の違いをまとめています。
今回は無償版で学習可能なエクササイズをご紹介します。
環境準備
今回は脆弱性に対する基礎的な攻撃手法を学習できるエクササイズ「Web for Pentester」を解いていきたいと思います。難易度はEASYとなっています。
PentesterLabにログイン後、エクササイズ一覧からWeb for Pentesterのページにアクセスし、isoファイルをダウンロードします。
VirtualBoxやVMwareなど仮想化ソフトを使用し、ダウンロードしたisoファイルから仮想マシンを作成します。
この仮想マシンを立ち上げ、ifconfigコマンドでIPアドレスを確認します。
ブラウザから上記のIPアドレスへアクセスすると、エクササイズに接続することが可能となります。
Web for Pentester - Code Injection
今回はWeb for Pentesterで用意されている問題のうち、Code Injectionを解いていきます。
なお、各エクササイズのトップページには問題を解く際のヒントが掲載されていますので、問題に躓いたときはそちらを参考に学習を進めることも可能です。
Example1
アクセスすると”Hello hacker!!!”と画面に表示されます。URLを見ると、nameパラメータの値が反映されていることが分かります。
攻略の糸口を掴むべく、まずはファジングを実施し、エラーメッセージが出力されないか確認します。
ダブルクォーテーションを挿入したところ、エラーメッセージが表示されました。
このエラーメッセージからexample1.phpはeval関数[2]を使用していることがわかりました。
eval関数は任意の文字列をPHPのコードとして実行するため、悪意のあるコードを挿入した場合、実行できる可能性があります。
そこで、eval関数のパラメータにsystem関数(指定したコマンドを実行し結果を出力する関数)を使用してhostnameを表示するコードを挿入してみたいと思います。
まず、nameパラメータの値にsystem関数をそのまま挿入した場合、文字列として認識されます。
今回のエクササイズではexample1.phpのソースコードは確認できないため、エラーメッセージを参考にソースコードを推測しながら挿入するコードを模索していきます。
これらの試行結果から、「";system (‘hostname’);#」をURLエンコードし挿入することでsystem関数が実行できることわかりました。
他の情報も確認していきます。
pwdコマンド
lsコマンド
catコマンド
/etc/passwdの中身を確認することができました。
Example2
アクセスすると、id,name,ageを1組としたデータを確認することができます。
Example1と同様にファジングを行い、エラーメッセージを確認します。
エラーメッセージから、example2.phpではusort関数[3]を使用していることがわかります。
usort関数は、ユーザの定義した通りに配列の並び替えを行うことから、上記のデータはusort関数を用いてソートしていると推測できます。
またExample2のヒントを見ると、usort関数はcreate_function関数とともに使用されることが多く、コード実行につながる可能性があることが分かります。このことから、Example1と同様にエラーメッセージを参考にしながらsystemコマンドを挿入できるか模索していきます。
これらの試行結果から、「?order=id);} system ('cat /etc /passwd'); #」をURLエンコードし挿入することでsystem関数が実行できることわかりました。
/etc/passwdの中身を確認することができました。
Example3
アクセスすると”Hello hacker”と表示されます。
URLからlamerを削除すると、hackerの表記も消えました。よって、lamerをhackerに置き換える処理が行われていると推測できます。
Example1、Example2と同様にエラーメッセージを確認していきます。
警告文よりexample3.phpではpreg_replace関数[4]を使用していることがわかります。
preg_replace関数は正規表現検索、および置き換えを行います、preg_replace関数は、e修飾子の使用を制限する区切り文字を適切に選択しないため、任意のPHPコードを実行される脆弱性が報告されています。[5]
よって、正規表現の最後に文字列eを渡し、system関数を挿入します。
/etc/passwdの中身を確認することができました。
Example4
アクセスすると”Hello hacker”と表示されます。
Example1、Example 2、Example 3と同様にエラーメッセージを確認します。
エラーメッセージからexample4.phpではassert関数[6]を使用していることがわかります。
assert関数は受け取ったパラメータ(assertion)を評価しFALSEであるかをチェックします。assert関数は悪意のあるパラメータを渡すことでコードを実行できる可能性があります。
Example1、Example 2と同様にエラーメッセージをヒントにsystemコマンドを挿入します。
/etc/passwdの中身を確認することができました。
おわりに
本ブログでは、サイバーセキュリティのスキル向上に役立つオンライン学習プラットフォーム「PentesterLab」からエクササイズ「Web for Pentester – Code Injection 」を紹介しました。
PentesterLabはエクササイズ毎にヒントが掲載されており、関連資料も数多く用意されているため、ペネトレーションテストの初心者の方でも学習しやすいコンテンツだと思いました。ご興味のある方は、ぜひ挑戦してみてください。
参考文献
[2]https://www.php.net/manual/ja/function.eval.php
[3]https://www.php.net/manual/ja/function.usort.php
[4]https://www.php.net/manual/ja/function.preg-replace.php
[5]https://jvndb.jvn.jp/ja/contents/2016/JVNDB-2016-003434.html
[6]https://www.php.net/manual/ja/function.assert.php
執筆者プロフィール
muu(ムー)
セキュリティ技術センター リスクハンティングチーム
ペネトレーションテスト・脆弱性診断を通じて、NECグループのセキュア開発・運用を推進。