ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Безопасность и Уязвимости > Избранное
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #11  
Старый 01.04.2009, 20:19
Аватар для HIVER
HIVER
Познающий
Регистрация: 28.10.2008
Сообщений: 43
Провел на форуме:
117557

Репутация: 125
По умолчанию

Чего-то в нем нехватало, на мой взгляд, добавил нормальные цепочки и ротатор с файла

Серверная часть.
Код:
<?php

//$secret = 'secret';

if (isset($_POST["transfer"]) && $_POST["transfer"] != "")
	{
	if(isset($secret) && ($_POST['secret'] != $secret))exit;
	$transfer_hosts = explode("::", base64_decode($_POST["transfer"]));
	$next_host = array_shift($transfer_hosts);
	$postfields = array(
						"query" => $_POST['query'],
						"host" => $_POST['host'],
						"secret" => $_POST['secret']
						);
	if ($transfer_hosts[0] != "") $postfields["transfer"] = base64_encode(implode("::", $transfer_hosts));
	$ch = curl_init($next_host);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
	curl_setopt($ch, CURLOPT_HEADER, 0);
	$result = curl_exec($ch);
	curl_close($ch);
	echo $result;
	} else {
	if(isset($_POST['query']) && isset($_POST['host']))
		{
		if(isset($secret) && ($_POST['secret'] != $secret))exit;
		header('Content-type: application/octet-stream');
		@set_time_limit(0);
		$query = base64_decode(str_replace(" ", "+", $_POST['query']));
		list($host, $port) = explode(':', base64_decode(str_replace(" ", "+", $_POST['host'])));
		if(!$port)$port = 80;
		$ip = gethostbyname($host);
		if($fp = @fsockopen($ip, $port, $errno, $errstr, 20))
			{
			fwrite($fp, $query);        
			while(!feof($fp))
				{
				$answer = fread($fp, 1024);
				echo $answer;
				}
			fclose($fp);
			}
		exit;
		}
	}
?>

Локальная часть с генерацией рандомно распределенной цепочки:
Код:
use HTTP::Daemon;
use MIME::Base64 ();
use Getopt::Long;
use POSIX ":sys_wait_h";
use strict;

my $user_agent = 'Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4';

my $errheader = "HTTP/1.1 200 OK\x0D\x0AContent-Type: text/plain\x0D\x0A\x0D\x0A";
my $errmsg1 = $errheader . 'Could not connect to server';
my $errmsg2 = $errheader . 'Could not connect to pproxy';

my ($pproxyhost, $pproxyport, $pproxyurl);
my ($tunnelhost, $tunnelport);
my ($pproxy, $pproxyfile, @pproxylist, $bindport, $tunnel, $secret);
my ($destaddr, $destport, $desturl);

#Вывод справки
Usage() if @ARGV==0;

#Задание опций
GetOptions(
         "px=s"		=> \$pproxy,
         "bp=s" 	=> \$bindport,
         "tpx=s"	=> \$tunnel,
         "pwd=s"	=> \$secret,
		 "pf=s"		=> \$pproxyfile
     );
die "need pproxy.php url or pproxy.php url filelist" unless $pproxy || $pproxyfile;


#Получение параметров
$pproxyfile =~ /(.+)/;

if ($pproxyfile) 
	{
	open(file, "proxies.txt");
	@pproxylist = <file>;
	} else {
	$pproxy =~ /http:\/\/([\w\.\-]+)(:\d*)?\/(.+)/;
	$pproxyhost = $1; $pproxyport = substr($2, 1); $pproxyurl = '/' . $3;
	}

defined($pproxyport) || ($pproxyport = 80);
defined($bindport) || ($bindport = 8008);

if(defined($tunnel))
{
	$tunnel =~ /http:\/\/([\w\.\-]+):(\d*)?/;
	$tunnelhost = $1; $tunnelport = $2;

	$destaddr = $tunnelhost;
	$destport = $tunnelport;
	$desturl = $pproxy;

	print "# tunnelhost = $tunnelhost\n";
	print "# tunnelport = $tunnelport\n";
}else{
	if (!$pproxyfile)
		{
		$destaddr = $pproxyhost;
		$desturl = $pproxyurl;
		}
		$destport = $pproxyport;
}

if (!$pproxyfile)
	{
	print "# pproxyhost = $pproxyhost\n";
	print "# pproxyport = $pproxyport\n";
	print "# pproxyurl = $pproxyurl\n";
	} else {
	print "# pproxyfile = $pproxyfile\n";
	}
	
print "# bindport = $bindport\n\n";

$|=1;
my %children;
my $slave;

#Прием подключений
my $master = HTTP::Daemon->new(	LocalPort => $bindport,
				LocalAddr => 'localhost', 
				Reuse=>1)
|| die "Can't start server ($@)";
&MainProc($slave) while $slave = $master->accept;

sub MainProc
{
		my $conn = shift;

		#Прием HTTP-запроса
		my $request = $conn->get_request();
		
		#Ответвление процесса(потока)
		my $pid = fork();
		unless(defined($pid))
		{
			print "# Erorr couldn't fork\n";
			close $conn;
			return;
		}

		if($pid)
		{
			close $conn;
			$children{$pid}++;
			foreach(keys %children )
			{
				my $kid = waitpid($_, &WNOHANG);
				delete $children{$_} if($kid == -1 || $kid == $_);
			}
			return;
		}

		#Преобразование HTTP заголовка
		$request -> remove_header('Proxy-Connection');
		$request -> remove_header('Keep-Alive');
		$request -> header(Connection=>'close');
		my $host = $request -> header('Host');
		my $http = $request -> as_string();
		my $head_end = index ($http, "\x0A\x0A") + 2;
		my $head = substr ($http, 0, $head_end);
		my $post = substr ($http, $head_end);
		$head =~ s/\x0A/\x0D\x0A/g;
		$http = $head . $post;
		$http =~ s/http:\/\/$host//;
		my $time_start = time;
		
		#Отправка запроса прокси и прием результата
		my $lastaddr = SendToPProxy(	MIME::Base64::encode($host),
				MIME::Base64::encode($http),
				$conn
					);

		my $time_end = time;
		
		#Лог
		print &TranslateTimeHour($time_end), "   ", $host, " <- ", $lastaddr,
			" (", &TranslateTime($time_end - $time_start),
			")\n";

		close $conn;
		exit;
}

sub SendToPProxy
{
	my $dest_host = shift;
	my $query_content = shift;
	my $clientsock = shift;
	my (@destaddr, $desturl, $proxytransfer, $desthost);
	
	if ($pproxyfile)
		{
		
		my @pproxylist_shuffled = @pproxylist;
		shuffle(\@pproxylist_shuffled);
		chomp(@pproxylist_shuffled);
		my $desthost = shift(@pproxylist_shuffled);
		my @destaddr = split("//", $desthost);
		my @destaddrhost = (@destaddr[0] != "http:") ? split("/", @destaddr[0]) : split("/", @destaddr[1]);
		$destaddr = shift(@destaddrhost);
		$proxytransfer = MIME::Base64::encode(join("::", @pproxylist_shuffled));
		$desturl = $desthost;
		}
		
	my $proxysock = IO::Socket::INET->new(Proto=>'tcp',PeerAddr=>$destaddr,PeerPort=>$destport);

	unless($proxysock)
		{
		syswrite($clientsock, $errmsg2, length($errmsg2));
		return; 
		}
	
	my $post_query;
	#print "[!] <= $destaddr\n";
	$post_query = 'secret=' . $secret . '&' if defined($secret);
	$post_query .= 'transfer=' . $proxytransfer . '&' if defined($pproxyfile);
	$post_query .= 'host=' . $dest_host . '&query=' . $query_content;
	
	my $postlen = length($post_query);

	my $request = "POST $desturl HTTP/1.0\x0D\x0A".
			"Host: $pproxyhost:$pproxyport\x0D\x0A".
			"Accept: */*\x0D\x0A".
			"Content-Type: application/x-www-form-urlencoded\x0D\x0A".
			"Content-Length: $postlen\x0D\x0A".
			"User-Agent: $user_agent\x0D\x0A".
			"Connection: close\x0D\x0A\x0D\x0A" . $post_query;
	
	syswrite($proxysock, $request, length($request));
	my ($result, $buffer, $response);
	my $contentstart = -1;
	my $count = 0;
	while(1)
	{
		$result = sysread($proxysock, $buffer, 1024);
		last if !defined($result) || !$result;

		if($contentstart == -1)
		{
			$response .= $buffer;
			last if length($response)>65535;
			$contentstart = index($response,"\x0D\x0A\x0D\x0A");
			next if $contentstart == -1;
			$buffer = substr($response, $contentstart+4);
		}
		$count += length($buffer);
		syswrite($clientsock, $buffer, length($buffer));
	}
	syswrite($clientsock, $errmsg1, length($errmsg1)) if $count == 0;
	close $proxysock;
	return $destaddr;
}

sub TranslateTime
{
	my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(shift);
	return sprintf "%02u:%02u", $min, $sec;
}

sub TranslateTimeHour
{
	my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(shift);
	return sprintf "%02u:%02u:%02u", $hour, $min, $sec;
}

sub shuffle
	{
    my $deck = shift;    # $deck — ссылка на массив
    my $i = @$deck;
    while (--$i) {
        my $j = int rand ($i+1);
        @$deck[$i,$j] = @$deck[$j,$i];
        }
	}

sub Usage
{
	print "Usage: $0 -px proxy_url [-bp bindport] [-tpx tunnel_proxy] [-pwd secret] [-pf proxy filelist]\n";
	print "Example: $0 -px http://site.com/proxy/proxy.php -bp 8080\n";
	print "         $0 -px http://site.com/proxy/proxy.php -pwd pproxypass\n";
	print "         $0 -px http://site.com/proxy/proxy.php -tpx http://localhost:8118\n";
	print "         $0 -pf proxies.txt -bp 8080 -pwd pproxypass\n";
	print "\nDefault bind port - 8008\n";
	exit;
}
Либо с рандомной ротацией:
Код:
use HTTP::Daemon;
use MIME::Base64 ();
use Getopt::Long;
use POSIX ":sys_wait_h";
use strict;

my $user_agent = 'Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4';

my $errheader = "HTTP/1.1 200 OK\x0D\x0AContent-Type: text/plain\x0D\x0A\x0D\x0A";
my $errmsg1 = $errheader . 'Could not connect to server';
my $errmsg2 = $errheader . 'Could not connect to pproxy';

my ($pproxyhost, $pproxyport, $pproxyurl);
my ($tunnelhost, $tunnelport);
my ($pproxy, $pproxyfile, @pproxylist, $bindport, $tunnel, $secret);
my ($destaddr, $destport, $desturl);

#Вывод справки
Usage() if @ARGV==0;

#Задание опций
GetOptions(
         "px=s"		=> \$pproxy,
         "bp=s" 	=> \$bindport,
         "tpx=s"	=> \$tunnel,
         "pwd=s"	=> \$secret,
		 "pf=s"		=> \$pproxyfile
     );
die "need pproxy.php url or pproxy.php url filelist" unless $pproxy || $pproxyfile;


#Получение параметров
$pproxyfile =~ /(.+)/;

if ($pproxyfile) 
	{
	open(file, "proxies.txt");
	@pproxylist = <file>;
	} else {
	$pproxy =~ /http:\/\/([\w\.\-]+)(:\d*)?\/(.+)/;
	$pproxyhost = $1; $pproxyport = substr($2, 1); $pproxyurl = '/' . $3;
	}

defined($pproxyport) || ($pproxyport = 80);
defined($bindport) || ($bindport = 8008);

if(defined($tunnel))
{
	$tunnel =~ /http:\/\/([\w\.\-]+):(\d*)?/;
	$tunnelhost = $1; $tunnelport = $2;

	$destaddr = $tunnelhost;
	$destport = $tunnelport;
	$desturl = $pproxy;

	print "# tunnelhost = $tunnelhost\n";
	print "# tunnelport = $tunnelport\n";
}else{
	if (!$pproxyfile)
		{
		$destaddr = $pproxyhost;
		$desturl = $pproxyurl;
		}
		$destport = $pproxyport;
}

if (!$pproxyfile)
	{
	print "# pproxyhost = $pproxyhost\n";
	print "# pproxyport = $pproxyport\n";
	print "# pproxyurl = $pproxyurl\n";
	} else {
	print "# pproxyfile = $pproxyfile\n";
	}
	
print "# bindport = $bindport\n\n";

$|=1;
my %children;
my $slave;

#Прием подключений
my $master = HTTP::Daemon->new(	LocalPort => $bindport,
				LocalAddr => 'localhost', 
				Reuse=>1)
|| die "Can't start server ($@)";
&MainProc($slave) while $slave = $master->accept;

sub MainProc
{
		my $conn = shift;

		#Прием HTTP-запроса
		my $request = $conn->get_request();
		
		#Ответвление процесса(потока)
		my $pid = fork();
		unless(defined($pid))
		{
			print "# Erorr couldn't fork\n";
			close $conn;
			return;
		}

		if($pid)
		{
			close $conn;
			$children{$pid}++;
			foreach(keys %children )
			{
				my $kid = waitpid($_, &WNOHANG);
				delete $children{$_} if($kid == -1 || $kid == $_);
			}
			return;
		}

		#Преобразование HTTP заголовка
		$request -> remove_header('Proxy-Connection');
		$request -> remove_header('Keep-Alive');
		$request -> header(Connection=>'close');
		my $host = $request -> header('Host');
		my $http = $request -> as_string();
		my $head_end = index ($http, "\x0A\x0A") + 2;
		my $head = substr ($http, 0, $head_end);
		my $post = substr ($http, $head_end);
		$head =~ s/\x0A/\x0D\x0A/g;
		$http = $head . $post;
		$http =~ s/http:\/\/$host//;
		my $time_start = time;
		
		#Отправка запроса прокси и прием результата
		my $lastaddr = SendToPProxy(	MIME::Base64::encode($host),
				MIME::Base64::encode($http),
				$conn
					);

		my $time_end = time;
		
		#Лог
		print &TranslateTimeHour($time_end), "   ", $host, " <- ", $lastaddr,
			" (", &TranslateTime($time_end - $time_start),
			")\n";

		close $conn;
		exit;
}

sub SendToPProxy
{
	my $dest_host = shift;
	my $query_content = shift;
	my $clientsock = shift;
	my (@destaddr, $desturl, $proxytransfer, $desthost);
	
	if ($pproxyfile)
		{
		
		my @pproxylist_shuffled = @pproxylist;
		shuffle(\@pproxylist_shuffled);
		chomp(@pproxylist_shuffled);
		my $desthost = shift(@pproxylist_shuffled);
		my @destaddr = split("//", $desthost);
		my @destaddrhost = (@destaddr[0] != "http:") ? split("/", @destaddr[0]) : split("/", @destaddr[1]);
		$destaddr = shift(@destaddrhost);
		$proxytransfer = MIME::Base64::encode(join("::", @pproxylist_shuffled));
		$desturl = $desthost;
		}
		
	my $proxysock = IO::Socket::INET->new(Proto=>'tcp',PeerAddr=>$destaddr,PeerPort=>$destport);

	unless($proxysock)
		{
		syswrite($clientsock, $errmsg2, length($errmsg2));
		return; 
		}
	
	my $post_query;
	#print "[!] <= $destaddr\n";
	$post_query = 'secret=' . $secret . '&' if defined($secret);
	#$post_query .= 'transfer=' . $proxytransfer . '&' if defined($pproxyfile);
	$post_query .= 'host=' . $dest_host . '&query=' . $query_content;
	
	my $postlen = length($post_query);

	my $request = "POST $desturl HTTP/1.0\x0D\x0A".
			"Host: $pproxyhost:$pproxyport\x0D\x0A".
			"Accept: */*\x0D\x0A".
			"Content-Type: application/x-www-form-urlencoded\x0D\x0A".
			"Content-Length: $postlen\x0D\x0A".
			"User-Agent: $user_agent\x0D\x0A".
			"Connection: close\x0D\x0A\x0D\x0A" . $post_query;
	
	syswrite($proxysock, $request, length($request));
	my ($result, $buffer, $response);
	my $contentstart = -1;
	my $count = 0;
	while(1)
	{
		$result = sysread($proxysock, $buffer, 1024);
		last if !defined($result) || !$result;

		if($contentstart == -1)
		{
			$response .= $buffer;
			last if length($response)>65535;
			$contentstart = index($response,"\x0D\x0A\x0D\x0A");
			next if $contentstart == -1;
			$buffer = substr($response, $contentstart+4);
		}
		$count += length($buffer);
		syswrite($clientsock, $buffer, length($buffer));
	}
	syswrite($clientsock, $errmsg1, length($errmsg1)) if $count == 0;
	close $proxysock;
	return $destaddr;
}

sub TranslateTime
{
	my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(shift);
	return sprintf "%02u:%02u", $min, $sec;
}

sub TranslateTimeHour
{
	my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(shift);
	return sprintf "%02u:%02u:%02u", $hour, $min, $sec;
}

sub shuffle
	{
    my $deck = shift;    # $deck — ссылка на массив
    my $i = @$deck;
    while (--$i) {
        my $j = int rand ($i+1);
        @$deck[$i,$j] = @$deck[$j,$i];
        }
	}

sub Usage
{
	print "Usage: $0 -px proxy_url [-bp bindport] [-tpx tunnel_proxy] [-pwd secret] [-pf proxy filelist]\n";
	print "Example: $0 -px http://site.com/proxy/proxy.php -bp 8080\n";
	print "         $0 -px http://site.com/proxy/proxy.php -pwd pproxypass\n";
	print "         $0 -px http://site.com/proxy/proxy.php -tpx http://localhost:8118\n";
	print "         $0 -pf proxies.txt -bp 8080 -pwd pproxypass\n";
	print "\nDefault bind port - 8008\n";
	exit;
}
 
Ответить с цитированием
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Books PHP FRAGNATIC PHP, PERL, MySQL, JavaScript 186 21.02.2010 02:41
Proxy FAQ foreva Чужие Статьи 12 04.01.2008 12:15
Что такое Php? PAPA212 Болталка 13 28.12.2007 20:44
Безопасность в Php, Часть Iii k00p3r Чужие Статьи 0 11.07.2005 19:02
Защищаем Php. Шаг за шагом. k00p3r Чужие Статьи 0 13.06.2005 11:31



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ