nmap学习

Posted kalixcn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nmap学习相关的知识,希望对你有一定的参考价值。

Nmap概述

Namp是一个免费的开源网络扫描和嗅探工具,可以用来扫描计算机上开放的端口,确定哪些服务运行在那些端口,并且推断出计算机运行的操作系统。利用该工具,可以评估网络基础的安全性。
Nmap的四项功能:

  • 主机发现
  • 端口扫描
  • 版本侦测
  • 操作系统探测

工作原理:

  1. 发送探针并分析响应包的特征。(探针(Probe)是基于协议功能和特性,使用特定端口和数据载荷所构建的数据包)。
  2. 指纹信息就是目标主机响应包的特征信息,如TCP标志位、ARP应答报文、ICMP应答报文等等,通过这些指纹信息可以判断主机的状态和端口状态。

在Linux系统中,Nmap工具默认安装在/usr/share/nmap目录下,脚本默认在/usr/share/nmap/scripts.

nmap -V    #查看nmap版本信息

#输出*********************************
# map version 7.93 ( https://nmap.org )
#版本号
# Platform: x86_64-pc-linux-gnu
#操作系统
# Compiled with: liblua-5.3.6 openssl-3.0.7 libssh2-1.10.0 libz-1.2.13 libpcre-8.39 nmap-libpcap-1.7.3 nmap-libdnet-1.12 ipv6
#编译库
# Compiled without:
# Available nsock engines: epoll poll select    
#可以套接字引擎                                     

--dns-servers <serv1,[serv2],...>:指定特定的NDS服务器地址。
--system-dns:使用操作系统的DNS解析器。
-sL(Scan List):列出扫描的目标
-iL(Input from List)<inputfilename>:指定主机或网络列表文件
--resolve-all:指定扫描主机中的所有IP地址

实例:

nmap --dns-servers 114.114.114.114 www.baidu.com

nmap --system-dns www.baidu.com

#扫描连续主机IP地址,如扫描10.10.1.100-10.10.1.200

#cat ip.txt
# 10.10.1.132
# 10.10.1.135
# 10.10.1.168
nmap -iL ip.txt    #对指定文件中的IP进行扫描
nmap -iL ip.txt -sL   #

nmap --resolve-all www.baidu.com  #扫描主机www.baidu.com中的所有IP地址

--exclude <host1,host2..>:指定排除的主机
--excludefile <exclude_file>:指定排除的主机文件列表
#扫描192.168.198.0/24网络中所有主机,但不扫描192.169.0-100范围内的主机
nmap 192.169.198.0/24 --exclude 192.168.198.1-100 -sL

--iR <num hosts>:指定随机扫描的主机数
#随机扫描5个主机并列出来
nmap -iR 5 -sL

-A:实施全部扫描,探测目标主机的操作系统和版本信息

渗透步骤:

  1. 发现主机
    在Nmap中,可以通过不同的方式来发现主机,如IP发现,ICMP发现、TCP发现和UDP发现。

    • IP发现
      -PO <protocol list>:使用IP数据包探测目标主机是否开启,其中,protocol list是协议编号列表。如17(UDP)、1(ICMP)、6(TCP)、4(IP)。
      -sn:实施ping扫描,禁止端口扫描
      -PE:实施ICMP Echo探测请求发现。其中P是ping的首字母,E是ICMP Echo的首字母。
      -PP:ICMP时间戳Ping扫描。
      -PM:进行ICMP地址掩码Ping扫描。
      -PS<portlist>:实施TCP SYN Ping扫描
      -PA<portlist>:实施TCP ACK扫描
      -PU<portlist>:实施UDP Ping扫描
      -PR:实施ARP Ping扫描
      -R:对IP地址进行反向域名解析
      -n:禁止域名解析
      --traceroute:实施路由追踪
      --packet-trace:显示包发送
      如果目标主机禁用Ping发现,则可以跳过主机发现,直接进行其他扫描,使用这种方法可以很好地规避防火墙
      -P0:跳过主机发现
      -Pn:跳过主机发现
  2. 扫描端口
    -p:指定扫描端口
    实例:

    扫描UDP的53和137端口,扫描TCP的25和80端口
    nmap  -Pn -sU -sS U:53,137,T:25,80
    

    --exclude-ports<portranges>:指定排除端口
    namp -r <target>:实施顺序扫描

    -sT:TCP全连接扫描
    -sS:SYN半连接扫描

    隐蔽扫描:

    nmap 10.10.10.129 -p 80 -sF  # Fin扫描
    nmap 10.10.10.129 -p 80 -sN  # Null扫描(所有flags都为0的TCP包)
    nmap 10.10.129 -p 80 -sX  # Xmas扫描(flags的FIN、URG、PUSH都为1的包)
    
  3. 服务识别

nmap 10.10.10.129 -p -sV
  1. 系统识别
nmap 10.10.10.129 -O
  1. 扫描结果导出
    1. 导出为文本格式
    nmap 10.10.10.129 -oN result.txt
    
    1. 导出为xml格式
    nmap 10.10.10.129 -oX result.xml
    

6. 逃避防火墙和IDS检测
--source-port <portnum>:指定信任源端口
-g <portnum>:指定信任的源端口

实例:使用被信任的源端口67对目标实施主机发现

nmap -sn -PS --source-port 67 10.10.10.129

--badsum:使用一个伪TCP/UDP/SCTP校验值发送探测数据包。
--adler32:用于指定SCTP校验值。

nmap --badsum -sn 10.10.10.129

数据载荷指发送的数据报中所包含的数据,通过添加数据载荷伪造成有意义的数据包,逃避防火墙或者IDS检测。
--data-length<num>:指定数据包长度的随机数
--date-string:指定一个文本值的数据

报文分段是将一个数据包分成许多更小的分片,来逃避防火墙或者IDS检测。
-f<var>:设置分片大小
--mtu<val>:设置最大传输单元值

--ttl<val>:设置一个TTL值,其中,TTL值的范围为0~255。

脚本使用

Nmap脚本主要分为以下几类:
auth:负责处理认证证书(绕过认证)的脚本,如enum-users。
broadcast:在局域网内探测更多的服务开启情况脚本。
brute:用来暴力破解的脚本,如http-brute和snmp-brute。
discovery:对网络进行扫描,如SMB枚举和SNMP查询。
dos:用来进行拒绝访问工具。
fuzzer:探测主机潜在漏洞。
vuln:负责检查目标主机是否有常见的漏洞
malware:探测目标主机是否开启后门或者感染病毒。
intrusive:入侵性脚本。
safe:安全类型

更新脚本

nmap --script-updatedb

--script-help=<Lus scripts>:查看脚本帮助信息

实例:
使用ftp-anon脚本对目标实施扫描

nmap -p 21 --script=ftp-anon 10.10.10.129

使用vuln类脚本实施扫描

nmap --script=vuln 10.10.10.129

指定脚本参数,如果不指定将使用默认参数
--script-args-file=filename:指定脚本参数文件列表
--script-args=<n1..n2>:指定参数
实例:使用ftp-brute对服务进行暴力破解

nmap -p 21 --script=ftp-brute --script-args userdb=user.txt,passdb=password.txt

扫描整个局域网中活动的主机

nmap -sL --script=targets-sniffer --script-args=newtargets,targets-sniffer.timeout=4s,targets-sniffer.iface=eth0 

监听广播包

nmap --script=broadcast-listener -e eth0 

探测防火墙

nmap --script=firewalk --traceroute www.baidu.com

获取路由器跟踪位置

nmap --traceroute --script=traceroute-geolocation www.baidu.com

广播ping发现主机

nmap -e eth0 --script=broadcast-ping <target > [--ttl <ttl>][--data-length]<payload_length>

探测IP转发

 nmap -sn <target> --script ip-forwarding --script-args=\'target=www.example.com\'

使用字典暴力爆破子域名

nmap --script=dns-brute baidu.com

探测基本认证信息

nmap --script http-auth 10.10.22.1

探测默认账号

nmap --script=http-default-accounts 10.10.11.1

探测使用方法

nmap --script=http-methods 10.10.10.1

获取HTTP注释信息

nmap -p 80 --script=http-comments-displayer.nse 10.10.10.129

获取邮件地址

nmap --script=http-grep -p 80 10.10.10.129

查看http是否开启TRACE方法

nmap --script=http-trace -p 80 10.10.10.129

探测目标主机Telnet服务是否支持加密

nmap -p 23 --script=telnet-encrytion 10.10.10.129

破解Telnet服务密码

nmap -p 23 --script=telnet-brute 10.10.10.129

探测SSH服务
查看SSH服务的密钥信息

nmap --script=ssh-hostkey --script-args=ssh_hostkey=full 10.10.10.129

查看目标主机支持的SSH2协议算法

nmap --script=ssh2-enum-algos 10.10.10.129

检查MySQL空密码

nmap --script=mysql-empty-password 10.10.10.129  

暴力破解mysql用户密码

nmap --script=mysql-brute -p 3306 10.10.10.129

枚举MySQL数据库用户信息

nmap --script=mysql-enum -p 3306 10.10.10.129

SQL Server的超级用户sa,使用端口为1433
破解SQL Server数据库的用户密码

nmap -p 1433 --script=ms-sql-info 10.10.10.129
nmap -p 1433 --script=ms-sql-brute 10.10.10.129

查看ftp是否允许匿名登录

nmap --script=ftp-anon 10.10.10.129

python模块学习----nmap模块

安装nmap模块:

pip install python_nma


nmap模块说明:

python-nmap是一个帮助使用nmap端口扫描器的python库。它允许轻松操纵nmap扫描结果,并且将是一个完美的选择,为需要自动完成扫描任务的系统管理员提供的工具并报告。它也支持nmap脚本输出。


nmap模块类:

ET:Python的轻量级XML支持

PortScanner:端口扫描

PortScannerAsync:异步进行端口扫描

PortScannerError:nmap的异常错误类

PortScannerHostDict:用于存储和访问主机扫描结果的特殊小类

PortScannerYield:通过生成器使用Python中的nmap

Process:表示在单独的过程中运行的活动,应该是控制扫描进程之类的

convert_nmap_output_to_encoding:编码

csv:CSV操作模块

io:

nmap:

os:

re:

shlex:

subprocess:

sys:


看大概意思就知道,我们这里主要是用PortScanner、PortScannerError、PortScannerHostDict这三个类


PortScanner:普通端口扫描类

初始化PortScanner类,首先看看该模块的__init__构造函数说明。

检测系统和nmap版本上的nmap,如果在路径中找不到nmap,可能会引发PortScannerError异常

__init__(self, nmap_search_path=('nmap', '/usr/bin/nmap', '/usr/local/bin/nmap', '/sw/bin/nmap', '/opt/local/bin/nmap'))

如果你调用PortScanner模块异常,可能就是nmap_search_path默认路径里没找到你安装的nmap可执行文件,需要你手动修改此参数默认值即可。


该类里的方法说明:

all_hosts():返回所有主机的排序列表

analyse_nmap_xml_scan(nmap_xml_output=None, nmap_err='', nmap_err_keep_trace='', nmap_warn_keep_trace=''):分析NMAP xml扫描输出
param nmap_xml_output:要分析的xml字符串

command_line():返回用于扫描的命令行

csv():将CSV输出作为文本返回

get_nmap_last_output():以原始文本返回nmap的最后文本输出

has_host(host):如果主机有结果则返回True,否则返回False

listscan(hosts='127.0.0.1'):不要扫描,但解释目标主机并返回一个主机列表

nmap_version():如果检测到返回nmap版本

scan(hosts='127.0.0.1', ports=None, arguments='-sV', sudo=False):扫描指定的主机
如果nmap输出不是xml,可能会引发PortScannerError异常
hosts:需要扫描的IP或IP段
ports:扫描的端口
arguments:nmap的参数字符串'-sU -sX -sC'
sudo:是否使用sudo启动nmap

scaninfo():返回scaninfo结构{'tcp': {'services': '22', 'method': 'connect'}}

scanstats():返回scanstats结构{'uphosts': '3', 'timestr': 'Thu Jun  3 21:45:07 2010', 'downhosts': '253', 'totalhosts': '256', 'elapsed': '5.79'}


实例演示:

>>> nm = nmap.PortScanner() #实例化普通端口扫描对象nm
>>> nm.nmap_version() #看看当前系统nmap版本
(7, 70) #当前版本为nmap7.7

>>> date = nm.scan('127.0.0.1','22','-sV') #进行扫描,会弹出nmap cmd窗口,会一直等待扫描结束,然后返回json格式的扫描结果date
{'nmap': {'command_line': 'nmap -oX - -p 22 -sV 127.0.0.1', 'scaninfo': {'tcp': {'method': 'syn', 'services': '22'}}, 'scanstats': {'timestr': 'Fri Apr 13 10:43:29 2018', 'elapsed': '8.71', 'uphosts': '1', 'downhosts': '0', 'totalhosts': '1'}}, 'scan': {'127.0.0.1': {'hostnames': [{'name': '', 'type': ''}], 'addresses': {'ipv4': '127.0.0.1'}, 'vendor': {}, 'status': {'state': 'up', 'reason': 'localhost-response'}, 'tcp': {22: {'state': 'open', 'reason': 'syn-ack', 'name': 'ssh', 'product': 'Microsoft Windows IoT sshd', 'version': '1.100', 'extrainfo': 'protocol 2.0', 'conf': '10', 'cpe': 'cpe:/o:microsoft:windows_10:::iot_core'}}}}}
>>> nm.all_hosts()
['127.0.0.1']
>>> nm.command_line()
'nmap -oX - -p 22 -sV 127.0.0.1'
>>> nm.csv()
'host;hostname;hostname_type;protocol;port;name;state;product;extrainfo;reason;version;conf;cpe\r\n127.0.0.1;;;tcp;22;ssh;open;Microsoft Windows IoT sshd;protocol 2.0;syn-ack;1.100;10;cpe:/o:microsoft:windows_10:::iot_core\r\n'
>>> nm.get_nmap_last_output()
'<?xml version="1.0" encoding="UTF-8"?>\r\n<!DOCTYPE nmaprun>\r\n<?xml-stylesheet href="file:///d:/Program Files (x86)/Nmap/nmap.xsl" type="text/xsl"?>\r\n<!-- Nmap 7.70 scan initiated Fri Apr 13 10:43:20 2018 as: nmap -oX - -p 22 -sV 127.0.0.1 -->\r\n<nmaprun scanner="nmap" args="nmap -oX - -p 22 -sV 127.0.0.1" start="1523587400" startstr="Fri Apr 13 10:43:20 2018" version="7.70" xmloutputversion="1.04">\r\n<scaninfo type="syn" protocol="tcp" numservices="1" services="22"/>\r\n<verbose level="0"/>\r\n<debugging level="0"/>\r\n<host starttime="1523587408" endtime="1523587409"><status state="up" reason="localhost-response" reason_ttl="0"/>\r\n<address addr="127.0.0.1" addrtype="ipv4"/>\r\n<hostnames>\r\n</hostnames>\r\n<ports><port protocol="tcp" portid="22"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="ssh" product="Microsoft Windows IoT sshd" version="1.100" extrainfo="protocol 2.0" ostype="Windows 10 IoT Core" method="probed" conf="10"><cpe>cpe:/o:microsoft:windows_10:::iot_core</cpe></service></port>\r\n</ports>\r\n<times srtt="0" rttvar="5000" to="100000"/>\r\n</host>\r\n<runstats><finished time="1523587409" timestr="Fri Apr 13 10:43:29 2018" elapsed="8.71" summary="Nmap done at Fri Apr 13 10:43:29 2018; 1 IP address (1 host up) scanned in 8.71 seconds" exit="success"/><hosts up="1" down="0" total="1"/>\r\n</runstats>\r\n</nmaprun>\r\n'
>>> nm.scaninfo()
{'tcp': {'method': 'syn', 'services': '22'}}
>>> nm.scanstats()
{'timestr': 'Fri Apr 13 10:43:29 2018', 'elapsed': '8.71', 'uphosts': '1', 'downhosts': '0', 'totalhosts': '1'}
>>>


PortScannerHostDict类说明:

该类里的方法说明:

all_ip():返回ip端口列表

all_protocols():返回所有扫描协议的列表
>>> nm['127.0.0.1'].all_protocols()
['tcp']

all_sctp():返回sctp端口列表

all_tcp():返回tcp端口列表
>>> nm['127.0.0.1'].all_tcp()
[22]

all_udp():返回udp端口列表

has_ip(port):如果ip端口具有info,则返回true,否则返回False

has_sctp(port):如果sctp端口有info,则为真,否则为False

has_tcp(port):如果tcp端口有info,则返回true,否则返回False

has_udp(port):如果udp端口有info,则返回true,否则返回False

hostname():返回用户记录或列表主机名的第一个主机名

hostnames():返回主机名列表

ip(port):返回信息的IP端口

sctp(port):返回信息的sctp端口

state():返回主机状态

tcp(port):返回tcp端口的信息
>>> nm['127.0.0.1'].state()
'up'

udp(port):返回udp端口的信息

uptime():返回主机状态




以上是关于nmap学习的主要内容,如果未能解决你的问题,请参考以下文章

python-nmap的函数学习

关于Nmap的学习记录

安全牛学习笔记​NMAP

Linux学习-网络工具使用(nmap)

Linux学习-网络工具使用(nmap)

nmap学习