Japan

関連リンク

関連リンク

関連リンク

関連リンク

サイト内の現在位置

トレーニングコンテンツ:「PentesterLab」のご紹介

NECセキュリティブログ

2021年7月9日

NECサイバーセキュリティ戦略本部セキュリティ技術センターのmuu(ハンドルネーム)です。今回は、ペネトレーションテストのスキル向上に役立つセキュリティ学習プラットフォーム「PentesterLab」new window[1]と、学習用コンテンツを1つ取り上げてご紹介します。

PentesterLabのトップページ

PentesterLabとは

「PentesterLab」とは、セキュリティ(特にペネトレーションテスト)に関する技術を学ぶことができるオンライン学習プラットフォームです。PentesterLabには、トピック毎にエクササイズが用意されており、脆弱性に対する攻撃手法などを学習することができます。

PentesterLabのエクササイズ一覧ページ

学習方法はBootcamp、Progressの2種類が用意されています。Bootcampはエクササイズを始める前に習得しておくべきスキルを座学ベースで学習できます。基礎的な知識から学ぶことができるため、ペネトレーションテスト初心者の方はBootcampから始めることをおすすめします。また、Progressでは各エクササイズをカテゴライズし、効果的に学べるよう学習のルートが示されています。

BootCampの画面
Progressの画面

この他、PentesterLabでは無償版のほかに有償版となるPentesterLab Pro($19.99/月)も用意されています。以下に有償版と無償版の違いをまとめています。

PentesterLab ProとFreeの違い

今回は無償版で学習可能なエクササイズをご紹介します。

環境準備

今回は脆弱性に対する基礎的な攻撃手法を学習できるエクササイズ「Web for Pentester」を解いていきたいと思います。難易度はEASYとなっています。

エクササイズ「Web for Pentester」の画面

PentesterLabにログイン後、エクササイズ一覧からWeb for Pentesterのページにアクセスし、isoファイルをダウンロードします。

「Web for Pentester」のisoファイルのダウンロード画面

VirtualBoxやVMwareなど仮想化ソフトを使用し、ダウンロードしたisoファイルから仮想マシンを作成します。

仮想マシンの作成画面

この仮想マシンを立ち上げ、ifconfigコマンドでIPアドレスを確認します。

仮想マシンのIPアドレス

ブラウザから上記のIPアドレスへアクセスすると、エクササイズに接続することが可能となります。

「Web for Pentester」のトップページ

Web for Pentester - Code Injection

今回はWeb for Pentesterで用意されている問題のうち、Code Injectionを解いていきます。
なお、各エクササイズのトップページには問題を解く際のヒントが掲載されていますので、問題に躓いたときはそちらを参考に学習を進めることも可能です。

Example1

Example1のトップページ

アクセスすると”Hello hacker!!!”と画面に表示されます。URLを見ると、nameパラメータの値が反映されていることが分かります。
攻略の糸口を掴むべく、まずはファジングを実施し、エラーメッセージが出力されないか確認します。

ダブルクォーテーションを挿入したところ、エラーメッセージが表示されました。
このエラーメッセージからexample1.phpはeval関数new window[2]を使用していることがわかりました。
eval関数は任意の文字列をPHPのコードとして実行するため、悪意のあるコードを挿入した場合、実行できる可能性があります。

エラーメッセージの表示

そこで、eval関数のパラメータにsystem関数(指定したコマンドを実行し結果を出力する関数)を使用してhostnameを表示するコードを挿入してみたいと思います。

system関数を挿入した結果

まず、nameパラメータの値にsystem関数をそのまま挿入した場合、文字列として認識されます。
今回のエクササイズではexample1.phpのソースコードは確認できないため、エラーメッセージを参考にソースコードを推測しながら挿入するコードを模索していきます。

挿入するコードの試行1
挿入するコードの試行2
挿入するコードの試行3

これらの試行結果から、「";system (‘hostname’);#」をURLエンコードし挿入することでsystem関数が実行できることわかりました。

System関数を用いたhostnameコマンドの実行例

他の情報も確認していきます。

pwdコマンド

pwdコマンドの実行結果

lsコマンド

lsコマンドの実行結果

catコマンド

catコマンドの実行結果

/etc/passwdの中身を確認することができました。

Example2

Example2のトップページ

アクセスすると、id,name,ageを1組としたデータを確認することができます。
Example1と同様にファジングを行い、エラーメッセージを確認します。

エラーメッセージの表示

エラーメッセージから、example2.phpではusort関数new window[3]を使用していることがわかります。
usort関数は、ユーザの定義した通りに配列の並び替えを行うことから、上記のデータはusort関数を用いてソートしていると推測できます。
またExample2のヒントを見ると、usort関数はcreate_function関数とともに使用されることが多く、コード実行につながる可能性があることが分かります。このことから、Example1と同様にエラーメッセージを参考にしながらsystemコマンドを挿入できるか模索していきます。

挿入する不正コードの試行1
挿入する不正コードの試行2
挿入する不正コードの試行3

これらの試行結果から、「?order=id);} system ('cat /etc /passwd'); #」をURLエンコードし挿入することでsystem関数が実行できることわかりました。

catコマンドの実行結果

/etc/passwdの中身を確認することができました。

Example3

アクセスすると”Hello hacker”と表示されます。

Example3のトップページ

URLからlamerを削除すると、hackerの表記も消えました。よって、lamerをhackerに置き換える処理が行われていると推測できます。

URLからlamerを削除

Example1、Example2と同様にエラーメッセージを確認していきます。

エラーメッセージの表示

警告文よりexample3.phpではpreg_replace関数new window[4]を使用していることがわかります。
preg_replace関数は正規表現検索、および置き換えを行います、preg_replace関数は、e修飾子の使用を制限する区切り文字を適切に選択しないため、任意のPHPコードを実行される脆弱性が報告されています。new window[5]
よって、正規表現の最後に文字列eを渡し、system関数を挿入します。

catコマンドの実行結果

/etc/passwdの中身を確認することができました。

Example4

アクセスすると”Hello hacker”と表示されます。

Example4のトップページ

Example1、Example 2、Example 3と同様にエラーメッセージを確認します。

エラーメッセージの確認

エラーメッセージからexample4.phpではassert関数new window[6]を使用していることがわかります。
assert関数は受け取ったパラメータ(assertion)を評価しFALSEであるかをチェックします。assert関数は悪意のあるパラメータを渡すことでコードを実行できる可能性があります。
Example1、Example 2と同様にエラーメッセージをヒントにsystemコマンドを挿入します。

catコマンドの実行結果

/etc/passwdの中身を確認することができました。

おわりに

本ブログでは、サイバーセキュリティのスキル向上に役立つオンライン学習プラットフォーム「PentesterLab」からエクササイズ「Web for Pentester – Code Injection 」を紹介しました。
PentesterLabはエクササイズ毎にヒントが掲載されており、関連資料も数多く用意されているため、ペネトレーションテストの初心者の方でも学習しやすいコンテンツだと思いました。ご興味のある方は、ぜひ挑戦してみてください。

参考文献

執筆者プロフィール

muu(ムー)
セキュリティ技術センター リスクハンティングチーム

ペネトレーションテスト・脆弱性診断を通じて、NECグループのセキュア開発・運用を推進。

執筆者の他の記事を読む

Escキーで閉じる 閉じる