学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
Python实战微信订餐小程序 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
Python量化交易实战 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
2022年09月06日16:20:10
2022年10月28日21:19:20
nmap(Network Mapper)是免费、开源的网络发现和安全审计工具,通常我们用于收集网络中的比如主机和端口等信息,从而为下一步的攻击提供突破口,制定攻击的计划。也可为网络管理员使用,从而针对性修复可能暴露的安全漏洞。
具体的功能介绍可以登录官网https://nmap.org,来获取软件包和官方教程。
图1.Windows查看nmap提供的可执行文件
nmap发现的原理无非就是,发送数据包到目标主机,依据响应报文来识别已经开放的端口等信息等,属于主动攻击。
nmap
[<扫描类型>
…] [<选项>
] {<扫描目标说明>
}
下面的篇幅较长,如果是忘记了命令,可以只看这部分即可,我在这里翻译了nmap -h原文,并做了小总结。时间宝贵,头发也宝贵呢。
Nmap 7.93 (https://nmap.org)
用法:nmap [扫描类型] [选项] {要扫描的目标}
**扫描的目标:**
可以是 主机名、IP 地址、网络等。#(可以使用逗号,指定不连续的ip段 减号-指定连续ip段 斜杠/指定掩码 星号*代表全部)
例如:scanme.nmap.org、microsoft.com/24、192.168.0.1; 10.0.0-255.1-254
-iL : 从文件中读取要扫描的主机列表
-iR <主机数量>: 选择随机目标 #0为无限生成
--exclude :要排除的 主机/网络
--excludefile : 从文件中选择要排除的主机列表
**主机发现:** -sL: 列表扫描 - 打印主机的列表(对域名进行扫描时,可以得到IP列表 )
-sn: Ping 扫描,同时禁用端口扫描,用来检查主机存活状态。
-Pn: 禁用 Ping 扫描,默认所有主机都是存活状态
-PS/PA/PU/PY[端口列表]:对指定的端口通过 TCP SYN/ACK、UDP 或 SCTP 扫描来发现主机
-PE/PP/PM: 对指定的端口通过 ICMP、时间戳和网络掩码请求发现和探测主机
-PO[协议列表]: IP 协议 Ping
-n/-R: 不进行DNS解析/ 进行DNS解析 [默认]
--dns-servers : 指定自定义 DNS 服务器
--system-dns: 使用操作系统的 DNS 解析器
--traceroute: 跟踪每个主机的跃点路径
**扫描技术:** -sS/sT/sA/sW/sM: TCP SYN / Connect() / ACK / Window / Maimon 扫描
-sU: UDP 扫描
-sN/sF/sX: TCP Null、FIN 和 Xmas 扫描
--scanflags : 自定义 TCP 扫描标志
-sI <僵尸主机[:僵尸端口]>: 空闲扫描
-sY/sZ: SCTP INIT/COOKIE-ECHO 扫描
-sO: IP 协议扫描
-b : FTP 反弹扫描
**指定扫描端口、扫描顺序:** -p <端口范围>:只扫描指定的端口
例如:-p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9
--exclude-ports <端口范围>: 从扫描中排除指定端口
-F: 快速模式。 扫描比默认扫描更少的端口
-r: 连续扫描端口。不要随机化,即按顺序扫描端口
--top-ports : 扫描个最常用的端口
--port-ratio : 扫描比更常见的端口
**服务****/版本检测:** -sV: 探测开放端口以确定服务/版本信息
--version-intensity :设置从 0(轻)到 9(尝试所有探针)
--version-light: 限制最可能的探测(强度 2)
--version-all: 尝试每一个探测(强度 9)
--version-trace: 显示详细的版本扫描活动(用于调试)
**脚本扫描:** -sC: 相当于--script=default
--script=: 使用脚本进行扫描,多个脚本时用逗号分隔,支持通配符。
--script-args=: 为脚本提供参数
--script-args-file=filename: 从文件中提供 NSE 脚本参数
--script-trace: 显示所有发送和接收的数据
--script-updatedb: 更新脚本数据库。
--script-help=: 显示有关脚本的帮助。
**操作系统检测:** -O: 启用操作系统检测
--osscan-limit: 将操作系统检测限制为有希望的目标
--osscan-guess: 更积极地猜测操作系统
**时间和性能:**
默认是秒,也可以 “ms”(毫秒),'s'(秒)、'm'(分钟)或 'h'(小时)到值(例如 30m)。
-T<0-5>: 设置时序模板(越高扫描速度越快,但是准确性降低)
--min-hostgroup/max-hostgroup : 并行主机扫描组大小
--min-parallelism/max-parallelism :探针并行化
--min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout <时间>: 指定探测往返时间。
--max-retries : 限制端口扫描探测重传的次数。
--host-timeout
nmap命令中扫描的目标是不可省略的参数,可以使用**/,-*
**符号来确认目标范围。当然这三种都可以混合使用。
# 直接单台主机ip,当然直接使用域名也可以,就是不怎么灵活而已
nmap 192.168.1.1
# 直接使用**/****掩码**,扫描网段内全部ip
nmap 192.168.1.**1****/24**
# 使用**,指定对象**,一般针对于不连续的网段
nmap 192.168.2.**1****,10,172,192,254**
# 使用**-****选择**连续的范围
nmap 192.168.3.**1****-255**
# 使用*选择本段全部,和0-255一样nmap 192.168.4.*****
# ,/-*四者可以任意结合起来使用
nmap 192.168.**1,2,****3**.*****
nmap 192.168.**1-****192,240**.**1****/24**
# 比如你指定了大范围内的ip,但是某些ip你又想排除,后面可以无限写
nmap 192.168.1.1/24 **--exclude** 192.168.1.1 192.168.1.100
有时候从dhcp服务器中导出了在线的ip,可以使用文件来批量的选择扫描的目标,比如某公司禁止公司内部电脑开启web服务等,使用文件导入的方法,可以跳过离线主机进行的扫描。
-iL <目标ip的文件路径>
--excludefile <排除ip的文件路径>
文件格式中ip之间可以使用换行(\n),同时也支持,/-语法。
-iR <随机生成ip数量>
-iR 0
# 0代表无限次以下是我使用nmap -iR 2后的抓包,可以看到ip是随机的,默认的
图2.默认扫描发送的报文
扫描类型可以省略,缺省时使用-sT参数,即TCP连接扫描,缺省情况下发送三个报文
nmap将端口分成六个状态:
针对于不同的设备和网络环境,不同的扫描方式会有着截然不同的效果。
其实这个参数不会对目标进行扫描操作,但因为nmap默认情况下是会对本机设置的所有DNS服务器反向解析其IP,即获取hostname,所以使用起来可以起到获取目标IP域名的效果。
图3.sL扫描会向本机DNS依据IP反解析hostname
我的本机默认的DNS是192.168.24.8和223.5.5.5。话说对公网的DNS服务器反向解析内网的IP的hostname,是不是有点太搞笑了。
-dns-servers
指定DNS服务器-n
不解析DNS,那就真的只是列出IP地址而已了┌──(kali㉿kali)-[~]
└─$ **nmap** **-sL 192.168.24.1/30 -dbs-servers 192.168.28.8**
Starting Nmap 7.93 ( https://nmap.org ) at 2022-10-26 22:39 EDT
Nmap scan report for 192.168.24.0
Nmap scan report for redmiAX6(192.168.1.1)
Nmap scan report for **xiaomi10s(192.168.24.2)**
Nmap scan report for 192.168.24.3Nmap done: 4 IP addresses (2 hosts up) scanned in 0.01 seconds
只使用Ping的方式判断主机存活。就和使用ping命令判断主机在线一样,如果有icmp回显那么nmap就认为其是存活的。
图4.sP方式扫描
┌──(kali㉿kali)-[~]
└─$ **nmap** **-sP 192.168.24.1-100**
Starting Nmap 7.93 ( https://nmap.org ) at 2022-10-26 23:14 EDT
Nmap scan report for 192.168.24.1
Host is up (0.0034s latency).
Nmap scan report for 192.168.24.4
Host is up (0.0021s latency).
Nmap scan report for 192.168.24.6
Host is up (0.0026s latency).
Nmap scan report for 192.168.24.9
Host is up (0.0027s latency).
Nmap scan report for 192.168.24.10
Host is up (0.0033s latency).
Nmap scan report for 192.168.24.15
Host is up (0.0025s latency).
...省略
如果对方关闭了icmp回显的功能,那么nmap会判断本主机不在线,同时后续的端口扫描等也不会进行,会给扫描结果带来干扰。
Windows下开关回显:
图5.Windows系统可在防火墙规则开关icmp回显
Linux关闭回显:
#临时关闭
echo 0 >/proc/sys/net/ipv4/icmp\_echo\_ignore\_all
#永久
echo net.ipv4.icmp\_echo\_ignore\_all=0 >> /etc/sysctl.conf
sysctl -p
图6.ping测试下的icmp开关效果
所以为了排除干扰,可以加上-P0
参数,这样后续的端口扫描等操作也不会被干扰。请注意,P0虽然可以更彻底的扫描,但是代价是如果该地址本就真的不存在设备或者设备不在线,那么将花费大量的时间做无用功。
Windows主机上开启smb文件共享,确认开启445端口。并且是关闭的icmp回显。
图7.使用netstat查看端口监听情况
对于关闭icmp回显的设备,加不加-P0参数对扫描的结果有很大的影响。
图8.使用nmap 添加和不添加-P0的测试
向目标主机的常用端口发送标志SYN=1的TCP握手报文,默认-PS不加参数时候会向常用的TCP端口发送SYN报文,并不需要建立TCP连接,只要有回应那么就说明主机在线的。在判断主机存活时候随便还探测了开放的TCP端口。
图9.PS抓取报文的效果
#PS不带参数
nmap **-PS** 192.168.5.1/24
#如果需要添加指定端口,比如你发现目标喜欢使用65522作为ssh端口,或者65000到65535这些都有可能,可以添加到扫描列表中,默认情况下预设的TCP端口也依旧会扫描
nmap **-PS65522,65000-65535** 192.168.5.1/24
-PA和PS其实是类似的,向目标主机的常用端口发送TCP报文,只不过这次是ACK=1的TCP确认报文。主要是用于通过一些有防火墙防火墙,因为防火墙会依据SYN报文来识别TCP连接,比较容易暴露自己。
一般情况ACK和SYN一起发送效果比较好。
nmap -PS -PA 192.168.5.1/24
前面-PS和PA都是基于TCP扫描,PU使则是使用UDP扫描,如果网络中TCP的SYN和ACK都被防火墙隔离了,那就使用UDP。
nmap -PU 192.168.5.1/24
TCP和UDP这些都是基于IP扫描,如果只需要扫描局域网内(同网段,不跨越网关),可以使用ARP扫描,往往都不容易被察觉也比网络层扫描更可靠,当广播询问IP的对应MAC地址时候,当有回应那么就认为主机在线。
nmap -PR 192.168.5.1/24
如果使用-p自定义范围。
nmap -sS **-p** **1-1024,3389,3306** 192.168.5.1/24
nmap -sS -sU -p U:53,67,68,T:1-1024,3389,3306 192.168.5.1/24
默认是使用常见的1000个端口作为目标,如果觉得不够快也可以使用-F将使用最常见的100个端口作为目标。使用–top-ports也可以规定前几的端口为目标,-F相当于–top-ports 100的情况。
# 使用-F扫描最常用的100端口
nmap -F 192.168.5.1
# 使用--top-ports 自定义扫描最长用的端口,比如最常用的500个端口
nmap --top-ports 500 192.168.5.1
一个小参数,设置了可以按顺序扫描端口,默认情况是先扫常用端口再扫用户自定义的端口,其实意义不是那么大。
此模式需要管理员(administrator或root)权限。
sS是最常用的扫描方式,不会建立完整的TCP连接,只发送SYN连接请求,所以速度很快,而且通常不会被扫描目标记录。
nmap -sS -p 1-65535 192.168.5.1
sT需要建立完整的TCP连接,即三次握手。所以判断端口开放更可靠,但是很有可能会被记录下连接的日志。
默认情况下不加参数都是使用此方法作为端口扫描。
nmap -sT 192.168.5.1
此模式需要管理员(administrator或root)权限。
对UDP端口进行扫描,使用-sT、-sS都不扫描UDP端口,所以如果有需要扫描UDP那就务必加上此。当然也可以结合TCP扫描来使用。
其原理为想目标端口发送UDP探测包,等待相应,返回ICMP端口不可达(ICMP port unreachable)为端口关闭,等待超时则为端口被过滤
sudo nmap -sS -sU -p U:53,67,68,161,162,T:1-65535 192.168.5.1/24
此模式需要管理员(administrator或root)权限。
nmap发现TCP端口开放与否对不同标志位上TCP报文有不同回应,回复RST报文则认为开放,超时则认为关闭或过滤。因为对于服务器来说这些TCP报文都是错误的,不保证所有端口的都可以正确的相应,但是这比SYN和整个TCP连接都要来得更隐蔽。(不过我都没有用过啊)
-sN
,TCP Null扫描,发送标志位都为0的TCP包,用于测试防火墙。-sF
,TCP FIN扫描,发送标志位FIN=1(关闭连接)的TCP包。端口扫描效果不是很好,但是很隐蔽。-sX
,Xmas扫描,这个更过分了,直接把FIN,PSH和URG标志位都置1了。-sM
,TCP Maimon扫描,发送标志位FIN,ACK的TCP报文。--scanflags
(定制的TCP扫描),这些标志位你甚至可以自己定义,不过记得配合其他TCP扫描。
此模式需要管理员(administrator或root)权限。
ACK扫描,将TCP报文标志位ACK=1,可以用于检测防火墙屏蔽了哪个端口,不过滤的主机端口反而啥也扫不出。
有空要补上图。因为我手机上并没有模拟出来效果啊。
IP 协议扫描确定目标机支持哪些IP协议 (TCP,UDP,ICMP,IGMP等等)。从技术上说,这不是端口扫描 ,既然它遍历的是IP协议号,但是也可以使用-p来指定端口,只不过这个端口对应的是协议的号码。
图10.这里的数字不是代表端口,而是协议
僵尸主机也就是肉鸡,利用side-channel攻击,nmap对此端口进行扫描操作,从而更加隐蔽的进行扫描,若安全设备溯源也是溯源到肉鸡的IP。
-sI [:]
端口可以不写,默认80
sudo nmap -sI 192.168.2.8:8080 192.168.2.1/24 -Pn
这个是利用FTP代理链接漏洞,允许用户连接到一台FTP服务器,然后要求文件送到一台第三方服务器。可以有效的隐藏自己。
这里参数格式是-
-b :@:
sudo nmap -sS ftp:[email protected]:21
不同服务也有不同版本,比如SNMP有v1、v2c、v3三种版本,SMB也有v1.0、v2.0、v3.0三种版本。不同的版本也有不同的特性,为此这些信息也是很重要的内容。
-sV 打开版本探测。在端口扫描的基础上进行开放端口的服务分析。
–version-intensity (设置 版本扫描强度) 强度范围:0和9,默认是7。强度越高越精确,但是耗时更久。
- --version-light (轻量级模式) 相当于--version-intensity 2
- --version-all (尝试每端口探测) 相当于--version-intensity 9
–osscan-limit (针对指定的目标进行操作系统检测)
–osscan-guess; --fuzzy (推测操作系统检测结果)
因为nmap通常对整个进行扫描,倘若网段范围主机非常多,适当的添加参数调整参数会大大的节约时间。
只要记住这个就可以了,因为够用了,其他时间选项其实更加细致的设置,T时间模板已经封装好。
-T 范围0-5,可以使用数字来代替paranoid (0)、sneaky (1)、polite (2)、normal(3)、 aggressive (4)和insane (5)
原来扫描结果需要最后才可以全部看到,但是可以设置组的大小,从而让当前组扫完就可以的看结果,如果组的大小定义为50,扫描50个主机扫描完成后可以得到报告(详细模式中的补充信息 除外)。
不过其实个人觉得-v或者-vv参数更有效果吧。
设置扫描包的发送间隔,单位ms。
跳过通信差的主机,设置多少ms延迟才跳过。比如楼下蹭网的邻居,每一次扫描需要等待许久,非常消耗时间,干脆跳过。
使用诱饵隐藏扫描。即发送参杂着假ip的数据包检测。作为诱饵ip须在线。
使用逗号分隔每个诱饵主机,比如:
sudo nmap -sS -D 192.168.1.1,192.168.2.1,192.168.3.1,192.168.5.1 192.168.5.2-254
自定义源端口
默认时候发送的IP报文都是没有数据的空白报文,追加随机的数据可以减小被怀疑的可能,但是性能消耗会增加。
设置ttl,比如–ttl 255
这个比较有趣,可以输入完整的mac地址,也可以输入前面3Byte的mac,也可以输入厂家的名字(使用自带库中的预设)。
比如 ----spoof-mac 01:01:01:01:22:1a,a20123,Cisco
nmap可以将结果输出为文件,同时也可以配合–resume实现继续之前未完成的任务。
输出以下的全部,当然如果不需要也可以任意选择需要的:
-oN (标准输出) 标准输出可以用于–resume断点继续。
-oX (XML输出) 推荐使用此格式,因为XML使用场景很广,可方便被编程语言调用。比如使用python的脚本导结果为excel表格等。
-oG (Grep输出) 可以很方便的在grep、awk、cut、sed、diff等命令中展现。
要求Nmap打印发送和接收的每个报文的摘要,也可以方便初学者理解nmap工作原理。
用于分析路由,如果报文发送错误网卡可以使用-e来定义网卡接口,但是nmap中的命名是Linux那一套,在Windows要注意。
图11.显示网卡和路由