赞
踩
nmap是一款非常强大的主机发现和端口扫描工具,而且nmap运用自带的脚本,还能完成漏洞检测,同时支持多平台。
主要功能有:
nmap的相关网站在这里:python-nmap : nmap from python (xael.org)和Download the Free Nmap Security Scanner for Linux/Mac/Windows
yum install nmap
nmap -version
pip install python-nmap
相关网站:python-nmap · PyPI
最常用的是PortScanner类,这个类实现Nmap工具功能的封装。对这个类进行实例化很简单,只需要如下语句便可实现。
import nmap
nm=nmap.PortScanner()
PortScannerAsync类和PortScanner类的功能相似,但是这个类可以实现异步扫描,对这个类的实例化语句如下。
import nmap
nm=nmap.PortScannerAsync()
首先看一下PortScanner类,这个类中包含了如下几个函数。
scan()函数:这个函数的完整形式为scan(self,hosts=‘127.0.0.1’,ports=None,arguments=’-sV’,sudo=False),用来对指定目标进行扫描。
这里面的参数hosts的值为字符串类型,表示要扫描的主机,形式可以是IP地址,例如"192.168.1.1",也可以是一个域名,例如"www.nmap.org"
参数ports的值也是字符串类型,表示要扫描的端口。如果要扫描的是单一端口,形式可以为"80"。如果为多个端口,可以用逗号分开,例如"80,443,3389"。如果要扫描的是连续的端口范围,可以用横线,例如“1-5000” 。
参数arguments的值也是字符串类型,这个参数实际上就是Nmap扫描所用的参数。
参数 | 作用 |
---|---|
-O | 系统扫描 |
-V,-v,-D,-d,-p | debug信息 |
–fuzzy | 推测操作系统检测结果 |
-sT | TCP端口扫描(完整三次握手) |
-sU | UDP端口扫描(不回应可能打开,回应则关闭) |
-sL | DNS反向解析 |
-sS | 隐藏扫描(半开SYN) |
-sP | 发现存活主机(直连arp,非直连TCP80,ICMP) |
-sO | 确定主机协议扫描 |
-sW | 对滑动窗口的扫描 |
-sA | TCP ACK扫描 |
-sN | 关闭主机扫描(不管是否存活直接扫描) |
-sF | fin扫描 |
-sX | Xmas扫描(fin psh urg为置位) |
-sI | 完全隐藏(以一个跳板为主机(无流量)扫描另一台主机) |
-sV | 服务器版本 |
-sC | 跟安全有关的脚本 |
-PN | 扫描自己 |
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import nmap # 输入主机和端口 input_data = input("请输入主机和端口:") scan_row = input_data.split(" ") if len(scan_row) != 2: print('输入错误,示例:192.168.1.0/24 80,22,443') sys.exit(0) hosts = scan_row[0] # 输入的主机 ports = scan_row[1] # 输入的端口 # 创建端口扫描对象 try: nm = nmap.PortScanner() except nmap.PortScannerError: print("Nmap 未找到!", sys.exc_info()[0]) sys.exit(0) except: print("未知的错误:", sys.exc_info()[0]) sys.exit(0) # 执行扫描 try: nm.scan(hosts=hosts, arguments='-v -sS -p' + ports) except Exception as e: print("扫描错误:" + str(e)) # 遍历扫描主机 for host in nm.all_hosts(): print('----------------------------------------') print(f"Host: {host} ({nm[host].hostname()})") # 输出主机及主机名 print(f"State: {nm[host].state()}") # 输出主机状态,如up,down # 遍历协议 for proto in nm[host].all_protocols(): print('-------------') print(f"协议:{proto}") # 获取协议的所有扫描端口并排序 lport = sorted(nm[host][proto].keys()) for port in lport: # 遍历端口以及输出端口、状态 print(f"端口: {port} \t 状态: {nm[host][proto][port]['state']}")
效果如图:
其中主机支持所有表达方式,如www.qq.com、192.168.1.*、192.168.1.1-20、192.168.1.0/24。端口输入也灵活,如80,22,443、80,22-443。
参考文章:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。