python实现高效端口扫描器——nmap模块
掌控安全EDU
- 关注
python实现高效端口扫描器——nmap模块
对于端口扫描,使用的最多的就是nmap这个工具,不想python已经强大到,提供了nmap这个扫描端口的模块。
本片文章主要介绍nmap模块的两个常用类:
- PortScanner()类,实现一个nmap工具的端口扫描功能的封装;
- PortScannerHostDict()类,实现存储与访问主机的扫描结果。
安装:这里需要安装的是python-nmap模块,不是nmap模块,pip install python-nmap。
PortScanner()类的一些常用方法:
1. scan()方法:
scan(self,host='127.0.0.1',ports=None,arguments='-sV')
实现指定主机,端口,nmap命令行参数的扫描。
参数说明:
- hosts:字符串类型,表示扫描的主机的地址,格式可以用”scanme.nmap.org”,”127.0.0.1/24”表示;
- ports:字符串类型,表示要扫描的端口,可以用”22,80,443-1000”表示;
- arguments:字符串类型,表示nmap命令行参数,格式为”-sU -sX -sC”表示。
import nmap #实例化 nm = nmap.PortScanner() #端口扫描 nm.scan('www.baidu.com','22,80,443','-sV')
2. command_line(self)方法
返回的扫描方法映射到具体的nmap命令行
nm.command_line()
3. scaninfo(self)方法
返回nmap扫描信息,格式为字典类型
nm.scaninfo()
4. all_hosts(self)方法
返回nmap扫描的主机清单,格式为列表类型
nm.all_hosts()
PortScannerHostDict()类的一些常用方法
1. hostname(self)方法
返回扫描对象的主机名
nm['14.215.177.38'].hostname()
2. state(self)方法
返回扫描对象的状态,包括四种状态(up,down,unknown,skipped)
nm['14.215.177.38'].state()
3. all_protocols(self)方法
返回扫描的协议
nm['14.215.177.38'].all_protocols()
4.all_tcp(self)方法
返回TCP协议扫描的端口
nm['14.215.177.38'].all_tcp()
5.tcp(self,port)方法
返回扫描TCP协议port的信息
nm['14.215.177.38'].tcp(443)
实践:实现高效的端口扫描
实践代码采用scan()方法的arguments参数指定为 “-v -PE -p + 端口”,-v表示启用细节模式,可以返回非up状态主机清单;-PE 表示采用TCP同步扫描(TCP,SYN)方式;-p指定扫描端口范围。程序输出部分采用了三个for循环体,第一层遍历扫描主机,第二层遍历协议,第三层遍历端口,最后输出主机状态。
import sys
import nmap
nmapscan_row=[]
input_data = input('Please input hosts and port: ')
scan_row = input_data.split(" ")
if len(scan_row)!=2:
print("Input errors,example \"192.168.1.0/24 80,443,22\"")
sys.exit(0)
#接收用户输入的主机
hosts=scan_row[0]
#接收用户输入的端口
port=scan_row[1]
try:
#创建端口扫描对象
nm = nmap.PortScanner()
except nmap.PortScannerError:
print('Nmap not found', sys.exc_info()[0])
sys.exit(0)
except:
print("Unexpected error:", sys.exc_info()[0])
sys.exit(0)
try:
#调用扫描方法,参数指定扫描主机hosts,nmap扫描命令行参数arguments
nm.scan(hosts=hosts, arguments=' -v -sS -p '+port)
except Exception as e:
print("Scan erro:"+str(e))
#遍历扫描主机
for host in nm.all_hosts():
print('----------------------------------------------------')
#输出主机及主机名
print('Host : %s (%s)' % (host, nm[host].hostname()))
#输出主机状态,如up、down
print('State : %s' % nm[host].state())
for proto in nm[host].all_protocols():
#遍历扫描协议,如tcp、udp
print('----------')
#输入协议名
print('Protocol : %s' % proto)
#获取协议的所有扫描端口
lport = nm[host][proto].keys()
#端口列表排序
list(lport).sort()
#遍历端口及输出端口与状态
for port in lport:
print('port : %s\tstate : %s' % (port, nm[host][proto][port]['state']))
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 掌控安全EDU 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
(云安全)前端敏感信息泄露到接管整个云服务器
2025-03-12
记录某SRC邀请处逻辑越权到组织管理员漏洞
2025-03-05
掌控安全学院“零基础 3 天黑客训练营”开营啦
2025-02-26
文章目录