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地址的迭代对象。