nmap

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

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

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

目标格式

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

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地址是用来做负载的例如大型门户网站会根据用户的网络联通、电信、移动等返回访问最快的站点)

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

  • 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三次握手过程。没有被过滤的话肯定有回应。

    SYNSYN+ACKRSTopen
    SYNRSTclosed
    SYN多次重传无回应filtered
    SYNICMP unreachable error (type 3, code 0, 1, 2, 3, 9, 10, or 13)filtered
    SYNSYNopen参考https://nmap.org/misc/split-handshake.pdf
  • -sT (TCP connect scan)

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

    SYNSYN+ACKACKopen
    SYNRSTclosed
    SYN多次重传无回应filtered
    SYNICMP unreachable error (type 3, code 0, 1, 2, 3, 9, 10, or 13)filtered
    SYNSYNopen参考https://nmap.org/misc/split-handshake.pdf
  • -sU (UDP scans)

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

UDPUDPopen
UDPICMP port unreachable error (type 3, code 3)closed
UDPICMP 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。可以用他们探测操作系统,但是还是有更好的操作系统探测手段。总之鸡肋。

    TCP NULL, FIN, and Xmas无回应(重传两次)open|filtered
    TCP NULL, FIN, and XmasRSTclosed
    TCP NULL, FIN, and XmasICMP 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,过滤端口不允许通过标记为unfiltered。(未实验验证)

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

    ACK无回应(重传两次)filtered
    ACKRSTopen
    ACKICMP 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/

下次研究这个。

02-11 01:03