渗透测试工具篇——Nmap

渗透测试工具篇——Nmap

介绍

Nmap是一款网络扫描和主机检测的非常有用的工具。 Nmap是不局限于仅仅收集信息和枚举,同时可以用来作为一个漏洞探测器或安全扫描器。它可以适用于winodws,linux,mac等操作系统。Nmap是一款非常强大的实用工具,包含四项基本功能:

  • 主机发现(Host Detection)

  • 端口扫描(Port Scanning)

  • 版本侦测(version Detection)

  • 操作系统侦测(Operating System Detection)

安装

Nmap官网

Nmap中文网站

基本使用方法

主机发现

-sL: List Scan 列表扫描,仅将指定的目标的IP列举出来,不进行主机发现。

-sn: Ping Scan 只进行主机发现,不进行端口扫描。

-Pn: 将所有指定的主机视作开启的,跳过主机发现的过程。

-PS/PA/PU/PY[portlist]: 使用TCPSYN/ACK或SCTP INIT/ECHO方式进行发现。

-PE/PP/PM: 使用ICMP echo, timestamp, and netmask 请求包发现主机。-PO[protocollist]: 使用IP协议包探测对方主机是否开启。

-n/-R: -n表示不进行DNS解析;-R表示总是进行DNS解析。

--dns-servers <serv1[,serv2],...>: 指定DNS服务器。

--system-dns: 指定使用系统的DNS服务器

--traceroute: 追踪每个路由节点

端口扫描

nmap默认会扫描1000个最有可能开放的TCP端口

端口扫描的状态:

Opend:端口开启

Closed: 端口关闭

Filtered:端口被过滤,数据没有到达主机,返回的结果为空,数据被防火墙

Unfiltered:未被过滤,数据有到达主机,但是不能识别端口的当前状态

Open|filtered:开放或者被过滤,端口没有返回值,主要发生在UDP、IP、FIN、NULL和Xmas扫描中

Closed|filtered:关闭或者被过滤,只发生在IP ID idle扫描

原理

  • TCP SYN scanning

    这是Nmap默认的扫描方式,通常被称作半开放扫描(Half-open scanning)。该方式发送SYN到目标端口,如果收到SYN/ACK回复,那么判断端口是开放的;如果收到RST包,说明该端口是关闭的。如果没有收到回复,那么判断该端口被屏蔽(Filtered)。因为该方式仅发送SYN包对目标主机的特定端口,但不建立的完整的TCP连接,所以相对比较隐蔽,而且效率比较高,适用范围广。

  • TCP connect scanning

    TCP connect方式使用系统网络API connect向目标主机的端口发起连接,如果无法连接,说明该端口关闭。该方式扫描速度比较慢,而且由于建立完整的TCP连接会在目标机上留下记录信息,不够隐蔽。所以,TCP connect是TCP SYN无法使用才考虑选择的方式。

  • TCP ACK scanning

    向目标主机的端口发送ACK包,如果收到RST包,说明该端口没有被防火墙屏蔽;没有收到RST包,说明被屏蔽。该方式只能用于确定防火墙是否屏蔽某个端口,可以辅助TCP SYN的方式来判断目标主机防火墙的状况。

  • TCP FIN/Xmas/NULL scanning

    这三种扫描方式被称为秘密扫描(Stealthy Scan),因为相对比较隐蔽。FIN扫描向目标主机的端口发送的TCP FIN包或Xmas tree包/Null包,如果收到对方RST回复包,那么说明该端口是关闭的;没有收到RST包说明端口可能是开放的或被屏蔽的(open|filtered)。其中Xmas tree包是指flags中FIN URG PUSH被置为1的TCP包;NULL包是指所有flags都为0的TCP包。

  • UDP scanning

    UDP扫描方式用于判断UDP端口的情况。向目标主机的UDP端口发送探测包,如果收到回复“ICMP port unreachable”就说明该端口是关闭的;如果没有收到回复,那说明UDP端口可能是开放的或屏蔽的。因此,通过反向排除法的方式来断定哪些UDP端口是可能出于开放状态。

  • 其他方式

    除上述几种常用的方式之外,Nmap还支持多种其他探测方式。例如使用SCTP INIT/COOKIE-ECHO方式来探测SCTP的端口开放情况;使用IP protocol方式来探测目标主机支持的协议类型(TCP/UDP/ICMP/SCTP等等);使用idle scan方式借助僵尸主机(zombie host,也被称为idle host,该主机处于空闲状态并且它的IPID方式为递增。详细实现原理参见:http://nmap.org/book/idlescan.html)来扫描目标在主机,达到隐蔽自己的目的;或者使用FTP bounce scan,借助FTP允许的代理服务扫描其他的主机,同样达到隐藏自己的身份的目的。

用法

-sS/sT/sA/sW/sM:  指定使用 TCP SYN/Connect()/ACK/Window/Maimon scans的方式来对目标主	机进行扫描。
-sU:   指定使用UDP扫描方式确定目标主机的UDP端口状况。
-sN/sF/sX: 指定使用TCP Null, FIN, and Xmas scans秘密扫描方式来协助探测对方的TCP端口状	态。
--scanflags <flags>: 定制TCP包的flags。
-sI <zombiehost[:probeport]>: 指定使用idle scan方式来扫描目标主机(前提需要找到合适的		zombie host)
-sY/sZ: 使用SCTP INIT/COOKIE-ECHO来扫描SCTP协议端口的开放的情况。
-sO: 使用IP protocol 扫描确定目标机支持的协议类型。
-b <FTP relay host>: 使用FTP bounce scan扫描方式
-p <port ranges>: 扫描指定的端口

实例: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9(其中T代表TCP协议、U代表UDP协议、S代表SCTP协议)

-F: Fast mode – 快速模式,仅扫描TOP 100的端口
-r: 不进行端口随机打乱的操作(如无该参数,nmap会将要扫描的端口以随机顺序方式扫描,以让nmap的扫	描不易被对方防火墙检测到)。
--top-ports <number>:扫描开放概率最高的number个端口(nmap的作者曾经做过大规模地互联网扫描,	以此统计出网络上各种端口可能开放的概率。以此排列出最有可能开放端口的列表,具体可以参见文件:	    nmap-services。默认情况下,nmap会扫描最有可能的1000个TCP端口)
--port-ratio <ratio>: 扫描指定频率以上的端口。与上述--top-ports类似,这里以概率作为参数,	让概率大于--port-ratio的端口才被扫描。显然参数必须在在0到1之间,具体范围概率情况可以查看	    nmap-services文件。

版本侦测

版本侦测,用于确定目标主机开放端口上运行的具体的应用程序及版本信息。

Nmap提供的版本侦测具有如下的优点:

  • 高速。并行地进行套接字操作,实现一组高效的探测匹配定义语法。
  • 尽可能地确定应用名字与版本名字。
  • 支持TCP/UDP协议,支持文本格式与二进制格式。
  • 支持多种平台服务的侦测,包括Linux/Windows/Mac OS/FreeBSD等系统。
  • 如果检测到SSL,会调用openSSL继续侦测运行在SSL上的具体协议(如HTTPS/POP3S/IMAPS)。
  • 如果检测到SunRPC服务,那么会调用brute-force RPC grinder进一步确定RPC程序编号、名字、版本号。
  • 支持完整的IPv6功能,包括TCP/UDP,基于TCP的SSL。
  • 通用平台枚举功能(CPE)
  • 广泛的应用程序数据库(nmap-services-probes)。目前Nmap可以识别几千种服务的签名,包含了180多种不同的协议。

原理

版本侦测主要分为以下几个步骤:

  1. 首先检查open与open|filtered状态的端口是否在排除端口列表内。如果在排除列表,将该端口剔除。
  2. 如果是TCP端口,尝试建立TCP连接。尝试等待片刻(通常6秒或更多,具体时间可以查询文件nmap-services-probes中Probe TCP NULL q||对应的totalwaitms)。通常在等待时间内,会接收到目标机发送的“WelcomeBanner”信息。nmap将接收到的Banner与nmap-services-probes中NULL probe中的签名进行对比。查找对应应用程序的名字与版本信息。
  3. 如果通过“Welcome Banner”无法确定应用程序版本,那么nmap再尝试发送其他的探测包(即从nmap-services-probes中挑选合适的probe),将probe得到回复包与数据库中的签名进行对比。如果反复探测都无法得出具体应用,那么打印出应用返回报文,让用户自行进一步判定。
  4. 如果是UDP端口,那么直接使用nmap-services-probes中探测包进行探测匹配。根据结果对比分析出UDP应用服务类型。
  5. 如果探测到应用程序是SSL,那么调用openSSL进一步的侦查运行在SSL之上的具体的应用类型。
  6. 如果探测到应用程序是SunRPC,那么调用brute-force RPC grinder进一步探测具体服务。

用法

-sV: 指定让Nmap进行版本侦测
--version-intensity <level>: 指定版本侦测强度(0-9),默认为7。数值越高,探测出的服务越准	确,但是运行时间会比较长。
--version-light: 指定使用轻量侦测方式 (intensity 2)
--version-all: 尝试使用所有的probes进行侦测 (intensity 9)
--version-trace: 显示出详细的版本侦测过程信息。

OS侦测

Nmap使用TCP/IP协议栈指纹来识别不同的操作系统和设备。在RFC规范中,有些地方对TCP/IP的实现并没有强制规定,由此不同的TCP/IP方案中可能都有自己的特定方式。Nmap主要是根据这些细节上的差异来判断操作系统的类型的。

具体实现方式如下:

  1. Nmap内部包含了2600多已知系统的指纹特征(在文件nmap-os-db文件中)。将此指纹数据库作为进行指纹对比的样本库。
  2. 分别挑选一个open和closed的端口,向其发送经过精心设计的TCP/UDP/ICMP数据包,根据返回的数据包生成一份系统指纹。
  3. 将探测生成的指纹与nmap-os-db中指纹进行对比,查找匹配的系统。如果无法匹配,以概率形式列举出可能的系统。
nmap -O ip

Nmap进阶用法

防火墙/IDS规避

防火墙与IDS规避为用于绕开防火墙与IDS(入侵检测系统)的检测与屏蔽,以便能够更加详细地发现目标主机的状况。

Nmap提供了多种规避技巧,通常可以从两个方面考虑规避方式:数据包的变换(Packet Change)与时序变换(Timing Change)。

规避原理

  • 分片

    将可疑的探测包进行分片处理(例如将TCP包拆分成多个IP包发送过去),某些简单的防火墙为了加快处理速度可能不会进行重组检查,以此避开其检查。

  • ip诱骗

    在进行扫描时,将真实IP地址和其他主机的IP地址(其他主机需要在线,否则目标主机将回复大量数据包到不存在的主机,从而实质构成了拒绝服务攻击)混合使用,以此让目标主机的防火墙或IDS追踪检查大量的不同IP地址的数据包,降低其追查到自身的概率。注意,某些高级的IDS系统通过统计分析仍然可以追踪出扫描者真实IP地址。

  • ip伪装

    顾名思义,IP伪装即将自己发送的数据包中的IP地址伪装成其他主机的地址,从而目标机认为是其他主机在与之通信。需要注意,如果希望接收到目标主机的回复包,那么伪装的IP需要位于统一局域网内。另外,如果既希望隐蔽自己的IP地址,又希望收到目标主机的回复包,那么可以尝试使用idle scan或匿名代理(如TOR)等网络技术。

  • 指定源端口

    某些目标主机只允许来自特定端口的数据包通过防火墙。例如FTP服务器配置为:允许源端口为21号的TCP包通过防火墙与FTP服务端通信,但是源端口为其他端口的数据包被屏蔽。所以,在此类情况下,可以指定Nmap将发送的数据包的源端口都设置特定的端口。

  • 扫描延时

    某些防火墙针对发送过于频繁的数据包会进行严格的侦查,而且某些系统限制错误报文产生的频率(例如,Solaris 系统通常会限制每秒钟只能产生一个ICMP消息回复给UDP扫描),所以,定制该情况下发包的频率和发包延时可以降低目标主机的审查强度、节省网络带宽。

  • 其它技术

    Nmap还提供多种规避技巧,比如指定使用某个网络接口来发送数据包、指定发送包的最小长度、指定发包的MTU、指定TTL、指定伪装的MAC地址、使用错误检查和(badchecksum)。

    更多信息http://nmap.org/book/man-bypass-firewalls-ids.html

规避用法

-f; --mtu <val>: 指定使用分片、指定数据包的MTU.
-D <decoy1,decoy2[,ME],...>: 用一组IP地址掩盖真实地址,其中ME填入自己的IP地址。
-S <IP_Address>: 伪装成其他IP地址
-e <iface>: 使用特定的网络接口
-g/--source-port <portnum>: 使用指定源端口
--data-length <num>: 填充随机数据让数据包长度达到Num。
--ip-options <options>: 使用指定的IP选项来发送数据包。
--ttl <val>: 设置time-to-live时间。
--spoof-mac <mac address/prefix/vendor name>: 伪装MAC地址
--badsum: 使用错误的checksum来发送数据包(正常情况下,该类数据包被抛弃,如果收到回复,说明回复来自防火墙或IDS/IPS)。

示例:

nmap -v -F -Pn -D ip,ME -e etho -g 3355 192.168.1.1

-F表示快速扫描100个端口;-Pn表示不进行Ping扫描;-D表示使用IP诱骗方式掩盖自己真实IP(其中ME表示自己IP);-e eth0表示使用eth0网卡发送该数据包;-g 3355表示自己的源端口使用3355;192.168.1.1是被扫描的目标IP地址。

NSE脚本引擎

SE脚本引擎(Nmap Scripting Engine)是Nmap最强大最灵活的功能之一,允许用户自己编写脚本来执行自动化的操作或者扩展Nmap的功能。

NSE使用Lua脚本语言,并且默认提供了丰富的脚本库,目前已经包含14个类别的350多个脚本。

NSE的设计初衷主要考虑以下几个方面:

  • 网络发现(Network Discovery)
  • 更加复杂的版本侦测(例如skype软件)
  • 漏洞侦测(Vulnerability Detection)
  • 后门侦测(Backdoor Detection)
  • 漏洞利用(Vulnerability Exploitation)

nmap的脚本主要可以分为

  • Auth:负责处理鉴权证书(绕过鉴权)的脚本
  • Broadcast:在局域网内探查更多服务去开启情况,如DHCP/DNS等
  • Brute:针对常见的应用提供暴力破解方式,如HTTP/HTTPS
  • Default:使用-sC或-A选项扫描时默认的脚本,提供基本的脚本扫描能力
  • Discovery:对网络进行更多的信息搜集,如SMB枚举,SNMP查询等
  • Dos:用于进行拒绝服务攻击
  • Exploit:利用已知的漏洞入侵系统
  • External:利用第三方的数据库或资源 。如,进行whois解析
  • Fuzzer:模糊测试脚本,发送异常的包到目标机,探测出潜在漏洞
  • Intrusive:入侵性的脚本,此类脚本可能引发对方的IDS/IPS的记录或屏蔽
  • Malware:探测目标是否感染了病毒,开启后门等
  • Safe:与Intrusive相反,属于安全性脚本
  • Version:负责增强服务与版本扫描功能的脚本
  • Vuln:负责检查目标机是否有常见漏洞,如MS08-067

用法

-sC: 等价于 --script=default,使用默认类别的脚本进行扫描。

--script=<Lua scripts>: <Lua scripts>使用某个或某类脚本进行扫描,支持通配符描述

--script-args=<n1=v1,[n2=v2,...]>: 为脚本提供默认参数

--script-args-file=filename: 使用文件来为脚本提供参数

--script-trace: 显示脚本执行过程中发送与接收的数据

--script-updatedb: 更新脚本数据库

--script-help=<Lua scripts>: 显示脚本的帮助信息,其中<Luascripts>部分可以逗号分隔的文件或脚本类别。

实例

nmap -script smb-vuln-ms17-010  192.168.10.34     #可以探测该主机是否存在ms17_010漏洞
nmap --max-parallelism 800 --script http-slowloris scanme.nmap.org  #可以探测该主机是否存在http拒绝服务攻击漏洞
nmap -script http-iis-short-name-brute 192.168.10.34  #探测是否存在IIS短文件名漏洞
nmap -script mysql-empty-password 192.168.10.34       #验证mysql匿名访问
nmap -p 443 -script ssl-ccs-injection 192.168.10.34   #验证是否存在openssl CCS注入漏洞
--script=http-waf-detect            #验证主机是否存在WAF
--script=http-waf-fingerprint       #验证主机是否存在WAF
nmap --script-brute 192.168.1.1     #nmap可对数据库、SMB、SNMP等进行简单密码的暴力破解
nmap --script-vuln  192.168.1.1     #扫描是否有常见漏洞

常用命令小结

nmap -sn 10.95.10.100/24(10.96.10.100-200)
nmap -Pn ip
nmap -sS ip
nmap -sS -sU -p 1-65535 ip
nmap -sV ip
nmap -T4 -A -V ip
nmap -O ip
nmap --script-vuln ip

Nmap命令原理详解

Nmap参数详解

posted @ 2019-06-26 22:14  tomyyyyy  阅读(637)  评论(0编辑  收藏  举报