【TryHackMe】「Vulnversity」のWriteUp

CTF
この記事は約10分で読めます。

自分自身の勉強結果の整理ということでWriteUpを書いていく。

TryHackMe | Vulnversity
Learn about active recon, web app attacks and privilege escalation.

TryHackMeはウォークスルー形式のお勉強サイトなので、ここに載っている内容も案内に従って攻略したものに過ぎないので、私の実力はお察し。

ルーム「Vulnversity」について

おそらくTryHackMeのペンテスト系ルームのなかで、入門編にあたる部屋。

Web系の知識を使ってサーバを攻撃し、エクスプロイトするというもの。

といっても、そこまで難しいものではなく、応用情報技術者試験に合格するくらいの知識があれば十分ついていけると思う。

攻略の手順

OpenVPNで接続

TryHackMeはサイト上でKaliを仮想的に使うことができるので、ぶっちゃけこちら側で用意するものはない。(さすがにブラウザはいるが)

だが、辞書攻撃用のWordlistやツールはできれば自前のものを使いたいから、自分のOSで操作したいところ。

そういう人のために、openvpnを使って攻撃対象のサーバに接続もできる。

攻略前にまずはつなぐ。

$sudo openvpn /etc/muchipopo.ovpn

.ovpnの設定ファイルはあらかじめサイト上からダウンロードしておこう。

ポートスキャン

デプロイした。

まずは攻撃対象のサーバをデプロイ。
今回のIPアドレスは10.10.216.27らしい。これは毎回デプロイするたびに代わる。

Nmapを使ってポートスキャンする。

$ nmap -sV -A -Pn -T4 10.10.216.27 -oN nmap_report

オプションについて解説すると、
-sV:サービス内容もスキャン
-A:OS名とかバージョンも探す
-Pn:スキャン前にpingを使わない
-T4:高速スキャン
-oN:ノーマル形式で結果出力

結果は

# Nmap 7.91 scan initiated Tue Oct 26 21:58:44 2021 as: nmap -sV -A -Pn -T4 -oN nmap_report 10.10.216.27
Nmap scan report for 10.10.216.27
Host is up (0.27s latency).
Not shown: 994 closed ports
PORT     STATE SERVICE     VERSION
21/tcp   open  ftp         vsftpd 3.0.3
22/tcp   open  ssh         OpenSSH 7.2p2 Ubuntu 4ubuntu2.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 5a:4f:fc:b8:c8:76:1c:b5:85:1c:ac:b2:86:41:1c:5a (RSA)
|   256 ac:9d:ec:44:61:0c:28:85:00:88:e9:68:e9:d0:cb:3d (ECDSA)
|_  256 30:50:cb:70:5a:86:57:22:cb:52:d9:36:34:dc:a5:58 (ED25519)
139/tcp  open  netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp  open  netbios-ssn Samba smbd 4.3.11-Ubuntu (workgroup: WORKGROUP)
3128/tcp open  http-proxy  Squid http proxy 3.5.12
|_http-server-header: squid/3.5.12
|_http-title: ERROR: The requested URL could not be retrieved
3333/tcp open  http        Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Vuln University
Service Info: Host: VULNUNIVERSITY; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

Host script results:
|_clock-skew: mean: 1h19m58s, deviation: 2h18m36s, median: -3s
|_nbstat: NetBIOS name: VULNUNIVERSITY, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| smb-os-discovery: 
|   OS: Windows 6.1 (Samba 4.3.11-Ubuntu)
|   Computer name: vulnuniversity
|   NetBIOS computer name: VULNUNIVERSITY\x00
|   Domain name: \x00
|   FQDN: vulnuniversity
|_  System time: 2021-10-26T08:59:44-04:00
| smb-security-mode: 
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)
| smb2-security-mode: 
|   2.02: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2021-10-26T12:59:43
|_  start_date: N/A

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Tue Oct 26 21:59:55 2021 -- 1 IP address (1 host up) scanned in 71.30 seconds

こんなかんじ。

ウォークスルーでは、Webサーバを攻めろというようなことが書いてあったので、3333番ポートで稼働しているApacheを対象に決めた。

ブラウザでアクセス

http://10.10.216.27:3333
にブラウザでアクセスしてみた。

シャレオツかつオシャンティーなサイトなのね。こんな青春送ってみたかったね。つらいね。

フォルダ構成探索

クエストは「アップロード画面を探せ」

フォルダ構成を探索する必要があるが、TryHackMe上ではgobusterというツールが紹介されていた。

だが、どうもこのgobuster、再帰的なフォルダ探索ができないらしい。

つまり、10.10.216.27/usr/なら見つけられるけれど、 10.10.216.27/usr/realju/は見つけられない。

ダメじゃんこれ…と思ったので、DirBusterを使うことに。

DirBusterはgobusterと違ってGUIがあるので、フィーリングで何となく操作できる。
ちなみにKaliには最初から入っている。

目をつむっても入力できるくらい洗練された入力フォームよ。

Wordlistは既存のを使用。Kaliであれば、/usr/share/wordlistのあたりに入っているので適当に使おう。
このディレクトリには、おなじみのrockyou.txtもあるのでこちらでもいいんじゃないかな?(知らんけどな)

DirBusterで探索すると、

あはれにぞ見えける

ウォークスルーの課題が、「アップロード画面を探せ」だったので、この構成をもとにブラウザでいろんなURLに接続を試みた。

internalにあった

ということでアップロード画面発見。

アップロードできるファイル形式を調査

次のウォークスルーでの指令が「アップロードできるファイル形式は何?」のため、ひとまずtxtファイルを作ってアップロード。

怒られて終了。
どうも許可された拡張子しかアップロードできないらしい。

ということで、BurpSuiteで辞書攻撃的なのをやることに。

Kaliならデフォルトで入っているので、メニューから起動するか、

$sudo burpsuite

でもOK。

起動すれば、ProxyタブからOptionの項目を選択して設定。

まずはProxyListenersの項目で、ループバックアドレスで8080ポートを使って待ち受けることに。

次の項目で、リクエストとレスポンスの両方をインターセプトする設定にした。
別にインターセプトしなくてもなんとかなるけど、好みでこうしてる。

設定出来たら、再度txtファイルをアップロードしてみて、その際のリクエストを確認する。

これで送信時のリクエスト内容がわかった。
SSL化されていたらサーバ証明書の設定なんかがいるしめんどいよね。平文でよかった。

下準備できたので、次は攻撃の段取り。

Intruderタブに移動して、Target項目からホストのIPとポートを設定。

そして、Positionsの項目へ移動。
そこでは、辞書攻撃でいじくる場所を設定する。
今回はいろんな拡張子を試すのが目的なので、txtファイルの拡張子部分を変数扱いにした。

緑のところが変数的なやつな

本当は大きな辞書ファイルを使うところだけど、時間がかかるのでウォークスルーに従ってリストを手入力して読み込ませた。
無課金ユーザーのつらいところよ。

6項目だけ

あとは右上のStart Attackボタンをクリックすれば開始。

phtmlのみレスポンスが違う

ということで、phtmlの場合のみアップロード可能だとあたりがついた。

ローカル権限の取得

phtmlをアップロードできるということは、こちらが作ったPHPコードを実行できるということ。

なので、PHPからリバースシェルをアップロードすることに。

こちらからPHPソースをダウンロード。

nanoエディタで編集してthm.phtmlを作成。
CHANGE THISと書いてあるところは、こちら側のOSのIPとリバースシェルを待ち受けるためのポート番号。

そして先ほどのWebフォームからアップロード。

次に、こちらのターミナルでnetcatを実行。
4444ポートで受け付けることに。

$nc -nlvp 4444

その後、ブラウザで/internal/uploads/thm.phtmlにアクセスすると、

www-dataというユーザで権限をゲットすることができた。

ユーザの検索

クエストでは、「Webサーバを動かしているユーザは?」となっていたので、ひとまず/etc/passwdをcatする。
この程度、目grepで十分よ。

billがいますね。ということでこれが答え。

鬼門!SUID脆弱性攻撃の巻!

ここから急にクエストが投げやりになり、

「SUID調べていろいろ攻撃してroot権限とってみ。/root/root.txtにflagあるからさ」

とな。なめとんか。

ひとまずヒントに従い、SUID権限がついたファイル一覧を検索する。

systemctlにSUID

SUIDがついているということは、実行することさえできればそのサービスなりが管理者権限を持つということ。SUIDを攻撃するしかない。

次にこちらへアクセスして、systemctlのSUID実装不備を攻撃するexploitツールを検索。

日本語訳すると

SUIDがセットされたバイナリーファイルがあった場合、権限昇格を拒否できないことがある。
そして、SUIDのバックドアを使って、ファイルシステム上で任意の場所にアクセスされたり、権限を昇格されたり維持されたりする。
(略)
この例では、ローカルのバイナリファイルのSUIDコピーを作って、起動することで、権限昇格する。

ということらしい。

一言でいうと、SUID使って権限昇格するということらしい。

スクリプトを全部読むのはしんどいので、一部いじってあとはコピーして実行。

ということで、shを使って/root/root.txtのファイルが/tmp/outputに書き出されたことになるので、あとはcatでoutputのファイルを読みだせばお題はクリア。

これでこのコースはおしまい!

まとめ

いろいろな人のブログで、このマシーンはおすすめされている。
たしかにたくさんの要素が詰め込まれているので、きっと重要なのだと思う。

コメント

タイトルとURLをコピーしました