nmap概念及功能

概念

NMap,也就是Network Mapper,最早是Linux下的网络扫描和嗅探工具包。

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

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

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

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

功能

基本功能有三个,一是探测一组主机是否在线;其次是扫描 主机端口,嗅探所提供的网络服务;还可以推断主机所用的操作系统 。Nmap可用于扫描仅有两个节点的LAN,直至500个节点以上的网络。Nmap 还允许用户定制扫描技巧。通常,一个简单的使用ICMP协议的ping操作可以满足一般需求;也可以深入探测UDP或者TCP端口,直至主机所 使用的操作系统;还可以将所有探测结果记录到各种格式的日志中, 供进一步分析操作。

进行ping扫描,打印出对扫描做出响应的主机,不做进一步测试(如端口扫描或者操作系统探测):

  1. nmap -sP 192.168.1.0/

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

  1. nmap -sL 192.168.1.0/

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

  1. nmap -PS 192.168.1.234

使用UDP ping探测主机:

  1. nmap -PU 192.168.1.0/

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

  1. nmap -sS 192.168.1.0/

nmap安装

本文以linux Ubuntu16.04为例,最后主要用python操作

1. 先安装nmap

  1. sudo apt-get install nmap

2.再安装python-nmap

  1. sudo pip install python-nmap

安装完之后python导入nmap测试验证是否成功

  1. root@LiDebin:~# python
  2. Python 2.7.12 (default, Jul 1 2016, 15:12:24)
  3. [GCC 5.4.0 20160609] on linux2
  4. Type "help", "copyright", "credits" or "license" for more information.
  5. >>> import nmap

python操作nmap

1.简单的小案例

创建PortScanner实例,然后扫描159.239.210.26这个IP的20-443端口。

  1. import nmap
  2.  
  3. nm = nmap.PortScanner()
  4. ret = nm.scan('115.239.210.26','')
  5. print ret
  6.  
  7. 返回格式如下:
  8. {'nmap': {'scanstats':
  9. {'uphosts': '', 'timestr': 'Tue Oct 25 11:30:47 2016', 'downhosts': '', 'totalhosts': '', 'elapsed': '1.11'},
  10. 'scaninfo': {'tcp': {'services': '', 'method': 'connect'}}, 'command_line': 'nmap -oX - -p 20 -sV 115.239.210.26'},
  11. 'scan': {'115.239.210.26': {'status': {'state': 'up', 'reason': 'syn-ack'}, 'hostnames': [{'type': '', 'name': ''}],
  12. 'vendor': {}, 'addresses': {'ipv4': '115.239.210.26'},
  13. 'tcp': {20: {'product': '', 'state': 'filtered', 'version': '', 'name': 'ftp-data', 'conf': '', 'extrainfo': '',
    'reason': 'no-response', 'cpe': ''}
  14. }
  15. }
  16. }
  17. }

2.内置方法:

还可以打印出简单的信息

  1. import nmap
  2. nm = nmap.PortScanner()
  3. print nm.scaninfo()
  4. # {u'tcp': {'services': u'20-443', 'method': u'syn'}}
  5. print nm.command_line()
  6. # u'nmap -oX - -p 20-443 -sV 115.239.210.26'

查看有多少个host

  1. print nm.all_hosts()
  2. # [u'115.239.210.26']

查看该host的详细信息

  1. nm['115.239.210.26']

查看该host包含的所有协议

  1. nm['115.239.210.26'].all_protocols()

查看该host的哪些端口提供了tcp协议

  1. nm['115.239.210.26']['tcp']
  2.  
  3. nm['115.239.210.26']['tcp'].keys()

查看该端口是否提供了tcp协议

  1. nm['115.239.210.26'].has_tcp(21)

还可以像这样设置nmap执行的参数

  1. 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

  1. #-*- coding:utf-8 -*-
  2. import smtplib
  3. from email.mime.text import MIMEText
  4. from email.header import Header
  5. def sendemail(sender,receiver,subject,content,smtpserver,smtpuser,smtppass):
  6. msg = MIMEText(content,'html','utf-8')#中文需参数‘utf-8',单字节字符不需要
  7. msg['Subject'] = Header(subject, 'utf-8')
  8. msg['From'] = '<%s>' % sender
  9. msg['To'] = ";".join(receiver)
  10. try:
  11. smtp = smtplib.SMTP()
  12. smtp.connect(smtpserver)
  13. smtp.login(smtpuser, smtppass)
  14. smtp.sendmail(sender, receiver, msg.as_string())
  15. smtp.quit()
  16. except Exception,e:
  17. print e

2. 实现端口扫描的程序,单线程版本nmscan.py

  1. # !/usr/bin/python
  2. # -*- coding:utf-8 -*-
  3.  
  4. import nmap
  5. import re
  6. import mytools as tool
  7. import sys
  8.  
  9. reload(sys)
  10. sys.setdefaultencoding('utf8')
  11.  
  12. def nmScan(hostlist, portrange, whitelist):
  13. p = re.compile("^(\d*)\-(\d*)$")
  14.  
  15. if type(hostlist) != list:
  16. help()
  17. portmatch = re.match(p, portrange)
  18. if not portmatch:
  19. help()
  20. l = []
  21. for host in hostlist:
  22. result = ''
  23. nm = nmap.PortScanner()
  24. tmp = nm.scan(host, portrange)
  25. result = result + "<h2>ip地址:%s 主机名:[%s] ...... %s</h2><hr>" % (
  26. host, tmp['scan'][host]['hostname'], tmp['scan'][host]['status']['state'])
  27. try:
  28. ports = tmp['scan'][host]['tcp'].keys()
  29. except KeyError, e:
  30. if whitelist:
  31. whitestr = ','.join(whitelist)
  32. result = result + "未扫到开放端口!请检查%s端口对应的服务状态" % whitestr
  33. else:
  34. result = result + "扫描结果正常,无暴漏端口"
  35. for port in ports:
  36. info = ''
  37. if port not in whitelist:
  38. info = '<strong><font color=red>Alert:非预期端口</font><strong>&nbsp;&nbsp;'
  39. else:
  40. info = '<strong><font color=green>Info:正常开放端口</font><strong>&nbsp;&nbsp;'
  41. portinfo = "%s <strong>port</strong> : %s &nbsp;&nbsp;<strong>state</strong> : %s &nbsp;&nbsp;<strong>product<strong/> : %s <br>" % (
  42. info, port, tmp['scan'][host]['tcp'][port]['state'],
  43. tmp['scan'][host]['tcp'][port]['product'])
  44. result = result + portinfo
  45. l.append([host, str(result)])
  46. return l
  47.  
  48. def help():
  49. print "Usage: nmScan(['127.0.0.1',],'0-65535')"
  50.  
  51. if __name__ == "__main__":
  52. hostlist = ['10.10.10.10', '10.10.10.11']
  53. portrange = '0-65535'
  54. whitelist = [80, 443]
  55. l = nmScan(hostlist, portrange, whitelist)
  56. sender = '75501664@qq.com'
  57. receiver = ['zhangyanlin8851@163.com', '877986976@qq.com']
  58. subject = '服务器端口扫描'
  59. smtpserver = 'smtp.exmail.qq.com'
  60. smtpuser = 'zhangyanlin8851@163.cn'
  61. smtppass = 'linuxidc163'
  62. mailcontent = ''
  63. for i in range(len(l)):
  64. mailcontent = mailcontent + l[i][1]
  65. tool.sendemail(sender, receiver, subject, mailcontent, smtpserver, smtpuser, smtppass)

3.多线程版本

  1. # !/usr/bin/python
  2. # -*- coding:utf-8 -*-
  3.  
  4. import nmap
  5. import re
  6. import mytools as tool
  7. import sys
  8. from multiprocessing import Pool
  9. from functools import partial
  10.  
  11. reload(sys)
  12. sys.setdefaultencoding('utf8')
  13.  
  14. def nmScan(host, portrange, whitelist):
  15. p = re.compile("^(\d*)\-(\d*)$")
  16. # if type(hostlist) != list:
  17. # help()
  18. portmatch = re.match(p, portrange)
  19. if not portmatch:
  20. help()
  21.  
  22. if host == '121.42.32.172':
  23. whitelist = [25, ]
  24. result = ''
  25. nm = nmap.PortScanner()
  26. tmp = nm.scan(host, portrange)
  27. result = result + "<h2>ip地址:%s 主机名:[%s] ...... %s</h2><hr>" % (
  28. host, tmp['scan'][host]['hostname'], tmp['scan'][host]['status']['state'])
  29. try:
  30. ports = tmp['scan'][host]['tcp'].keys()
  31. for port in ports:
  32. info = ''
  33. if port not in whitelist:
  34. info = '<strong><font color=red>Alert:非预期端口</font><strong>&nbsp;&nbsp;'
  35. else:
  36. info = '<strong><font color=green>Info:正常开放端口</font><strong>&nbsp;&nbsp;'
  37. portinfo = "%s <strong>port</strong> : %s &nbsp;&nbsp;<strong>state</strong> : %s &nbsp;&nbsp;<strong>product<strong/> : %s <br>" % (
  38. info, port, tmp['scan'][host]['tcp'][port]['state'], tmp['scan'][host]['tcp'][port]['product'])
  39. result = result + portinfo
  40. except KeyError, e:
  41. if whitelist:
  42. whitestr = ','.join(whitelist)
  43. result = result + "未扫到开放端口!请检查%s端口对应的服务状态" % whitestr
  44. else:
  45. result = result + "扫描结果正常,无暴漏端口"
  46. return result
  47.  
  48. def help():
  49. print "Usage: nmScan(['127.0.0.1',],'0-65535')"
  50. return None
  51.  
  52. if __name__ == "__main__":
  53. hostlist = ['10.10.10.10', '10.10.10.11']
  54. portrange = '0-65535'
  55. whitelist = [80, 443]
  56. l = nmScan(hostlist, portrange, whitelist)
  57. sender = '75501664@qq.com'
  58. receiver = ['zhangyanlin8851@163.com', '877986976@qq.com']
  59. subject = '服务器端口扫描'
  60. smtpserver = 'smtp.exmail.qq.com'
  61. smtpuser = 'zhangyanlin8851@163.cn'
  62. smtppass = 'linuxidc163'
  63. mailcontent = ''
  64. for i in range(len(l)):
  65. mailcontent = mailcontent + l[i][1]
  66. tool.sendemail(sender, receiver, subject, mailcontent, smtpserver, smtpuser, smtppass)

 

python-nmap使用及案例的更多相关文章

  1. Python的元编程案例

    Python的元编程案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是元编程 元编程概念来自LISP和smalltalk. 我们写程序是直接写代码,是否能够用代码来生成 ...

  2. 主成分分析PCA数据降维原理及python应用(葡萄酒案例分析)

    目录 主成分分析(PCA)——以葡萄酒数据集分类为例 1.认识PCA (1)简介 (2)方法步骤 2.提取主成分 3.主成分方差可视化 4.特征变换 5.数据分类结果 6.完整代码 总结: 1.认识P ...

  3. LDA线性判别分析原理及python应用(葡萄酒案例分析)

    目录 线性判别分析(LDA)数据降维及案例实战 一.LDA是什么 二.计算散布矩阵 三.线性判别式及特征选择 四.样本数据降维投影 五.完整代码 结语 一.LDA是什么 LDA概念及与PCA区别 LD ...

  4. Selenium2+python自动化10-登录案例

    前言 前面几篇都是讲一些基础的定位方法,没具体的案例,小伙伴看起来比较枯燥,有不少小伙伴给小编提建议以后多出一些具体的案例.本篇就是拿部落论坛作为测试项目,写一个简单的登录测试脚本. 在写登录脚本的时 ...

  5. Python爬虫(十一)_案例:使用正则表达式的爬虫

    本章将结合先前所学的爬虫和正则表达式知识,做一个简单的爬虫案例,更多内容请参考:Python学习指南 现在拥有了正则表达式这把神兵利器,我们就可以进行对爬取到的全部网页源代码进行筛选了. 下面我们一起 ...

  6. Python爬虫(十三)_案例:使用XPath的爬虫

    本篇是使用XPath的案例,更多内容请参考:Python学习指南 案例:使用XPath的爬虫 现在我们用XPath来做一个简单的爬虫,我们尝试爬取某个贴吧里的所有帖子且将该帖子里每个楼层发布的图片下载 ...

  7. python nmap

    #!/usr/bin/env python# -*- coding: utf-8 -*-import sysimport nmap scan_row = []input_data = input('P ...

  8. python(nmap模块、多线程模块)

    http://xael.org/pages/python-nmap-en.html       nmap模块 http://www.tutorialspoint.com/python/python_m ...

  9. Python中日期时间案例演示

    案例:准备10个人姓名,然后为这10个人随机生成生日[都是90后] 1.统计出那些人是夏季[6月-8月]出生的. 2.最大的比最小的大多少天 3.谁的生日最早,谁的生日最晚 备注:春季[3-5]夏季[ ...

  10. python nmap模块使用进行主机探测(ICMP)

    终于审核通过了......第一次用博客,想记录自己的学习情况,分享知识. 废话不多说,第一篇blog,大牛请轻喷. 资产清点首先需要进行主机探测,将存活主机统计下来再进行进一步的指纹识别及端口探测.若 ...

随机推荐

  1. B/S 端构建的基于 WebGL 3D 可视化档案馆管理系统

    前言 档案管理系统是通过建立统一的标准以规范整个文件管理,包括规范各业务系统的文件管理的完整的档案资源信息共享服务平台,主要实现档案流水化采集功能.为企事业单位的档案现代化管理,提供完整的解决方案,档 ...

  2. 如和用python给女朋友做个专属她的软件

    如和用python给女朋友做个专属她的软件 在学习python的路上如果觉得枯燥就可以想我一样做一些有趣的事情就不会无聊了 python是一门及其有趣的语言. 人们都喜欢记住一些重要的日子,比如说跟女 ...

  3. 题解:2018级算法第二次上机 Zexal的竞赛

    题目描述: 样例: 实现解释: 一道需要一点思考的动态规划题目 知识点:动态规划,数据记录 首先将题目描述调整:分别输入不同分数的题目总分(便于后续计算),当获得了i分数的总分后无法获得i-1和i+1 ...

  4. Asp.net内置对象用途说明

    Asp.net 内置对象 1.Session当客户第一次请求网页,session创建.当客户最后一次请求页面,一段时间后,session销毁.默认30分钟. 一般存用户信息,即登陆成功后,在sessi ...

  5. MySQL学习(二)索引原理及其背后的数据结构

    首先区分几个概念: 聚集索引 主索引和辅助索引(即二级索引) innodb中每个表都有一个聚簇索引(clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引(sec ...

  6. Podman 使用指南

    原文链接:Podman 使用指南 Podman 原来是 CRI-O 项目的一部分,后来被分离成一个单独的项目叫 libpod.Podman 的使用体验和 Docker 类似,不同的是 Podman 没 ...

  7. django自带cache结合redis创建永久缓存

    0916自我总结 django自带cache结合redis创建永久缓存 1.redis库 1.安装redis与可视化操作工具 1.安装redis https://www.runoob.com/redi ...

  8. Detours 劫持

    在使用 Detours 劫持之前必须得拥有这两个东西:detours.h 和 detours.lib. 为了这两个东西我真的是弄了大半天,本着自己动手丰衣足食的思想: 我去 GitHub 克隆了一份来 ...

  9. powershell 基础

    目录 本教程概述 用到的工具 标签 简介 0x01使用简介 0x02脚本编写 0x03实例讲解 本教程概述 本课我们学习powershell使用. 用到的工具 cmd.exe   powershell ...

  10. 元素定位之css选择器(1)

    CSS选择器用于选择你想要的元素的样式的模式. "CSS"列表示在CSS版本的属性定义(CSS1,CSS2,或对CSS3). 表格部分摘自菜鸟教程:https://www.runo ...