Frederick

Welcome to my Alter Ego's site!

Jan 12, 2025 - 8 minute read - Comments

nmap基础

  • TCP扫描,默认常用
 sudo nmap -sS localhost

发现主机

sudo nmap 10.129.2.0/24 -sn -oA tnet | grep for | cut -d" " -f5
扫描选项 描述
10.129.2.0/24 目标网络范围。
-sn 禁用端口扫描。
-oA tnet 以名称“tnet”开头的所有格式存储结果。

Firewall and IDS Evasion此扫描方法仅在主机的防火墙允许的情况下才有效

禁用端口扫描,则会启用ICMP扫描

  • 扫描IP列表
cat hosts.lst

这可能意味着其他主机由于其防火墙配置而忽略了默认的ICMP 回应请求Nmap。由于没有收到响应,它会将这些主机标记为非活动状态

对预定义列表使用相同的扫描技术

sudo nmap -sn -oA tnet -iL hosts.lst | grep for | cut -d" " -f5
扫描选项 描述
-sn 禁用端口扫描。
-oA tnet 以名称“tnet”开头的所有格式存储结果。
-iL 对提供的“hosts.lst”列表中的目标执行定义的扫描。

为了确保发送了 ICMP 回显请求,

  • ICMP 回显请求 ( -Pn)、DNS 解析 ( -n) 和 ARP ping 扫描 ( --disable-arp-ping)。
sudo nmap 10.129.2.0/24 -sn -oA tnet | grep for | cut -d" " -f5
sudo nmap 10.129.2.18 -sn -oA host -PE --packet-trace 
扫描选项 描述
10.129.2.18 对目标执行定义的扫描。
-sn 禁用端口扫描。
-oA host 以名称“host”开头的所有格式存储结果。
-PE 使用“ICMP Echo 请求”对目标执行 ping 扫描。
--packet-trace 显示所有发送和接收的数据包
sudo nmap 10.129.2.18 -sn -oA host -PE --reason 
扫描选项 描述
10.129.2.18 对目标执行定义的扫描。
-sn 禁用端口扫描。
-oA host 以名称“host”开头的所有格式存储结果。
-PE 使用“ICMP Echo 请求”对目标执行 ping 扫描。
--reason 显示特定结果的原因。

主机和端口扫描

在发现目标还活着之后,我们希望更准确地了解系统。我们需要的信息包括:

  • 开放端口及其服务
  • 服务版本
  • 服务提供的信息
  • 操作系统

扫描端口六种情况:

状态 描述
open 这表示已建立与扫描端口的连接。这些连接可以是TCP 连接UDP 数据报以及SCTP 关联
closed 当端口显示为关闭时,TCP 协议会指示我们收到的数据包包含一个RST标志。这种扫描方法还可用于确定我们的目标是否还活着。
filtered Nmap 无法正确识别扫描的端口是打开还是关闭,因为目标没有返回该端口的响应,或者我们从目标收到错误代码。
unfiltered 端口的这种状态仅在TCP-ACK扫描期间发生,表示该端口可访问,但无法确定它是开放还是关闭。
`open filtered`
`closed filtered`

扫描前 10 个 TCP 端口

sudo nmap 10.129.2.28 --top-ports=10 
扫描选项 描述
10.129.2.28 扫描指定目标。
--top-ports=10 扫描已被定义为最频繁的指定顶级端口。

Nmap——跟踪数据包

sudo nmap 10.129.2.28 -p 21 --packet-trace -Pn -n --disable-arp-ping
扫描选项 描述
10.129.2.28 扫描指定目标。
-p 21 仅扫描指定端口。
--packet-trace 显示所有发送和接收的数据包。
-n 禁用 DNS 解析。
--disable-arp-ping 禁用 ARP ping。
信息 描述
SENT (0.0429s) 表示Nmap的SENT操作,向目标发送数据包。
TCP 显示用于与目标端口交互的协议。
10.10.14.2:63090 > 代表我们的 IPv4 地址和源端口,Nmap 将使用它们来发送数据包。
10.129.2.28:21 显示目标 IPv4 地址和目标端口。
S 发送的TCP数据包的SYN标志。
ttl=56 id=57322 iplen=44 seq=1699105818 win=1024 mss 1460 附加的 TCP 标头参数。

连接扫描

Nmap TCP 连接扫描( -sT) 使用 TCP 三次握手来确定目标主机上的特定端口是打开还是关闭。

 sudo nmap 10.129.2.28 -p 443 --packet-trace --disable-arp-ping -Pn -n --reason -sT 

Connect扫描(也称为完整 TCP 连接扫描)非常准确,因为它完成了三次 TCP 握手,使我们能够确定端口的确切状态(打开、关闭或过滤)。但是,它并不是最隐蔽的。

过滤端口

防火墙drops会扫描我们发送的 TCP 数据包。因此,我们扫描 TCP 端口139,该端口已显示为已过滤。为了能够跟踪我们发送的数据包的处理方式,我们再次停用 ICMP 回显请求 ( -Pn)、DNS 解析 ( -n) 和 ARP ping 扫描 ( --disable-arp-ping)。

sudo nmap 10.129.2.28 -p 139 --packet-trace -n --disable-arp-ping -Pn

发现开放的 UDP 端口

sudo nmap 10.129.2.28 -F -sU
扫描选项 描述
10.129.2.28 扫描指定目标。
-F 扫描前 100 个端口。
-sU 执行 UDP 扫描。

一些系统管理员有时会忘记过滤除 TCP 端口之外的 UDP 端口,但UDP比TCP慢的多

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

版本扫描

sudo nmap 10.129.2.28 -Pn -n --disable-arp-ping --packet-trace -p 445 --reason  -sV
扫描选项 描述
10.129.2.28 扫描指定目标。
-Pn 禁用 ICMP Echo 请求。
-n 禁用 DNS 解析。
--disable-arp-ping 禁用 ARP ping。
--packet-trace 显示所有发送和接收的数据包。
-p 445 仅扫描指定端口。
--reason 显示端口处于特定状态的原因。
-sV 执行服务扫描。

扫描端口的另一种方便方法是-sV使用选项从开放端口获取其他可用信息。此方法可以识别版本、服务名称和有关目标的详细信息。

保存结果

Nmap可以以 3 种不同的格式保存结果。

  • 正常输出(-oN.nmap文件扩展名
  • 带有文件扩展名的Grepable 输出(-oG.gnmap
  • XML 输出 ( -oX),.xml文件扩展名

我们还可以指定选项(-oA)以所有格式保存结果。命令可能如下所示:

sudo nmap 10.129.2.28 -p- -oA target
扫描选项 描述
10.129.2.28 扫描指定目标。
-p- 扫描所有端口。
-oA target 以所有格式保存结果,每个文件的名称以“目标”开头。
target.gnmap target.xml  target.nmap

转换格式

要将存储的结果从 XML 格式转换为 HTML,我们可以使用该工具xsltproc

xsltproc target.xml -o target.html

服务枚举

服务版本检测

sudo nmap 10.129.2.28 -p- -sV
描选项 描述
10.129.2.28 扫描指定目标。
-p- 扫描所有端口。
-sV 对指定端口执行服务版本检测。

增加verbosity level-v/ -vv),当检测到开放端口时,它将直接显示给我们Nmap

sudo nmap 10.129.2.28 -p- -sV -v 
扫描选项 描述
10.129.2.28 扫描指定目标。
-p- 扫描所有端口。
-sV 对指定端口执行服务版本检测。
-v 增加扫描的详细程度,以显示更详细的信息。

横幅抓取

Nmap则尝试通过基于签名的匹配系统识别它们,但这会大大增加扫描的持续时间。Nmap所呈现结果的一个缺点是自动扫描可能会遗漏一些信息,因为有时Nmap不知道如何处理它。

某些服务可能不会立即提供此类信息。也可以从相应的服务中删除或操纵横幅。如果我们manually使用 连接到 SMTP 服务器nc,抓取横幅,并使用 拦截网络流量tcpdump,我们就可以看到Nmap未显示的内容。

  • 传输控制包Tcpdump
sudo tcpdump -i eth0 host 10.10.14.2 and 10.129.2.28
  • nc
nc -nv 10.129.2.28 25

Nmap脚本引擎

它为我们提供了在 Lua 中创建脚本以与某些服务进行交互的可能性。这些脚本总共可分为 14 个类别:

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

默认脚本 -sC

特定脚本类型–script

定义脚本 –script ,

Nmap - Aggressive Scan -A

sudo nmap 10.129.2.28 -p 80 -A
-A 执行服务检测、操作系统检测、跟踪路由并使用默认脚本扫描目标。
发现了系统上运行着哪种 Web 服务器,使用了哪种 Web 应用程序,以及网页的标题 。

漏洞评估

--script vuln 使用指定类别的所有相关脚本。

防火墙和IDS/IPS规避

TCP SYN扫描又称“半开扫描”。回顾TCP连接的三次握手,申请方首先发送的是一个SYN数据包,服务方在接到这个SYN数据包后,如果该端口处于侦听状态,则会回复一个SYN|ACK的数据包;如果该端口没有处于侦听状态,则会回复一个RST的数据包。而此时如果对方处于侦听状态,申请方还需要再向对方回复一个ACK数据包以示建立连接。此时对方就认为连接建立,并记入日志。

无论服务方回复SYN|ACK的数据包,还是回复RST的数据包,申请方其实已经能够判断对方端口是否为“开”的状态。之后的ACK数据包发送则被对方监视,如果此时不发送ACK数据包,而是发一个RST数据包,则不仅关闭了这个未完成的连接过程,并且也会因为连接未建立而不会被对方记录。这种扫描方式因为使用了SYN标志位,所以被称为TCP SYN扫描。这种扫描技术的优点在于一般不会在目标计算机上留下记录,有时即使在用netstat命令也显示不出来;但这种方法的一个缺点是必须要有管理员权限才能建立自己的SYN数据包。

使用诱饵扫描

Nmap 会生成插入到 IP 标头中的各种随机 IP 地址,以掩盖发送的数据包的来源。使用此方法,我们可以随机生成 ( RND) 个特定数量(例如:5)的 IP 地址,并以冒号 ( :) 分隔。然后,我们的真实 IP 地址会随机放置在生成的 IP 地址之间

sudo nmap 10.129.2.28 -p 80 -sS -Pn -n --disable-arp-ping --packet-trace -D RND:5
扫描选项 描述
10.129.2.28 扫描指定目标。
-p 80 仅扫描指定端口。
-sS 对指定端口执行 SYN 扫描。
-Pn 禁用 ICMP Echo 请求。
-n 禁用 DNS 解析。
--disable-arp-ping 禁用 ARP ping。
--packet-trace 显示所有发送和接收的数据包。
-D RND:5 生成五个随机 IP 地址,指示连接来自的源 IP。

DNS 代理

过滤端口的 SYN 扫描

sudo nmap 10.129.2.28 -p50000 -sS -Pn -n --disable-arp-ping --packet-trace

从 DNS 端口进行 SYN 扫描

sudo nmap 10.129.2.28 -p50000 -sS -Pn -n --disable-arp-ping --packet-trace --source-port 53

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

扫描选项 描述
10.129.2.28 扫描指定目标。
-p 50000 仅扫描指定端口。
-sS 对指定端口执行 SYN 扫描。
-Pn 禁用 ICMP Echo 请求。
-n 禁用 DNS 解析。
--disable-arp-ping 禁用 ARP ping。
--packet-trace 显示所有发送和接收的数据包。
--source-port 53 从指定的源端口执行扫描。

连接到过滤端口

ncat -nv --source-port 53 10.129.2.28 50000

sqli-labs通关 Web应用程序

comments powered by Disqus