Code:
#!/usr/bin/ruby
#file: portscan.rb
require 'open-uri'
require 'socket'
require 'rexml/document'
include REXML
class PortScanner
def initialize(host, xmlfileout='portscan_result.xml')
high = 8192
service_url = "http://rorbuilder.info/r/service_ports.xml"
doc_result = main(service_url, host, high)
File.new(xmlfileout,'w').puts(doc_result)
end
def main(url, host, high)
buffer = open(url, "UserAgent" => "Ruby-PortScanner1.0")
doc = Document.new(buffer)
doc.root.elements.each('records/port') do |node|
new_node = Element.new('open')
new_node.text = 'n'
node.add_element new_node
end
for port in 1 .. high
begin
s = TCPsocket.open(host, port)
puts 'port ' + port.to_s
node_port = doc.root.elements["records/port[number='#{port.to_s}']"]
unless node_port.nil?
port_name = node_port.elements['name'].text.to_s
node_port.elements['open'].text = 'y'
else
port_name = 'unknown'
add_port(:doc => doc , :port => port , :name => port_name, :description => '')
end
printf "%s/%sopen\t%s\n", port, 'tcp'.ljust(11 - port.to_s.length), port_name
s.close
rescue Errno::ECONNREFUSED
next
end
end
return doc
end
def add_port(h)
node_port = Element.new('port')
add_child(node_port, 'number', h[:port])
add_child(node_port, 'name', h[:name])
add_child(node_port, 'description', h[:description])
h[:doc].root.elements['records'].add_element node_port
end
def add_child(node,nodename, value)
newnode = Element.new(nodename)
newnode.text = value
node.add_element(newnode)
end
end
if __FILE__ == $0 then
ps = PortScanner.new('192.168.1.106')
end
Screen Output:
22/tcp open ssh
80/tcp open www
443/tcp open https
513/tcp open login
514/tcp open shell
4369/tcp open unknown
5222/tcp open xmpp-client
5269/tcp open xmpp-server
5280/tcp open unknown
8000/tcp open unknown
8001/tcp open unknown
xml output:
<ports>
<summary/>
<records>
<port>
<number>1</number>
<name>tcpmux</name>
<description>TCP port service multiplexer</description>
<open>n</open></port>
<port>
<number>7</number>
<name>echo</name>
<description/>
<open>n</open></port>
<port>
<number>7</number>
<name>echo</name>
<description/>
<open>n</open></port>
...
<port>
<number>5222</number>
<name>xmpp-client</name>
<description>Jabber Client Connection</description>
<open>y</open></port>
<port>
<number>5222</number>
<name>xmpp-client</name>
<description/>
<open>n</open></port>
<port>
<number>5269</number>
<name>xmpp-server</name>
<description>Jabber Server Connection</description>
<open>y</open></port>
<port>
<number>5269</number>
<name>xmpp-server</name>
<description/>
<open>n</open></port>
...
<port>
<number>60179</number>
<name>fido</name>
<description>fidonet EMSI over TCP</description>
<open>n</open></port>
<port><number>4369</number><name>unknown</name><description></description></po
rt><port><number>5280</number><name>unknown</name><description></description></p
ort><port><number>8000</number><name>unknown</name><description></description></
port><port><number>8001</number><name>unknown</name><description></description><
/port></records>
bytes!Font: http://snippets.dzone.com/posts/show/6242