Nmap 扫描原理及使用方法
Namp包含四项基本功能
- 主机返现(Host Discovery)
- 端口扫描(Port Scanning)
- 应用与版本探测(Version Detection)
- 操作系统侦测(Openrating System Detection)
Nmap基本扫描方法
2.1 用法引入
2.1.1确定端口状况
确定目标主机在线情况及端口基本状况。
命令形式:
namp targethost
2.1.2 完整全面的扫描
对主机进行完整全面的扫描,那么可以使用nmap内置的-A选项。使用该选项,nmap 对主机进行主机发现、端口扫描、应用程序与版本侦测、操作系统侦测及调用默认NSE脚本扫描。
1)命令形式:
nmap -T4 -A -v targethost
2)参数详解:
- -A 用于使用进攻性方式扫描
- -T4 指定扫描过程使用的时序,(总共6个级别[0-5]),级别越高,扫描速度越快,但容易被防火墙或IDS检测屏蔽掉)。
- -v 表示显示冗余信息,显示扫描的细节。
2.2 主机发现
2.2.1 主机发现原理
主机发现发现的原理与Ping命令类似,发送探测包到目标主机,如果收到回复,说明目标主机是开启的。
1)常见主机探测方式:
- ICMP ECHO/TIMESTAMP/NETMASK报文
- TCPSYN/ACK包
- SCTP INIT/COOKIE-ECHO包等等
2)案例:
Nmap的用户位于源端,IP地址192.168.0.5,向目标主机192.168.0.3发送ICMP Echo Request。如果该请求报文没有被防火墙拦截掉,那么目标机会回复ICMP Echo Reply包回来。以此来确定目标主机是否在线。
3)默认情况下:Nmap会发送四种不同类型的数据包来探测目标主机是否在线。
- ICMP echo request
- a TCP SYN packet to port 443
- a TCP SYN packert to port 80
- an ICMP timestamp request
依次发送四个报文探测目标机是否开启。只要收到其中一个包的回复,那就证明目标机开启。使用四种不同类型的数据包可以避免因防火墙或丢包造成的判断错误。
2.2.2 主机发现的用法
- -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 [protocllist]:使用IP协议包探测对方主机是否开启。
- -n/-R:-n表示不进行DNS解析;-R表示总是进行DNS解析。
- --dns-servers <serv1[,serv2],...>:指定DNS服务器。
- --system-dns:指定使用系统的DNS服务器。
- --traceroute:追踪每个路由节点。
2.3 端口扫描
Namp通过探测将端口划分为6个状态:
- open:端口是开放的。
- closed:端口是关闭的。
- filtered:端口被防火墙IDS/IPS屏蔽,无法确定其状态。
- unfiltered:端口没有被屏蔽,但是否开放需要进一步确定。
- open|filtered:端口是开放的或被屏蔽。
- closed|filtered:端口是关闭的或被屏蔽。
2.3.1 端口扫描原理
2.3.1.1 TCP SYN scanning
TCP SYN scanning 是Nmap默认的扫描方式,称作半开放扫描。
原理:该方式发送SYN到目标端口。
- 如果收到SYN/ACK回复,那么判断该端口是开发;
- 如果收到RST包,那么判断该端口是关闭;
- 如果没收到回复,那么判断该端口是被屏蔽。
2.3.1.2 TCP connect scanning
原理:TCP connect 方式使用系统网络API connect 向目标主机的端口发起连接。
- 如果无法连接,说明该端口关闭。
优缺点:该方式扫描速度比较慢,而且由于建立完整的TCP连接会在目标机上留下记录信息,不够隐蔽。所以,TCP connect是TCP SYN无法使用才考虑选择的方式。
2.3.1.3 TCP ACK scanning
原理:向目标主机的端口发送ACK包。
- 如果收到RST包,说明该端口没有被防火墙屏蔽;
- 没有收到RST包,说明被屏蔽。
优缺点:该方式只能用于确定防火墙是否屏蔽某个端口,可以辅助TCP SYN的方式来判断目标主机防火墙的状况。
2.3.1.4 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包。
2.3.1.5 UDP scanning
UDP扫描方式用于判断UDP端口的情况。
原理:向目标主机的UDP端口发送探测包。
- 如果收到回复“ICMP port unreachable”就说明该端口是关闭的;
- 如果没有收到回复,那说明UDP端口可能是开放的或屏蔽的。
2.3.2 端口扫描用法
2.3.2.1 扫描方式选项
- -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端口状态。
- -sI <zombiehost[:probeport]>:指定使用idle scan方式来扫描目标主机。
- -sY/sZ:使用SCTP INIT/COOKIE-ECHO来扫描SCTP协议端口的开放情况。
- -sO:使用IP protocol 扫描确定目标主机支持的协议类型。
- -b <FTP relay host>:使用FTP bounce scan扫描方式。
- --scanflages <flags>:定制TCP包的flags。
2.3.2.2 端口参数与扫描顺序
- -p <port rages>:扫描指定的端口。
- -F:Fast mode 快速模式,仅扫描TOP 100的端口。
- -r:不进行端口随机打乱的操。
- --top-ports <number>:扫描开放概率最高的number个端口。
- --port-ratio <ratio>:扫描指定频率以上的端口。
2.4 版本侦测
2.4.1 优缺点
- 高速。并行地进行套接字操作,实现一组高效的探测匹配定义语法。
- 尽可能地确定应用名字与版本名字。
- 支持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多种不同的协议。
2.4.2 版本侦测原理
- 首先检查open与open|filtered状态的端口是否在排除端口列表内。如果在排除列表,将该端口剔除。
- 如果是TCP端口,尝试建立TCP连接。尝试等待片刻。通常在等待时间内,会接收到目标机发送的“WelcomeBanner”信息。nmap将接收到的Banner与nmap-services-probes中NULL probe中的签名进行对比。查找对应应用程序的名字与版本信息。
- 果通过“Welcome Banner”无法确定应用程序版本,那么nmap再尝试发送其他的探测包(即从nmap-services-probes中挑选合适的probe),将probe得到回复包与数据库中的签名进行对比。如果反复探测都无法得出具体应用,那么打印出应用返回报文,让用户自行进一步判定。
- 如果是UDP端口,那么直接使用nmap-services-probes中探测包进行探测匹配。根据结果对比分析出UDP应用服务类型。
- 如果探测到应用程序是SSL,那么调用openSSL进一步的侦查运行在SSL之上的具体的应用类型。
- 如果探测到应用程序是SunRPC,那么调用brute-force RPC grinder进一步探测具体服务。
2.4.3 版本侦测用法
- -sV: 指定让Nmap进行版本侦测
- --version-intensity <level>: 指定版本侦测强度(0-9),默认为7。数值越高,探测出的服务越准确,但是运行时间会比较长。
- --version-light: 指定使用轻量侦测方式 (intensity 2)
- --version-all: 尝试使用所有的probes进行侦测 (intensity 9)
- --version-trace: 显示出详细的版本侦测过程信息。
2.5 OS侦测
2.5.1 OS侦测原理
- Nmap内部包含了2600多已知系统的指纹特征(在文件nmap-os-db文件中)。将此指纹数据库作为进行指纹对比的样本库。
- 分别挑选一个open和closed的端口,向其发送经过精心设计的TCP/UDP/ICMP数据包,根据返回的数据包生成一份系统指纹。
- 将探测生成的指纹与nmap-os-db中指纹进行对比,查找匹配的系统。如果无法匹配,以概率形式列举出可能的系统。
2.5.2 OS侦测用法
- -O: 指定Nmap进行OS侦测。
- --osscan-limit: 限制Nmap只对确定的主机的进行OS探测(至少需确知该主机分别有一个open和closed的端口)。
- --osscan-guess: 大胆猜测对方的主机的系统类型。由此准确性会下降不少,但会尽可能多为用户提供潜在的操作系统。