|
@@ -7,6 +7,8 @@ from multiprocessing.pool import ThreadPool
|
|
|
from multiprocessing import Lock
|
|
|
from threading import Thread
|
|
|
|
|
|
+from pprint import pprint
|
|
|
+
|
|
|
class MassTraceroute:
|
|
|
def __init__(self, socket_timeout, listener_timeout, threads, targets, maxhops):
|
|
|
logging.info("Setting up class")
|
|
@@ -18,10 +20,12 @@ class MassTraceroute:
|
|
|
self.threads = threads
|
|
|
self.pool = ThreadPool(processes=self.threads)
|
|
|
self.routes = dict()
|
|
|
+ for target in self.targets:
|
|
|
+ self.routes[target] = dict()
|
|
|
logging.info("Creating listener socket")
|
|
|
self.listener = self.init_listener()
|
|
|
self.sources = dict()
|
|
|
- self.last_send = 0
|
|
|
+ self.last_send = time()
|
|
|
|
|
|
def main(self):
|
|
|
logging.info("Starting listener thread")
|
|
@@ -40,23 +44,24 @@ class MassTraceroute:
|
|
|
return listener
|
|
|
|
|
|
def process_listener(self):
|
|
|
- while((self.last_send + self.listener_timeout) < time()):
|
|
|
+ while((self.last_send + self.listener_timeout) > time()):
|
|
|
logging.debug("Listening...")
|
|
|
try:
|
|
|
data, addr = self.listener.recvfrom(1024)
|
|
|
except socket.error as e:
|
|
|
+ logging.debug(e)
|
|
|
pass
|
|
|
- logging.debug("Got data from ip = {}".format(addr))
|
|
|
- logging.debug(data)
|
|
|
- logging.debug(data[48:49])
|
|
|
- srcport = int.from_bytes(data[48:49], byteorder="big")
|
|
|
- dstport = int.from_bytes(data[50:51], byteorder="big")
|
|
|
+ srcport = int.from_bytes(data[48:50], byteorder="big")
|
|
|
+ dstport = int.from_bytes(data[50:52], byteorder="big")
|
|
|
+ logging.info("Got data from ip = {}, srcport = {}, dstport = {}, original target = {}, hop = {}".format(addr[0], srcport, dstport, self.sources[srcport]["ip"], self.sources[srcport][dstport]))
|
|
|
if srcport in self.sources and dstport in self.sources[srcport]:
|
|
|
hop = self.sources[srcport][dstport]
|
|
|
ip = self.sources[srcport]["ip"]
|
|
|
- self.routes[ip][hop] = addr
|
|
|
+ self.routes[ip][hop] = addr[0]
|
|
|
+ logging.info(self.routes[ip][hop])
|
|
|
else:
|
|
|
logging.error("Received package with srcport or dstport non existsant?")
|
|
|
+ pprint(self.routes)
|
|
|
|
|
|
def process_sender(self):
|
|
|
logging.info("Starting process_sender")
|
|
@@ -77,22 +82,25 @@ class MassTraceroute:
|
|
|
def send(self, dstip):
|
|
|
logging.info("Entering send()")
|
|
|
sender = self.init_sender()
|
|
|
- srcport = getrandbits(16)
|
|
|
- while(srcport not in self.sources):
|
|
|
- self.sources[srcport] = dict()
|
|
|
- self.sources[srcport]["ip"] = dstip
|
|
|
+ while(True):
|
|
|
srcport = getrandbits(16)
|
|
|
+ if srcport not in self.sources:
|
|
|
+ self.sources[srcport] = dict()
|
|
|
+ self.sources[srcport]["ip"] = dstip
|
|
|
+ break
|
|
|
|
|
|
logging.info("Binding sending socket")
|
|
|
sender.bind(('', srcport))
|
|
|
|
|
|
for ttl in range(1, self.maxhops):
|
|
|
-
|
|
|
sender.setsockopt(socket.SOL_IP, socket.IP_TTL, ttl)
|
|
|
dstport = getrandbits(16)
|
|
|
- while(dstport not in self.sources[srcport]):
|
|
|
- self.sources[srcport][dstport] = ttl
|
|
|
+ while(True):
|
|
|
dstport = getrandbits(16)
|
|
|
+ if dstport not in self.sources[srcport]:
|
|
|
+ self.sources[srcport][dstport] = ttl
|
|
|
+ logging.debug("Saved ttl = {}, original ttl = {}, target = {}".format(self.sources[srcport][dstport], ttl, dstip))
|
|
|
+ break
|
|
|
logging.debug("Sending packet srcport = {}, dstport = {}, ttl = {}, dstip = {}".format(srcport, dstport, ttl, dstip))
|
|
|
sender.sendto(b'', (dstip, dstport))
|
|
|
self.last_send = time()
|