python nmap模块详解_python中的nmap模块(编写扫描器)

模块功能

目前Nmap模块已具备如下各种功能。

主机发现功能。向目标计算机发送信息,然后根据目标的反应来确定它是否处于开机并联网的状态。

端口扫描 。向目标计算机的指定端口发送信息,然后根据目标端口的反应来判断它是否开放。

服务及版本检测。向目标计算机的指定端口发送特制的信息,然后根据目标的反应来检测它运行服务的服务类型和版本。

操作系统检测。

除了这些基本功能之外,Nmap还实现一些高级的审计技术,例如,伪造发起扫描端的身份,进行隐蔽的扫描,规避目标的防御设备(例如防火墙),对系统进行安全漏洞检测,并提供完善的报告选项。再后来的不断发展中,随着Nmap强大的脚本引擎NSE的推出,任何人都可以自己向Nmap中添加新的功能模块。

安装Nmap及其模块

Nmap的安装Windows下去官网下载就可以了,作者遇到的问题也已经专门做了笔记,这是笔记链接

在这里需要强调一下,我们要安装的模块是python-nmap 而不是 nmap ,切记切记!如果装错了模块,后面是无法完成实例化的!

pip install python-nmap #安装模块命令

基本用法

python-nmap模块实例化

最常用的是PortScanner类,这个类实现Nmap工具功能的封装。对这个类进行实例化很简单,只需要如下语句便可实现。

import nmap

nm=nmap.PortScanner()

PortScannerAsync类和PortScanner类的功能相似,但是这个类可以实现异步扫描,对这个类的实例化语句如下。

import nmap

nm=nmap.PortScannerAsync()

python-nmap中的函数

首先看一下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

扫描自己

以上就是我常用的指令==参数,还有很多很多,就不一一列举了。

如果要对192.168.1.101的1~500端口进行一次TCP扫描,可以使用以下命令。

import nmap

nm = nmap.PortScanner()

nm.scan('192.168.1.101','1-500','-sS')

all_hosts()函数:返回一个被扫描的所有主机列表。

command_line()函数:返回在当前扫描中使用的命令行。

csv()函数:返回值是一个CSV(逗号分隔文件格式)的输出。

如果想看的更清楚一点,可以使用print输出csv()的内容。

has_host(self,host)函数:检查是否有host的扫描结果,如果有则返回True,否则返回False。

scaninfo()函数:列出一个扫描信息的结构。

还有一些不常用的操作大家可以自己去实践一下,这里不做过多介绍。

而PortScannerAsync类中最为重要的函数也是scan(),用法与PortScanner类中的scan()基本一样,只不过多了一个回调函数。完整的scan()函数格式为scan(self,hosts=‘127.0.0.1’,ports=None,arguments=’-sV’,callback=None,sudo=False)这里面的callback是以(host,scan_data)为参数的函数,也就是整个网段的扫描。

import nmap

nm = nmap.PortScannerAsync()

nm.scan(hosts = '192.168.1.0/24',arguments = '-sP')

这个类提供了以下三个用来实现异步的函数。

still_scanning():如果扫描正在进行则返回Ture,否则返回False。

wait(self,timeout=None):函数表示等待时间。

stop():停止扫描。

编写一个端口扫描器

好了,现在已经了解python-nmap的用法,接下来就可以使用这个模块来编写一个简单的端口扫描器了。

import nmap #导入模块

nm = nmap.PortScanner() #导入函数

nm.scan('192.168.1.104','1-1000') #输入你要扫描的ip与道口

for host in nm.all_hosts(): #返回被扫描的主机列表给host

print('---------------------------------------------------------')

print('Host : %s (%s)' % (host,nm[host].hostname())) #nm[host].hostname()获取目标主机的主机名

print('State : %s' % nm[host].state()) #nm[host].state()获取主机的状态 |up|down|unknow|skipped|

for proto in nm[host].all_protocols(): #nm[host].all_protocols获取执行的协议['tcp','udp']

print('-----------------------------------------------------')

print('protocol : %s' % proto ) #输出执行的协议

lport = nm[host][proto].keys() #获取目标主机所开放的端口赋值给lport

# lport.sort()

for port in lport: #将lport赋值给port并遍历

print('port : %s\tstate : %s' % (port,nm[host][proto][port]['state'])) #输出扫描结果

运行结果:

编写一个主机存活扫描器

这里其实换汤不换药,好好体会一下两段代码就会发现他们其实是大同小异的。

import nmap #导入模块

nm = nmap.PortScanner() #导入函数

nm.scan('192.168.1.0/24',arguments='-sP') #绑定网段与扫描模式

hosts_list = [(x, nm[x]['status']['state']) for x in nm.all_hosts()] #定义字典

for host, status in hosts_list: #将字典里的状态赋值给host,status

print(host+" is "+status) #输出扫描结果

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值