| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 | #!/usr/bin/perl -wrequire 5.005;use strict;use IO::Socket;use Getopt::Std;# Checks routers for open socks-ports and socks5# Successful connects go to STDOUT, failed ones to STDERR.# We only do one check per loop in -d mode, so it takes some time.# Contributed by Peter Kornherr <peter at wuschelpuschel dot org>, and# cleaned up by Peter Palfrader <peter at palfrader dot org>.our($opt_i,$opt_p,$opt_d,$opt_h,$opt_l);getopts('i:p:dhl:');if ($opt_h || !($opt_d||$opt_i||$opt_l)) {    print "Usage: $0 -d < file_with_routers_in_it\n";    print "or:    $0 -i IP -p Port\n";    print "or:    $0 -l IP:Port\n";    exit;}if ($opt_d) {    open (IN,"<-") or die $!;    while (<IN>) {        next unless /^router /;        (my $routername,my $checkip,my $checkport) = (split(" "))[1,2,4];        &do_check($checkip,$checkport,$routername);    }} elsif ($opt_i && $opt_p) {    &do_check($opt_i,$opt_p);} elsif ($opt_l) {    &do_check(split(":",$opt_l));}sub do_check {    (my $checkip, my $checkport,my $routername) = @_;    # as socksports may not be published (therefore "0") here,    # let's try 9050, the default port:    if ($checkport == 0) { $checkport = 9050; }    # print "Checking $checkip:$checkport\n";    my $s5socket = IO::Socket::INET->new(PeerAddr => $checkip,        PeerPort => $checkport, Proto => "tcp", Type => SOCK_STREAM,        Timeout => "20");    if ($s5socket) {        my @got;        print $s5socket pack("CCC",'5','1','0');        eval {            local $SIG{ALRM} = sub { die "alarm\n" };            alarm 10;            read ($s5socket,$got[0],1);            read ($s5socket,$got[1],1);            alarm 0;        };        if ($@) {            return; # die unless $@ eq "alarm\n";        }        if ($got[0] eq pack('C','5')) {            if(defined($routername)) {                print "Found SOCKS5 at $routername ($checkip:$checkport)\n";            } else {                print "Found SOCKS5 at $checkip:$checkport\n";            }        } else {            if(defined($routername)) {                print "$routername ($checkip:$checkport) answers - " .                      "but not SOCKS5.\n";            } else {                print "$checkip:$checkport answers - but not SOCKS5.\n";            }        }    } else {        if(defined($routername)) {            print STDERR "Can't connect to $routername " .                         "($checkip:$checkport) ($!)\n";        } else {            print STDERR "Can't connect to $checkip:$checkport ($!)\n";        }    }}
 |