python nmap网络扫描详解

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: python nmap网络扫描详解

python 模块 nmap 网络扫描

文章目录

python 模块 nmap 网络扫描

1. 简介

2. 功能

3. 安装

4. 方法

4.1 PortScanner()类常用方法

4.1.1 scan()方法

4.1.2 command_line()方法

4.1.3 scaninfo()方法

4.1.4 all_hosts()方法

4.2 PortScannerHostDict()类常用方法

4.2.1 hostname()方法

5. 实战

5.1 测试多个主机的状态、协议、端口

5.2 测试主机状态

1. 简介

NMap,也就是Network Mapper,最早是Linux下的网络扫描和嗅探工具包。源码:https://github.com/nmmapper/python3-nmap


nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting)。它是网络管理员必用的软件之一,以及用以评估网络系统安全。


正如大多数被用于网络安全的工具,nmap 也是不少黑客及骇客(又称脚本小子)爱用的工具 。系统管理员可以利用nmap来探测工作环境中未经批准使用的服务器,但是黑客会利用nmap来搜集目标电脑的网络设定,从而计划攻击的方法。


Nmap 常被跟评估系统漏洞软件Nessus 混为一谈。Nmap 以隐秘的手法,避开闯入检测系统的监视,并尽可能不影响目标系统的日常操作。


Nmap 在黑客帝国(The Matrix)中,连同SSH1的32位元循环冗余校验漏洞,被崔妮蒂用以入侵发电站的能源管理系统。

2. 功能

基本功能有三个:


一是探测一组主机是否在线;

其次是扫描 主机端口,嗅探所提供的网络服务;

还可以推断主机所用的操作系统

Nmap可用于扫描仅有两个节点的LAN,直至500个节点以上的网络。Nmap 还允许用户定制扫描技巧。通常,一个简单的使用ICMP协议的ping操作可以满足一般需求;也可以深入探测UDP或者TCP端口,直至主机所 使用的操作系统;还可以将所有探测结果记录到各种格式的日志中, 供进一步分析操作。进行ping扫描,打印出对扫描做出响应的主机,不做进一步测试(如端口扫描或者操作系统探测):

$ nmap -sP 192.168.1.0/24

仅列出指定网络上的每台主机,不发送任何报文到目标主机:

$ nmap -sL 192.168.1.0/24

探测目标主机开放的端口,可以指定一个以逗号分隔的端口列表(如-PS22,23,25,80):

$ nmap -PS 192.168.1.234

使用UDP ping探测主机:

$ nmap -PU 192.168.1.0/24

使用频率最高的扫描选项:SYN扫描,又称为半开放扫描,它不打开一个完全的TCP连接,执行得很快:

$ nmap -sS 192.168.1.0/24

nmao命令详解

3. 安装

官网下载:https://pypi.org/project/python-nmap/#files

$ pip install nmap

4. 方法

python-nmap模块的两个常用类,一个是PortScanner()类,实现一个nmap工具的端口扫描功能封装;另一个为PortScannerHostDict()类,实现存储与访问主机扫描结果

4.1 PortScanner()类常用方法

4.1.1 scan()方法

scan(self, hosts='127.0.0.1', ports=None, arguments='-sV')方法:

实现指定主机、端口、namp命令行参数的扫描。


hosts为字符串类型,表示扫描的主机地址,格式可用"scanme.nmap.org"、“192.116.0-255.1-127”、"216.163.128.20/20"表示;

ports为字符串类型,表示扫描的端口,可以用"22,53,110,143-4564"表示;

namp命令行参数,格式为"-sU -sX -sC"

例如:

#!/usr/bin/python
import nmap
nm = nmap.PortScanner()
ret = nm.scan('192.168.1.121-122', '22,80')
print ret
$ python nm1.py
{'nmap': {'scanstats': {'uphosts': '2', 'timestr': 'Sat May  9 17:04:43 2020', 'downhosts': '0', 'totalhosts': '2', 'elapsed': '7.54'}, 'scaninfo': {'tcp': {'services': '22,80', 'method': 'syn'}}
.......

4.1.2 command_line()方法

command_line(self)方法,返回的扫描方法映射到具体的nmap命令行,如:

#!/usr/bin/python
import nmap
nm = nmap.PortScanner()
nm.scan('192.168.1.121-122', '22,80')
print nm.command_line()
$ python nm1.py 
nmap -oX - -p 22,80 -sV 192.168.1.121-122

4.1.3 scaninfo()方法

scaninfo(self)方法,返回nmap扫描信息,格式为字典类型,如:

#!/usr/bin/python
import nmap
nm = nmap.PortScanner()
nm.scan('192.168.1.121-122', '22,80')
print nm.scaninfo()
$ python nm1.py 
{'tcp': {'services': '22,80', 'method': 'syn'}}

4.1.4 all_hosts()方法

all_hosts(self)方法,返回nmap扫描的主机清单,格式为列表类型,例如:

#!/usr/bin/python
import nmap
nm = nmap.PortScanner()
re = nm.scan('192.168.1.121-122', '22,80')
print nm.all_hosts()
$ python nm1.py 
['192.168.1.121', '192.168.1.122']

4.2 PortScannerHostDict()类常用方法

4.2.1 hostname()方法

hostname(self)方法,返回扫描对象的主机名,如:

$ vim nm3.py
#!/usr/bin/env python
#--coding:utf-8---
import nmap # 导入 nmap.py 模块  
nm = nmap.PortScanner() # 实例化nmap.PortScanner对象  
nm.scan('127.0.0.1', '22-443') # 扫描127.0.0.1,端口号从22至443  
print nm['127.0.0.1'].hostname() # 获取一个主机127.0.0.1的主机名,通常为用户记录  
print nm['127.0.0.1'].hostnames() # 获取主机127.0.0.1的主机名列表,返回一个字典类型  
## [{'name':'hostname1', 'type':'PTR'}, {'name':'hostname2', 'type':'user'}]
print nm['127.0.0.1'].state() # 获取主机127.0.0.1的状态 (up|down|unknown|skipped)  
print nm['127.0.0.1'].all_protocols() # 获取执行的协议 ['tcp', 'udp'] 包含 (ip|tcp|udp|sctp)  
print nm['127.0.0.1']['tcp'].keys() # 获取tcp协议所有的端口号  
print nm['127.0.0.1'].all_tcp() # 获取tcp协议所有的端口号 (按照端口号大小进行排序)  
print nm['127.0.0.1'].all_udp() # 获取udp协议所有的端口号 (按照端口号大小进行排序)  
print nm['127.0.0.1'].all_sctp() # 获取sctp协议所有的端口号 (按照端口号大小进行排序)  
print nm['127.0.0.1'].has_tcp(22) # 主机127.0.0.1是否有关于22端口的任何信息  
print nm['127.0.0.1']['tcp'][22] # 获取主机127.0.0.1关于22端口的信息  
print nm['127.0.0.1'].tcp(22) # 获取主机127.0.0.1关于22端口的信息  
print nm['127.0.0.1']['tcp'][22]['state'] # 获取主机22端口的状态 (open)  
$ python nm3.py 
localhost
[{'type': 'PTR', 'name': 'localhost'}]
up
['tcp']
[25, 22, 111]
[22, 25, 111]
[]
[]
True
{'product': 'OpenSSH', 'state': 'open', 'version': '7.4', 'name': 'ssh', 'conf': '10', 'extrainfo': 'protocol 2.0', 'reason': 'syn-ack', 'cpe': 'cpe:/a:openbsd:openssh:7.4'}
{'product': 'OpenSSH', 'state': 'open', 'version': '7.4', 'name': 'ssh', 'conf': '10', 'extrainfo': 'protocol 2.0', 'reason': 'syn-ack', 'cpe': 'cpe:/a:openbsd:openssh:7.4'}
open

5. 实战

5.1 测试多个主机的状态、协议、端口

$ vim nm4.py
#!/usr/bin/python
import nmap
nm = nmap.PortScanner()
re = nm.scan('192.168.1.190-192', '22,80')
for host in nm.all_hosts():
    print('----------------------------------------------------')
    print('Host : %s (%s)' % (host, nm[host].hostname()))
    print('State : %s' % nm[host].state())
    for proto in nm[host].all_protocols():
        print('----------')
        print('Protocol : %s' % proto)
        lport = nm[host][proto].keys()
        lport.sort()
        for port in lport:
            print ('port : %s\tstate : %s' % (port, nm[host][proto][port]['state']))
print(nm.csv())
$ python nm4.py 
----------------------------------------------------
Host : 192.168.1.190 ()
State : up
----------
Protocol : tcp
port : 22 state : open
port : 80 state : open
----------------------------------------------------
Host : 192.168.1.191 ()
State : up
----------
Protocol : tcp
port : 22 state : open
port : 80 state : filtered
----------------------------------------------------
Host : 192.168.1.192 ()
State : up
----------
Protocol : tcp
port : 22 state : open
port : 80 state : open
host;hostname;hostname_type;protocol;port;name;state;product;extrainfo;reason;version;conf;cpe
192.168.1.190;;;tcp;22;ssh;open;OpenSSH;protocol 2.0;syn-ack;7.4;10;cpe:/a:openbsd:openssh:7.4
192.168.1.190;;;tcp;80;http;open;Apache httpd;(CentOS);syn-ack;2.4.6;10;cpe:/a:apache:http_server:2.4.6
192.168.1.191;;;tcp;22;ssh;open;OpenSSH;protocol 2.0;syn-ack;7.4;10;cpe:/a:openbsd:openssh:7.4
192.168.1.191;;;tcp;80;http;filtered;;;no-response;;3;
192.168.1.192;;;tcp;22;ssh;open;OpenSSH;protocol 2.0;syn-ack;7.4;10;cpe:/a:openbsd:openssh:7.4
192.168.1.192;;;tcp;80;http;open;Apache httpd;(CentOS);syn-ack;2.4.6;10;cpe:/a:apache:http_server:2.4.6
192.168.1.193;;;tcp;22;ssh;filtered;;;no-response;;3;
192.168.1.193;;;tcp;80;http;filtered;;;no-response;;3;

5.2 测试主机状态

$ vim nm5.py
#!/usr/bin/python
import nmap
nm = nmap.PortScanner()
nm.scan(hosts='192.168.1.0/24', arguments='-n -sP -PE -PA21,23,80,3389')
hosts_list = [(x, nm[x]['status']['state']) for x in nm.all_hosts()]
for host, status in hosts_list:
    print(host + ":" + status)
$ python nm5.py
192.168.1.0:up
192.168.1.1:up
192.168.1.10:up
192.168.1.100:up
192.168.1.101:up
192.168.1.102:up
192.168.1.103:up
192.168.1.104:up

参考:


xiaix’s Blog

python-nmap : nmap from python

Port scanner using ‘python-nmap’

Using the Nmap Port Scanner with Python

Python Nmap Module Fully Explained with 8 Programs


相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
10天前
|
机器学习/深度学习 人工智能 算法
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
海洋生物识别系统。以Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经网络算法,通过对22种常见的海洋生物('蛤蜊', '珊瑚', '螃蟹', '海豚', '鳗鱼', '水母', '龙虾', '海蛞蝓', '章鱼', '水獭', '企鹅', '河豚', '魔鬼鱼', '海胆', '海马', '海豹', '鲨鱼', '虾', '鱿鱼', '海星', '海龟', '鲸鱼')数据集进行训练,得到一个识别精度较高的模型文件,然后使用Django开发一个Web网页平台操作界面,实现用户上传一张海洋生物图片识别其名称。
93 7
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
|
3天前
|
机器学习/深度学习 人工智能 算法
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
乐器识别系统。使用Python为主要编程语言,基于人工智能框架库TensorFlow搭建ResNet50卷积神经网络算法,通过对30种乐器('迪吉里杜管', '铃鼓', '木琴', '手风琴', '阿尔卑斯号角', '风笛', '班卓琴', '邦戈鼓', '卡萨巴', '响板', '单簧管', '古钢琴', '手风琴(六角形)', '鼓', '扬琴', '长笛', '刮瓜', '吉他', '口琴', '竖琴', '沙槌', '陶笛', '钢琴', '萨克斯管', '锡塔尔琴', '钢鼓', '长号', '小号', '大号', '小提琴')的图像数据集进行训练,得到一个训练精度较高的模型,并将其
12 0
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
|
6天前
|
机器学习/深度学习 存储 算法
使用Python实现深度学习模型:强化学习与深度Q网络(DQN)
使用Python实现深度学习模型:强化学习与深度Q网络(DQN)
21 2
|
12天前
|
数据采集 存储 JSON
Python网络爬虫教程概览
【6月更文挑战第21天】Python网络爬虫教程概览:安装requests和BeautifulSoup库抓取网页;使用HTTP GET请求获取HTML,解析标题;利用CSS选择器提取数据;处理异步内容可选Selenium;遵循爬虫策略,处理异常,尊重法律与网站规定。
23 1
|
10天前
|
机器学习/深度学习 人工智能 算法
【昆虫识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+机器学习+TensorFlow+ResNet50
昆虫识别系统,使用Python作为主要开发语言。通过TensorFlow搭建ResNet50卷积神经网络算法(CNN)模型。通过对10种常见的昆虫图片数据集('蜜蜂', '甲虫', '蝴蝶', '蝉', '蜻蜓', '蚱蜢', '蛾', '蝎子', '蜗牛', '蜘蛛')进行训练,得到一个识别精度较高的H5格式模型文件,然后使用Django搭建Web网页端可视化操作界面,实现用户上传一张昆虫图片识别其名称。
141 7
【昆虫识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+机器学习+TensorFlow+ResNet50
|
11天前
|
机器学习/深度学习 人工智能 算法
【球类识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+TensorFlow
球类识别系统,本系统使用Python作为主要编程语言,基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集 '美式足球', '棒球', '篮球', '台球', '保龄球', '板球', '足球', '高尔夫球', '曲棍球', '冰球', '橄榄球', '羽毛球', '乒乓球', '网球', '排球'等15种常见的球类图像作为数据集,然后进行训练,最终得到一个识别精度较高的模型文件。再使用Django开发Web网页端可视化界面平台,实现用户上传一张球类图片识别其名称。
104 7
【球类识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+TensorFlow
|
5天前
|
JSON 数据可视化 API
技术心得:如何用Python和API收集与分析网络数据?
技术心得:如何用Python和API收集与分析网络数据?
12 2
|
7天前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现深度学习模型:图神经网络(GNN)
使用Python实现深度学习模型:图神经网络(GNN)
15 1
|
7天前
|
数据可视化 数据挖掘 知识图谱
精选:15款顶尖Python知识图谱(关系网络)绘制工具,数据分析的强力助手
这里有15款免费工具推荐:NetworkX(Python基础),Graph-tool(C++速度),Graphviz(可视化库),ipycytoscape(Jupyter集成),ipydagred3,ipySigma(NetworkX + Web),Netwulf(交互式),nxviz(Matplotlib绑定),Py3plex(复杂网络分析),Py4cytoscape(Python+Cytoscape),pydot(Graphviz接口),PyGraphistry(GPU加速),python-igraph,pyvis(交互式图形),SNAP(大规模网络分析)。绘制和理解网络图从未如此简单!
19 0
|
8天前
|
数据采集 机器学习/深度学习 数据可视化
利用Python进行网络爬虫和数据抓取
在当今数字化时代,数据是无处不在的。从市场趋势到个人偏好,从社交媒体活动到商业智能,数据扮演着关键的角色。然而,访问、处理和利用数据并不总是轻而易举的。幸运的是,Python提供了一套强大而灵活的工具,使得网络爬虫和数据抓取成为可能。本文将深入探讨如何利用Python进行网络爬虫和数据抓取,为您打开数据世界的大门。

相关实验场景

更多