diff --git a/scapy/all.py b/scapy/all.py index f9268d015003c6840dc349f293d415d7f5d64a13..3119a189ac3d78600795a8a8ef45e9ec6421e90d 100644 --- a/scapy/all.py +++ b/scapy/all.py @@ -18,6 +18,7 @@ from route import * from sendrecv import * from supersocket import * from volatile import * +from as_resolvers import * from ansmachine import * from automaton import * diff --git a/scapy/as_resolvers.py b/scapy/as_resolvers.py new file mode 100644 index 0000000000000000000000000000000000000000..05392c8d61e20ad5deca0325921b11e36a5f627e --- /dev/null +++ b/scapy/as_resolvers.py @@ -0,0 +1,103 @@ +from config import conf + +class AS_resolver: + server = None + options = "-k" + def __init__(self, server=None, port=43, options=None): + if server is not None: + self.server = server + self.port = port + if options is not None: + self.options = options + + def _start(self): + self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.s.connect((self.server,self.port)) + if self.options: + self.s.send(self.options+"\n") + self.s.recv(8192) + def _stop(self): + self.s.close() + + def _parse_whois(self, txt): + asn,desc = None,"" + for l in txt.splitlines(): + if not asn and l.startswith("origin:"): + asn = l[7:].strip() + if l.startswith("descr:"): + if desc: + desc += r"\n" + desc += l[6:].strip() + if asn is not None and desc: + break + return asn,desc.strip() + + def _resolve_one(self, ip): + self.s.send("%s\n" % ip) + x = "" + while not ("%" in x or "source" in x): + x += self.s.recv(8192) + asn, desc = self._parse_whois(x) + return ip,asn,desc + def resolve(self, *ips): + self._start() + ret = [] + for ip in ips: + ip,asn,desc = self._resolve_one(ip) + if asn is not None: + ret.append((ip,asn,desc)) + self._stop() + return ret + +class AS_resolver_riswhois(AS_resolver): + server = "riswhois.ripe.net" + options = "-k -M -1" + + +class AS_resolver_radb(AS_resolver): + server = "whois.ra.net" + options = "-k -M" + + +class AS_resolver_cymru(AS_resolver): + server = "whois.cymru.com" + options = None + def resolve(self, *ips): + ASNlist = [] + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.connect((self.server,self.port)) + s.send("begin\r\n"+"\r\n".join(ips)+"\r\nend\r\n") + r = "" + while 1: + l = s.recv(8192) + if l == "": + break + r += l + s.close() + for l in r.splitlines()[1:]: + if "|" not in l: + continue + asn,ip,desc = map(str.strip, l.split("|")) + if asn == "NA": + continue + asn = int(asn) + ASNlist.append((ip,asn,desc)) + return ASNlist + +class AS_resolver_multi(AS_resolver): + resolvers_list = ( AS_resolver_cymru(),AS_resolver_riswhois(),AS_resolver_radb() ) + def __init__(self, *reslist): + if reslist: + self.resolvers_list = reslist + def resolve(self, *ips): + todo = ips + ret = [] + for ASres in self.resolvers_list: + res = ASres.resolve(*todo) + resolved = [ ip for ip,asn,desc in res ] + todo = [ ip for ip in todo if ip not in resolved ] + ret += res + return ret + + +conf.AS_resolver = AS_resolver_multi() diff --git a/scapy/plist.py b/scapy/plist.py index 4298cb8c4cd8f71a326f376f86bc770782f93c8f..feda560ceca1615a193b65fe11606ea319e53d24 100644 --- a/scapy/plist.py +++ b/scapy/plist.py @@ -469,105 +469,6 @@ class ARPingResult(SndRcvList): print r.sprintf("%Ether.src% %ARP.psrc%") -class AS_resolver: - server = None - options = "-k" - def __init__(self, server=None, port=43, options=None): - if server is not None: - self.server = server - self.port = port - if options is not None: - self.options = options - - def _start(self): - self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.s.connect((self.server,self.port)) - if self.options: - self.s.send(self.options+"\n") - self.s.recv(8192) - def _stop(self): - self.s.close() - - def _parse_whois(self, txt): - asn,desc = None,"" - for l in txt.splitlines(): - if not asn and l.startswith("origin:"): - asn = l[7:].strip() - if l.startswith("descr:"): - if desc: - desc += r"\n" - desc += l[6:].strip() - if asn is not None and desc: - break - return asn,desc.strip() - - def _resolve_one(self, ip): - self.s.send("%s\n" % ip) - x = "" - while not ("%" in x or "source" in x): - x += self.s.recv(8192) - asn, desc = self._parse_whois(x) - return ip,asn,desc - def resolve(self, *ips): - self._start() - ret = [] - for ip in ips: - ip,asn,desc = self._resolve_one(ip) - if asn is not None: - ret.append((ip,asn,desc)) - self._stop() - return ret - -class AS_resolver_riswhois(AS_resolver): - server = "riswhois.ripe.net" - options = "-k -M -1" - - -class AS_resolver_radb(AS_resolver): - server = "whois.ra.net" - options = "-k -M" - - -class AS_resolver_cymru(AS_resolver): - server = "whois.cymru.com" - options = None - def resolve(self, *ips): - ASNlist = [] - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.connect((self.server,self.port)) - s.send("begin\r\n"+"\r\n".join(ips)+"\r\nend\r\n") - r = "" - while 1: - l = s.recv(8192) - if l == "": - break - r += l - s.close() - for l in r.splitlines()[1:]: - if "|" not in l: - continue - asn,ip,desc = map(str.strip, l.split("|")) - if asn == "NA": - continue - asn = int(asn) - ASNlist.append((ip,asn,desc)) - return ASNlist - -class AS_resolver_multi(AS_resolver): - resolvers_list = ( AS_resolver_cymru(),AS_resolver_riswhois(),AS_resolver_radb() ) - def __init__(self, *reslist): - if reslist: - self.resolvers_list = reslist - def resolve(self, *ips): - todo = ips - ret = [] - for ASres in self.resolvers_list: - res = ASres.resolve(*todo) - resolved = [ ip for ip,asn,desc in res ] - todo = [ ip for ip in todo if ip not in resolved ] - ret += res - return ret - class TracerouteResult(SndRcvList): @@ -927,5 +828,4 @@ class TracerouteResult(SndRcvList): return do_graph(self.graphdef, **kargs) -conf.AS_resolver = AS_resolver_multi()