1. Определяет тип прокси (SOCKS4/SOCKS5)
2. Пытается проломится на него в гугл, принтит, если прокси валидный( читайте публичный), при остальных "ошибках"(таких как запрос авторизации, идента, GSSAPI авторизация итд) не принтит прокси.
Юзать: ./socks.pl list.txt , где list.txt - файл с соксамив формате ип:порт
Код:
#!perl
# Simple SOCKS(4/5) sorter and checker
# Author: biophreak (s-teals.org)
# Todo: print results to text files, use threads
use warnings;
use strict;
use Socket;
use IO::Handle;
my $DEBUG = 0;
my $sockslist = shift || die '[ERROR] Specify sockslist!';
(open S, $sockslist and my @socks = <S> and close S)
or die "Cannot open file $sockslist: $!\n";
my %SOCKS4_CONNECT_RESPONSES = (
90 => "request granted",
91 => "request rejected or failed",
92 => "request rejected, ident required",
93 => "request rejected, ident mismatch",
);
my %SOCKS5_METHODS = (
0 => "no authentication required",
1 => "GSSAPI",
2 => "username/password",
255 => "no acceptable methods",
);
my %SOCKS5_CONNECT_RESPONSES = (
0 => "succeeded",
1 => "general SOCKS server failure",
2 => "connection not allowed by ruleset",
3 => "Network unreachable",
4 => "Host unreachable",
5 => "Connection refused",
6 => "TTL expired",
7 => "Command not supported",
8 => "Address type not supported",
);
my $answer;
for (my $i=0; $i < scalar @socks; $i++)
{
my ($server, $port) = split(/:/, $socks[$i]);
chomp($server, $port);
socket(SOCK, AF_INET, SOCK_STREAM, getprotobyname('tcp'))
or (print "Cannot open socket: $!\n" and exit);
connect(SOCK, sockaddr_in($port, inet_aton($server)))
or (print "Cannot connect to $server $port: $!\n" and exit);
SOCK->autoflush(1);
print SOCK pack("CCC",5,1,0);
sysread(SOCK,$answer,1)
or die "Cannot read from socket: $!\n";
close SOCK;
if ($answer eq pack('C',0))
{
print "$server:$port is SOCKS4/SOCKS4a proxy.\nChecking...\n"if $DEBUG == 1;
checkSocks4($server,$port);
} elsif ($answer eq pack('C',5))
{
print "$server:$port is SOCKS5 proxy.\nChecking...\n"if $DEBUG == 1;
checkSocks5($server,$port);
} else {
print "$server:$port is not SOCKS4/SOCKS5 proxy\n";
}
}
sub checkSocks5
{
my($server,$port) = @_;
my($mssg, $repcode, $repmssg);
socket(SOCK, AF_INET, SOCK_STREAM, getprotobyname('tcp'))
or (print "Cannot open socket: $!\n" and return 0);
connect(SOCK, sockaddr_in($port, inet_aton($server)))
or (print "Cannot connect to $server $port: $!\n" and return 0);
SOCK->autoflush(1);
print SOCK pack("CCC", 5, 1, 0)
or (print "Cannot send to socket: $!\n" and return 0);;
sysread(SOCK,$mssg,2)
or (print "Cannot read from socket: $!\n" and return 0);
$repcode = (unpack("C*", $mssg))[1];
$repmssg = $SOCKS5_METHODS{$repcode}
|| "unknown or reserved reply code";
print "$server:$port reply code = $repcode ($repmssg)\n"
if $DEBUG == 1;
# print "[ERROR] $server:$port is alive,but isn't usable: $repcode ($repmssg)\n"
# if $repcode != 0;
(return 0 and close SOCK) unless($repcode == 0);
print SOCK pack("CCCCa4n", 5, 1, 0, 1, inet_aton('www.ya.ru'), 80)
or (warn "Cannot send to socket: $!\n" and return 0);;
sysread(SOCK,$mssg,10)
or (warn "Cannot read from socket: $!\n" and return 0);
$repcode = (unpack("C*", $mssg))[1];
$repmssg = $SOCKS5_CONNECT_RESPONSES{$repcode}
|| "unknown or reserved reply code";
print "$server:$port reply code = $repcode ($repmssg)\n"
if $DEBUG == 1;
# print "[ERROR] $server:$port is alive,but isn't usable: $repcode ($repmssg)\n"
# if $repcode != 0;
(return 0 and close SOCK) unless($repcode == 0);
print "$server:$port is good SOCKS5 proxy\n"; # Print to file...
close SOCK;
return 1;
}
sub checkSocks4
{
my($server,$port) = @_;
my($mssg, $repcode, $repmssg);
socket(SOCK, AF_INET, SOCK_STREAM, getprotobyname('tcp'))
or (print "Cannot open socket: $!\n" and return 0);
connect(SOCK, sockaddr_in($port, inet_aton($server)))
or (print "Cannot connect to $server $port: $!\n" and return 0);
SOCK->autoflush(1);
print SOCK pack("CCnA4x", 4, 1, 80, inet_aton('www.google.com'));
sysread(SOCK,$mssg,8)
or (print "Cannot read from socket: $!\n" and return 0);
$repcode = (unpack("C*", $mssg))[1];
$repmssg = $SOCKS4_CONNECT_RESPONSES{$repcode}
|| "unknown reply code";
print "$server:$port reply code = $repcode ($repmssg)\n"
if $DEBUG == 1;
# print "[ERROR] $server:$port is alive,but isn't usable: $repcode ($repmssg)\n"
# if $repcode != 90;
(return 0 and close SOCK) unless ($repcode == 90);
print "$server:$port is good SOCKS4/SOCKS4a proxy\n"; # Print to file...
close SOCK;
return 1;
}
|