天天看点

Python之渗透测试笔记(二)——python-nmap模块python-nmap 模块

python-nmap 模块

简介

  1. nmap以下功能:
  • 主机发现功能
  • 端口扫描
  • 服务器版本检测
  • 操作系统检测
  • 此外还有一些高级审计技术(伪造扫描段身份、绕过防火墙等)、脚本引擎NSE等。
  1. 安装python-nmap,须先安装nmap。
  • Windows直接下载安装
  • Linux需要如下命令:
  • sudo apt-get install nmap

  • sudo pip install python-nmap

  • 安装之后打开终端,启动python,导入nmap。
    Python之渗透测试笔记(二)——python-nmap模块python-nmap 模块

基本用法

  • python-nmap模块的核心PortScanner、PortScannerAsync、PortScannerError、PortScannerHostDict、PortScannerYield等5个类。
  1. python-nmap实例化
  • 最常用的PortScanner类,实现Nmap工具功能的封装。
>>>import nmap
>>> nm = nmap.PortScanner()
           
  • PortScannerAsync类,实现异步扫描。
  1. Python-nmap模块函数
  • PortScanner类的函数:
  • scan()

    :完整形式为sacn(self,host=‘127.0.0.1’,port=None,arguments=’-sV’,sudo=False),用来对指定目标进行扫描。参数

    hosts

    的值为字符串类型,表示要扫描的主机,形式可以是IP地址或域名;参数

    ports

    的值也是字符串类型,表示要扫描的端口,多个端口进行扫描时用逗号分隔开,连续扫描使用横线;参数

    arguments

    的值也是字符串类型,这个参数就是Nmap扫描时使用的参数("-sP"对目标主机进行ping主机在线扫描,"-PR"对目标主机进行ARP主机在线扫描,"-sS"对目标主机进行TCP半开SYN类型的端口扫描,"-sT"对目标主机进行TCP全开类型的端口扫描,"-O"表示扫描目标的操作系统类型,"-sV"扫描目标所安装网络服务软件的版本)。
>>> nm = nmap.PortScanner()
>>> nm.scan('192.168.1.6','1-500','-sS')	#对192.168.1.6的1-500端口进行一次TCP半开扫描  
           
  • all_hosts()

    :返回一个被扫描的所有主机列表。
>>> nm.all_hosts()
['192.168.1.6']
           
  • command_line()

    :返回在当前扫描中使用的命令行。
>>> nm.command_line()
'nmap -oX - -p 1-500 -sS 192.168.1.6'
           
  • csv()

    :返回值是一个CSV(逗号分隔值文件格式)的输出。
>>> nm.csv()
'host;hostname;hostname_type;protocol;port;name;state;product;extrainfo;reason;version;conf;cpe\r\n192.168.1.6;win-ojspvlsmn7r;PTR;tcp;135;msrpc;open;;;syn-ack;;3;\r\n192.168.1.6;win-ojspvlsmn7r;PTR;tcp;139;netbios-ssn;open;;;syn-ack;;3;\r\n192.168.1.6;win-ojspvlsmn7r;PTR;tcp;445;microsoft-ds;open;;;syn-ack;;3;\r\n   
#若想看清楚点,可以使用print
>>> print(nm.csv())
host;hostname;hostname_type;protocol;port;name;state;product;extrainfo;reason;version;conf;cpe
192.168.1.6;win-ojspvlsmn7r;PTR;tcp;135;msrpc;open;;;syn-ack;;3;
192.168.1.6;win-ojspvlsmn7r;PTR;tcp;139;netbios-ssn;open;;;syn-ack;;3;
192.168.1.6;win-ojspvlsmn7r;PTR;tcp;445;microsoft-ds;open;;;syn-ack;;3;
           
  • has_host(self,host)

    :检查是否有host的扫描结果,如果有则返回True,否则返回False。
>>> nm.has_host("192.168.1.6")
True
>>> nm.has_host("192.168.1.1")
False
           
  • scaninfo()

    :列出扫描信息的结构。
>>> nm.scaninfo()
{'tcp': {'services': '1-500', 'method': 'syn'}}
           
>>> nm['192.168.1.6'].hostname() #获取192.168.1.6的主机名,通常为用户记录。
''
>>> nm['192.168.1.6'].state()	#获取192.168.1.6的状态(up|down|unknown|skipped)
'up'
>>> nm['192.168.1.6'].all_protocols()	#获取执行的协议['tcp','udp']包含(IP|TCP|UDP|SCTP)
['tcp']
>>> nm['192.168.1.6'].keys()	#获取TCP()所有的端口号
['status', 'hostnames', 'vendor', 'addresses', 'tcp']
>>> nm['192.168.1.6'].all_tcp()		#获取TCP()所有的端口号(按照端口号大小进行排序)
[135, 139, 445]
>>> nm['192.168.1.6'].all_udp()		#获取UDP()所有的端口号(按照端口号大小进行排序)
[]
>>> nm['192.168.1.6'].all_sctp()	#获取SCTP()所有的端口号(按照端口号大小进行排序)
[]
>>> nm['192.168.1.6'].has_tcp(135)	 #主机192.168.1.6是否有关于135端口的任何信息
True
>>> nm['192.168.1.6']['tcp'][135]	#获取主机192.168.1.6关于135端口的信息
{'product': '', 'state': 'open', 'version': '', 'name': 'msrpc', 'conf': '3', 'extrainfo': '', 'reason': 'syn-ack', 'cpe': ''}  
>>> nm['192.168.1.6'].tcp(135)		#获取主机192.168.1.6关于135端口的信息
{'product': '', 'state': 'open', 'version': '', 'name': 'msrpc', 'conf': '3', 'extrainfo': '', 'reason': 'syn-ack', 'cpe': ''}
>>> nm['192.168.1.6']['tcp'][135]['state']   #获取主机192.168.1.6的135端口的状态(open)
'open'
           
  • PortScannerAsync类的函数
  • scan()

    :多一个回调函数,完整形式为scan(self,hosts=‘127.0.0.1’,port=None,arguments=’-sV’,callback=None,sudo=False),这里的callback是(host,scan_data)为参数的函数。
>>> nma = nmap.PortScannerAsync()
>>> nma.scan(hosts = "192.168.1.0/24",arguments = '-sP')	#或nma.scan("192.168.1.0/24",arguments = '-sP') 
           
  • still_scanning()

    :如果扫描正在进行,则返回True,否则返回False。
>>> sta = nma.still_scanning()
>>> sta
False
           
  • wait(self,time=None)

    :表示等待时间
  • stop()

    :停止当前扫描。