Advertisement
The_Defalt

arp_network_enumerator.py

May 25th, 2016
283
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.62 KB | None | 0 0
  1. #! /usr/bin/python
  2.  
  3. #Hello fellow hackers! My name is Defalt.
  4. #This is a re-write of an older tool that I made
  5. #You can see the old version here: http://pastebin.com/EyF6xGkw
  6. #Happy Hacking! -Defalt
  7.  
  8. import sys
  9. from datetime import datetime
  10. try:
  11.     from logging import getLogger, ERROR
  12.     getLogger('scapy.runtime').setLevel(ERROR)
  13.     from scapy.all import *
  14.     conf.verb = 0
  15. except ImportError:
  16.     print '[!] Failed to Import Scapy'
  17.     sys.exit(1)
  18.  
  19. class ArpEnumerator(object):
  20.     def __init__(self, interface=False, passive=False, range=False):
  21.         self.interface = interface
  22.         self.passive = passive
  23.         self.range = range
  24.         self.discovered_hosts = {}
  25.         self.filter = 'arp'
  26.         self.starttime = datetime.now()
  27.     def passive_handler(self, pkt):
  28.         try:
  29.             if not pkt[ARP].psrc in self.discovered_hosts.keys():
  30.                 print "%s - %s" %(pkt[ARP].psrc, pkt[ARP].hwsrc)
  31.                 self.discovered_hosts[pkt[ARP].psrc] = pkt[ARP].hwsrc
  32.         except Exception:
  33.             return
  34.         except KeyboardInterrupt:
  35.             return
  36.     def passive_sniffer(self):
  37.         if not self.range:
  38.             print '[*] No Range Given; Sniffing All ARP Traffic'
  39.         else:
  40.             self.filter += ' and (net %s)' %(self.range)
  41.         print '[*] Sniffing Started on %s\n' %(self.interface)
  42.         try:
  43.             sniff(filter=self.filter, prn=self.passive_handler, store=0)
  44.         except Exception:
  45.             print '\n[!] An Unknown Error Occured'
  46.             return
  47.         print '\n[*] Sniffing Stopped'
  48.         print '[*] Sniff Duration: %s' %(datetime.now() - self.starttime)
  49.     def active_scan(self):
  50.         print '[*] Scanning for Hosts... ',
  51.         sys.stdout.flush()
  52.         try:
  53.             ans = srp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst=self.range), timeout=2, iface=self.interface, inter=0.1)[0]
  54.         except Exception:
  55.             print '[FAIL]'
  56.             print '[!] An Unknown Error Occured'
  57.             return
  58.         print '[DONE]\n[*] Displaying Discovered Hosts:\n'
  59.         for snd, rcv in ans:
  60.             self.discovered_hosts[rcv[ARP].psrc] = rcv[ARP].hwsrc
  61.             print '%s - %s' %(rcv[ARP].psrc, rcv[ARP].hwsrc)
  62.         print '\n[*] Scan Complete'
  63.         print '[*] Scan Duration: %s' %(datetime.now() - self.starttime)
  64.         return
  65.     def output_results(self, path):
  66.         print '[*] Writing to Output File...',
  67.         try:
  68.             with open(path, 'w') as file:
  69.                 for key, val in self.discovered_hosts.items():
  70.                     file.write('%s - %s\n' %(key, val))
  71.             print '[DONE]\n[*] Successfully Wrote to %s' %(path)
  72.             return
  73.         except IOError:
  74.             print '\n[!] Failed to Write Output File'
  75.             return
  76.  
  77. if __name__ == '__main__':
  78.     import argparse
  79.     parser = argparse.ArgumentParser(description='ARP-based Network Enumeration Tool')
  80.     parser.add_argument('-i', '--interface', help='Network interface to scan/sniff on', action='store', dest='interface', default=False)
  81.     parser.add_argument('-r', '--range', help='Range of IPs in CIDR notation', action='store', dest='range', default=False)
  82.     parser.add_argument('--passive', help='Enable passive mode (No packets sent, sniff only)', action='store_true', dest='passive', default=False)
  83.     parser.add_argument('-o', help='Output scan results to text file', action='store', dest='file', default=False)
  84.     args = parser.parse_args()
  85.     if not args.interface:
  86.         parser.error('No network interface given')
  87.     elif (not args.passive) and (not args.range):
  88.         parser.error('No range specified for active scan')
  89.     else:
  90.         pass
  91.     if args.passive:
  92.         if not not args.range:
  93.             enum = ArpEnumerator(interface=args.interface, passive=True, range=args.range)
  94.             enum.passive_sniffer()
  95.         else:
  96.             enum = ArpEnumerator(interface=args.interface, passive=True)
  97.             enum.passive_sniffer()
  98.     else:
  99.         enum = ArpEnumerator(interface=args.interface, range=args.range)
  100.         enum.active_scan()
  101.     if not not args.file:
  102.         enum.output_results(args.file)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement