From 9ddb00b140f4af4cbdbc7867d357e6cdb04bc382 Mon Sep 17 00:00:00 2001 From: Hamid <hamid.sadeghian@dw.com> Date: Thu, 27 Jul 2023 16:59:23 +0000 Subject: [PATCH] Add new file --- src/netscan/netscan.py | 162 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 src/netscan/netscan.py diff --git a/src/netscan/netscan.py b/src/netscan/netscan.py new file mode 100644 index 0000000..fddbd86 --- /dev/null +++ b/src/netscan/netscan.py @@ -0,0 +1,162 @@ +import sys +import getopt +import socket, struct +from netaddr import * +from datetime import date +import json, csv +import subprocess, platform +import logging + + +today= date.today() +today_dot = today.strftime('%d.%m.%Y') + +logging.basicConfig(filename='logs/log_%s' %today, + filemode='w+', + format='%(asctime)s %(levelname)s %(message)s', + datefmt='%Y-%m-%d %H:%M:%S', + level=logging.DEBUG) + +version = '1.0' +verbose = False +ip_range=[] +ip_ranges=[] +alive_devices=[] +hostname={} + +def help(): + + print(''' + + Scans the specified network to find and list alive nodes. + + Syntax: /usr/bin/python netscan.py [-n Network -p Port -f FilePath ] ... + + example: /usr/bin/python netscan.py -n 192.168.1.0/24 -p 22 -f /etc/output.json + /usr/bin/python netscan.py -n 192.168.1.16/30,192.168.2.2/32 -p 22 -f /etc/output.json + + args: + -h --help Help. + -v --version Shows version. + -n --network Network(S) to scan. + -f --file-path File path containing file name to save the output. + You can write the output in .csv, .txt or .json file formats. + + © 2023 Hamid Sadeghian + + ''') + + +def portscan(ips, port): + for ip in ips: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(1) + result = sock.connect_ex((ip, int(port))) + if result == 0: + alive_devices.append(ip) + print(ip, ' port {} is open.'.format(port)) + logging.info('{} port {} is open.'.format(ip, port)) + sock.close() + return alive_devices + +def pingscan(ips): + ping_str = '-n 2' if platform.system().lower()=='windows' else '-c 2' + need_sh = False if platform.system().lower()=='windows' else True + for ip in ips: + args = 'ping ' + ' ' + ping_str + ' ' + ip + # Ping + if subprocess.call(args, shell=need_sh) == 0: + alive_devices.append(ip) + return alive_devices + +def ips(start, end): + start = struct.unpack('>I', socket.inet_aton(start))[0] + end = struct.unpack('>I', socket.inet_aton(end))[0] + return [socket.inet_ntoa(struct.pack('>I', i)) for i in range(start, end)] + +def nslook(alive_devices): + hostname={} + for i in alive_devices: + try: + p=(socket.getnameinfo((i, 0), socket.NI_NAMEREQD)) + hostname[i]= p[0] + except: + hostname[i]= 'no dns record' + pass + return hostname + +def main(argv): + file = None + networks=[] + network='' + + logging.info(' START') + opts, args = getopt.getopt(argv[1:],'n:f:p:hv',['help','version','network=','file-path=','port=']) + + for opt, arg in opts: + if opt in ('-h', '--help'): + help() + sys.exit() + elif opt in ('-v', '--version'): + print('Version', version) + sys.exit() + elif opt in ('-n', '--network'): + network = arg + networks = network.split(',') + elif opt in ('-f', '--file-path'): + file = arg + elif opt in ('-p', '--port'): + port = arg + + if any((not network, not file, not port)): + help() + print('\nERROR: Mandatory parameter is missing.\n') + logging.error('Mandatory parameters are missing.') + sys.exit() + + # find out ip ranges + for n in networks: + ip_ranges = IPNetwork(str(n)) + for ip in ip_ranges: + ip_range.append(str(ip)) + + print(networks, 'will be scaned.') + logging.info('%s will be scaned.' %networks) + + + #input('Press Enter to Continue...') + alive_devices = portscan(ip_range, port) + print(len(ip_range),'IPs scaned.') + logging.info('%s IPs scaned.'%len(ip_range)) + + hosts = nslook(alive_devices) + + header = ['IP-Address','Hostname'] + + try: + with open(file, 'w', encoding='UTF8', newline='') as f: + if '.json' in file: + json.dump(hosts, f, indent=2) + elif '.csv' in file: + writer = csv.DictWriter(f, fieldnames=header) + writer.writeheader() + for key in hosts.keys(): + f.write('%s,%s\n'%(key,hosts[key])) + elif '.txt' in file: + for key in hosts.keys(): + f.write('%s %s\n'%(key,hosts[key])) + else: + print('Unsupported file extension!') + logging.error('Unsupported file extension!') + logging.info('List of hosts inclusive DNS-Name saved in {}'.format(file)) + + except IOError: + print('Error occurred while exporting to file: {0}'.format(file)) + logging.error('Error occurred while exporting to file: {0}'.format(file)) + + print('\n',len(hosts),'IP(s) with open port 22 found:',hosts,'\n') + logging.info('{} IP(s) with open port 22 found: {}'.format(len(hosts), hosts)) + + +if __name__ == '__main__': + main(sys.argv) -- GitLab