From af0429d7a661f846e9e2afc43aab40f6a4ad6ac0 Mon Sep 17 00:00:00 2001 From: xdavidhu Date: Wed, 28 Dec 2016 11:26:31 +0100 Subject: [PATCH] scan.py with callable function, and list return --- scan.py | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 scan.py diff --git a/scan.py b/scan.py new file mode 100644 index 0000000..116edcd --- /dev/null +++ b/scan.py @@ -0,0 +1,66 @@ +#kickthemout/scan.py by @xdavidhu + +def scanNetwork(): + import scapy.config + import scapy.layers.l2 + import scapy.route + import socket + import math + import errno + + def long2net(arg): + if (arg <= 0 or arg >= 0xFFFFFFFF): + raise ValueError("illegal netmask value", hex(arg)) + return 32 - int(round(math.log(0xFFFFFFFF - arg, 2))) + + + def to_CIDR_notation(bytes_network, bytes_netmask): + network = scapy.utils.ltoa(bytes_network) + netmask = long2net(bytes_netmask) + net = "%s/%s" % (network, netmask) + if netmask < 16: + return None + + return net + + + def scan_and_print_neighbors(net, interface, timeout=1): + hostsList = [] + try: + ans, unans = scapy.layers.l2.arping(net, iface=interface, timeout=timeout, verbose=True) + for s, r in ans.res: + mac = r.sprintf("%Ether.src%") + ip = r.sprintf("%ARP.psrc%") + line = r.sprintf("%Ether.src% %ARP.psrc%") + hostsList.append([ip, mac]) + try: + hostname = socket.gethostbyaddr(r.psrc) + line += "," + hostname[0] + except socket.herror: + pass + except socket.error as e: + if e.errno == errno.EPERM: # Operation not permitted + exit() + else: + raise + return hostsList + + + if __name__ == "__main__": + for network, netmask, _, interface, address in scapy.config.conf.route.routes: + + # skip loopback network and default gw + if network == 0 or interface == 'lo' or address == '127.0.0.1' or address == '0.0.0.0': + continue + + if netmask <= 0 or netmask == 0xFFFFFFFF: + continue + + net = to_CIDR_notation(network, netmask) + + if interface != scapy.config.conf.iface: + # see http://trac.secdev.org/scapy/ticket/537 + continue + + if net: + return scan_and_print_neighbors(net, interface) \ No newline at end of file