nmap 是一个网络探测和安全审核工具,能够扫描主机开放端口。nmap 全称 network mapper 网络映射器,设计的目标是快速扫描大型网络。

nmap以原始IP报文来检测网络上有哪些主机,主机运行哪些操作系统(包括版本),主机提供哪些服务(应用程序名和版本),主机使用什么类型的报文过滤器/防火墙,以及一堆其它功能。虽然Nmap通常用于安全审核,许多系统管理员和网络管理员也用它来做一些日常的工作,比如查看整个网络的信息,管理服务升级计划,以及监视主机和服务的运行。

Nmap输出的是扫描目标的列表,以及每个目标的补充信息,至于是哪些信息则依赖于所使用的选项。 “所感兴趣的端口表格”是其中的关键。结果列出端口号,协议,服务名称和状态。状态可能是 open(开放的),filtered(被过滤的),closed(关闭的),或者unfiltered(未被过滤的)。

  • Open(开放的)意味着目标机器上的应用程序正在该端口监听连接/报文。
  • filtered(被过滤的) 意味着防火墙,过滤器或者其它网络障碍阻止了该端口被访问,Nmap无法得知 它是 open(开放的) 还是 closed(关闭的)。 
  • closed(关闭的) 端口没有应用程序在它上面监听,但是他们随时可能开放。
  • unfiltered(未被过滤的)当端口对Nmap的探测做出响应,但是Nmap无法确定它们是关闭还是开放时
如果Nmap报告状态组合 open filtered 和 closed filtered 时,那说明Nmap无法确定该端口处于两个状态中的哪一个状态。当要求进行版本探测时,端口表也可以包含软件的版本信息。当要求进行IP协议扫描时 (-sO),Nmap提供关于所支持的IP协议而不是正在监听的端口的信息。

除了所感兴趣的端口表,Nmap还能提供关于目标机的进一步信息,包括反向域名,操作系统猜测,设备类型,和MAC地址。

简单例子

    nmap -A -T4 scanme.nmap.org

端口状态

open 开放的

应用程序正在该端口接收TCP 连接或者UDP报文。发现这一点常常是端口扫描的主要目标,安全意识强的人们知道每个开放的端口都是攻击的入口。攻击者或者入侵测试者想要发现开放的端口。而管理员则试图关闭它们或者用防火墙保护它们以免妨碍了合法用户。非安全扫描可能对开放的端口也感兴趣,因为它们显示了网络上那些服务可供使用。

closed 关闭的

关闭的端口对于Nmap也是可访问的(它接受Nmap的探测报文并作出响应), 但没有应用程序在其上监听。 它们可以显示该IP地址上(主机发现,或者ping扫描)的主机正在运行up 也对部分操作系统探测有所帮助。 因为关闭的关口是可访问的,也许过会儿值得再扫描一下,可能一些又开放了。 系统管理员可能会考虑用防火墙封锁这样的端口。 那样他们就会被显示为被过滤的状态,下面讨论。

filtered 被过滤的

由于包过滤阻止探测报文到达端口,Nmap无法确定该端口是否开放。过滤可能来自专业的防火墙设备,路由器规则 或者主机上的软件防火墙。这样的端口让攻击者感觉很挫折,因为它们几乎不提供 任何信息。有时候它们响应ICMP错误消息如类型3代码13 (无法到达目标: 通信被管理员禁止),但更普遍的是过滤器只是丢弃探测帧, 不做任何响应。 这迫使Nmap重试若干次以访万一探测包是由于网络阻塞丢弃的。 这使得扫描速度明显变慢。

unfiltered 未被过滤的

未被过滤状态意味着端口可访问,但Nmap不能确定它是开放还是关闭。 只有用于映射防火墙规则集的ACK扫描才会把端口分类到这种状态。 用其它类型的扫描如窗口扫描,SYN扫描,或者FIN扫描来扫描未被过滤的端口可以帮助确定 端口是否开放。

open filtered 开放或者被过滤的

当无法确定端口是开放还是被过滤的状态。开放的端口不响应就是一个例子,没有响应也可能意味着报文过滤器丢弃了探测报文或者它引发的任何响应。因此Nmap无法确定该端口是开放的还是被过滤的。UDP,IP协议,FIN,Null,和Xmas扫描可能把端口归入此类。

closed filtered 关闭或者被过滤的

Nmap不能确定端口是关闭的还是被过滤的。它只可能出现在IPID Idle扫描中。

常用端口 Common Ports

端口号从 1 到 65535

  • 小于1024 的端口号通常和 Linux 和 Unix-Like 系统内置服务关联,通常不单独使用,一般需要root才能开启
  • 1024 到 49151 的端口,被认为是 registered.  通常特定的服务可以向 IANA (Internet Assigned Numbers Authority) 来申请使用。 - 在49152 到65535 之间的端口不能被注册使用,并且推荐作为私有用途

常见的端口

20: FTP data
21: FTP control port
22: SSH
23: Telnet <= Insecure, not recommended for most uses
25: SMTP
43: WHOIS protocol
53: DNS services
67: DHCP server port
68: DHCP client port
80: HTTP traffic <= Normal web traffic
110: POP3 mail port
113: Ident authentication services on IRC networks
143: IMAP mail port
161: SNMP
194: IRC389: LDAP port
443: HTTPS <= Secure web traffic
587: SMTP <= message submission port
631: CUPS printing daemon port
666: DOOM <= This legacy FPS game actually has its own special port

其他常见的端口可以通过

    less /etc/services 

来查看。

查看本地端口

    sudo netstat -plunt

netstat 命令用来查看本地端口和服务。

使用 Nmap

安装

    sudo apt-get update      sudo apt-get install nmap

nmap 的创建者提供了一个测试服务器

scanme.nmap.org

扫描类型

-sT    TCP connect()扫描,这是最基本的TCP扫描方式。这种扫描很容易被检测到,在目标主机的日志中会记录大批的连接请求以及错误信息。    
-sS    TCP同步扫描(TCP SYN),因为不必全部打开一个TCP连接,所以这项技术通常称为半开扫描(half-open)。这项技术最大的好处是,很少有系统能够把这记入系统日志。不过,你需要root权限来定制SYN数据包。    
-sF,-sX,-sN    秘密FIN数据包扫描、圣诞树(Xmas Tree)、空(Null)扫描模式。这些扫描方式的理论依据是:关闭的端口需要对你的探测包回应RST包,而打开的端口必需忽略有问题的包(参考RFC 793第64页)。    
-sP    ping扫描,用ping方式检查网络上哪些主机正在运行。当主机阻塞ICMP echo请求包是ping扫描是无效的。nmap在任何情况下都会进行ping扫描,只有目标主机处于运行状态,才会进行后续的扫描。    
-sU    UDP的数据包进行扫描,如果你想知道在某台主机上提供哪些UDP(用户数据报协议,RFC768)服务,可以使用此选项。    
-sA    ACK扫描,这项高级的扫描方法通常可以用来穿过防火墙。    
-sW    滑动窗口扫描,非常类似于ACK的扫描。    
-sR    RPC扫描,和其它不同的端口扫描方法结合使用。    
-b    FTP反弹攻击(bounce attack),连接到防火墙后面的一台FTP服务器做代理,接着进行端口扫描。    

通用选项

-P0    在扫描之前,不ping主机。    
-PT    扫描之前,使用TCP ping确定哪些主机正在运行。    
-PS    对于root用户,这个选项让nmap使用SYN包而不是ACK包来对目标主机进行扫描。    
-PI    设置这个选项,让nmap使用真正的ping(ICMP echo请求)来扫描目标主机是否正在运行。    
-PB    这是默认的ping扫描选项。它使用ACK(-PT)和ICMP(-PI)两种扫描类型并行扫描。如果防火墙能够过滤其中一种包,使用这种方法,你就能够穿过防火墙。    
-O    这个选项激活对TCP/IP指纹特征(fingerprinting)的扫描,获得远程主机的标志,也就是操作系统类型。    
-I    打开nmap的反向标志扫描功能。    
-f    使用碎片IP数据包发送SYN、FIN、XMAS、NULL。包增加包过滤、入侵检测系统的难度,使其无法知道你的企图。    
-v    冗余模式。强烈推荐使用这个选项,它会给出扫描过程中的详细信息。    
-S <IP>    在一些情况下,nmap可能无法确定你的源地址(nmap会告诉你)。在这种情况使用这个选项给出你的IP地址。    
-g port    设置扫描的源端口。一些天真的防火墙和包过滤器的规则集允许源端口为DNS(53)或者FTP-DATA(20)的包通过和实现连接。显然,如果攻击者把源端口修改为20或者53,就可以摧毁防火墙的防护。    
-oN    把扫描结果重定向到一个可读的文件logfilename中。    
-oS    扫描结果输出到标准输出。    
--host_timeout    设置扫描一台主机的时间,以毫秒为单位。默认的情况下,没有超时限制。    
--max_rtt_timeout    设置对每次探测的等待时间,以毫秒为单位。如果超过这个时间限制就重传或者超时。默认值是大约9000毫秒。    
--min_rtt_timeout    设置nmap对每次探测至少等待你指定的时间,以毫秒为单位。    
-M count    置进行TCP connect()扫描时,最多使用多少个套接字进行并行的扫描。 ```  

### 扫描目标

目标地址可以为IP地址,CIRD 地址等。如192.168.1.2,222.247.54.5/24    

-iL filename    从filename文件中读取扫描的目标。     -iR    让nmap自己随机挑选主机进行扫描。     -p    端口 这个选项让你选择要进行扫描的端口号的范围。如:-p 20-30,139,60000 -exclude    排除指定主机。     -excludefile    排除指定文件中的主机。    


## 常用命令

### 获取远程主机系统类型和开放端口

    nmap -sS -P0 -sV -O [target]

这里的 target 可以是单一 IP, 或主机名,或域名,或子网

-sS TCP SYN 扫描 (又称半开放,或隐身扫描) -P0 允许你关闭 ICMP pings. -sV 打开系统版本检测 -O 尝试识别远程操作系统


其它选项:

-A 同时打开操作系统指纹和版本检测 -v 详细输出扫描情况.


### 寻找网络中所有在线主机

    sudo nmap -sP 192.168.0.0/24


## 参数

Usage: nmap [Scan Type(s)] [Options] {target specification} TARGET SPECIFICATION:  Can pass hostnames, IP addresses, networks, etc.  Ex: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0-255.0-255.1-254  -iL : Input from list of hosts/networks  -iR : Choose random targets  --exclude <host1[,host2][,host3],...>: Exclude hosts/networks  --excludefile : Exclude list from file HOST DISCOVERY:  -sL: List Scan - simply list targets to scan  -sP: Ping Scan - go no further than determining if host is online  -P0: Treat all hosts as online -- skip host discovery  -PS/PA/PU [portlist]: TCP SYN/ACK or UDP discovery probes to given ports  -PE/PP/PM: ICMP echo, timestamp, and netmask request discovery probes  -n/-R: Never do DNS resolution/Always resolve [default: sometimes resolve] SCAN TECHNIQUES:  -sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans  -sN/sF/sX: TCP Null, FIN, and Xmas scans  --scanflags : Customize TCP scan flags  -sI <zombie host[:probeport]>: Idlescan  -sO: IP protocol scan  -b : FTP bounce scan PORT SPECIFICATION AND SCAN ORDER:  -p : Only scan specified ports    Ex: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080  -F: Fast - Scan only the ports listed in the nmap-services file)  -r: Scan ports consecutively - don't randomize SERVICE/VERSION DETECTION:  -sV: Probe open ports to determine service/version info  --version-light: Limit to most likely probes for faster identification  --version-all: Try every single probe for version detection  --version-trace: Show detailed version scan activity (for debugging) OS DETECTION:  -O: Enable OS detection  --osscan-limit: Limit OS detection to promising targets  --osscan-guess: Guess OS more aggressively TIMING AND PERFORMANCE:  -T[0-6]: Set timing template (higher is faster)  --min-hostgroup/max-hostgroup : Parallel host scan group sizes  --min-parallelism/max-parallelism : Probe parallelization  --min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout : Specifies      probe round trip time.  --host-timeout : Give up on target after this long  --scan-delay/--max-scan-delay : Adjust delay between probes FIREWALL/IDS EVASION AND SPOOFING:  -f; --mtu : fragment packets (optionally w/given MTU)  -D <decoy1,decoy2[,ME],...>: Cloak a scan with decoys  -S : Spoof source address  -e : Use specified interface  -g/--source-port : Use given port number  --data-length : Append random data to sent packets  --ttl : Set IP time-to-live field  --spoof-mac <mac address, prefix, or vendor name>: Spoof your MAC address OUTPUT:  -oN/-oX/-oS/-oG : Output scan results in normal, XML, s|<rIpt kIddi3,     and Grepable format, respectively, to the given filename.  -oA : Output in the three major formats at once  -v: Increase verbosity level (use twice for more effect)  -d[level]: Set or increase debugging level (Up to 9 is meaningful)  --packet-trace: Show all packets sent and received  --iflist: Print host interfaces and routes (for debugging)  --append-output: Append to rather than clobber specified output files  --resume : Resume an aborted scan  --stylesheet <path/URL>: XSL stylesheet to transform XML output to HTML  --no-stylesheet: Prevent Nmap from associating XSL stylesheet w/XML output MISC:  -6: Enable IPv6 scanning  -A: Enables OS detection and Version detection  --datadir : Specify custom Nmap data file location  --send-eth/--send-ip: Send packets using raw ethernet frames or IP packets  --privileged: Assume that the user is fully privileged  -V: Print version number  -h: Print this help summary page. EXAMPLES:  nmap -v -A scanme.nmap.org  nmap -v -sP 192.168.0.0/16 10.0.0.0/8  nmap -v -iR 10000 -P0 -p 80 ```

reference