ftpcheck.pl
上传用户:yyd5256081
上传日期:2007-01-05
资源大小:2k
文件大小:3k
源码类别:

扫描程序

开发平台:

Unix_Linux

  1. #!/usr/bin/perl
  2. #
  3. # http://www.cotse.com  Fear the swimming Elephant!
  4. #
  5. ########################################################
  6. # ftpcheck v0.31                      [November 2, 1998] 
  7. #          http://david.weekly.org/code
  8. #
  9. # by David Weekly <dew@cs.stanford.edu>
  10. #
  11. # Thanks to Shane Kerr for cleaning up the process code!
  12. #
  13. # This code is under the GPL. Use it freely. Enjoy.
  14. #        Debug. Enhance. Email me the patches!
  15. ########################################################
  16. use Socket;
  17. use Net::FTP;
  18. # timeouts in seconds for creating a socket and connecting
  19. my $MAX_SOCKET_TIME = 2;
  20. my $MAX_CONNECT_TIME = 3;
  21. my $HELP=qq{Usage: ftpcheck [-h | --help] [-p processes] [-d | --debug] host};
  22. my @hosts;
  23. # how many simultaneous processes are we allowed to use?
  24. my $MAX_PROCESSES=10;
  25. my $DEBUG=0;
  26. while($_=shift){
  27.     if(/^--(.*)/){
  28. $_=$1;
  29. if(/help/){
  30.     print $HELP;
  31.     exit(0);
  32. }
  33. if(/debug/){
  34.     $DEBUG=1;
  35. }
  36.     }    
  37.     elsif(/^-(.*)/){
  38. $_=$1;
  39. if(/^h/ or /^?/){     
  40.     print $HELP;
  41.     exit(0);
  42. }
  43. if(/^p/){
  44.     $MAX_PROCESSES=shift;
  45. }
  46. if(/^d/){
  47.     $DEBUG=1;
  48. }
  49.     }else{
  50. push @hosts,$_;
  51.     }
  52. }
  53. if(!$hosts[0]){
  54.     print $HELP;
  55.     exit(-1);
  56. }
  57. my $host;
  58. $|=1;
  59. print "ftpcheck v0.31 by dave weekly <dew@cs.stanford.edu>nn";
  60. # go through all of the hosts, replacing subnets with all contained IPs.
  61. for $host (@hosts){
  62.     $_=shift(@hosts);
  63.     # scan a class C
  64.     if(/^([^.]+).([^.]+).([^.]+)$/){
  65. my $i;
  66. print "Expanding class C $_n" if($DEBUG);
  67. for($i=1;$i<255;$i++){
  68.     my $thost="$_.$i";
  69.     push @hosts,$thost;
  70. }
  71.     }
  72.     else{
  73. push @hosts,$_;
  74.     }
  75. }
  76. my @pids;
  77. my $npids=0;
  78. for $host (@hosts){
  79.     my $pid;
  80.     $pid=fork();
  81.     if($pid>0){
  82. $npids++;
  83. if($npids>=$MAX_PROCESSES){
  84.     for(1..($MAX_PROCESSES)){
  85. $wait_ret=wait();
  86. if($wait_ret>0){
  87.     $npids--;
  88. }
  89.     }
  90. }
  91. next;
  92.     }elsif(undef $pid){
  93. print "fork errorn" if ($DEBUG);
  94. exit(0);
  95.     }else{
  96. my($proto,$port,$sin,$ip);
  97. print "Trying $hostn" if ($DEBUG);
  98. $0="(checking $host)";
  99. # kill thread on timeout
  100. local $SIG{'ALRM'} = sub { exit(0); };
  101. alarm $MAX_SOCKET_TIME;
  102. $proto=getprotobyname('tcp');
  103. $port=21;
  104. $ip=inet_aton($host);
  105. if(!$ip){
  106.     print "couldn't find host $hostn" if($DEBUG);
  107.     exit(0);
  108. }
  109. $sin=sockaddr_in($port,$ip);
  110. socket(Sock, PF_INET, SOCK_STREAM, $proto);
  111. alarm $MAX_CONNECT_TIME;
  112. if(!connect(Sock,$sin)){
  113.     exit(0);
  114. }
  115. my $iaddr=(unpack_sockaddr_in(getpeername(Sock)))[1];
  116. close(Sock);       
  117. # SOMETHING is listening on the FTP port...really ftp server?
  118. print "listen $host!n" if($DEBUG);
  119. alarm 0;
  120. $hostname=gethostbyaddr($iaddr,AF_INET);
  121. # create new FTP connection w/5 second timeout
  122. $ftp = Net::FTP->new($host, Timeout =>  5);
  123. if(!$ftp){
  124.     print "      <$host ($hostname) denied you>n" if($DEBUG);
  125.     exit(0);
  126. }
  127. if(!$ftp->login("anonymous","just@checking.com")){
  128.     print "   FTP on $host [$hostname]n";
  129.     exit(0);
  130. }
  131. print "Anon FTP on $host [$hostname]n";
  132. $ftp->quit;
  133. exit(0);
  134.     }
  135. }
  136. print "done spawning, $npids children remainn" if($DEBUG);
  137. # wait for my children
  138. for(1..$npids){
  139.     my $wt=wait();
  140.     if($wt==-1){
  141. print "hey $!n" if($DEBUG);
  142. redo;
  143.     }
  144. }
  145. print "Donen";