This script was developed and tested on NT4.0 running ActiveState's ActivePerl build 506. With minor mods, and the addition of the shebang syntax, it should work on Un*x, as well. sweep.pl is a port scanner (I put a the ports in the '@ports' array...I kept the number small for testing purposes) that lists which ports are active, grabs banners/HTTP server/finger output (where available) and writes it all to a logfile at the same time as to STDOUT. Feel free to use or modify...just be sure to give credit where credit is due!! Keydet89 ##################################################### # sweep.pl # by Keydet89 # 12 Nov 1998 # # written and tested on NT 4.0 w/ ActivePerl build 506 # # usage 'perl sweep.pl [options] # [options] => hostname or IP # # sweep a host looking for open ports; # list of active ports are placed into an array, # and further information is gathered; # performs auto-logging ##################################################### # for www_svr use LWP::Simple; # for socket use IO::Socket; # for Win32-specific functions use Win32; if ($#ARGV < 0) { usage(); exit; } # Ports to check @ports = (21,23,25,79,80,139,12345); @active_ports; # Assign hostname/IP to variable $target = $ARGV[0]; print "Checking $target...\n"; ################################################# # main section ################################################# # open log file # all data written to screen and log # new scans of same system overwritten open (LOG,">$target.log"); $ip = name($target); foreach $port (@ports) { check_port($ip,$port); } # Now, collect banner from active ports print "\nNow checking active ports...\n"; print LOG "\nNow checking active ports...\n"; get_data($ip); ################################################# # Get name or IP, do lookup ################################################# sub name { my ($host) = @_; # print "\nUsing gethostbyaddr()...\n"; ($name,$alias,$addrtype,$length,$new_addr) = gethostbyaddr(inet_aton($host),AF_INET); print "Hostname:\t$name\n"; print LOG "Hostname:\t$name\n"; $ipaddr = inet_ntoa(scalar($new_addr)); print "IP:\t\t$ipaddr\n"; print LOG "IP:\t\t$ipaddr\n"; return $ipaddr; } ################################################# # Get name of WWW Server ################################################# sub www_svr { my ($host) = @_; ($content_type, $document_length, $modified_time,$expires, $server) = head("http://$host"); print "HTTP Server:\t$server\n"; print LOG "HTTP Server:\t$server\n"; } ################################################# # Check to see if a port is open ################################################# sub check_port { my ($host,$port) = @_; $remote = IO::Socket::INET -> new ( Proto => "tcp", PeerAddr => $host, PeerPort => $port ) ; if ($remote) { close $remote; print "$host:$port=>\tActive\n"; print LOG "$host:$port=>\tActive\n"; push @active_ports, $port; } else { print "$host:$port=>\tInactive\n"; print LOG "$host:$port=>\tInactive\n"; } } ################################################# # subroutine to collect data from active ports ################################################# sub get_data { my ($host) = @_; foreach $port (@active_ports) { if ($port == 80) {www_svr($host);} if ($port == 21) {get_banner($host,$port);} if ($port == 25) {get_banner($host,$port);} if ($port == 79) {finger($host);} if ($port == 110) {get_banner($host,$port);} if (($port == 139) && Win32::IsWinNT()) {nbt($host);} } } ################################################# # Get banner (single line) from port ################################################# sub get_banner { my ($host,$port) = @_; $remote = IO::Socket::INET -> new ( Proto => "tcp", PeerAddr => $host, PeerPort => $port ) or die "Could not open socket.\n"; $line = <$remote>; print "$line\n"; print LOG "$line\n"; close $remote; } ################################################# # Send data to a port, read back all data # (finger) ################################################# sub finger { my ($host) = @_; print "Finger $host...\n"; print LOG "Finger $host...\n"; $remote = IO::Socket::INET -> new ( Proto => "tcp", PeerAddr => $host, PeerPort => 79 ); print $remote "\n"; @lines = <$remote>; close $remote; foreach $line (@lines) { print "$line"; print LOG "$line"; } print "\n"; print LOG "\n"; } ################################################# # Run nbtstat on the target ################################################# sub nbt { print "\nRunning nbtstat...\n"; my ($host) = @_; open(NBT,"nbtstat -A $host |"); while() { print ; print LOG ; } } ################################################# # Print out usage ################################################# sub usage { print "usage: perl sweep.pl [options]\n\n"; print "\t[options]\tHostname or IP address of target\n"; }