HackTheBox: Lock
偵察 — ポートスキャンと Gitea 公開リポジトリの発見
ポートスキャン (nmap)
IIS (80) + SMB (445) + Gitea (3000) + RDP (3389) の 4 ポートが開いている。
Gitea は ASP.NET アプリ開発に使われており、CI/CD による自動デプロイとの連携が示唆される。
IIS ウェブサイトの確認 (port 80)
IIS 10.0 + ASP.NET が稼働。ウェブサイトは PDF 文書管理ソリューションを提供する企業サイト。ASPX ファイルが実行可能なことを意味する。
Gitea 公開リポジトリの列挙 (port 3000)
dev-scripts は Python スクリプト集、website は IIS にデプロイされているウェブサイトのソースコード。
CI/CD 統合が有効: website の readme.md に「CI/CD integration is now active — changes to the repository will automatically be deployed to the webserver」と記載あり。
Gitea PAT 漏洩 — dev-scripts コミット履歴から認証トークン取得
dev-scripts コミット履歴の調査
2 コミットが存在。最初のコミット (Add repos.py) には PAT がハードコードされていた可能性がある。
更新コミット (Update repos.py) では環境変数 GITEA_ACCESS_TOKEN に変更済み — つまり履歴に過去のトークンが残っている。
初期コミット時点の repos.py を取得
💎 取得認証情報 (Personal Access Token)
GITEA_PAT = 43ce39bb0bd6bc489284f2905f033ca467a6362f
PAT をコミット後に環境変数へ変更しても、git の commit history から復元可能。
PAT は取り消し・再発行が必要。git の filter-branch や BFG Repo-Cleaner で履歴からも完全削除すること。
PAT で website リポジトリへのアクセス確認
PAT で ellen.freeman の全リポジトリへの読み書きアクセスが可能。
website リポジトリへの push 権限が得られた。
CI/CD ASPX Webshell — website リポジトリ push → IIS 自動デプロイ
website リポジトリをクローン
IIS の webroot は git pull (fast-forward) で更新される。
git init + git push --force で orphan commit を作成すると、IIS 側の git が「unrelated histories」を拒否し、以降のデプロイが全て失敗する。
必ず git clone → 追記コミット → 通常 push の順で実施すること。
ASPX Webshell を追加してコミット・プッシュ
push イベントで Gitea の post-receive hook が発火し、IIS の webroot ディレクトリで git pull が実行される。
73cdcc1..b62dc3e のような fast-forward delta push でのみ動作する。約 10〜15 秒でデプロイ完了。
Webshell の動作確認と RCE
IIS ユーザ (lock\ellen.freeman) として RCE を確立。
webshell は URL エンコードされたコマンドを ?c= パラメータで受け取り、出力を WSSTART...WSEND マーカーで返す。
mRemoteNG AES-GCM 復号 → Gale.Dekarios RDP → user.txt
config.xml の取得
Base64 デコード後のバイト列: salt(16) + nonce/IV(16) + ciphertext + tag(16)
鍵導出: PBKDF2-SHA1(master_password, salt, iterations=1000, dklen=32)
デフォルト master password: mR3m(mRemoteNG 公式のデフォルト値)
復号時: AES-GCM.decrypt(key, nonce, ciphertext, tag, AAD=salt) — salt を AAD として渡すことが必須
パスワードの復号 (Python AES-GCM)
💎 取得認証情報
Gale.Dekarios : ty8wnW9qCKDosXo6
① master password: mRemoteNG のデフォルトは "mR3m"。ネット上の記事で "mRemoteNG" と誤記されていることがあるが、実際は "mR3m"。
② AAD (Additional Authenticated Data): cipher.update(salt) で salt を AAD として渡さないと認証タグ検証が失敗する。cryptography ライブラリでは authenticate_additional_data(salt) に相当。
RDP 接続と user.txt 取得
🚩 user.txt
974b2bb4d6bbe4663399def4a5446ba3
webshell は lock\ellen.freeman として動作しており、C:\Users\gale.dekarios\Desktop\ への読み取りアクセス権がない。
SMB C$ も Gale 権限でのアクセスは拒否される。WinRM (5985) も開いていない。
→ RDP セッション中に Gale 本人として読み取るしかない。
CVE-2023-49147 PDF24 OpLock + MSI repair → SYSTEM → root.txt
PDF24 バージョン確認と脆弱性概要
根本原因: PDF24 Creator の MSI repair (msiexec /fa) は SYSTEM 権限で動作し、C:\Program Files\PDF24\faxPrnInst.log を作成・オープンしようとする。
攻撃手法 (TOCTOU): 攻撃者が OpLock (Opportunistic Lock) で faxPrnInst.log をブロックすると、MSI が log ファイルを開けずに待機。その間に pdf24-PrinterInstall.exe が SYSTEM として RDP セッションに可視の GUI ウィンドウを立ち上げる。
影響バージョン: PDF24 Creator ≤ 11.15.1
SetOpLock.exe の取得とアップロード
go.bat の準備
rSetOpLock.exe "path\to\file" r — r (Read oplock) はダッシュなしの位置引数として渡す。
-r と書くと OpLock が設定されず、faxPrnInst.log が即座に開かれて PrinterInstall が正常終了してしまう。
OpLock + msiexec repair の実行
MSI repair 開始から pdf24-PrinterInstall.exe の GUI が現れるまで 30〜60 秒かかる。
途中で「PDF24 Backend を閉じてください」ダイアログが出た場合は Enter で dismissed。
SYSTEM 権限での cmd.exe 起動
pdf24-PrinterInstall.exe は SYSTEM トークンで動作しており、そのコンソールウィンドウから起動される子プロセス (Firefox → cmd.exe) は SYSTEM トークンを継承する。
“Open With” ダイアログでの選択はマウスクリック必須 (キーボード Down+Enter では Firefox が選択されず失敗)。
root.txt 取得
🚩 root.txt
4d9b42b7754f88f1543041102fdc0036
xdotool でキー入力をシミュレートする場合、Shift キーが正しく送信されないため大文字・記号が化ける。
パスはすべて小文字・バックスラッシュのみ・コロンなしで入力する (\users\public\ 形式)。
全体まとめと防御側の学び
攻撃チェーンの全体像
| 段階 | 手法・脆弱性 | 取得したもの |
|---|---|---|
| 1 | Gitea 公開リポジトリ + コミット履歴 PAT 漏洩 | GITEA_PAT: 43ce39bb... |
| 2 | website リポジトリ clone → ASPX webshell push → CI/CD 自動デプロイ | IIS RCE (lock\ellen.freeman) |
| 3 | mRemoteNG config.xml 取得 → AES-GCM 復号 (master pw: mR3m, AAD=salt) |
Gale.Dekarios : ty8wnW9qCKDosXo6 |
| 4 | RDP ログイン (Gale.Dekarios) | user.txt: 974b2bb4... |
| 5 | CVE-2023-49147: SetOpLock r + msiexec /fa → SYSTEM GUI → Firefox → cmd.exe |
root.txt: 4d9b42b7... |
防御側の学び
- PAT の git 管理禁止: Personal Access Token をソースコードにコミットしない。コミット後は必ず PAT を失効・再発行し、BFG Repo-Cleaner で履歴から完全削除すること。
- CI/CD のスコープ制限: CI/CD が書き込む webroot を最小権限に。IIS の実行ユーザと webroot 所有者を分離し、ASPX などのスクリプトを CI/CD でデプロイできないよう制限する。
- mRemoteNG の暗号化強化: デフォルト master password (
mR3m) を強力なカスタムパスワードに変更。config.xml を平文アクセス可能な場所に保存しない。 - PDF24 のアップデート: CVE-2023-49147 は PDF24 Creator 11.15.1 以前に影響。最新バージョンへアップデートすること。インストーラが SYSTEM 権限でユーザー書き込み可能パスにログを作成する設計を避ける。
- RDP セッション分離: 管理者権限ユーザの RDP セッションに一般ユーザから視認できる SYSTEM プロセスが出現する状況を作らない (Restricted Admin Mode の検討)。
使用した主要ツール
| ツール | 用途 |
|---|---|
nmap |
ポートスキャン・サービス検出 |
curl + Gitea API |
コミット履歴からの PAT 取得 |
git clone / push |
ASPX webshell の CI/CD デプロイ |
Python3 (Cryptodome) |
mRemoteNG AES-GCM + PBKDF2 パスワード復号 |
xfreerdp3 + xdotool |
RDP 自動化・GUI 操作 |
SetOpLock.exe (Google Project Zero) |
CVE-2023-49147: faxPrnInst.log への Read OpLock 設定 |
取得フラグ
🚩 user.txt
974b2bb4d6bbe4663399def4a5446ba3
🚩 root.txt
4d9b42b7754f88f1543041102fdc0036
