Nmap提供了许多不同类型的扫描,可用于获得有关我们目标的各种结果。基本上,Nmap可以分为以下扫描技术: 主机发现 端口扫描 服务枚举和检测 OS检测 与目标服务的脚本化交互(Nmap脚本引擎)

Syntax

Tanin@htb[/htb]$ nmap <scan types> <options> <target>

Scan Techniques

Nmap提供了许多不同的扫描技术,可以进行不同类型的连接,并使用不同结构的数据包进行发送。在这里,我们可以看到Nmap提供的所有扫描技术:

Tanin@htb[/htb]$ nmap --help

<SNIP>
SCAN TECHNIQUES:
  -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
<SNIP>

例如,TCP-SYN扫描(-sS)是默认设置之一,除非我们另有定义,它也是最流行的扫描方法之一。这种扫描方法可以每秒扫描数千个端口。TCP-SYN扫描发送一个带有SYN标志的数据包,因此永远不会完成三方握手,这导致无法建立到扫描端口的完整TCP连接。

如果我们的目标将带有SYN-ACK标记的数据包发送回扫描的端口,Nmap会检测到该端口处于打开状态。 如果数据包接收到RST标志,则表示端口已关闭。 如果Nmap没有收到返回的数据包,它将显示为已过滤。根据防火墙配置,某些数据包可能会被防火墙丢弃或忽略。

Host Discovery

Scan Network Range

Tanin@htb[/htb]$ sudo nmap 10.129.2.0/24 -sn -oA tnet | grep for | cut -d" " -f5

10.129.2.4
10.129.2.10
10.129.2.11
10.129.2.18
10.129.2.19
10.129.2.20
10.129.2.28

提供的命令使用了nmap工具对IP范围10.129.2.0/24执行了一个ping扫描(-sn)。然后,它以指定的格式(-oA tnet)保存输出结果。grep for命令用于过滤只显示包含关键词”for”的行。最后,cut -d" " -f5使用空格作为分隔符提取每行的第五个字段。

在这种情况下,第五个字段对应于响应了ping扫描的IP地址。

Scan IP List

Tanin@htb[/htb]$ sudo nmap -sn -oA tnet -iL hosts.lst | grep for | cut -d" " -f5
-iL Performs defined scans against targets in provided ‘hosts.lst’ list.
-sn Disables port scanning.

Scan Multiple IPs

Tanin@htb[/htb]$ sudo nmap -sn -oA tnet 10.129.2.18 10.129.2.19 10.129.2.20| grep for | cut -d" " -f5

如果这些IP地址相邻,我们也可以定义各自八位字节中的范围。

Tanin@htb[/htb]$ sudo nmap -sn -oA tnet 10.129.2.18-20| grep for | cut -d" " -f5

如果我们禁用端口扫描(-sn),Nmap会使用ICMP回显请求(-PE)自动ping扫描。一旦发送了这样的请求,如果ping主机处于活动状态,我们通常会收到ICMP回复。更有趣的事实是,我们之前的扫描并没有做到这一点,因为在Nmap发送ICMP回显请求之前,它会发送ARP ping,从而得到ARP回复。我们可以通过“–packet trace”选项来确认这一点。为了确保发送ICMP回显请求,我们还为此定义了选项(-PE)。

Tanin@htb[/htb]$ sudo nmap 10.129.2.18 -sn -oA host -PE --packet-trace 

Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 00:08 CEST
SENT (0.0074s) ARP who-has 10.129.2.18 tell 10.10.14.2
RCVD (0.0309s) ARP reply 10.129.2.18 is-at DE:AD:00:00:BE:EF
Nmap scan report for 10.129.2.18
Host is up (0.023s latency).
MAC Address: DE:AD:00:00:BE:EF
Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds
-PE Performs the ping scan by using ‘ICMP Echo requests’ against the target.
--packet-trace Shows all packets sent and received

另一种确定Nmap为什么将我们的目标标记为“alive”的方法是使用“–reason”选项。

Tanin@htb[/htb]$ sudo nmap 10.129.2.18 -sn -oA host -PE --reason 

Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 00:10 CEST
SENT (0.0074s) ARP who-has 10.129.2.18 tell 10.10.14.2
RCVD (0.0309s) ARP reply 10.129.2.18 is-at DE:AD:00:00:BE:EF
Nmap scan report for 10.129.2.18
Host is up, received arp-response (0.028s latency).
MAC Address: DE:AD:00:00:BE:EF
Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds

我们在这里看到,Nmap确实通过ARP请求和ARP回复单独检测主机是否活着。要禁用ARP请求并用所需的ICMP回显请求扫描我们的目标,我们可以通过设置“–disable ARP ping”选项来禁用ARP ping。然后我们可以再次扫描目标,查看发送和接收的数据包。

ICMP回显请求可以帮助我们确定目标是否活着并识别其系统。有关主机发现的更多策略,请访问:https://nmap.org/book/host-discovery-strategies.html

​ 不同操作系统的ICMP Time-to-Live (TTL)值可能会有所不同。TTL是一个IP数据包头部字段,它指定了数据包在网络中可以经过的最大路由跳数。当ICMP Echo Request(ping请求)被发送到目标主机时,TTL字段被设置为一个初始值,然后在每个路由器经过时递减。通过检查返回的ICMP Echo Reply(ping响应)中的TTL值,可以提供一些关于目标主机的操作系统类型的线索。

然而,需要注意的是,TTL值并非仅由操作系统决定,还受到网络设备、路由器和防火墙等因素的影响。因此,通过TTL值进行操作系统识别是一种推测,可能并不总是准确。

以下是一些常见操作系统的TTL默认值范例:

  • Windows系统通常使用默认TTL值为 128。
  • Linux和Unix系统通常使用默认TTL值为 64。
  • macOS系统通常使用默认TTL值为 64。

Host and Port Scanning

Discovering Open TCP Ports

默认情况下,Nmap使用SYN扫描(-sS)扫描前1000个TCP端口。由于创建原始TCP数据包所需的套接字权限,此SYN扫描仅在我们以root身份运行时设置为默认值。否则,默认情况下会执行TCP扫描(-sT)。这意味着,如果我们不定义端口和扫描方法,这些参数将自动设置。我们可以逐个定义端口(-p 22,25,80139445),按范围(-p 22-445),按Nmap数据库中已被签名为最频繁的顶级端口(-top ports=10),通过扫描所有端口(-p-),也可以定义包含前100个端口(-F)的快速端口扫描。

Tanin@htb[/htb]$ sudo nmap 10.129.2.28 --top-ports=10 

Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 15:36 CEST
Nmap scan report for 10.129.2.28
Host is up (0.021s latency).

PORT     STATE    SERVICE
21/tcp   closed   ftp
22/tcp   open     ssh
23/tcp   closed   telnet
25/tcp   open     smtp
80/tcp   open     http
110/tcp  open     pop3
139/tcp  filtered netbios-ssn
443/tcp  closed   https
445/tcp  filtered microsoft-ds
3389/tcp closed   ms-wbt-server
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)

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

我们看到,我们只扫描了目标的前10个TCP端口,Nmap相应地显示了它们的状态。如果我们跟踪Nmap发送的数据包,我们将看到目标发送回我们的TCP端口21上的RST标志。为了清楚地了解SYN扫描,我们禁用ICMP回显请求(-Pn)、DNS解析(-n)和ARP ping扫描(–disable ARP ping)。

Tanin@htb[/htb]$ sudo nmap 10.129.2.28 -p 21 --packet-trace -Pn -n --disable-arp-ping

Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 15:39 CEST
SENT (0.0429s) TCP 10.10.14.2:63090 > 10.129.2.28:21 S ttl=56 id=57322 iplen=44  seq=1699105818 win=1024 <mss 1460>
RCVD (0.0573s) TCP 10.129.2.28:21 > 10.10.14.2:63090 RA ttl=64 id=0 iplen=40  seq=0 win=0
Nmap scan report for 10.11.1.28
Host is up (0.014s latency).

PORT   STATE  SERVICE
21/tcp closed ftp
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)

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

我们可以从SENT行中看到,我们(10.10.14.2)向我们的目标(10.129.2.28)发送了一个带有SYN标志(S)的TCP数据包。在下一行RCVD中,我们可以看到目标用一个包含RST和ACK标志(RA)的TCP包进行响应。RST和ACK标志用于确认TCP分组(ACK)的接收并结束TCP会话(RST)。

--packet-trace Shows all packets sent and received.
-n Disables DNS resolution.
--disable-arp-ping Disables ARP ping.

Response

Message Description
RCVD (0.0573s) Indicates a received packet from the target.
TCP Shows the protocol that is being used.
10.129.2.28:21 > Represents targets IPv4 address and the source port, which will be used to reply.
10.10.14.2:63090 Shows our IPv4 address and the port that will be replied to.
RA RST and ACK flags of the sent TCP packet.
ttl=64 id=0 iplen=40 seq=0 win=0 Additional TCP Header parameters.

Connect Scan

Nmap TCP连接扫描 TCP Connect Scan(-sT)使用TCP三方握手来确定目标主机上的特定端口是打开还是关闭。扫描会向目标端口发送一个SYN数据包,并等待响应。如果目标端口用SYN-ACK数据包进行响应,则它被认为是打开的;如果目标端口使用RST数据包进行回应,则它是关闭的。 Connect扫描很有用,因为它是确定端口状态的最准确方法,也是最隐蔽的方法。与其他类型的扫描(如SYN扫描)不同,Connect扫描不会在目标主机上留下任何未完成的连接或未发送的数据包,这使得它不太可能被入侵检测系统(IDS)或入侵预防系统(IPS)检测到。当我们想绘制网络地图,又不想干扰其背后运行的服务时,它很有用,因此影响最小,有时被认为是一种更礼貌的扫描方法。 当目标主机具有丢弃传入数据包但允许传出数据包的个人防火墙时,它也很有用。在这种情况下,连接扫描可以绕过防火墙,准确地确定目标端口的状态。但是,需要注意的是,Connect扫描比其他类型的扫描慢,因为它要求扫描仪在发送每个数据包后等待来自目标的响应,如果目标繁忙或没有响应,这可能需要一些时间。

Tanin@htb[/htb]$ sudo nmap 10.129.2.28 -p 443 --packet-trace --disable-arp-ping -Pn -n --reason -sT 

Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 16:26 CET
CONN (0.0385s) TCP localhost > 10.129.2.28:443 => Operation now in progress
CONN (0.0396s) TCP localhost > 10.129.2.28:443 => Connected
Nmap scan report for 10.129.2.28
Host is up, received user-set (0.013s latency).

PORT    STATE SERVICE REASON
443/tcp open  https   syn-ack

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

Filtered Ports

当一个端口显示为已过滤时,可能有几个原因。在大多数情况下,防火墙都设置了某些规则来处理特定的连接。数据包可以被丢弃,也可以被拒绝。当数据包被丢弃时,Nmap不会收到来自目标的响应,默认情况下,重试率(–max retries)设置为1。这意味着Nmap将向目标端口重新发送请求,以确定前一个数据包是否未被意外错误处理。 让我们看一个例子,其中防火墙丢弃了我们为端口扫描发送的TCP数据包。因此,我们扫描TCP端口139,该端口已显示为已过滤。为了能够跟踪我们发送的数据包是如何处理的,我们再次停用ICMP回显请求(-Pn)、DNS解析(-n)和ARP ping扫描(–disable ARP-ping)。

Tanin@htb[/htb]$ sudo nmap 10.129.2.28 -p 139 --packet-trace -n --disable-arp-ping -Pn

Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 15:45 CEST
SENT (0.0381s) TCP 10.10.14.2:60277 > 10.129.2.28:139 S ttl=47 id=14523 iplen=44  seq=4175236769 win=1024 <mss 1460>
SENT (1.0411s) TCP 10.10.14.2:60278 > 10.129.2.28:139 S ttl=45 id=7372 iplen=44  seq=4175171232 win=1024 <mss 1460>
Nmap scan report for 10.129.2.28
Host is up.

PORT    STATE    SERVICE
139/tcp filtered netbios-ssn
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)

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

我们在上一次扫描中看到,Nmap发送了两个带有SYN标志的TCP数据包。通过扫描的持续时间(2.06s),我们可以识别出它比以前的扫描花费了更长的时间(~0.05s)。如果防火墙拒绝数据包,情况就不同了。为此,我们看一下TCP端口445,它由防火墙的这种规则相应地处理。

Tanin@htb[/htb]$ sudo nmap 10.129.2.28 -p 445 --packet-trace -n --disable-arp-ping -Pn

Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 15:55 CEST
SENT (0.0388s) TCP 10.129.2.28:52472 > 10.129.2.28:445 S ttl=49 id=21763 iplen=44  seq=1418633433 win=1024 <mss 1460>
RCVD (0.0487s) ICMP [10.129.2.28 > 10.129.2.28 Port 445 unreachable (type=3/code=3) ] IP [ttl=64 id=20998 iplen=72 ]
Nmap scan report for 10.129.2.28
Host is up (0.0099s latency).

PORT    STATE    SERVICE
445/tcp filtered microsoft-ds
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)

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

作为响应,我们收到一个ICMP回复,类型为3,错误代码为3,表示无法访问所需的主机。尽管如此,如果我们知道主机是活动的,我们可以强烈假设该端口上的防火墙正在拒绝数据包,稍后我们将不得不仔细查看该端口。

Discovering Open UDP Ports

有些系统管理员有时除了过滤TCP端口外,还忘记过滤UDP端口。由于UDP是一种无状态协议,不需要像TCP那样的三方握手。我们没有收到任何确认。因此,超时时间要长得多,使得整个UDP扫描(-sU)比TCP扫描(-sS)慢得多。 让我们来看看UDP扫描(-sU)的样子以及它给我们带来的结果。

UDP Port Scan

Tanin@htb[/htb]$ sudo nmap 10.129.2.28 -F -sU

Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 16:01 CEST
Nmap scan report for 10.129.2.28
Host is up (0.059s latency).
Not shown: 95 closed ports
PORT     STATE         SERVICE
68/udp   open|filtered dhcpc
137/udp  open          netbios-ns
138/udp  open|filtered netbios-dgm
631/udp  open|filtered ipp
5353/udp open          zeroconf
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)

Nmap done: 1 IP address (1 host up) scanned in 98.07 seconds
Scanning Options Description
-F Scans top 100 ports.
-sU Performs a UDP scan.

这样做的另一个缺点是,我们经常得不到响应,因为Nmap向扫描的UDP端口发送空数据报,而我们没有收到任何响应。因此,我们无法确定UDP数据包是否已经到达。如果UDP端口是打开的,我们只有在应用程序被配置为打开时才会得到响应。

Tanin@htb[/htb]$ sudo nmap 10.129.2.28 -sU -Pn -n --disable-arp-ping --packet-trace -p 137 --reason 

Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 16:15 CEST
SENT (0.0367s) UDP 10.10.14.2:55478 > 10.129.2.28:137 ttl=57 id=9122 iplen=78
RCVD (0.0398s) UDP 10.129.2.28:137 > 10.10.14.2:55478 ttl=64 id=13222 iplen=257
Nmap scan report for 10.129.2.28
Host is up, received user-set (0.0031s latency).

PORT    STATE SERVICE    REASON
137/udp open  netbios-ns udp-response ttl 64
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)

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

如果我们得到错误代码为3(无法访问端口)的ICMP响应,我们就知道该端口确实已关闭。

Tanin@htb[/htb]$ sudo nmap 10.129.2.28 -sU -Pn -n --disable-arp-ping --packet-trace -p 100 --reason 

Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 16:25 CEST
SENT (0.0445s) UDP 10.10.14.2:63825 > 10.129.2.28:100 ttl=57 id=29925 iplen=28
RCVD (0.1498s) ICMP [10.129.2.28 > 10.10.14.2 Port unreachable (type=3/code=3) ] IP [ttl=64 id=11903 iplen=56 ]
Nmap scan report for 10.129.2.28
Host is up, received user-set (0.11s latency).

PORT    STATE  SERVICE REASON
100/udp closed unknown port-unreach ttl 64
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)

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

另一种方便的扫描端口的方法是-sV选项,用于从打开的端口获取额外的可用信息。这种方法可以识别版本、服务名称和有关我们目标的详细信息。

More information about port scanning techniques we can find at: https://nmap.org/book/man-port-scanning-techniques.html

Saving the Results

Different Formats

当我们运行各种扫描时,我们应该始终保存结果。我们可以稍后使用这些来检查我们使用的不同扫描方法之间的差异。Nmap可以将结果保存为3种不同的格式。

具有.nmap文件扩展名的正常输出(-oN)

具有.gnmap文件扩展名的可扩展输出(-oG)

扩展名为.XML的XML输出(-oX)

Style sheets

有了XML输出,我们可以轻松地创建易于阅读的HTML报告,即使对于非技术人员来说也是如此。这在以后的文档中非常有用,因为它以详细而清晰的方式呈现了我们的结果。要将存储的结果从XML格式转换为HTML,我们可以使用xsltproc工具。

Tanin@htb[/htb]$ xsltproc target.xml -o target.html

More information about the output formats can be found at: https://nmap.org/book/output.html

Service Enumeration

首先,Nmap会查看扫描端口的横幅并将其打印出来。如果无法通过横幅识别版本,Nmap会尝试通过基于签名的匹配系统识别版本,但这会显著增加扫描的持续时间。Nmap给出的结果的一个缺点是,自动扫描可能会错过一些信息,因为有时Nmap不知道如何处理这些信息。

在成功的三方握手之后,服务器通常会发送一条横幅进行标识。这是为了让客户端知道它正在使用哪个服务。在网络级别,这种情况发生在TCP报头中的PSH标志上。然而,某些服务可能不会立即提供此类信息。还可以从相应的服务中移除或操纵横幅。如果我们使用nc手动连接到SMTP服务器,获取横幅,并使用tcpdump拦截网络流量,我们可以看到Nmap没有向我们显示的内容

Tcpdump

Tanin@htb[/htb]$ sudo tcpdump -i eth0 host 10.10.14.2 and 10.129.2.28

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes

Nc

Tanin@htb[/htb]$  nc -nv 10.129.2.28 25

Connection to 10.129.2.28 port 25 [tcp/*] succeeded!
220 inlane ESMTP Postfix (Ubuntu)

Nmap Scripting Engine

Nmap脚本引擎(NSE)是Nmap的另一个方便功能。它为我们提供了在Lua中创建用于与某些服务交互的脚本的可能性。这些脚本总共可分为14类:

类别 描述
auth 确定身份验证凭据。
broadcast 通过广播和发现的主机用于主机发现的脚本可以自动添加到其余扫描中。
brute 执行尝试通过使用凭据暴力破解登录到相应服务的脚本。
default 使用该选项执行的默认脚本。-sC
discovery 无障碍服务评估。
dos 这些脚本用于检查服务是否存在拒绝服务漏洞,并且使用较少,因为它会损害服务。
exploit 此类脚本尝试利用扫描端口的已知漏洞。
external 使用外部服务进行进一步处理的脚本。
fuzzer 这使用脚本通过发送不同的字段来识别漏洞和意外的数据包处理,这可能需要很长时间。
intrusive 可能对目标系统产生负面影响的侵入性脚本。
malware 检查某些恶意软件是否感染了目标系统。
safe 不执行侵入性和破坏性访问的防御性脚本。
version 服务检测的扩展。
vuln 识别特定漏洞。

Default Scripts

Tanin@htb[/htb]$ sudo nmap <target> -sC

Specific Scripts Category

Tanin@htb[/htb]$ sudo nmap <target> --script <category>

Defined Scripts

Tanin@htb[/htb]$ sudo nmap <target> --script <script-name>,<script-name>,...

例如,让我们继续使用目标SMTP端口,并查看使用两个定义的脚本得到的结果。

Tanin@htb[/htb]$ sudo nmap 10.129.2.28 -p 25 --script banner,smtp-commands
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-16 23:21 CEST
Nmap scan report for 10.129.2.28
Host is up (0.050s latency).

PORT   STATE SERVICE
25/tcp open  smtp
|_banner: 220 inlane ESMTP Postfix (Ubuntu)
|_smtp-commands: inlane, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, SMTPUTF8,
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)
-A Performs service detection, OS detection, traceroute and uses defaults scripts to scan the target.

Performance

当我们需要扫描广泛的网络或处理低网络带宽时,扫描性能起着重要作用。我们可以使用各种选项来告诉Nmap测试数据包的速度(-T<1-5>)、频率(–min parallelism<number>)、超时(–max rtt timeout<time>)、同时发送的数据包数量(–min rate<number>)。

Timeouts

当Nmap发送数据包时,从扫描端口接收响应需要一些时间(往返时间-RTT)。通常,Nmap以100ms的高超时(–min RTT超时)开始。让我们看一个例子,通过扫描具有256个主机的整个网络,包括前100个端口。

Default Scan

Tanin@htb[/htb]$ sudo nmap 10.129.2.0/24 -F

<SNIP>
Nmap done: 256 IP addresses (10 hosts up) scanned in 39.44 seconds

Optimized RTT

Tanin@htb[/htb]$ sudo nmap 10.129.2.0/24 -F --initial-rtt-timeout 50ms --max-rtt-timeout 100ms

<SNIP>
Nmap done: 256 IP addresses (8 hosts up) scanned in 12.29 seconds
Scanning Options Description
-F Scans top 100 ports.
--initial-rtt-timeout 50ms Sets the specified time value as initial RTT timeout.
--max-rtt-timeout 100ms Sets the specified time value as maximum RTT timeout.

当比较两次扫描时,我们可以看到,我们发现优化扫描减少了两台主机,但扫描只花了四分之一的时间。由此,我们可以得出结论,将初始RTT超时(–initial RTT timeout)设置为太短的时间段可能会导致我们忽略主机。

Max Retries

另一种提高扫描速度的方法是指定发送数据包的重试率(–max retries)。重试率的默认值是10,因此,如果Nmap没有收到端口的响应,它将不会向该端口发送更多的数据包,并且将被跳过。

Default Scan

Tanin@htb[/htb]$ sudo nmap 10.129.2.0/24 -F | grep "/tcp" | wc -l

23

Reduced Retries

Tanin@htb[/htb]$ sudo nmap 10.129.2.0/24 -F --max-retries 0 | grep "/tcp" | wc -l

21

我们再次认识到,加速也会对我们的结果产生负面影响,这意味着我们可能忽视重要信息。

Rates

在白盒渗透测试期间,我们可能会将安全系统列入白名单,以检查网络中的系统是否存在漏洞,而不仅仅是测试保护措施。如果我们知道网络带宽,我们就可以处理发送的数据包的速率,这大大加快了我们使用Nmap的扫描速度。当设置发送数据包的最小速率(–min-rate<number>)时,我们告诉Nmap同时发送指定数量的数据包。它将尝试相应地保持利率。

Default Scan

Tanin@htb[/htb]$ sudo nmap 10.129.2.0/24 -F -oN tnet.default

<SNIP>
Nmap done: 256 IP addresses (10 hosts up) scanned in 29.83 seconds

Optimized Scan

Tanin@htb[/htb]$ sudo nmap 10.129.2.0/24 -F -oN tnet.minrate300 --min-rate 300

<SNIP>
Nmap done: 256 IP addresses (10 hosts up) scanned in 8.67 seconds
--min-rate 300 Sets the minimum number of packets to be sent per second.

Timing

因为这样的设置不能总是手动优化,比如在黑匣子渗透测试中,Nmap提供了六种不同的计时模板(-T<0-5>)供我们使用。这些值(0-5)决定了我们扫描的攻击性。如果扫描过于激进,这也会产生负面影响,安全系统可能会因产生的网络流量而阻止我们。当我们没有定义其他内容时,使用的默认计时模板是正常的(-T3)。

  • -T 0 / -T paranoid
  • -T 1 / -T sneaky
  • -T 2 / -T polite
  • -T 3 / -T normal
  • -T 4 / -T aggressive
  • -T 5 / -T insane

这些模板包含我们也可以手动设置的选项,我们已经看到了其中的一些。开发人员根据他们的最佳结果确定了这些模板的值集,使我们更容易将扫描适应相应的网络环境。我们可以在这里找到确切使用的选项及其值:

https://nmap.org/book/performance-timing-templates.html

Firewall and IDS/IPS Evasion

Nmap为我们提供了许多不同的方法来绕过防火墙规则和IDS/IPS。这些方法包括数据包的分段、诱饵的使用以及我们将在本节中讨论的其他方法。

Firewalls

防火墙是防止来自外部网络的未经授权的连接尝试的安全措施。每个防火墙安全系统都基于一个软件组件,该组件监控防火墙和传入数据连接之间的网络流量,并根据已设置的规则决定如何处理连接。它检查单个网络数据包是否被传递、忽略或阻止。此机制旨在防止可能存在潜在危险的不必要连接。

IDS/IPS

与防火墙一样,入侵检测系统(IDS)和入侵防御系统(IPS)也是基于软件的组件。IDS扫描网络以寻找潜在的攻击,对其进行分析,并报告任何检测到的攻击。IPS通过在本应检测到潜在攻击的情况下采取特定防御措施来补充IDS。对此类攻击的分析基于模式匹配和签名。如果检测到特定模式,例如服务检测扫描,IPS可以阻止挂起的连接尝试。

Determine Firewalls and Their Rules

我们已经知道,当一个端口显示为已筛选时,可能有几个原因。在大多数情况下,防火墙都设置了某些规则来处理特定的连接。数据包可以被丢弃,也可以被拒绝。丢弃的数据包将被忽略,主机不会返回任何响应。 这与用RST标志返回的被拒绝的数据包不同。这些数据包包含不同类型的ICMP错误代码,或者根本不包含任何内容。 此类错误可能是:

  • 无法访问网络
  • 禁用网络
  • 主机不可达
  • 禁止主机
  • 端口不可达
  • 无法访问协议

与常规的SYN(-sS)或Connect扫描(sT)相比,Nmap的TCP ACK扫描(-sA)方法更难过滤防火墙和IDS/IPS系统,因为它们只发送带有ACK标志的TCP数据包。当端口关闭或打开时,主机必须使用RST标志进行响应。与传出连接不同,来自外部网络的所有连接尝试(带有SYN标志)通常都会被防火墙阻止。然而,带有ACK标志的数据包通常由防火墙传递,因为防火墙无法确定连接是首先从外部网络还是从内部网络建立的。 如果我们看一下这些扫描,我们会发现结果有什么不同。

SYN-Scan

Tanin@htb[/htb]$ sudo nmap 10.129.2.28 -p 21,22,25 -sS -Pn -n --disable-arp-ping --packet-trace

Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-21 14:56 CEST
SENT (0.0278s) TCP 10.10.14.2:57347 > 10.129.2.28:22 S ttl=53 id=22412 iplen=44  seq=4092255222 win=1024 <mss 1460>
SENT (0.0278s) TCP 10.10.14.2:57347 > 10.129.2.28:25 S ttl=50 id=62291 iplen=44  seq=4092255222 win=1024 <mss 1460>
SENT (0.0278s) TCP 10.10.14.2:57347 > 10.129.2.28:21 S ttl=58 id=38696 iplen=44  seq=4092255222 win=1024 <mss 1460>
RCVD (0.0329s) ICMP [10.129.2.28 > 10.10.14.2 Port 21 unreachable (type=3/code=3) ] IP [ttl=64 id=40884 iplen=72 ]
RCVD (0.0341s) TCP 10.129.2.28:22 > 10.10.14.2:57347 SA ttl=64 id=0 iplen=44  seq=1153454414 win=64240 <mss 1460>
RCVD (1.0386s) TCP 10.129.2.28:22 > 10.10.14.2:57347 SA ttl=64 id=0 iplen=44  seq=1153454414 win=64240 <mss 1460>
SENT (1.1366s) TCP 10.10.14.2:57348 > 10.129.2.28:25 S ttl=44 id=6796 iplen=44  seq=4092320759 win=1024 <mss 1460>
Nmap scan report for 10.129.2.28
Host is up (0.0053s latency).

PORT   STATE    SERVICE
21/tcp filtered ftp
22/tcp open     ssh
25/tcp filtered smtp
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)

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

ACK-Scan

Tanin@htb[/htb]$ sudo nmap 10.129.2.28 -p 21,22,25 -sA -Pn -n --disable-arp-ping --packet-trace

Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-21 14:57 CEST
SENT (0.0422s) TCP 10.10.14.2:49343 > 10.129.2.28:21 A ttl=49 id=12381 iplen=40  seq=0 win=1024
SENT (0.0423s) TCP 10.10.14.2:49343 > 10.129.2.28:22 A ttl=41 id=5146 iplen=40  seq=0 win=1024
SENT (0.0423s) TCP 10.10.14.2:49343 > 10.129.2.28:25 A ttl=49 id=5800 iplen=40  seq=0 win=1024
RCVD (0.1252s) ICMP [10.129.2.28 > 10.10.14.2 Port 21 unreachable (type=3/code=3) ] IP [ttl=64 id=55628 iplen=68 ]
RCVD (0.1268s) TCP 10.129.2.28:22 > 10.10.14.2:49343 R ttl=64 id=0 iplen=40  seq=1660784500 win=0
SENT (1.3837s) TCP 10.10.14.2:49344 > 10.129.2.28:25 A ttl=59 id=21915 iplen=40  seq=0 win=1024
Nmap scan report for 10.129.2.28
Host is up (0.083s latency).

PORT   STATE      SERVICE
21/tcp filtered   ftp
22/tcp unfiltered ssh
25/tcp filtered   smtp
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)

Nmap done: 1 IP address (1 host up) scanned in 0.15 seconds
Scanning Options Description
-sS Performs SYN scan on specified ports.
-sA Performs ACK scan on specified ports.
-Pn Disables ICMP Echo requests.
-n Disables DNS resolution.
--disable-arp-ping Disables ARP ping.
--packet-trace Shows all packets sent and received.

请注意我们从目标收到的RCVD数据包及其设置标志。使用SYN扫描(-sS),我们的目标试图通过发送回设置了SYN-ACK(SA)标志的数据包来建立TCP连接,使用ACK扫描(-SA),我们得到RST标志,因为TCP端口22是打开的。对于TCP端口25,我们没有收到任何返回的数据包,这表明数据包将被丢弃。

Detect IDS/IPS

与防火墙及其规则不同,IDS/IPS系统的检测要困难得多,因为它们是被动的流量监控系统。IDS系统检查主机之间的所有连接。如果IDS发现包含定义的内容或规范的数据包,则会通知管理员,并在最坏的情况下采取适当的操作。 IPS系统采取管理员独立配置的措施,自动防止潜在的攻击。必须知道IDS和IPS是不同的应用程序,IPS是IDS的补充。 建议使用几个具有不同IP地址的虚拟专用服务器(VPS)来确定渗透测试期间这些系统是否在目标网络上。如果管理员检测到对目标网络的这种潜在攻击,第一步是阻止潜在攻击的IP地址。因此,我们将无法再使用该IP地址访问网络,我们的互联网服务提供商(ISP)将被联系并阻止访问所有互联网。 IDS系统通常单独用于帮助管理员检测网络上的潜在攻击。然后,他们可以决定如何处理此类连接。我们可以从管理员那里触发某些安全措施,例如,通过主动扫描单个端口及其服务。根据是否采取了特定的安全措施,我们可以检测网络是否有一些监控应用程序。 确定这样的IPS系统是否存在于目标网络中的一种方法是从单个主机(VPS)进行扫描。如果在任何时候此主机被阻止并且无法访问目标网络,我们知道管理员已经采取了一些安全措施。因此,我们可以继续使用另一个VPS进行渗透测试。 因此,我们知道我们需要更安静地进行扫描,在最好的情况下,掩盖与目标网络及其服务的所有交互。

Decoys

在某些情况下,管理员原则上会阻止来自不同区域的特定子网。这将阻止对目标网络的任何访问。另一个例子是什么时候IPS应该阻止我们。因此,Decoy扫描方法(-D)是正确的选择。通过这种方法,Nmap生成插入到IP报头中的各种随机IP地址,以伪装发送的数据包的来源。使用此方法,我们可以生成由冒号(:)分隔的特定数量(例如:5)的IP地址的随机(RND)。然后,我们的真实IP地址被随机放置在生成的IP地址之间。在下一个示例中,我们的真实IP地址因此被放置在第二个位置。另一个关键点是诱饵必须是活着的。否则,由于SYN洪泛安全机制,目标上的服务可能无法访问。

Tanin@htb[/htb]$ sudo nmap 10.129.2.28 -p 80 -sS -Pn -n --disable-arp-ping --packet-trace -D RND:5

Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-21 16:14 CEST
SENT (0.0378s) TCP 102.52.161.59:59289 > 10.129.2.28:80 S ttl=42 id=29822 iplen=44  seq=3687542010 win=1024 <mss 1460>
SENT (0.0378s) TCP 10.10.14.2:59289 > 10.129.2.28:80 S ttl=59 id=29822 iplen=44  seq=3687542010 win=1024 <mss 1460>
SENT (0.0379s) TCP 210.120.38.29:59289 > 10.129.2.28:80 S ttl=37 id=29822 iplen=44  seq=3687542010 win=1024 <mss 1460>
SENT (0.0379s) TCP 191.6.64.171:59289 > 10.129.2.28:80 S ttl=38 id=29822 iplen=44  seq=3687542010 win=1024 <mss 1460>
SENT (0.0379s) TCP 184.178.194.209:59289 > 10.129.2.28:80 S ttl=39 id=29822 iplen=44  seq=3687542010 win=1024 <mss 1460>
SENT (0.0379s) TCP 43.21.121.33:59289 > 10.129.2.28:80 S ttl=55 id=29822 iplen=44  seq=3687542010 win=1024 <mss 1460>
RCVD (0.1370s) TCP 10.129.2.28:80 > 10.10.14.2:59289 SA ttl=64 id=0 iplen=44  seq=4056111701 win=64240 <mss 1460>
Nmap scan report for 10.129.2.28
Host is up (0.099s latency).

PORT   STATE SERVICE
80/tcp open  http
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)

Nmap done: 1 IP address (1 host up) scanned in 0.15 seconds
-sS Performs SYN scan on specified ports.
-Pn Disables ICMP Echo requests.
-n Disables DNS resolution.
--disable-arp-ping Disables ARP ping.
--packet-trace Shows all packets sent and received.
-D RND:5 Generates five random IP addresses that indicates the source IP the connection comes from.

伪造的数据包通常会被互联网服务提供商和路由器过滤掉,即使它们来自同一网络范围。因此,我们还可以指定我们的VPS服务器的IP地址,并将其与IP标头中的“IP ID”操作结合使用,以扫描目标。 另一种情况是,只有个别子网无法访问服务器的特定服务。因此,我们也可以手动指定源IP地址(-S),以测试我们是否使用此地址获得更好的结果。诱饵可用于SYN、ACK、ICMP扫描和操作系统检测扫描。因此,让我们看看这样一个例子,并确定它最有可能是哪种操作系统。

Testing Firewall Rule

Tanin@htb[/htb]$ sudo nmap 10.129.2.28 -n -Pn -p445 -O

Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-22 01:23 CEST
Nmap scan report for 10.129.2.28
Host is up (0.032s latency).

PORT    STATE    SERVICE
445/tcp filtered microsoft-ds
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)
Too many fingerprints match this host to give specific OS details
Network Distance: 1 hop

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

Scan by Using Different Source IP

Tanin@htb[/htb]$ sudo nmap 10.129.2.28 -n -Pn -p 445 -O -S 10.129.2.200 -e tun0

Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-22 01:16 CEST
Nmap scan report for 10.129.2.28
Host is up (0.010s latency).

PORT    STATE SERVICE
445/tcp open  microsoft-ds
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Aggressive OS guesses: Linux 2.6.32 (96%), Linux 3.2 - 4.9 (96%), Linux 2.6.32 - 3.10 (96%), Linux 3.4 - 3.10 (95%), Linux 3.1 (95%), Linux 3.2 (95%), AXIS 210A or 211 Network Camera (Linux 2.6.17) (94%), Synology DiskStation Manager 5.2-5644 (94%), Linux 2.6.32 - 2.6.35 (94%), Linux 2.6.32 - 3.5 (94%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 1 hop

OS detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 4.11 seconds
-n Disables DNS resolution.
-Pn Disables ICMP Echo requests.
-p 445 Scans only the specified ports.
-O Performs operation system detection scan.
-S Scans the target by using different source IP address.
10.129.2.200 Specifies the source IP address.
-e tun0 Sends all requests through the specified interface.

DNS Proxying

默认情况下,除非另有规定,否则Nmap会执行反向DNS解析,以查找有关我们目标的更重要信息。这些DNS查询在大多数情况下也会被传递,因为给定的web服务器应该被找到并访问。DNS查询是通过UDP端口53进行的。TCP端口53以前仅用于DNS服务器之间的所谓“区域传输”或大于512字节的数据传输。由于IPv6和DNSSEC的扩展,这种情况正在发生越来越多的变化。这些更改导致许多DNS请求通过TCP端口53进行。 然而,Nmap仍然为我们自己指定DNS服务器提供了一种方法(–DNS server<ns>,<ns>)。如果我们在非军事区,这种方法对我们来说可能是至关重要的。该公司的DNS服务器通常比来自互联网的服务器更受信任。因此,例如,我们可以使用它们与内部网络的主机进行交互。作为另一个例子,我们可以使用TCP端口53作为扫描的源端口(–source端口)。如果管理员使用防火墙控制该端口,并且没有正确过滤IDS/IPS,则我们的TCP数据包将受到信任并通过。

SYN-Scan of a Filtered Port

Tanin@htb[/htb]$ sudo nmap 10.129.2.28 -p50000 -sS -Pn -n --disable-arp-ping --packet-trace

Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-21 22:50 CEST
SENT (0.0417s) TCP 10.10.14.2:33436 > 10.129.2.28:50000 S ttl=41 id=21939 iplen=44  seq=736533153 win=1024 <mss 1460>
SENT (1.0481s) TCP 10.10.14.2:33437 > 10.129.2.28:50000 S ttl=46 id=6446 iplen=44  seq=736598688 win=1024 <mss 1460>
Nmap scan report for 10.129.2.28
Host is up.

PORT      STATE    SERVICE
50000/tcp filtered ibm-db2

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

SYN-Scan From DNS Port

Tanin@htb[/htb]$ sudo nmap 10.129.2.28 -p50000 -sS -Pn -n --disable-arp-ping --packet-trace --source-port 53

SENT (0.0482s) TCP 10.10.14.2:53 > 10.129.2.28:50000 S ttl=58 id=27470 iplen=44  seq=4003923435 win=1024 <mss 1460>
RCVD (0.0608s) TCP 10.129.2.28:50000 > 10.10.14.2:53 SA ttl=64 id=0 iplen=44  seq=540635485 win=64240 <mss 1460>
Nmap scan report for 10.129.2.28
Host is up (0.013s latency).

PORT      STATE SERVICE
50000/tcp open  ibm-db2
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)

Nmap done: 1 IP address (1 host up) scanned in 0.08 seconds
-sS Performs SYN scan on specified ports.
-Pn Disables ICMP Echo requests.
-n Disables DNS resolution.
--disable-arp-ping Disables ARP ping.
--packet-trace Shows all packets sent and received.
--source-port 53 Performs the scans from specified source port.

现在我们已经发现防火墙接受TCP端口53,很可能IDS/IPS过滤器的配置也比其他过滤器弱得多。我们可以通过尝试使用Netcat连接到此端口来测试这一点。

Connect To The Filtered Port

Tanin@htb[/htb]$ ncat -nv --source-port 53 10.129.2.28 50000

Ncat: Version 7.80 ( https://nmap.org/ncat )
Ncat: Connected to 10.129.2.28:50000.
220 ProFTPd

Firewall and IDS/IPS Evasion - Easy Lab

我们的客户想知道我们是否可以识别他们提供的机器运行在哪个操作系统上。提交操作系统名称作为答案。

hint:记住,你不需要提供它的版本。想想哪些服务可以为你提供有关操作系统的信息。在采访了管理员后,我们发现他们想阻止其/24子网掩码的相邻主机相互通信。

这里明显是要使用RND制造间距,但是扫描到的结果比较迷,也没找到正确答案,两次相同的代码扫到不同的结果,也是有点人麻了……

image-20230708203746705

image-20230708203708394

Firewall and IDS/IPS Evasion - Medium Lab

配置传输到系统后,我们的客户想知道是否有可能找到我们目标的DNS服务器版本。提交目标的DNS服务器版本作为答案。

hint:在会议期间,管理员们谈到了我们测试的主机是一个以前没有提到的可公开访问的服务器。

image-20230709100334372

–script dns-nsid:此选项指定要在扫描期间运行的特定Nmap脚本。dns-nsid脚本设计用于执行dns名称服务器标识符(nsid)查询并从dns服务器收集信息。

最高难度的就算了,人蒙了