python-nmap使用及案例
本文内容纲要:
-nmap概念及功能
-概念
-功能
-nmap安装
-python操作nmap
-实验案例
nmap概念及功能
概念
NMap,也就是NetworkMapper,最早是Linux下的网络扫描和嗅探工具包。
nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称fingerprinting)。它是网络管理员必用的软件之一,以及用以评估网络系统安全。
正如大多数被用于网络安全的工具,nmap也是不少黑客及骇客(又称脚本小子)爱用的工具。系统管理员可以利用nmap来探测工作环境中未经批准使用的服务器,但是黑客会利用nmap来搜集目标电脑的网络设定,从而计划攻击的方法。
Nmap常被跟评估系统漏洞软件Nessus混为一谈。Nmap以隐秘的手法,避开闯入检测系统的监视,并尽可能不影响目标系统的日常操作。
Nmap在黑客帝国(TheMatrix)中,连同SSH1的32位元循环冗余校验漏洞,被崔妮蒂用以入侵发电站的能源管理系统。
功能
基本功能有三个,一是探测一组主机是否在线;其次是扫描主机端口,嗅探所提供的网络服务;还可以推断主机所用的操作系统。Nmap可用于扫描仅有两个节点的LAN,直至500个节点以上的网络。Nmap还允许用户定制扫描技巧。通常,一个简单的使用ICMP协议的ping操作可以满足一般需求;也可以深入探测UDP或者TCP端口,直至主机所使用的操作系统;还可以将所有探测结果记录到各种格式的日志中,供进一步分析操作。
进行ping扫描,打印出对扫描做出响应的主机,不做进一步测试(如端口扫描或者操作系统探测):
nmap-sP192.168.1.0/24
仅列出指定网络上的每台主机,不发送任何报文到目标主机:
nmap-sL192.168.1.0/24
探测目标主机开放的端口,可以指定一个以逗号分隔的端口列表(如-PS22,23,25,80):
nmap-PS192.168.1.234
使用UDPping探测主机:
nmap-PU192.168.1.0/24
使用频率最高的扫描选项:SYN扫描,又称为半开放扫描,它不打开一个完全的TCP连接,执行得很快:
nmap-sS192.168.1.0/24
nmap安装
本文以linuxUbuntu16.04为例,最后主要用python操作
-
先安装nmap
sudoapt-getinstallnmap
2.再安装python-nmap
sudopipinstallpython-nmap
安装完之后python导入nmap测试验证是否成功
root@LiDebin:~#python
Python2.7.12(default,Jul12016,15:12:24)
[GCC5.4.020160609]onlinux2
Type"help","copyright","credits"or"license"formoreinformation.
>>>importnmap
python操作nmap
1.简单的小案例
创建PortScanner实例,然后扫描159.239.210.26这个IP的20-443端口。
importnmap
nm=nmap.PortScanner()
ret=nm.scan('115.239.210.26','20')
printret
返回格式如下:
{'nmap':{'scanstats':
{'uphosts':'1','timestr':'TueOct2511:30:472016','downhosts':'0','totalhosts':'1','elapsed':'1.11'},
'scaninfo':{'tcp':{'services':'20','method':'connect'}},'command_line':'nmap-oX--p20-sV115.239.210.26'},
'scan':{'115.239.210.26':{'status':{'state':'up','reason':'syn-ack'},'hostnames':[{'type':'','name':''}],
'vendor':{},'addresses':{'ipv4':'115.239.210.26'},
'tcp':{20:{'product':'','state':'filtered','version':'','name':'ftp-data','conf':'3','extrainfo':'',
'reason':'no-response','cpe':''}
}
}
}
}
2.内置方法:
还可以打印出简单的信息
importnmap
nm=nmap.PortScanner()
printnm.scaninfo()
#{u'tcp':{'services':u'20-443','method':u'syn'}}
printnm.command_line()
#u'nmap-oX--p20-443-sV115.239.210.26'
查看有多少个host
printnm.all_hosts()
#[u'115.239.210.26']
查看该host的详细信息
nm['115.239.210.26']
查看该host包含的所有协议
nm['115.239.210.26'].all_protocols()
查看该host的哪些端口提供了tcp协议
nm['115.239.210.26']['tcp']
nm['115.239.210.26']['tcp'].keys()
查看该端口是否提供了tcp协议
nm['115.239.210.26'].has_tcp(21)
还可以像这样设置nmap执行的参数
nm.scan(hosts='192.168.1.0/24',arguments='-n-sP-PE-PA21,23,80,3389')
更多操作请进官网http://xael.org/pages/python-nmap-en.html
实验案例
检测内网机器端口
1.定义函数库mytools.py
#-*-coding:utf-8-*-
importsmtplib
fromemail.mime.textimportMIMEText
fromemail.headerimportHeader
defsendemail(sender,receiver,subject,content,smtpserver,smtpuser,smtppass):
msg=MIMEText(content,'html','utf-8')#中文需参数‘utf-8',单字节字符不需要
msg['Subject']=Header(subject,'utf-8')
msg['From']='<%s>'%sender
msg['To']=";".join(receiver)
try:
smtp=smtplib.SMTP()
smtp.connect(smtpserver)
smtp.login(smtpuser,smtppass)
smtp.sendmail(sender,receiver,msg.as_string())
smtp.quit()
exceptException,e:
printe
2.实现端口扫描的程序,单线程版本nmscan.py
#!/usr/bin/python
#-*-coding:utf-8-*-
importnmap
importre
importmytoolsastool
importsys
reload(sys)
sys.setdefaultencoding('utf8')
defnmScan(hostlist,portrange,whitelist):
p=re.compile("^(\d*)\-(\d*)$")
iftype(hostlist)!=list:
help()
portmatch=re.match(p,portrange)
ifnotportmatch:
help()
l=[]
forhostinhostlist:
result=''
nm=nmap.PortScanner()
tmp=nm.scan(host,portrange)
result=result+"<h2>ip地址:%s主机名:[%s]......%s</h2><hr>"%(
host,tmp['scan'][host]['hostname'],tmp['scan'][host]['status']['state'])
try:
ports=tmp['scan'][host]['tcp'].keys()
exceptKeyError,e:
ifwhitelist:
whitestr=','.join(whitelist)
result=result+"未扫到开放端口!请检查%s端口对应的服务状态"%whitestr
else:
result=result+"扫描结果正常,无暴漏端口"
forportinports:
info=''
ifportnotinwhitelist:
info='<strong><fontcolor=red>Alert:非预期端口</font><strong> '
else:
info='<strong><fontcolor=green>Info:正常开放端口</font><strong> '
portinfo="%s<strong>port</strong>:%s <strong>state</strong>:%s <strong>product<strong/>:%s<br>"%(
info,port,tmp['scan'][host]['tcp'][port]['state'],
tmp['scan'][host]['tcp'][port]['product'])
result=result+portinfo
l.append([host,str(result)])
returnl
defhelp():
print"Usage:nmScan(['127.0.0.1',],'0-65535')"
if__name__=="__main__":
hostlist=['10.10.10.10','10.10.10.11']
portrange='0-65535'
whitelist=[80,443]
l=nmScan(hostlist,portrange,whitelist)
sender='75501664@qq.com'
receiver=['zhangyanlin8851@163.com','877986976@qq.com']
subject='服务器端口扫描'
smtpserver='smtp.exmail.qq.com'
smtpuser='zhangyanlin8851@163.cn'
smtppass='linuxidc163'
mailcontent=''
foriinrange(len(l)):
mailcontent=mailcontent+l[i][1]
tool.sendemail(sender,receiver,subject,mailcontent,smtpserver,smtpuser,smtppass)
3.多线程版本
#!/usr/bin/python
#-*-coding:utf-8-*-
importnmap
importre
importmytoolsastool
importsys
frommultiprocessingimportPool
fromfunctoolsimportpartial
reload(sys)
sys.setdefaultencoding('utf8')
defnmScan(host,portrange,whitelist):
p=re.compile("^(\d*)\-(\d*)$")
#iftype(hostlist)!=list:
#help()
portmatch=re.match(p,portrange)
ifnotportmatch:
help()
ifhost=='121.42.32.172':
whitelist=[25,]
result=''
nm=nmap.PortScanner()
tmp=nm.scan(host,portrange)
result=result+"<h2>ip地址:%s主机名:[%s]......%s</h2><hr>"%(
host,tmp['scan'][host]['hostname'],tmp['scan'][host]['status']['state'])
try:
ports=tmp['scan'][host]['tcp'].keys()
forportinports:
info=''
ifportnotinwhitelist:
info='<strong><fontcolor=red>Alert:非预期端口</font><strong> '
else:
info='<strong><fontcolor=green>Info:正常开放端口</font><strong> '
portinfo="%s<strong>port</strong>:%s <strong>state</strong>:%s <strong>product<strong/>:%s<br>"%(
info,port,tmp['scan'][host]['tcp'][port]['state'],tmp['scan'][host]['tcp'][port]['product'])
result=result+portinfo
exceptKeyError,e:
ifwhitelist:
whitestr=','.join(whitelist)
result=result+"未扫到开放端口!请检查%s端口对应的服务状态"%whitestr
else:
result=result+"扫描结果正常,无暴漏端口"
returnresult
defhelp():
print"Usage:nmScan(['127.0.0.1',],'0-65535')"
returnNone
if__name__=="__main__":
hostlist=['10.10.10.10','10.10.10.11']
portrange='0-65535'
whitelist=[80,443]
l=nmScan(hostlist,portrange,whitelist)
sender='75501664@qq.com'
receiver=['zhangyanlin8851@163.com','877986976@qq.com']
subject='服务器端口扫描'
smtpserver='smtp.exmail.qq.com'
smtpuser='zhangyanlin8851@163.cn'
smtppass='linuxidc163'
mailcontent=''
foriinrange(len(l)):
mailcontent=mailcontent+l[i][1]
tool.sendemail(sender,receiver,subject,mailcontent,smtpserver,smtpuser,smtppass)
本文内容总结:nmap概念及功能,概念,功能,nmap安装,python操作nmap,实验案例,
原文链接:https://www.cnblogs.com/aylin/p/5996229.html