大和SEC×神戸脆弱性診断の会でペネトレーションテストを学ぶ
Apr 14, 2018
2018年4月7日に神戸デジタル・ラボで開催された「大和SEC×神戸脆弱性診断の会:みんなでペンテストCTF」というペネトレーションテストに関する勉強会に参加した。私は今まで脆弱性調査を主に取り組んでいたため、脆弱性の発見までが目標となっていた。見つけた脆弱性を悪用し、組み合わせながらシステムに侵入していく手法に興味が湧き、ペネトレーションテストを学ぼうと考えた。
勉強会の概要
この勉強会は関西を中心に活動する大和セキュリティ勉強会と神戸脆弱性診断の会が合同で開催したもので、事前に用意された脆弱なサーバに対して参加者自ら侵入を試みながらテスト手法を学ぶ形式で行なわれた。
始めに講師の方が演習のルールとツールの使い方を説明し、約4時間の演習となった。参加者は6人ごとのチームに分かれて協力しながらサーバの攻略に取り組み、演習終了後にリーダーがテスト結果を全体へ報告した。最後に講師の方が攻略方法を解説した。
演習での取り組み
テスト対象のネットワークでは脆弱なサーバ(仮想マシン)が複数起動しており、各チームはそれらのサーバに侵入してroot権限の奪取を目指した。演習では 10.10.66.0/24
のネットワークを対象にテストを実施した。なお以下の行為は禁止された。
- Nessus等による脆弱性スキャン
- 必要以上のポート/サービススキャン
10.10.66.0/24
以外へのスキャンや攻撃- 脆弱なサーバ内のファイルや設定の改ざん
- DoSやMITMなどのシステムへの影響が懸念される攻撃
私が演習時にとったアプローチを以下に示していく。
1. 対象ネットワークへのスキャン
まずは対象のネットワークに存在する端末を把握するため、ネットワーク調査ツールであるNmapを使用してネットワーク全体をスキャンする。端末を検出するため -sn
オプションを付けて実行すると、5台の端末が見つかる。
私たちのチームでは5台の端末ごとに担当を決めて1人1台の端末をテストし、リーダーがその進捗を取りまとめた。以降は私が担当した 10.10.66.89
の端末へのアプローチである。
2. 対象端末へのポートスキャン
検出した端末に対してNmapによるポートスキャンを実施する。-sS
オプションを付けてTCP SYNスキャンを実行すると、3つのオープンポートが検出される。
23番ポートにTelnet接続するとSSHサーバが動作していることがわかる。
SSH接続するとパスワード認証を求められるので、パスワードリストを用いたユーザー root
の総当たりをTHC-Hydraで試みるが失敗に終わる。
3. Webサーバへの脆弱性スキャン
80番ポートではWebサーバが動作しているので、Webサーバ向けのセキュリティ診断ツールであるNiktoでスキャンする。
Niktoのスキャンにより OSVDB-3092: /dev/: This might be interesting...
という問題が検出される。これは /dev/
という開発用と推測されるディレクトリが公開されているとの報告である。ブラウザからアクセスすると開発者向けのページが表示される。ページ内には開発者のメールアドレスが記載されている。
ページ内のリンクから /dev/shell/
の存在が明らかになるが、現状ではWebShell機能を利用できない。何らかの権限が必要なようだ。
4. 開発者アカウントの認証情報を特定
/dev/
のページソースを見ると、ハッシュ値のような文字列がHTMLコメントとして記載されている。
文字列は40文字であり、数字と a
から f
までの英字で構成されていることから、開発者ごとのパスワードをSHA-1でハッシュした値だと推測される。John the Ripperによるパスワードの解析を試みるが、Mac上では Unknown ciphertext format name requested
とのエラーが発生する。
このエラーはJohn the Ripperの一部のエディションで発生するようで、Kali上では問題なく解析に成功する¹。
特定したパスワード bulldog
を用いてユーザー nick
でのSSHログインを試みるが失敗する。
5. Webサーバへのコンテンツ探索
サイト内にはログインページが見当たらないため、特定したパスワードの用途が不明である。そこでNiktoよりもコンテンツ探索に特化したDIRBでWebサーバをスキャンする。
新たに発見した /admin/
ディレクトリにブラウザからアクセスすると、管理者のログインページにリダイレクトする。先ほど特定した開発者アカウントの認証情報を入力するとログインに成功する。
6. 任意コマンドの実行
開発者としてログインした状態であればWebShell機能を利用できる。しかし実行できるコマンドは ifconfig
、ls
、echo
、pwd
、cat
、rm
のみに制限されている。許可されていないコマンドを入力するとハッカーと疑われてしまう。
ls
コマンドで内部を探るとWebサーバ上でDjangoが動作していることがわかる。Pythonスクリプトを実行できれば、リバースシェルにより任意のコマンドを実行できると考え、echo
コマンドを用いて以下のようにファイルを作成する²。
作成したファイルを実行できれば、私のMacである 10.10.0.221
の8888番ポートとコネクションが確立するはずである。python
コマンドの使用は許可されていないため ./
での実行を試みるが、これも許可されていない。
WebShell機能から実行するのではなく、Webサーバのドキュメントルート配下にファイルを作成し、Webアプリケーションとしての実行を試みる。CSSや画像が格納されている /static/
というディレクトリにPythonスクリプトを置き、ブラウザからアクセスするが実行されない。
Djangoのデザインパターンに従ってテンプレートの追加も試みたが、演習のルールでは設定ファイルの書き換えは禁止のためルーティングを追加できない。Metasploit FrameworkからDjangoやWSGIのエクスプロイトもあさってみたが利用できず、ここで演習は終了となった。
サーバの攻略方法
任意コマンドの実行にはコマンド置換や連続実行の手法を応用する。例えば echo
コマンドの引数のうち `
で括られた部分はコマンドとして実行される。以下のように入力することで本来は許可されていない python
コマンドを実行できた。
Mac上のNetcatで待ち受けているとPythonスクリプトからの接続があり、リバースシェルが可能となる。
root権限の奪取には /.hiddenadmindirectory/
という隠しディレクトリ配下のファイル内の文字列を利用する。strings
コマンドで抽出した中の4つの文字列を連結し、そこから H
を削除した文字列がrootのパスワードであった。
所感
Linuxコマンドの連続実行やコマンド置換を応用する方法は、今までの診断やCTFで何度も利用していた。それにも関わらず演習時に気づけなかったのが悔やまれる。ここまで露骨なWebShell機能は私の診断経験の中では見かけなかったが、講師の方曰くルーターのWebコンソールなどで見かけるとのこと。そこでのコマンド縛りを今回と同様の方法で回避できるケースがあるようだ。ペネトレーションテストでは内部ネットワークに侵入するため、ネットワーク機器のWebコンソールや社内システム特有の機能に触れる機会は多い。それらを悪用できる能力もテスターには求められると感じた。
私が演習で担当した端末ではWebサーバが動作していたため、Webアプリケーションの脆弱性調査で培った能力を活かせた。例えばコンテンツ探索やHTMLコメントの確認は自然に手が動いた。しかしテスト対象で必ずしもWebサーバが動作しているとは限らない。HTTP以外のプロトコルでのテスト手法も身につけ、攻撃の幅を広げる必要がある。演習で使用された仮想マシンは全てVulnHubで配布されているので³、担当しなかった端末も攻略しながら今後もペネトレーションテストの能力を高めていきたい。
大和セキュリティ勉強会も神戸脆弱性診断の会も初めての参加だったが、明るい雰囲気で講師の方にも気軽に質問できた。また懇親会ではチーム以外の参加者の方とも交流でき、関西方面のセキュリティに関する動向やイベントなども知れた。普段触れる機会のないことを学べたので、神戸まで行ったかいがあった。
¹ 私がこのエラーにてこずるなか、隣のメンバーは早々にハッシュ値をGoogle検索して元の値を特定した。
² リバースシェルのコードはpentestmonkeyにあるPythonスクリプトを参考にした。
³ 演習で使用された仮想マシンは第4オクテット別に 3
、66
、77
、89
、126
である。