udf提權

0x00前言:

udf提權是通過數據庫來實現獲取目標的管理員的shell,來達到從低權限提權到高權限

 

0x01什麼是udf:

udf(Userdefined function)是用戶自定義函數

在mysql中函數是什麼,比如mysql中常見的sleep(),sum(),ascii()等都是函數

udf就是爲了讓我們開發者能夠自己寫方便自己函數,它有3種返回值,這三種分別是STRING,INTEGER,REAL

STRING        字符型
INTEGER       整型
REAL          實數型

 

定義格式

#創建自定義函數
CREATE
[AGGREGATE] FUNCTION function_name RETURNS {STRING|INTEGER|REAL} SONAME '文件名'
[AGGREATE]是聚集函數的表示,系統定義的聚集函數比如有
COUNT()、AVE()、MN()、MAX()、SUM()
SONAME 'file'表示這個函數從哪個文件裏面引入,而這個文件一般是動態鏈接庫,windows下是dll,linux是so,並且這個文件要在mysql的plugin目錄下

#刪除自定義函數
DROP FUNCTION function_name

特別注意mysql版本如果是在5.1以下udf.dll文件在windows server 2003下放置於c:\windows\system32目錄,在windows server 2000下放置在c:\winnt\system32目錄

如果顏刪除函數,必須udf文件還存在plugin目錄下

舉個例子,mysql加載了udf.so文件中的某個函數,然後在沒有刪除這個函數前,把plugin目錄下導入的這個udf.so文件利用rm命令刪除了,那麼這個導入mysql的函數就無法被刪除,沒有找到解決辦法,如果後面新創的函數名字和該函數相沖突,mysql還不允許創建,所以請注意一下。(我被坑了,重裝了mysql才終於把那個自定義導入的函數刪掉了)

 

0x02一道CTF題目:

首先看一道jarvis OJ的一道web題目RE?,來明確如何使用用戶自定義函數

https://dn.jarvisoj.com/challengefiles/udf.so.02f8981200697e5eeb661e64797fc172

題目下載下來的是一個so文件,那麼明顯就是針對linux系統,首先可用linux進mysql看看自己的plugin文件夾在哪

這裏我ubuntu虛擬機是在/usr/lib/mysql/plugin/下,把下載的文件拖進虛擬機並copy過去

但是有個問題,我們不知道這個so文件有哪些函數怎麼辦(雖然題目提示有個help_me),這裏可以用ida逆向工具打開這個so文件

可以看到這裏面有函數的名字,於是在linux下的mysql裏面先加載help_me看看效果

那麼繼續加載getflag這個函數(請忽略輸入錯誤的語句.....),最終獲取了flag

那麼要刪除這2個函數也很簡單實用drop function語句即可

 

0x03UDF利用:

迴歸正題,那麼這幾個udf提權文件從哪裏來,msf和sqlmap下都有

metasploit下的動態鏈接庫

sqlmap下的動態鏈接庫

我在這裏把metasploit下的4個文件copy出來,sqlmap下的4個udf文件是經過編碼的,如果直接丟在mysql的plugin目錄下是無法加載的,需要用sqlmap/extra/cloak/cloak.py進行解碼

在sqlmap/extra/cloak/目錄下使用以下命令,生成的udf文件就會出現在當前文件夾中

python .\cloak.py -d -i ..\..\udf\mysql\linux\64\lib_mysqludf_sys.so_ -o linux_udf_64.so

首先可以向上面做題的時候瞧瞧這個so文件裏面的函數

 那麼將文件丟到剛剛的ubuntu下,並添加udf是成功的,但是一運行的時候會斷開連接

 

我又用msf的作用於windows的udf.dll文件上,在win7的虛擬機運行,也是斷開連接

最先我在思考是爲什麼會出現這種情況,最先懷疑udf文件能加載那麼可能是mysql版本的問題,但是最後看國外的一篇udf提權的文章,最後僅簡單的提了一句msf的udf文件原C++函數沒有寫異常處理,那麼mysql加載的時候會使mysql出錯導致斷開連接。

然後我比較了下msf和sqlmap的udf文件,發現其實2個文件是一模一樣的,也就是如果單獨拿出來會在有些環境下(比如我自己的ubuntu16.04 mysql5.7和win7 phpstudy mysql5.5)的環境下會出現無法運行。

最後在解決這個問題上是,藉助大馬的udf提權模塊能夠獲取windows的32位和64位的udf文件,並且能夠成功運行。(大馬是具體是哪個這裏就不透露了,有興趣可以去github翻翻,或者網上查查)

這個大馬的udf.dll文件是20k,而msf的udf文件普遍只有7~8k,估計裏面寫了很多操作(可能有後門,不是很安全,所以我就不在這透露了)

至於linux如何解決,目前我還沒有找到現場能直接用的文件,如果可以那麼就自己寫C++吧。

 

0x04關於mysql寫文件的注意:

mysql有個配置是叫secure_file_priv,該參數來覺得mysql可以對哪個目錄進行可寫操作,在剛裝的mysql上該參數是沒有寫的(不是爲空是沒有寫,也就是被註釋掉的)

在mysql5.5之前 secure_file_priv默認是空,這個情況下可以向任意絕對路徑寫文件

在mysql5.5之後 secure_file_priv默認是NULL,這個情況下不可以寫文件

但是如果mysql的配置文件中添加,那麼就和mysql5.5之前一樣,爲空,可以爲任意目錄寫文件

而在mysql5.7後 secure_file_priv會默認一個目錄,當然這個不是web的目錄.....

所以現在通過mysql來寫webshell是越來越困難了,但是不排除一些配置錯誤導致的我們“有機可乘”

 

0xff結語:

這次udf提權的學習,也讓我理清一條攻擊思路,如果挖到sql注入,

查數據庫密碼和賬號,看看是不是能遠程連接

mysql5.7版本之後有個system可以直接執行命令

可以通過union select 來利用load_file或者dumpfile或者outfile向絕對路徑目錄寫webshell

拿到webshell可以連接數據庫,能夠寫文件的話,利用udf提權

 

參考:

https://www.jianshu.com/p/5b34c1b6dee7

http://www.360doc.com/content/18/0228/22/31784658_733287732.shtml

https://www.cnblogs.com/ghc666/p/8609067.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章