1 #絕大多數成功的網絡攻擊都是以端口掃描開始的,在網絡安全和黑客領域,端口掃描是經常用到的技術,可以探測指定主機上是否 2 #開放了指定端口,進一步判斷主機是否運行了某些重要的網絡服務,最終判斷是否存在潛在的安全漏洞,從一定意義上將也屬於系統運維的范疇 3 4 #端口掃描器程序:模擬端口掃描器的工作原理,並采用多進程技術提高掃描速度 5 import socket 6 import sys 7 import multiprocessing 8 9 def ports(ports_serve): 10 #獲取常用端口對應的服務名稱 11 for port in list(range(1,100))+[143,145,113,443,445,3389,8080]: 12 try: 13 ports_serve[port]=socket.getservbyport(port) 14 except socket.error: 15 pass 16 17 def ports_scan(host,ports_service): 18 ports_open=[] 19 try: 20 sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 21 #超時時間的不同會影響掃描結果的精確度 22 socket.timeout(0.01) 23 except socket.error: 24 print('socket creation error') 25 sys.exit() 26 for port in ports_service: 27 try: 28 #嘗試連接指定端口 29 sock.connect((host,port)) 30 #記錄打開的端口 31 ports_open.append(port) 32 sock.close() 33 except socket.error: 34 pass 35 return ports_open 36 37 if __name__ == '__main__': 38 m=multiprocessing.Manager() 39 ports_service=dict() 40 results=dict() 41 ports(ports_service) 42 #創建進程池,允許最多8個進程同時運行 43 pool = multiprocessing.Pool(processes=8) 44 net = '10.2.1.' 45 for host_number in map(str,range(8,10)): 46 host = net + host_number 47 #創建一個新進程,同時記錄其運行結果 48 results[host] = pool.apply_async(ports_scan,(host,ports_service)) 49 print('starting '+host+'...') 50 #關閉進程池,close()必須在join()之前調用 51 pool.close() 52 #等待進程池中的進程全部執行結束 53 pool.join() 54 55 #打印輸出結果 56 for host in results: 57 print('='*30) 58 print(host,'.'*10) 59 for port in results[host].get(): 60 print(port,':',ports_service[port]) 61 62 #Python擴展庫netaddr提供了大量可以處理網絡地址的類和對象,例如netaddr.valid_ipv4(addr)可以判斷addr時否為合法IPv4地址 63 #netaddr.IPNetwork('10.2.1.0/24')和netaddr.IPRange('10.2.1.0','10.2.1.255')都可以用來生成包含介於10.2.1.0到10.2.1.255之間的IP地址的迭代對象。