自分自身の勉強結果の整理ということでWriteUpを書いていく。
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に接続を試みた。
ということでアップロード画面発見。
アップロードできるファイル形式を調査
次のウォークスルーでの指令が「アップロードできるファイル形式は何?」のため、ひとまずtxtファイルを作ってアップロード。
怒られて終了。
どうも許可された拡張子しかアップロードできないらしい。
ということで、BurpSuiteで辞書攻撃的なのをやることに。
Kaliならデフォルトで入っているので、メニューから起動するか、
$sudo burpsuite
でもOK。
起動すれば、ProxyタブからOptionの項目を選択して設定。
まずはProxyListenersの項目で、ループバックアドレスで8080ポートを使って待ち受けることに。
次の項目で、リクエストとレスポンスの両方をインターセプトする設定にした。
別にインターセプトしなくてもなんとかなるけど、好みでこうしてる。
設定出来たら、再度txtファイルをアップロードしてみて、その際のリクエストを確認する。
これで送信時のリクエスト内容がわかった。
SSL化されていたらサーバ証明書の設定なんかがいるしめんどいよね。平文でよかった。
下準備できたので、次は攻撃の段取り。
Intruderタブに移動して、Target項目からホストのIPとポートを設定。
そして、Positionsの項目へ移動。
そこでは、辞書攻撃でいじくる場所を設定する。
今回はいろんな拡張子を試すのが目的なので、txtファイルの拡張子部分を変数扱いにした。
本当は大きな辞書ファイルを使うところだけど、時間がかかるのでウォークスルーに従ってリストを手入力して読み込ませた。
無課金ユーザーのつらいところよ。
あとは右上のStart Attackボタンをクリックすれば開始。
ということで、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権限がついたファイル一覧を検索する。
SUIDがついているということは、実行することさえできればそのサービスなりが管理者権限を持つということ。SUIDを攻撃するしかない。
次にこちらへアクセスして、systemctlのSUID実装不備を攻撃するexploitツールを検索。
日本語訳すると
SUIDがセットされたバイナリーファイルがあった場合、権限昇格を拒否できないことがある。
そして、SUIDのバックドアを使って、ファイルシステム上で任意の場所にアクセスされたり、権限を昇格されたり維持されたりする。
(略)
この例では、ローカルのバイナリファイルのSUIDコピーを作って、起動することで、権限昇格する。
ということらしい。
一言でいうと、SUID使って権限昇格するということらしい。
スクリプトを全部読むのはしんどいので、一部いじってあとはコピーして実行。
ということで、shを使って/root/root.txtのファイルが/tmp/outputに書き出されたことになるので、あとはcatでoutputのファイルを読みだせばお題はクリア。
これでこのコースはおしまい!
まとめ
いろいろな人のブログで、このマシーンはおすすめされている。
たしかにたくさんの要素が詰め込まれているので、きっと重要なのだと思う。
コメント