python nmap网络扫描详解

简介: 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


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
94 55
|
1月前
|
数据采集 缓存 定位技术
网络延迟对Python爬虫速度的影响分析
网络延迟对Python爬虫速度的影响分析
|
13天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
87 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
13天前
|
机器学习/深度学习 人工智能 算法
深度学习入门:用Python构建你的第一个神经网络
在人工智能的海洋中,深度学习是那艘能够带你远航的船。本文将作为你的航标,引导你搭建第一个神经网络模型,让你领略深度学习的魅力。通过简单直观的语言和实例,我们将一起探索隐藏在数据背后的模式,体验从零开始创造智能系统的快感。准备好了吗?让我们启航吧!
41 3
|
18天前
|
网络安全 Python
Python网络编程小示例:生成CIDR表示的IP地址范围
本文介绍了如何使用Python生成CIDR表示的IP地址范围,通过解析CIDR字符串,将其转换为二进制形式,应用子网掩码,最终生成该CIDR块内所有可用的IP地址列表。示例代码利用了Python的`ipaddress`模块,展示了从指定CIDR表达式中提取所有IP地址的过程。
35 6
|
21天前
|
机器学习/深度学习 自然语言处理 语音技术
Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧
本文介绍了Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧,并通过TensorFlow和PyTorch等库展示了实现神经网络的具体示例,涵盖图像识别、语音识别等多个应用场景。
45 8
|
21天前
|
数据采集 XML 存储
构建高效的Python网络爬虫:从入门到实践
本文旨在通过深入浅出的方式,引导读者从零开始构建一个高效的Python网络爬虫。我们将探索爬虫的基本原理、核心组件以及如何利用Python的强大库进行数据抓取和处理。文章不仅提供理论指导,还结合实战案例,让读者能够快速掌握爬虫技术,并应用于实际项目中。无论你是编程新手还是有一定基础的开发者,都能在这篇文章中找到有价值的内容。
|
1月前
|
安全 Linux 网络安全
nmap 是一款强大的开源网络扫描工具,能检测目标的开放端口、服务类型和操作系统等信息
nmap 是一款强大的开源网络扫描工具,能检测目标的开放端口、服务类型和操作系统等信息。本文分三部分介绍 nmap:基本原理、使用方法及技巧、实际应用及案例分析。通过学习 nmap,您可以更好地了解网络拓扑和安全状况,提升网络安全管理和渗透测试能力。
114 5
|
1月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
77 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
移动开发 网络协议 Linux
Python网络编程(socketserver、TFTP云盘、HTTPServer服务器模型)
Python网络编程 Python小项目 Python网盘 Python HTTP请求服务端
2152 0