本次實現對某個網段的主機端口(0—65535)掃描,因為端口較多進而耗時較長,可根據實際情況指定掃描的范圍
import nmap import os import threading import time from concurrent.futures import ThreadPoolExecutor from concurrent.futures import ProcessPoolExecutor IP_list = [] lock = threading.Lock() pool = ThreadPoolExecutor(5) # 寫入文件操作 def openfile(path, content): with open(path, 'W+')as f: f.write(content+'\n') # 查看當前主機操作系統 def find_os(ip): ret = os.popen("nmap -O %s" % ip).read().split('\n') for i in ret: if 'Running' in i: return i continue return 'noting' # 局域網存活的主機 def ping_ip(ip): output = os.popen('ping -n 1 %s' % ip).readlines() for w in output: if str(w).upper().find('TTL') >= 0: print(ip) IP_list.append(ip) pool.submit(nmapScan, ip) def Alive_host(ip): wd_ip = '.'.join(ip.split('.')[:-1]) for i in range(1, 256): new_ip = wd_ip + '.' + str(i) t = threading.Thread(target=ping_ip, args=(new_ip,)) t.start() time.sleep(0.01) def nmapScan(ip): port_list = [] nm = nmap.PortScanner() ret = nm.scan(hosts=ip, arguments='-v -n -A')['scan'][ip]['tcp'] for port in ret: port_list.append(str(port)) content = ip+" "+find_os(ip)+" "+','.join(port_list) print(content) openfile('./result', content) if __name__ == '__main__': Alive_host('192.168.16.0/24')
關於對“192.168.0.0/24” 的理解
24是CIDR值。簡單說就是一個CIDR值對應一個子網掩碼,然后對網絡就行分段。
/24對應的是255.255.255.0,與ip作位運算,將擋住的部分作為網段,其余部分做電腦的地址,如 192.168.0 屬於網段
192.168.0.0/24就代表了192.168.0.0至192.168.0.255
一直分下去有 192.168.1.0至192.168.1.255
192.168.2.0至192.168.2.255等等
每個IP地址的長度為32位(bit),分4段,每段8位(1個字節)。簡單的說24代表從前往后有24個1,就是11111111.11111111.11111111.00000000