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本文以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. >>>importnmap1.简单的小案例
创建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() #{utcp:{services:u20-443,method:usyn}} printnm.command_line() #unmap-oX--p20-443-sV115.239.210.26查看有多少个host
printnm.all_hosts() #[u115.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: printe2.实现端口扫描的程序,单线程版本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