1
2
3
4
5
6
7
8
9
10
11 import logging
12
13 from twisted.internet import defer
14 from twisted.internet import reactor
15 from twisted.internet.protocol import Protocol
16 from twisted.internet.protocol import ClientFactory
17 from twisted.internet.protocol import ReconnectingClientFactory
18 from twisted.internet.error import ConnectBindError
19
20 log = logging.getLogger("zen.Portscanner")
21
27
41
54
56 '''
57 '''
58 - def __init__(self, hosts, portRange=(1, 10000), portList=[],
59 queueCount=50, timeout=30):
60 if isinstance(hosts, list):
61 self.hosts = hosts
62 else:
63 self.hosts = [hosts]
64 self.portRange = (portRange[0], portRange[1] + 1)
65 self.portList = portList
66 self.queueCount = queueCount
67 self.timeout = timeout
68 self.data = {
69 'success': {},
70 'failure': {},
71 }
72
74 '''
75 The use of DeferredSemaphore() here allows us to control the
76 number of deferreds (and therefore connections) created at once,
77 thus providing a way for systems to use the script efficiently.
78 '''
79
80 dl = []
81 semaphore = defer.DeferredSemaphore(self.queueCount)
82 if self.portList:
83 ports = self.portList
84 else:
85 ports = range(*self.portRange)
86 for host in self.hosts:
87 for port in ports:
88 d = semaphore.run(self.doFactory, host, port)
89 dl.append(d)
90 dl = defer.DeferredList(dl, consumeErrors=True)
91 return dl
92
97
105
107 hostData = self.data['success'].setdefault(host, [])
108 log.debug('Connected to %s:%d' % (host, port))
109 hostData.append(port)
110
116
120
122 print "Open Ports:"
123 for host, ports in self.getSuccesses().items():
124 print "Host: %s" % host
125 for port in ports:
126 print "\topen port: %i" % port
127 errors = {}
128 for host, portAndError in self.getFailures().items():
129 for port, error in portAndError:
130 errors.setdefault(error, 0)
131 errors[error] += 1
132 print "\nErrors encountered, and their counts:"
133 for error, count in errors.items():
134 print "\t%s -- %i" % (error, count)
135
137 return self.data['success']
138
140 return self.data['failure']
141