【原创】nmap命令详解实战


Nmap是一个用来扫描网络扫描的实用工具,它可以用来扫描目标地址的存活情况、开放端口、协议,甚至能判断目标主机的操作系统版本。在Linux运维、网络、安全等方面有很广泛的应用。

nmap

相关知识:tcp协议连接过程、tcp协议报文、arp协议、nping、nc、IDS、IPS、iptables、HIDS、NIDS、tcpdump、wireshark

nmap安装

nmap官网

1
2
3
4
5
6
7
8
9
10
# linux系统可以通过包管理工具进行安装
yum install -y nmap
apt install -y nmap
# mac
brew install nmap
# linux系统中通过包管理工具安装的一般不是最新版本,需要最新版本的包需要通过编译的方式来安装
# 编译安装,以linux系统为例
wget https://nmap.org/dist/nmap-7.92.tar.bz2 --no-check-certificate
tar xf nmap-7.92.tar.bz2 && cd nmap-7.92
./configure && make -j 4 && make install -j 4

Nmap包含四项基本功能

  • 主机发现(Host Discovery)
  • 端口扫描(Port Scanning)
  • 版本侦测(Version Detection)
  • 操作系统侦测(Operating System Detection)

nmap的探活机制

默认情况下,nmap在做端口扫描之前,会先对目标地址进行探活操作,在得不到存活反馈的情况下,nmap会直接结束扫描过程,并输出目标地址不存活的信息。在这种情况下,我们得到的扫描结果就不够准确了,因此,我们可以使用-Pn参数来跳过探活阶段,直接进行端口扫描。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 默认情况下会先进行探活
$ nmap c.isme.pub
Starting Nmap 7.92 ( https://nmap.org ) at 2022-05-19 11:33 CST
Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 3.09 seconds
# 使用-Pn参数会跳过探活
nmap -Pn c.isme.pub
Starting Nmap 7.92 ( https://nmap.org ) at 2022-05-19 11:30 CST
Nmap scan report for c.isme.pub (140.143.247.181)
Host is up (0.011s latency).
Not shown: 989 closed tcp ports (conn-refused)
PORT STATE SERVICE
...

那么nmap的探活机制是什么样的呢?我们可以通过抓包的方式来对nmap的探活机制进行分析。

1
tcpdump host c.isme.pub -w nmap.cap
  • mac nmap 7.92版本抓包结果

image-20220519113939668

  • linux nmap 7.01版本抓包结果

image-20220519114436497

  • linux nmap 7.92版本抓包结果

image-20220519123522344

通过以上抓包结果分析能够得出大概结论,默认情况下:

  • nmap是以icmp协议为主结合tcp(80、443)协议来判断目标地址是否存活
  • 在mac的nmap中探活去掉了icmp协议,只使用tcp(80、443)协议来判断目标地址是否存活

仅对目标地址进行探活

使用-sP参数只会对目标地址探活,不会进行端口扫描

1
2
3
4
5
6
7
8
$ nmap -sP c.isme.pub
Starting Nmap 7.92 ( https://nmap.org ) at 2022-05-19 12:07 CST
Nmap scan report for c.isme.pub (140.143.247.181)
Host is up (0.0030s latency).
Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds

# 只使用icmp协议做探活
$ nmap -sn c.isme.pub

使用ARP协议进行探活

如果我们是在针对局域网的目标地址进行扫描,那么我们可以通过ARP协议来进行探活,这样不仅速度快,而且探活结果也更加准确,但是ARP协议只适用于局域网内,不能用于公网扫描。

1
2
3
4
$ nmap -PR 10.10.10.10
Starting Nmap 7.92 ( https://nmap.org ) at 2022-05-19 12:10 CST
Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 3.08 seconds

半开扫描和全开扫描

半开扫描和全开扫描与TCP连接的三次握手有关系,所谓三次握手就是建立TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。这3个包的发送过程,类似于我们打电话,首先自我介绍,然后对方介绍,最后问好,整个流程如下图所示

img

全开扫描

tcp三次握手的过程全部完成即为全开扫描。

1
nmap -sT -Pn -p 80 c.isme.pub

image-20220519130758847

半开扫描(SYN扫描)

SYN扫描,又称半开扫描,是使用频率最高的扫描选项,扫描原理是在TCP三次握手过程中,不进行最后一次握手,因此执行的速度比全开扫描更快,效率更高,使用参数为-sS

Tcp SYN Scan (sS) 它被称为半开放扫描

  • 优点:Nmap发送SYN包到远程主机,但是它不会产生任何会话,目标主机几乎不会把连接记入系统日志。(防止对方判断为扫描攻击),扫描速度快,效率高,在工作中使用频率最高。
  • 缺点:它需要root/administrator权限执行,非root用户可以用sT,但是效率低利用三次握手有可能会被检测为恶意攻击行为。
1
nmap -sS -Pn -p 80 c.isme.pub

image-20220519130725317

UDP扫描

它不需要发送任何的SYN包,因为这种技术是针对UDP端口的。UDP扫描发送UDP数据包到目标主机,并等待响应,
如果返回ICMP不可达的错误消息,说明端口是关闭的,如果得到正确的适当的回应,说明端口是开放的,udp端口扫描速度比较慢

1
2
3
4
$ nmap -sU -Pn -p 81 c.isme.pub
PORT STATE SERVICE
123/udp open ntp
68/udp open|filtered dhcpc

image-20220519134835462

image-20220519134337374

FIN扫描(FIN scan(sF))

有时候TcpSYN扫描不是最佳的扫描模式,因为有防火墙的存在,目标主机有时候可能有IDSIPS系统的存在,防火墙会阻止掉SYN数据包。

FIN扫描发送了一个设置了FIN标志的数据包并不需要完成TCP的握手,和sS扫描效果差不多,比sT速度快

1
2
3
4
5
6
7
8
9
10
$ nmap -sF -Pn -p 80-81 c.isme.pub 
Starting Nmap 7.92 ( https://nmap.org ) at 2022-05-19 13:58 CST
Nmap scan report for c.isme.pub (140.143.247.181)
Host is up (0.00033s latency).

PORT STATE SERVICE
80/tcp open|filtered http
81/tcp closed hosts2-ns

Nmap done: 1 IP address (1 host up) scanned in 1.34 seconds

image-20220519135811304

image-20220519140141203

通过抓包可以看到,有明确FIN回包的情况下会认为目标端口处于open状态,目前回包RST/ACK报文会认为端口处于关闭状态,目标地址没有明确回包的情况下会认为是filtered状态

比较奇怪的是不管是有没有fin回包,nmap都会标记为open|filtered状态,目前怀疑是因为nmap不确定目标是否有iptables策略导致,暂时没有深究原理

ACK扫描(ACK scan(sA))

ACK扫描一般用于判断目标地址的端口是否有防火墙策略,nmap发送一个ACK请求,通过目标地址是否回复RST报文判断目标端口是否有防火墙策略

  • 如果目标没有回复,会认为目标地址有防火墙策略
  • 如果目标有回复,会认为目标地址没有防火墙策略
1
2
3
4
5
$ nmap -sA -p 80 -Pn c.isme.pub
80/tcp unfiltered http
135/tcp filtered msrpc
136/tcp unfiltered profile
80/tcp open http

image-20220519143751275

端口扫描

端口发现

Nmap默认扫描的端口是1000个Nmap认为比较常用的1000个端口,但是实际上电脑的端口范围是0-65535。如果我们想要扫描目标主机的全部端口,我们可以在参数-p后面加上*1-65535

1
2
nmap -p '*' c.isme.pub
nmap -p 1-65535 c.isme.pub

端口状态

nmap扫描出来的端口通常来说会有以下六种状态

  • open
  • closed
  • filtered
  • unfiltered
  • open|filtered
  • closed|filtered

open

端口处于打开状态,并且能够回应当前扫描节点的请求,

image-20220519124835946

从抓包的结果上看,目标端口可能正常的进行tcp三次握手,nmap会认为目标端口存活

image-20220519134835462

udp场景下目标地址有明确的udp回包

closed

端口处于关闭状态,但是端口可能随时开放

image-20220519124859700

从抓包的结果上看,nmap拿到了目标端口的RST/ACK报文,nmap会认为目标端口处于closed状态

image-20220519134309562

在udp探测场景下,目标地址没有明确的udp回包,有icmp协议回包的端口不可达

filtered

无法判断端口是否存活,当前扫描节点被目标的防火墙设备阻断了请求

image-20220519123006385

从抓包的情况下分析可以发现,nmap向目标地址发送syn请求没有得到回应,这种情况下nmap会认为目标端口处于filtered状态

open|filtered

在udp场景下,目标地址接受了udp包,但是没有回包,很有可能被防火墙设备阻断了请求的情况下会出现这种状态

image-20220519134217904

常用扫描实例

目标地址存活探测

1
2
3
4
5
6
7
8
9
10
# 跳过存活探测
nmap -Pn 10.10.10.1
# 只做存活探测,icmp+tcp
nmap -sP 10.10.10.1
# 网段扫描
nmap -sP 10.10.10.0/24
# 只通过icmp协议判断目标是否存活
nmap -sn 10.0.1.161-166
# 使用arp协议探活
nmap -PR 10.10.10.1

识别目标操作系统

Nmap不仅能扫描IP还能扫描端口,同时Nmap还可以识别操作系统的类型。为什么要识别操作系统是什么类型呢?因为系统不一样,渗透的方法就不同,linux系统和Windows系统有区别,安卓系统和苹果系统有区别,所以识别出是什么系统还是非常重要的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ nmap -O -sS c.isme.pub -p 80 -Pn
Starting Nmap 7.92 ( https://nmap.org ) at 2022-05-19 14:05 CST
Nmap scan report for c.isme.pub (140.143.247.181)
Host is up (0.0035s latency).

PORT STATE SERVICE
80/tcp open http
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose|WAP
Running (JUST GUESSING): Linux 3.X|4.X|2.6.X (88%), Asus embedded (85%)
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:2.6 cpe:/h:asus:rt-n56u cpe:/o:linux:linux_kernel:3.4 cpe:/o:linux:linux_kernel:4.1
Aggressive OS guesses: Linux 3.10 - 4.11 (88%), Linux 3.13 (88%), Linux 3.13 or 4.2 (88%), Linux 3.16 (88%), Linux 3.2 - 4.9 (88%), Linux 4.2 (88%), Linux 3.5 (87%), Linux 3.12 (87%), Linux 3.18 (87%), Linux 3.8 - 3.11 (87%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: -190 hops

OS detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 4.35 seconds

从抓包结果上看包的内容比较复杂,目前没有具体分析

版本扫描

1
2
3
nmap -sS -sV c.isme.pub -p 80 -Pn
PORT STATE SERVICE VERSION
80/tcp open http nginx

image-20220519141503127

image-20220519141618177

从抓包结果上看 nmap会先针对端口判断协议,然后根据不同协议发送大量请求,针对目标的回包内容分析目标使用的软件版本信息。由于发送的包数量很多,因此这个扫描过程也会比较慢

端口扫描

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 全端口扫描
nmap -p '*' c.isme.pub
nmap -p 1-65535 c.isme.pub
# 扫描目标网段
nmap 10.10.10.0/24
# 指定本地扫描网卡
nmap -e eth0 c.isme.pub
# 全开扫描
nmap -sT -Pn -p 80 c.isme.pub
# 半开扫描
nmap -sS -Pn -p 80 c.isme.pub
# udp扫描
nmap -sU -Pn -p 81 c.isme.pub
# FIN扫描
nmap -sF -Pn -p 80-81 c.isme.pub
# ACK扫描
nmap -sA -p 80 -Pn c.isme.pub
nmap -sU -p U:445 192.168.130
nmap -sT -p T:455 192.168.1.30
nmap -sS -p T:135,U:445 192.168.1.30

其他

1
2
3
4
5
6
7
# iptables -I INPUT -s 10.0.1.162 -j DROP 拒绝10.0.1.162扫描
# 伪装地址,暂未测试
nmap -e eth0 10.0.1.161 -S 10.0.1.162 -Pn # 伪装成10.0.1.162扫描被拒绝
nmap -e eth0 10.0.1.161 -S 10.0.1.168 -Pn # 伪装成10.0.1.168成功扫描

# 查看本地路由与接口
nmap -iflist

总结

nmap是一个非常强大的扫描工具,运行模式和可使用的参数非常多,在nmap扫描的过程中通过抓包分析可以让我们更好的理解nmap的运行机制。

同时在使用nmap的过程中,还需要注意防火墙、入侵检测系统(IDS)以及其他工具对扫描操作的影响

通常来说 TCP connect 会引起IDS系统的反应(默认的nmap扫描是-sT模式)
但IDS不一定会记录俗称“半连接”的TCP SYN扫描(-sS方式的)

  • 避免误解:不要随意选择nmap的扫描目标,有些系统会将端口扫描视为恶意行为,端口扫描有可能会触发IDS报警或其他报警。
  • 关闭不必要的开放服务:通过nmap的扫描结果可以考虑将不需要使用的服务关闭,或者不需要开放到大范围的端口加上访问控制策略(ACL),只开放需要开放到外界的端口

参数详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
Nmap 7.92 ( https://nmap.org )
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.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
# 主机扫描
HOST DISCOVERY:
# 只列出将扫描的列表
-sL: List Scan - simply list targets to scan
# 只通过icmp协议判断目标主机是否存活
-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
SCAN TECHNIQUES:
# 半开扫描/全开扫描/ACK扫描/sW/sM
-sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans
# udp扫描
-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
PORT SPECIFICATION AND SCAN ORDER:
# 指定端口
-p <port ranges>: Only scan specified ports
Ex: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9
# 排除端口
--exclude-ports <port ranges>: Exclude the specified ports from scanning
# 快速扫描,比默认情况扫描更少的端口
-F: Fast mode - Scan fewer ports than the default scan
# 连续扫描端口
-r: Scan ports consecutively - don't randomize
# 只扫描最常见的端口数量
--top-ports <number>: Scan <number> most common ports
--port-ratio <ratio>: Scan ports more common than <ratio>
SERVICE/VERSION DETECTION:
# 扫描服务版本
-sV: Probe open ports to determine service/version info
--version-intensity <level>: Set from 0 (light) to 9 (try all probes)
--version-light: Limit to most likely probes (intensity 2)
--version-all: Try every single probe (intensity 9)
--version-trace: Show detailed version scan activity (for debugging)
SCRIPT SCAN:
-sC: equivalent to --script=default
--script=<Lua scripts>: <Lua scripts> is a comma separated list of
directories, script-files or script-categories
--script-args=<n1=v1,[n2=v2,...]>: provide arguments to scripts
--script-args-file=filename: provide NSE script args in a file
--script-trace: Show all data sent and received
--script-updatedb: Update the script database.
--script-help=<Lua scripts>: Show help about scripts.
<Lua scripts> is a comma-separated list of script-files or
script-categories.
OS DETECTION:
# 扫描操作系统版本
-O: Enable OS detection
--osscan-limit: Limit OS detection to promising targets
--osscan-guess: Guess OS more aggressively
TIMING AND PERFORMANCE:
Options which take <time> are in seconds, or append 'ms' (milliseconds),
's' (seconds), 'm' (minutes), or 'h' (hours) to the value (e.g. 30m).
-T<0-5>: Set timing template (higher is faster)
--min-hostgroup/max-hostgroup <size>: Parallel host scan group sizes
--min-parallelism/max-parallelism <numprobes>: Probe parallelization
--min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout <time>: Specifies
probe round trip time.
--max-retries <tries>: Caps number of port scan probe retransmissions.
--host-timeout <time>: Give up on target after this long
--scan-delay/--max-scan-delay <time>: Adjust delay between probes
--min-rate <number>: Send packets no slower than <number> per second
--max-rate <number>: Send packets no faster than <number> per second
FIREWALL/IDS EVASION AND SPOOFING:
-f; --mtu <val>: fragment packets (optionally w/given MTU)
-D <decoy1,decoy2[,ME],...>: Cloak a scan with decoys
-S <IP_Address>: Spoof source address
-e <iface>: Use specified interface
-g/--source-port <portnum>: Use given port number
--proxies <url1,[url2],...>: Relay connections through HTTP/SOCKS4 proxies
--data <hex string>: Append a custom payload to sent packets
--data-string <string>: Append a custom ASCII string to sent packets
--data-length <num>: Append random data to sent packets
--ip-options <options>: Send packets with specified ip options
--ttl <val>: Set IP time-to-live field
--spoof-mac <mac address/prefix/vendor name>: Spoof your MAC address
--badsum: Send packets with a bogus TCP/UDP/SCTP checksum
OUTPUT:
-oN/-oX/-oS/-oG <file>: Output scan in normal, XML, s|<rIpt kIddi3,
and Grepable format, respectively, to the given filename.
-oA <basename>: Output in the three major formats at once
-v: Increase verbosity level (use -vv or more for greater effect)
-d: Increase debugging level (use -dd or more for greater effect)
--reason: Display the reason a port is in a particular state
--open: Only show open (or possibly open) ports
--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 <filename>: Resume an aborted scan
--noninteractive: Disable runtime interactions via keyboard
--stylesheet <path/URL>: XSL stylesheet to transform XML output to HTML
--webxml: Reference stylesheet from Nmap.Org for more portable XML
--no-stylesheet: Prevent associating of XSL stylesheet w/XML output
MISC:
-6: Enable IPv6 scanning
-A: Enable OS detection, version detection, script scanning, and traceroute
--datadir <dirname>: Specify custom Nmap data file location
--send-eth/--send-ip: Send using raw ethernet frames or IP packets
--privileged: Assume that the user is fully privileged
--unprivileged: Assume the user lacks raw socket privileges
-V: Print version number
-h: Print this help summary page.
EXAMPLES:
nmap -v -A scanme.nmap.org
nmap -v -sn 192.168.0.0/16 10.0.0.0/8
nmap -v -iR 10000 -Pn -p 80
SEE THE MAN PAGE (https://nmap.org/book/man.html) FOR MORE OPTIONS AND EXAMPLES

附录

IDS、IPS、HIDS、NIDS

IDS

参考原文地址

入侵检测系统(intrusion detection system,简称IDS)是一种对网络传输进行即时监视,在发现可疑传输时发出警报或者采取主动反应措施的网络安全设备。它与其他网络安全设备的不同之处便在于,IDS是一种积极主动的安全防护技术。

入侵检测系统(IDS)检查所有进入和发出的网络活动,并可确认某种可疑模式,IDS利用这种模式能够指明来自试图进入(或破坏系统)的某人的网络攻击(或系统攻击)。

入侵检测系统与防火墙不同,防火墙关注入侵是为了阻止其发生。防火墙限制网络之间的访问,目的在于防止入侵,但并不对来自网络内部的攻击发出警报信号。而IDS却可以在入侵发生时,评估可疑的入侵并发出警告。而且IDS还可以观察源自系统内部的攻击。从这个意义上来讲,IDS可能安全工作做得更全面。

IDS从本质上可以分为两类:网络型IDS(NIDS)和主机型IDS(HIDS)两种。

  • 基于网络的NIDS,是指对收集漏洞信息、造成拒绝访问及获取超出合法范围的系统控制权等危害计算机系统安全的行为,进行检测的软件与硬件的组合。
  • 基于主机的HIDS,需要安装到被保护的主机,可以查看和监控流量、日志、文件等信息,并核对他们是否和预期相同,检测并报告结果。

img

HIDS

HIDS全称是Host-based Intrusion Detection System,即基于主机型入侵检测系统。作为计算机系统的监视器和分析器,它并不作用于外部接口,而是专注于系统内部,监视系统全部或部分的动态的行为以及整个计算机系统的状态。

NIDS

网络入侵检测系统(network intrusion detection systemNIDS),是指对收集漏洞信息、造成拒绝访问及获取超出合法范围的系统控制权等危害计算机系统安全的行为,进行检测的软件与硬件的组合。

IPS

入侵防御系统(IPS: Intrusion Prevention System)是电脑网络安全设施,是对防病毒软件(Antivirus Programs)和防火墙(Packet Filter, Application Gateway)的补充。 入侵防御系统(Intrusion-prevention system)是一部能够监视网络或网络设备的网络资料传输行为的计算机网络安全设备,能够及时的中断、调整或隔离一些不正常或是具有伤害性的网络资料传输行为。

wireshark

  • ip地址过滤:
    • ip.dst==192.168.0.1
    • ip.src==192.168.0.1
  • 端口过滤:
    • tcp.port==80
    • tcp.dstport==80
    • tcp.srcport==80
  • 协议过滤
    • http
    • tcp
    • ssl
  • http请求方法过滤
    • http.request.method==GET
      http.request.method==POST
  • 多个过滤条件可以用and连接