#!/usr/bin/perl
#
# Usage :
#
#  sockscan.pl <SOCKS-PROXY> <SOCKSPORT> <TARGET> <STARTPORT> <ENDPORT>
#
#
# written by SnakeByte [ SnakeByte@kryptocrew.de ]
# www.kryptocrew.de/snakebyte/
#

use Net::SOCKS;

if ( @ARGV < 5 ) {
    print "\nThis tool performs a portscan on a host,\n";
    print "over a socks proxy to hide your IP\n";
    print "and to make it possible, to see ports, which\n";
    print "are blocked to certain IP Ranges\n";
    print "written by SnakeByte [Snakebyte\@kryptocrew.de]\n\n";
    print "Usage : \n";
    print
      "sockscan <SOCKS-PROXY> <SOCKSPORT> <TARGET> <STARTPORT> <ENDPORT>\n\n";
    exit;
}

print "sockscan by SnakeByte [ SnakeByte\@kryptocrew.de ]\n";

$proxy     = @ARGV[0];
$proxyport = @ARGV[1];
$target    = @ARGV[2];
$startport = @ARGV[3];
$endport   = @ARGV[4];

print "scanning $target ...\n";

my $sock = new Net::SOCKS(
    socks_addr => $proxy,
    socks_port => $proxyport,
    # user_id => $ID,
    # user_password => $pass,
    protocol_version => 4
);

for ( $i = $startport ; $i <= $endport ; $i++ ) {
    $f = $sock->connect( peer_addr => $target, peer_port => $i );

    if ( $sock->param('status_num') == SOCKS_OKAY ) {
        print "--- Port $i open ! --- \n";
        # here we could easily retrieve a banner
    }
    $sock->close();
}

print "\nScan finished..\n";