nmap

nmap

nmap [ <Scan Type> ...] [ <Options> ] { <target specification> }

版本:nmap-7.70-1.x86_64.rpmhtml

命令行格式:https://svn.nmap.org/nmap/docs/nmap.usage.txt(老是最新)python

目标格式

nmap命令行中中除了选项或选项参数其他均为目标主机格式。linux

TARGET SPECIFICATION:
  Can pass hostnames, IP addresses, networks, etc.
  Ex: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.0-255.1-254
  -iL <inputfilename>: Input from list of hosts/networks
  -iR <num hosts>: Choose random targets
  --exclude <host1[,host2][,host3],...>: Exclude hosts/networks
  --excludefile <exclude_file>: Exclude list from file

当扫描目标是hostname时nmap会经过DNS解析地址。若是不特别指出--resolve-all选项nmap只会对NDS返回的第一个IP地址进行扫描。(一般一个域名对应多个IP地址是用来作负载的例如大型门户网站会根据用户的网络联通、电信、移动等返回访问最快的站点)web

  • CIDR-style addressing:www.baidu.com/24或者123.125.115.110/24(包括网络号和广播地址)shell

  • 192.168.0-255.1-254数据库

  • 192.168.3-5,7.1(192.168.3.1, 192.168.4.1, 192.168.5.1, 192.168.7.1)缓存

  • 可使多个目标组合192.168.0-255.1-254 192.168.3-5,7.1(IP条目可使命令行中能够接受的格式,每一个条目必须用一个或多个空格,制表符或换行符分隔)安全

  • -iL (Input from list) 指定要从文件中的目标列表,文件中能够有#开头和结尾的注释 服务器

  • -iR (Choose random targets) 随机生成num hosts个主机IP(自动去除私有,组播和一些未分配的地址) 网络

    nmap -n -iR 10 -sL | cut -d" " -f 5 >nmap_random_target.txt 不过须要整理一下文件开头和结尾

无聊了能够查看一些开了web服务的网站 nmap -Pn -sS -p 80 -iR 0 --open

  • --exclude [, [,...]] (Exclude hosts/networks) 指定要从扫描中排除的以逗号分隔的目标列表
  • --excludefile (Exclude list from file) 指定要从扫描中排除的文件中的目标列表,文件中能够有#开头和结尾的注释

主机发现

因为扫描端口的速度并不快,因此主机发现步骤是必要的。固然这个也取决于你的角色定位或任务目标,网络管理员可能只对运行某项服务的主机感兴趣,或者你在作资产发现。好比我曾经作过一个全端口扫描主机发现的项目,总公司怕分公司隐瞒资产同时规避掉主机扫描出漏洞。

主机发如今namp中有时候叫ping扫秒,因此大部分的主机发现过程当中的端口扫描选项以P开头(猜的( ̄▽ ̄)")

HOST DISCOVERY:
  -sL: List Scan - simply list targets to scan
  -sn: Ping Scan - disable port scan
  -Pn: Treat all hosts as online -- skip host discovery
  -PS/PA/PU/PY[portlist]: TCP SYN/ACK, UDP or SCTP discovery to given ports
  -PE/PP/PM: ICMP echo, timestamp, and netmask request discovery probes
  -PO[protocol list]: IP Protocol Ping
  -n/-R: Never do DNS resolution/Always resolve [default: sometimes]
  --dns-servers <serv1[,serv2],...>: Specify custom DNS servers
  --system-dns: Use OS's DNS resolver
  --traceroute: Trace hop path to each host

若是没有给出主机发现选项,nmap发送ICMP echo request请求,443端口TCP SYN数据包,80端口TCP ACK数据包和一个ICMP timestamp request。至关于默认值-PE -PS443 -PA80 -PP

对于没有特殊权限的unix shell用户默认探测是connect调用

nmap -sn 192.198.99.1

  • -sL (List Scan)

    简单地列出指定的每一个网络主机,而不向目标主机发送任何数据包。默认状况下,Nmap仍在主机上执行反向DNS解析以了解其名称。

  • -sn (No port scan)旧版本为-sP

    此选项仅作主机发现不作后续的端口扫描和-P*组合使用(不包括-Pn(跳过主机发现,直接端口扫描))

  • -Pn (No ping)

    跳过主机发现直接执行端口扫描

  • -PS (TCP SYN Ping)

    原理:TCP三次握手

    此选项发送一个设置了SYN标志的空TCP数据包(默认80端口),-PS22和-PS22-25,80,113,1050,35000。

    端口open返回SYN+ACK,为正常TCP三次握手第二步,而后运行nmap主机内核返回RST终止正在进行的链接以响应意外的SYN / ACK,而不是由Nmap自己。端口关闭返回RST数据包。

  • -PA (TCP ACK Ping)

    原理:对于一条不存在的链接,发送ACK包会直接返回RST中断这条请求。

ACK ping伪装存在一个established TCP connection,可是这个链接并不存在,目标主机端口开放或关闭都会返回一个RST数据包。此选项并不能判断端口状态,不过如果返回RST则代表主机是存活的。

ACKping对绕过无状态防火墙有些用处,像Linux主机防火墙iptables/netfilter的--syn选项过滤(若--state则相似于状态防火墙)。

若防火墙为状态防火墙stateful firewall会直接丢弃这类没有存在它的会话表中的怪异链接。

ps:我见过的企业就没发现过无状态防火墙,都是有状态的。并且都是遵循最小化原则,你要什么端口开什么端口,最后再来个默认拒绝(T_T)。

无回复版本

有回复(端口开启或关闭都会返回RST)

  • -PU (UDP Ping)

    原理:向一台没有开启对应端口的UDP数据包,返回一个ICMP destination port unreachable消息。

    默认向目标主机发送 UDP 端口40125(极不可能开启的端口)。

    关于paloads:数据包内容也可能受--data, - data-string和--data-length选项的影响。(the section called “UDP payloads: nmap-payloads

这种状态防火墙后面的默认拒绝的鸟你都不会鸟。

  • -PY (SCTP INIT Ping)

    SCTP除了电信运营商专网可能再用通常的企业不会用,我对协议也不了解,略过。

  • -PE; -PP; -PM (ICMP Ping Types)

    ICMP echo, timestamp, and netmask request ping回声请求时间戳请求,子网掩码请求

    通常商用防火墙都能准肯定义容许什么样的ping能够回复

  • -PO (IP Protocol Ping)

    IP协议ping,没有指定协议的话默认发送 IP packets for ICMP (protocol 1), IGMP (protocol 2), and IP-in-IP (protocol 4)

  • -PR (ARP Ping)

    当给定目标地址为本地网络的时候默认进行ARP扫描,这个比ICMP准确的多,通常的主机自带防火墙可能默认屏蔽icmp请求可是ARP请求通常确定会回复(禁用用--send-ip)

    对于IPV6来讲-PR用邻居发现协议。

    若是你本机上有目标主机ARP缓存也会发送ARP请求数据包,测试了。

    这玩意不太好实验,没有两台实体机,一用arp -d 就从新请求,还好我聪明想到了用不存在主机测试一下。

  • --disable-arp-ping (No ARP or ND Ping)

    禁用IPV4的ARP和IPV6的neighbor discovery

  • --traceroute (Trace path to host)

    多目标主机作traceroute

  • -n (No DNS resolution)

    不进行地址解析。IP地址反向解析

  • -R (DNS resolution for all targets)

    对断定存活主机进行地址解析,IP地址反向解析

  • --resolve-all (Scan each resolved address)

    有点诡异的是这个参数按照字面理解应当是对全部扫描的地址无论主机存不存活都进行反向地址解析,可是它的实际意思是对给定的域名,返回超过两个多个IP地址的所有进行扫描。

    更加诡异的是我在man手册和官网的最新man手册中都没有这个选项说明也用不了。

  • --system-dns (Use system DNS resolver)

    默认状况下,Nmap经过将查询直接发送到主机上配置的名称服务器,而后侦听响应来反向解析IP地址。许多请求(一般是几十个)是并行执行的。

    指定此选项以改成使用系统解析程序(经过getnameinfo调用一次一个IP)。这种状况较慢且不多有用。系统解析器始终用于正向查找(从主机名获取IP地址)。

  • --dns-servers [, [,...]] (Servers to use for reverse DNS queries)

    使用多个NDS服务器可能更快一些,而且隐秘一些。但此选项更多用途用于扫描专用网络能够确认53端口开放主机,而后每次使用一个dns地址来扫描。

端口扫描

-sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans
  -sU: UDP Scan
  -sN/sF/sX: TCP Null, FIN, and Xmas scans
  --scanflags <flags>: Customize TCP scan flags
  -sI <zombie host[:probeport]>: Idle scan
  -sY/sZ: SCTP INIT/COOKIE-ECHO scans
  -sO: IP protocol scan
  -b <FTP relay host>: FTP bounce scan

通用选项格式是-s , 是能表明某一类扫描的突出字符如-sU,U表明UDP

状态 详细的参数说明
Open 端口开启,数据有到达主机,有程序在端口上监控
Closed 端口关闭,数据有到达主机,没有程序在端口上监控
Filtered 数据没有到达主机,返回的结果为空,数据被防火墙或者是IDS过滤(正常来讲会有回应)
UnFiltered 数据有到达主机,可是不能识别端口的当前状态,只有用于映射防火墙规则集的ACK扫描会将端口分类为此状态,
Open|Filtered 端口没有返回值,主要发生在UDP、IP、FIN、NULL和Xmas扫描中
Closed|Filtered 只发生在IP ID idle扫描

使用nmap的障碍是你得正确选择合适的扫描选项。

  • -sS (TCP SYN scan)

    half-open半开扫描,利用TCP三次握手过程。没有被过滤的话确定有回应。

    nmap 目标主机 nmap 状态
    SYN SYN+ACK RST open
    SYN RST closed
    SYN 屡次重传无回应 filtered
    SYN ICMP unreachable error (type 3, code 0, 1, 2, 3, 9, 10, or 13) filtered
    SYN SYN open参考https://nmap.org/misc/split-handshake.pdf
  • -sT (TCP connect scan)

    SYN scan没有设置或不是特权用户默认用此设置。

    nmap 目标主机 nmap 状态
    SYN SYN+ACK ACK open
    SYN RST closed
    SYN 屡次重传无回应 filtered
    SYN ICMP unreachable error (type 3, code 0, 1, 2, 3, 9, 10, or 13) filtered
    SYN SYN open参考https://nmap.org/misc/split-handshake.pdf
  • -sU (UDP scans)

    DNS, SNMP, and DHCP (registered ports 53, 161/162, and 67/68)是最经常使用的UDP服务端口。特色:慢

nmap 目标主机 状态
UDP UDP open
UDP ICMP port unreachable error (type 3, code 3) closed
UDP ICMP unreachable error (type 3, code 0, 1, 2, 3, 9, 10, or 13) filtered
UDP 屡次重传无回应 open|filtered

DNS回应的是不支持状态查询,另外的ICMP port unreachble说明这个UDP 53的调用不是系统发出的源端口没有打开。

  • -sY (SCTP INIT scan)

    略过

  • -sN; -sF; -sX (TCP NULL, FIN, and Xmas scans)

    RFC793 page 65 不包含RST置位的包来到一个close端口返回一个RST,不包含SYN、RST或ACK置位的包来到open端口则丢弃该包,不返回任何东西。

    Null scan (-sN)

    TCP flag header 0x0不设置标志位

    FIN scan (-sF)

    FIN置位

    Xmas scan (-sX)

    FIN, PSH, and URG置位

    总之这几个选项没什么用,状态防火墙专治这种花里胡哨的。能用他们肯定的SYN扫描也能更好的肯定,不能用他们肯定的别的可能还有点但愿。

    另外Microsoft Windows, many Cisco devices, BSDI, and IBM OS/400不遵循这个RFC。能够用他们探测操做系统,可是仍是有更好的操做系统探测手段。总之鸡肋。

    nmap 目标主机 状态
    TCP NULL, FIN, and Xmas 无回应(重传两次) open|filtered
    TCP NULL, FIN, and Xmas RST closed
    TCP NULL, FIN, and Xmas ICMP unreachable error (type 3, code 0, 1, 2, 3, 9, 10, or 13) filtered
  • -sA (TCP ACK scan)

    ACK置位,这个选项不能肯定端口开放或者关闭(由于端口open或者close都会返回RST)

    状态防火墙全部的都不能经过,也不能映射防火墙规则集。

    关于用它映射过滤集,对应的是无状态防火墙(iptables --syn)和交换机ACL这种未过滤端口ACK容许经过标记为unfiltered,过滤端口不容许经过标记为filtered。(未实验验证)

    这种扫描用在内网好一点,由于如今还有内网中不一样区域用交换机ACL访问控制的,要是出口防火墙通常都是状态防火墙什么都不会回复,除了设置ICMP应答的。云上环境访问控制不太了解。

    nmap 目标主机 状态
    ACK 无回应(重传两次) filtered
    ACK RST unfiltered
    ACK ICMP unreachable error (type 3, code 0, 1, 2, 3, 9, 10, or 13) filtered

    状态防火墙(要是sS扫描80端口会回应)

  • -sW (TCP Window scan)

    有的操做系统,用的ACK置位探测,RST返回的window size端口开size正,端口关闭size为0。不过我试了两种系统都不太管用。还有的连端口过滤没过滤都肯定不了(涉及到上面的-sA扫描)。80开,443关闭。都返回的window seze 0 个人是路由器基于linux。

  • -sM (TCP Maimon scan)

    略过

  • --scanflags (Custom TCP scan)

    定制TCP标志位扫描。

  • -sZ (SCTP COOKIE ECHO scan)

    略过

  • -sI [: ] (idle scan)

    暂时搞不懂

  • -sO (IP protocol scan)

    基于IP的协议扫描(TCP、UDP和ICMP等)

    控制的是IP的协议号字段

  • -b (FTP bounce scan)

    略,实现很麻烦,并且如今大部分都不支持了。

端口扫描总结

扫描公网IP遇到状态防火墙的时候只用 -sS -sT -sU,其余的都不太管用。

端口说明和扫描顺序

默认状况下Nmap会扫描每一个协议最多见的1000个端口。

  • -p (Only scan specified ports)

    特别说明-p只适用于端口扫描,主机发现的直接加到选项后面如

    nmap -PS 80,443 -sS -p 80,443 192.168.99.1

    指定端口选项会覆盖默认端口扫描

    格式:443 443-445 -p-扫描1-65535

    特别须要说明的是协议扫描-sO 对应的-p指的是协议号0-255

    T: for TCP, U: for UDP, S: for SCTP, or P: for IP

    -p U:53,111,137,T:21-25,80,139,8080会扫描对应的TCP和UDP端口不过须要加上-sU和任意一种TCP扫描选项。如nmap -sU -sY -p U:53,111,137,T:21-25,80,139,8080 8.8.8.8

    还能够用nmap-services对应的协议名指定端口。协议名支持通配符和? 如-p ftp,http

  • --exclude-ports (Exclude the specified ports from scanning)

    排除要扫描的端口号或协议号。不只是扫描,发现阶段也不会扫描这些端口

  • -F (Fast (limited port) scan)

    扫描常见的100个端口而不是1000个

    自定义nmap-services映射文件用--datadir

  • -r (Don't randomize ports)

    按顺序发送端口扫描包

  • --port-ratio <decimal number between 0 and 1>

    按照比率扫描nmap-services文件中的端口

  • --top-ports

    扫描nmap-services中的前n个端口

服务和版本探测

原理: https://nmap.org/book/vscan.html

nmap-service-probes 数据库包含查询不一样服务的探测报文 和解析识别响应的匹配表达式

肯定TCP或UDP端口open的时候指定了版本探测,nmap会进行版本探测。

  • -sV (Version detection)

    -A同时打开操做系统探测和版本探测,最新版本-sR合并了

    能够看到GET / HTTP/1.0 要是在waf后面这种不符合http规范的可能被拦截掉。

  • --allports (Don't exclude any ports from version detection)

    默认状况下,Nmap版本探测会跳过9100 TCP端口,由于一些打印机简单地打印送到该端口的 任何数据,这回致使数十页HTTP get请求,二进制 SSL会话请求等等被打印出来。这一行为能够经过修改或删除nmap-service-probes 中的Exclude指示符改变, 您也能够不理会任何Exclude指示符,指定--allports扫描全部端口

  • --version-intensity (Set version scan intensity)

    当进行版本扫描(-sV)时,nmap发送一系列探测报文 ,每一个报文都被赋予一个1到9之间的值。 被赋予较低值的探测报文对大范围的常见服务有效,而被赋予较高值的报文 通常没什么用。强度水平说明了应该使用哪些探测报文。数值越高, 服务越有可能被正确识别。 然而,高强度扫描花更多时间。强度值必须在0和9之间。 默认是7。当探测报文经过nmap-service-probes ports指示符 注册到目标端口时,不管什么强度水平,探测报文都会被尝试。这保证了DNS 探测将永远在任何开放的53端口尝试, SSL探测将在443端口尝试,等等。

  • --version-light (Enable light mode)

    轻量级版本探测, --version-intensity 2的别名

  • --version-all (Try every single probe)

    --version-intensity 9别名,保证对每一个端口尝试每一个探测报文。

  • --version-trace (Trace version scan activity)

    nmap --send-ip -n -Pn -sV --version-trace -sU -p U:53 192.168.99.1

操做系统检测

  • -O (Enable OS detection)

    开启操做系统探测,另外-A开启操做系统和服务版本探测。

  • --osscan-limit (针对指定的目标进行操做系统检测)

    若是发现一个打开和关闭的TCP端口时,操做系统检测会更有效。 采用这个选项,Nmap只对知足这个条件的主机进行操做系统检测,这样能够节约时间,必须配合-A或-O使用。

防火墙/IDS逃避和哄骗

  • -f (fragment packets); --mtu (using the specified MTU)

    -f选项要求扫描时(包挺ping扫描)使用小的IP包分片。其思路是将TCP头分段在几个包中,使得包过滤器、 IDS以及其它工具的检测更加困难。

    对于IP分片至少华为的安全产品会默认开启IP报文虚拟分片重组功能。至于超时的处理状况并未说明,并且IP分片也有两种状况,正常的IP分片不会像下面我这种第三个包重组完才能知道TCP的目标端口,由于加上IP头才28字节,因此不可能绕过状态防火墙过滤的端口。第二种IP分片是UDP和ICMP常发生的应用层给的数据太长超过MTU才会分片,TCP不太可能发生这种状况,由于三次握手阶段就会协商MSS。除非中间套了好多层用了GRE,IPSEC等。

    须要说明的是IP分片能够形成网络攻击,比如防火墙对一个公网IP开通了80端口访问我强行将MTU设置的很小,HTTP报文很长的话这种就会形成检测设备的长时间等待重组会消耗不少内存,通常的串在链路当中而且作检测的只有IPS这种流式引擎设备了。可是网上的资料IP分片攻击主要指的是ICMP和UDP,例如ping of death不过老系统才会被这种数据包攻击。

  • -D [, ][,ME][,...] (Cloak a scan with decoys 诱饵)

    诱饵扫描,为了使目标主机不容易判断真实的扫描地址,将本身的真实IP混在大量的扫描之中能够用诱饵选项,固然诱饵主机最好存活,要否则只有你的包是和目标主机交互的,深刻扫描也容易判断出真实的扫描地址。固然,这种方式能够经过路由跟踪、响应丢弃以及其它主动机制来发现真实IP。

    使用逗号分隔每一个诱饵主机,也可用本身的真实IP做为诱饵,这时可以使用 ME选项说明。若是在第6个位置或 更后的位置使用ME选项,一些经常使用 端口扫描检测器(如Solar Designer's excellent scanlogd)就不会报告 这个真实IP。若是不使用ME选项,Nmap 将真实IP放在一个随机的位置。对版本探测等无效。

    由于我这是局域网并且127,128不存活因此比正常包少点。

  • -S (Spoof source address)

    若是你有多个网卡能够用-S指定发包的网卡,另外这个选项能够伪造原地址,而且你的真实地址不会产生包,能够假装成别的地址在扫描目标地址。另外更多的做用想得多的能够发现,我就很少说了。若是要用假的源地址须要配合-e和-Pn使用指定一个接口,而且这种对主机发现阶段没用因此要用-Pn并且最后nmap给的报告就不用看了。

  • -e (Use specified interface)

    指定发包网卡

  • --source-port ; -g (Spoof source port number)

    一个公网IP的数据包要主动进入内网有几个关口要过,状态防火墙规则容许,有对应nat规则。nat和防火墙都会创建会话表。假装源端口也不太管用。可是有的防火墙管理员规则设定的很烂,有的公网IP开了几个端口,有的全开放。有的甚至将源端口为53的DNS会话全放过。不妨测一测。

    五元组:源IP地址、目的IP地址、协议号、源端口、目的端口

  • --ttl (Set IP time-to-live field)

    设置TTL字段值

输出

重点是XML输出,能够标准的被其余程序或语言解析

  • -oN (normal output)

    将命令行输出结果保存到文件中

  • -oX (XML output)

    输出成XML格式文件

  • -oG (grepable output)

    适合于grep cut awk之类程序,这种格式化的方便检索。

  • -oA (Output to all formats)

    为使用方便,利用-oA 选项 可将扫描结果以标准格式、XML格式和Grep格式一次性输出。分别存放在 .nmap, .xml和 .gnmap文件中。也能够在文件名前 指定目录名,如在UNIX中,使用~/nmaplogs/foocorp/, 在Window中,使用c:\hacking\sco on Windows。

  • -v (Increase verbosity level) , -v (Set verbosity level)

    提升输出详细级别,有的时候nmap并不能作出准确判断,这样测试者能够自行找到一些容易忽视的信息。

  • -d (Increase debugging level) , -d (Set debugging level)

    输出一些比-v更详细的信息(调试信息)

  • --reason (Host and port state reasons)

    显示端口状态或主机存活或不存活缘由

  • --packet-trace (Trace packets and data sent and received)

    跟踪每个nmap发出去的包,接收到的包,有助于理解nmap工做方式。

    --version-trace显示版本跟踪细节

    --script-trace脚本细节

    --packet-trace上面的两个都包括

  • --open (Show only open (or possibly open) ports)

    只显示open的端口

  • --iflist (List interfaces and routes)

    输出网卡列表和路由信息

  • --append-output (Append to rather than clobber output files)

    将输出结果追加到文件支持oN oG不支持oX

  • --resume (Resume aborted scan)

    若是扫描过程当中中断如ctrl+c能够继续以前的扫描,好多漏洞扫描工具利用它实现暂停功能。支持oN oG 不支持oX输出的文件

其余

  • -6 (Enable IPv6 scanning)

    使能IPV6扫描

  • -A (Aggressive scan options)

    启用大部分经常使用的扫描内容,目前包括

    -O操做系统扫描

    -sV版本扫描

    -sC脚本扫描

    --traceroute路由跟踪

  • --datadir (Specify custom Nmap data file location)

    指定数据文件存放位置(注意不是输出)nmap-service-probes, nmap-services, nmap-protocols, nmap-rpc, nmap-mac-prefixes和 nmap-os-fingerprints

不是结束的结束

对于没有网络经验的人最好仍是找一本书而不是官方手册来看,很困难。其中有的选项没记录有的我认为没什么用,有的现阶段不会用到,有的理解不能。不过大部分都记录了。另外我想起来一个python的namp库(python-nmap),简单、实用。对于作运维自动化的颇有意思。

另外扫描器还有zmap,masscan。这些具体的区别还没研究。http://www.91ri.org/10800.html

另外基于这些扫描器的资产收集或者说内网zoomeye开源版实现

基于Python的网络侦查框架 – IVRE

支持主动侦查和被动侦查

介绍

https://www.freebuf.com/sectool/74083.html

官网

https://ivre.rocks/

下次研究这个。

相关文章
相关标签/搜索