1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- #!/usr/bin/perl -w
- require 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";
- }
- }
- }
|