#!/usr/bin/perl
#
# pasv_ports.pl
#
# Determine if an FTP server uses sequential
# ports in response to the PASV command
#
# Copyright 2002, Bri Hatch
# Released under the GPL.  See COPYING file
# for more information.

use FileHandle;
$|=1;

$hostname = shift @ARGV;

$username=shift @ARGV || 'anonymous' if @ARGV;
$password=shift @ARGV || 'mozilla@'  if @ARGV;
        
die "Usage: $0 ftpserver [username [password] ]" if @ARGV or !$hostname;

defined ($pid = open NETCAT, "-|" ) || die "open";

if ( $pid ) {           # parent
    NETCAT->autoflush(1);
    for ( <NETCAT> ) {
        push @ports, $1*256+$2 if /\( \d+,\d+,\d+,\d+, (\d+),(\d+) \)/x;
        #                               IP ADDRESS         PORT
    }
} else {
    open NC, "|nc $hostname 21" or die "Can't fork netcat";
    NC->autoflush(1);

    print NC "USER $username\nPASS $password\n";
    for ( 1..10 ) { sleep 1; print NC "PASV\n"; }
    print NC "QUIT\n";

    close NC;
    exit 0;
}

print "The passive ports opened were:\n@ports\n";

