./c0de/ruby/portscan.txt

0.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
 #!/usr/bin/ruby -w
 
=begin
quite simple connect scanner in ruby
 
Shows open (reliable), close and filtered. But the reliablity
of the last two states depends of course on firewalling and the timeout
interval you can set down. Uncomment or comment states you want or don't
want to get printed on the screen.
 
*supports scanning mutiple hosts/IPs (like www.heise.de,www.gulli.com)
*supports multiple ports(like 12,45,53,165),ranges(like 20..85) or one single
port(like 80)
*support a ports file like http://insecure.org/nmap/data/nmap-services (just
clean it with | grep /tcp ..)
 
ZGlnaXRhbGJ5dGU=
=end
 
require 'socket'
require 'timeout'
 
  class Scanner
 
     def initialize
        @hosts,@ports = Array($*)
     end
 
     def portarrange
        case @ports
          when /^.+[..]/
             @ports = @ports.split("..")
             @ports = @ports[0].to_i..@ports[1].to_i
          when /^.+[,]/
             @ports = @ports.split(",")
          else
             @ports = Array(@ports)
          end
     end
 
     def hostarrange
        case @hosts
          when /^.+[,]/
             @hosts = @hosts.split(",")
          else
             @hosts = Array(@hosts)
          end
     end
 
    def output(state,port)
       printed = false
       portsfile = File.new("ports", "r")
       scanpat = "^.+ #{port}/tcp"
       begin
         portsfile.each_line do |line|
           if line =~ Regexp.new(scanpat)
             puts "#{state}    : #{line}"
             printed = true
           end
          end
          puts "#{state}    : #{port}" if printed == false
       ensure
       portsfile.close
       end
    end
 
    def scanning(hosts,ports)
      hosts.each do |host|
        begin
          puts "scanning #{host}:"
          ports.each do |port|
            begin
              Timeout::timeout(10){TCPSocket.new(host, port)}
            rescue Timeout::Error
              output("filtered",port)
            rescue
             # output("closed",port)
            else
              output("open",port)
            end
          end
        end
      end
    end
end
 
#####################  code  start  #####################
 
puts "no arguments past,correct usage:\nruby #{$0} [hosts] [ports]\n" if
!ARGV[1]
 
my_scanner = Scanner.new
 
hosts = my_scanner.hostarrange
ports = my_scanner.portarrange
 
my_scanner.scanning(hosts,ports)
 
#####################      eof      ##################### 

Back