ペンテストから防御を学ぶ : TryHackMe - vulnversity
本記事はTryHackMeのvulnversityのレポートです。
TryHackMeとはサイバーセキュリティについて手を動かして学ぶことができるサービスで、vulnversityとはそのうちの1つの部屋(=攻略マシン)です。序盤の攻略マシンなので難易度は易しいのだと思います。
攻撃サイドはOffensive Pentestingというコース、防御サイドはCyber Defenseというコースがあり、今は攻撃サイドのコースをやっています。
初めて実際に攻撃をしてみましたが、非常に難しかったです。最後の方はわからず、ほぼ海外記事を参考に手を動かしてましたので、今でもきちんと理解できていないほどです...よって本記事の最後の方は手順をかなり省略しているので何卒ご了承ください
今回の攻撃の流れ
本来、攻撃の流れは最後にわかるのですが、本記事ではわかりやすさを優先して、最初に持ってきました。
1. ネットワークスキャンにより、Webサーバのポートを確認する
2. ウェブサイトのディレクトリを探し、ファイルのアップロードを許可するページを見つける
3. Fuzzingで特定の拡張子でアップロードが許可されていることを見つけて、リバースシェルをアップロードし利用することで、クライアントからサーバを操作できるようにする
4. SUIDを使ってrootのフラグを取る
1. Reconnaissance - 偵察
攻撃は攻撃対象マシンの情報収集からはじまります。nmapはコンピューターネットワーク上のホストとサービスを検出するために使用されるツールです。エンジニアであれば知っている方は多いツールでしょう。
スキャンはクイック & フルで実施
資料にこんなことが書かれていました。
常に徹底的に偵察を行っていることを確認することが重要です。開いているすべてのサービス(すべてが悪用される可能性がある)を知ることは非常に重要です。より高い範囲のポートが開いている可能性があることを忘れないでください。そのため、常に1000以降のポートをスキャンしてください
すべてのポートをスキャンするのは非常に時間がかかるので、最初にクイックにスキャンしたあと、クイックスキャンの結果を見ながらバックグラウンドでフルスキャンをかけることにします。
クイックスキャン
nmap -sC -sV -oA vulnuniversity 10.10.XXX.XXX
上記のコマンドでデフォルトのTCPポートおよそ1660個をスキャンし、かつサービスやバージョンを検出します。
nmap <target>というシンプルなコマンドで、<ターゲット>ホスト上の1660個あまりのTCPポートをスキャンできる
https://nmap.org/man/ja/man-port-scanning-basics.html
クイックスキャンで以下のポートが空いていることがわかります。また一緒にサービス名やアプリケーション名、そしてバージョンまでわかります。
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.7
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open netbios-ssn Samba smbd 4.3.11-Ubuntu
3128/tcp open http-proxy Squid http proxy 3.5.12
3333/tcp open http Apache httpd 2.4.18 ((Ubuntu))
オプション解説
-sC(スクリプトスキャン): デフォルトのスクリプトセットを使用してスクリプトスキャンを実行します。--script=defaultと同等です。
-sV(バージョン検出): 他のスキャン方法を使用してTCPおよび/またはUDPポートが検出された後、バージョン検出はそれらのポートに問い合わせて、サービスやバージョンを詳細に検出
-oA <basename>(すべての形式で出力): スキャン結果を様々な形式で保存
フルスキャン
nmap -sC -sV -oA vulnversity_full -T4 -p- 10.10.XXX.XXX
今度はすべてのポートに対してスキャンを行います。これが非常に時間がかかるので、オプションを調整して重要ポイントの情報を短時間で取得していくことが重要となります
オプション解説
-p- : “-p 1-65535”と同じ。すべてのポートをスキャンする
Nmapをつかって分かったこと
ここで分かったことは攻撃対象マシンにはいくつかのポートが空いていることです。今回注目していくのはWebサーバになりますので、
- 3333/tcpが空いている
- Apache httpd 2.4.18が使われている
ということを認識しておきます。
2. Locating directories using GoBuster - ディレクトリ検索
今度はWebサイトのディレクトリを検索していきます。
自動でディレクトリを検索するツールはいくつかありますが、今回はGobusterを使用します。
./gobuster dir -u http://10.10.XXX.XXX:3333/ -w /usr/share/wordlists/dirb/common.txt
ここで5つのディレクトリが検出されます。このうち、アップロードが可能なディレクトリに注目していきます。
http://10.10.XXX.XXX:3333/internal/
ここで分かったこと
http://10.10.XXX.XXX:3333/internal/というアップロード可能なページがある
3. Compromise the webserver - Webサーバを侵害
さて、ここから一気に難しくなります。
まず最初にやることはアップロードが許可されている拡張子を探すことです。これには1つずつ拡張子が違うファイルを作成し、アップロードして許可されているかを確認するのですが、手でやっていたら日が暮れてしまいます。
それを自動化するためにBurp Suiteというツールを使います。
このツールはクライアント(操作マシン)からサーバ(攻撃対象マシン)の間の通信をインタラプトし、データを変更して自動で異なるデータを投げます。
準備が色々と必要なのですが、ここでは省略して結果を出します。以下は多くの拡張子を自動で確認した結果です。そのうち、.php拡張子の結果を見てみると、データの一番下に"Extension not allowed"という文言があり、これはアップロードは許可されていないの意味だそうです。
それではアップロードが許可されている拡張子を探します。探すと.phtmlファイルでアップロードが許可されていることがわかります。
さてこれで.phtmlファイルであれば攻撃対象となるマシンにファイルをアップロードできることがわかりました。ここから更に難しくなるのですが、リバースシェルというものを使います。
リバースシェルとは攻撃対象マシンから操作しているマシンに接続する仕組みです。通常はクライアントである操作マシンからサーバである攻撃対象マシンに対して色々操作をするわけですが、その逆を行うということです。
PHPで作成されたリバースシェルスクリプトが一般的に存在するようで、これを.phtmlとしてサーバにアップロードして、実行します。
これも色々と細かい手順があるのですが、すぱっと省略して結果です。
手順はこちらです。
1. ncコマンドでポートをリッスンして出力できるようにしておきます
2. リバースシェルファイルをアップロードし、実行します
3. なぜかサーバ(攻撃対象マシン)のシェルが使えるようになります
なぜ、リバースシェルとncコマンドを使うと攻撃対象マシンのシェルが使えるようになるか理解できてません。下記あたりが理解の助けとなりそうですので、時間をかけて理解していく必要があります。
いま大事なのはリバースシェルとncコマンドを使った攻撃方法がある(半ば常識?)ということです。
もうすでに攻撃対象マシンのシェル操作できています。
homeディレクトリにbillディレクトリがあるのでbillというbillというアカウントがあるのでしょう。
ここでできたこと
- アップロードが許可されている拡張子が.phtmlであることがわかった
- リバースシェルとncコマンドを使って攻撃対象マシンのシェルが使えるようになった(一般権限?)
4. Privilege Escalation - 特権昇格
はい、もう色々新しいことだらけで頭が沸騰しそうですが、あと少しです。
たぶん、今は一般権限で攻撃対象マシンを操作していると思われるので、特権を取っていこうという話かと思います。
ここが一番むずかしいので手順や仕組みの解説は省略します。いえるのはSUIDを使うと特権昇格できるということです(雑
最後に
この記事を描いている現時点では4つの部屋(=攻撃対象マシン)を攻略済みです。
攻撃の全体の流れは定型化されていて、
1. nmapスキャンを行い、攻撃対象マシンの空きポート、サービスやアプリケーション名、バージョンを取得
2. 該当する脆弱性がないか探す
3. あれば脆弱性を突いて攻撃対象マシンに入りこむ
4. 特権昇格する
みたいな流れが多いです。
ペネトレーションテストというとセキュリティ会社のペネトレーションテスターだけが対象と思われがちです。しかし、多くの攻撃パターンを経験することで、防御のパターンも蓄積されていくので、事業会社のセキュリティエンジニアもこのような、セキュリティのオフェンシブ分野を学ぶことはかなり有意義だと感じました。
この記事が気に入ったらサポートをしてみませんか?