Python微信订餐小程序课程视频
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475
1|*0***0x00 简介**
nmap还用介绍吗?搞安全的人还有不知道或者不会用nmap的吗?据我观察,能够全面灵活运用nmap的人其实并不多见。其实nmap早已经不再是你眼中那个网络层的扫描器软件了,早在十年前它就已经进化成为一个全功能的安全评估框架。今天,利用nmap强大的脚本功能,你可以轻松开发出任何漏洞检测和利用的功能,甚至完全不需要掌握那些常见的编程语言。本课我向你介绍了nmap几乎全部参数功能,同时演示了如何自己开发一个脚本的过程。
本文使用的nmap
版本是7.92
2|*0***0x01 历史进程**
- 诞生于1997年
- 最早的版本只有2000行代码,没有版本号
- 只作为端口扫描工具
- 6个月后成为黑客社区中网路扫描的事实标准
- 2003年发布3.45版本
- Fyodor开始全职维护nmap
- 增加了服务检测、OS检测、时间控制等功能
- 进入成熟期
- 2006年集成NSE
- 从单一的网络扫描工具,转变为可扩展的全功能漏洞评估引擎
3|*0***0x02 默认扫描参数**
- 默认
TCP
syn
扫描,利用TCP
的三次握手机制,当发送syn
包后,如果目标主机的那个端口是开着的,就会返回syn
+ack
数据包,同时nmap
接收到之后不再返回ack
的确认包,不会建立完成的TCP
连接,节约扫描发起者机器的资源 - 默认扫描
1000个
常用端口,包括http
、https
、ftp
、smtp
、ssh
等等
4|*0***0x03 指定扫描IP**
4|*1***0x03-1 指定多个扫描IP**
例子 | 含义 |
---|---|
sudo nmap 10.0.2.1,2,25 |
扫描10.0.2.1 、10.0.2.2 、10.0.2.25 这3个IP |
sudo nmap 10.0.1,2.23,25 |
扫描10.0.1.23 、10.0.1.25 、10.0.2.23 、10.0.2.25 这4个IP |
sudo nmap 10.0,1.2,3.23,25 |
扫描10.0.2.23 、10.0.2.25 、10.0.3.23 、10.0.3.25 、10.1.2.23 、10.1.2.25 、10.1.3.23 、10.1.3.25 这8个IP |
例子 | 含义 |
---|---|
sudo nmap 10.0.2.20-25 |
扫描10.0.2.20-25 这一段的IP |
sudo nmap 10.0.2-10,25 |
扫描10.0.2-10,25 这几段的IP |
sudo nmap 10.0.2-10.20-25 |
扫描10.0.2-10.20-25 这几段的IP |
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25/24 |
扫描10.0.2.1/24 这个网段中的所有IP |
sudo nmap 10.0.2.1/16 |
扫描10.0.2.1/16 这个网段中的所有IP |
例子 | 含义 |
---|---|
sudo nmap -iL ip.txt |
扫描ip.txt 这个文件内容中所有的IP ,注意IP 得是一个一行的形式写入文件中 |
4|*2***0x03-2 指定扫描域名**
例子 | 含义 |
---|---|
sudo nmap www.baidu.com |
扫描www.baidu,com 这个域名对应的IP |
4|*3***0x03-3 排除要扫描的IP**
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25/24 --exclude 10.0.2.2,3,4 |
扫描10.0.2.1/24 这个网段中除10.0.2.2 、10.0.2.3 、10.0.2.4 外的所有IP |
sudo nmap 10.0.2.25/24 --exclude 10.0.2.2-10 |
扫描10.0.2.1/24 这个网段中除10.0.2.2-10 这一段外的所有IP |
sudo nmap 10.0.2.25/16 --exclude 10.0.2.0/24 |
扫描10.0.2.1/16 这一大段中除10.0.2.0/24 这一小段外的所有IP |
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25/24 --excludefile exip.txt |
扫描10.0.2.25/24 这个网段中除exip.txt 文件内容中包含的IP 外的所有IP |
5|*0***0x04 反向域名查询**
5|*1***0x04-1 -R 一定要做DNS反向域名查询**
例子 | 含义 |
---|---|
sudo nmap 220.181.38.251 -R -sn |
在扫描时一定要做DNS 反向域名查询,也就是查询IP 地址对应的域名,并且只做主机发现 |
5|*2***0x04-2 -n 不做DNS反向域名查询**
例子 | 含义 |
---|---|
sudo nmap 220.181.38.251 -n -sn |
在扫描时不做DNS 反向域名查询,也就是不查询IP 地址对应的域名,并且只做主机发现 |
5|*3***0x04-3 --dns-servers 指定 DNS 服务器做反向域名查询**
例子 | 含义 |
---|---|
sudo nmap 220.181.38.251 -R --dns-servers 114.114.114.114 -sn |
在扫描时做DNS 反向域名查询,指定DNS 服务器为114.114.114.114 ,并且只做主机发现 |
6|*0***0x05 -e 指定发包网卡**
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25 -e eth0 |
指定发扫描数据包的网卡为eth0 |
如果没有指定发包网卡,nmap
就会使用本机序号为第一个的网卡发扫描包
7|*0***0x06 主机发现**
做扫描的时候,先做主机发现,别一上来就对所有的
IP
发送大量数据包进行端口扫描,不要做这种莽撞的行为,因为在扫描的时候经常会触发安全机制的报警,所以做扫描的时候要越隐蔽越好,先做主机发现再做端口扫描,不仅节省自己的时间,还能避免被发现,何乐而不为呢?
7|*1***0x06-1 -sn 使用ICMP,TCP ping扫描,只做主机发现**
向目标系统的80
或443
端口发送ICMP
和TCP
ping
扫描,如果目标系统返回了ICMP
响应包、SYN+ACK
包、RST+ACK
包,就认为这个IP
是活着的
并且判断完IP
是否是活着的之后,就会结束,不会再发送端口扫描数据包
例子 | 含义 |
---|---|
sudo nmap -sn 192.168.123.2 |
扫描192.168.123.2 是否是活着的 |
7|*2***0x06-2 -Pn 跳过主机发现环节**
跳过主机发现环节,直接将IP
视为在线状态,直接发送大量的端口扫描数据包;不加此参数的情况是:若发现此IP
不在线,则不进行端口扫描
因为会发出大量的扫描数据包,一点也不隐蔽,所以用此参数来进行主机发现是不可取的
例子 | 含义 |
---|---|
sudo nmap -Pn 192.168.123.2 |
扫描192.168.123.2 ,不管此IP 是否是活着的状态 |
7|*3***0x06-3 --traceroute 显示经过的路由**
例子 | 含义 |
---|---|
sudo nmap www.baidu.com --traceroute -sn |
在扫描结果种显示每一跳经过的路由IP ,而且只做主机发现这一步 |
7|*4***0x06-4 -PS 发送 TCP SYN 包**
加入这个参数之后只会发送TCP
SYN
数据包包
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 -PS -sn |
只发送TCP SYN 包进行主机发现 |
7|*5***0x06-5 -PA 发送 TCP SYN 包**
加入这个参数之后只会发送TCP
ACK
数据包
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 -PA -sn -n |
只发送TCP ACK 包进行主机发现,并且跳过DNS 反向域名解析环节 |
7|*6***0x06-6 -PU 发送 UDP 包**
加入这个参数之后只会发送UDP
数据包
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 -PU -sn -n |
只发送UDP 包进行主机发现,并且跳过DNS 反向域名解析环节 |
7|*7***0x06-7 -PY 发送 SCTP 包**
加入这个参数之后只会发送SCTP
数据包
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 -PY -sn -n |
只发送SCTP 包进行主机发现,并且跳过DNS 反向域名解析环节 |
7|*8***0x06-8 -PE 发送 ICMP 包**
加入这个参数之后只会发送ICMP
数据包,跟使用ping
命令是完全一回事
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 -PE -sn -n |
只发送ICMP 包进行主机发现,并且跳过DNS 反向域名解析环节 |
7|*9***0x06-9 -PP 请求目标系统时间戳**
请求目标系统时间戳,如果返回的话则说明这个IP
是活着的
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 -PP -sn -n |
请求目标系统时间戳,如果返回的话则说明这个IP 是活着的,并且跳过DNS 反向域名解析环节 |
抓包结果显示发送了两次 ICMP 数据包请求目标系统时间戳都没有得到回复,但其实这个IP
是活着的
注意:每个参数的使用场景不一样,没有哪个参数可以全场景覆盖,要针对当前扫描的环境使用相对应的扫描参数
7|*10***0x06-10 -PM 请求目标系统子网掩码**
请求目标子网掩码,如果返回的话则说明这个IP
是活着的
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 -PM -sn -n |
请求目标系统子网掩码,如果返回的话则说明这个IP 是活着的,并且跳过DNS 反向域名解析环节 |
抓包结果显示发送了两次 ICMP 数据包请求目标系统子网掩码都没有得到回复,但其实这个IP
是活着的
注意:每个参数的使用场景不一样,没有哪个参数可以全场景覆盖,要针对当前扫描的环境使用相对应的扫描参数
7|*11***0x06-11 -PO[protocol list] 指定IP协议包探测目标主机是否开启**
指定IP
协议包探测目标主机是否开启,如果返回的话则说明这个IP
是活着的
数值 | 值描述 |
---|---|
0 | 保留字段,用于IPv6(跳跃点到跳跃点选项) |
1 | Internet控制消息 (ICMP) |
2 | Internet组管理 (IGMP) |
3 | 网关到网关 (GGP) |
4 | IP中的IP(封装) |
5 | 流 |
6 | 传输控制 (TCP) |
7 | CBT |
8 | 外部网关协议 (EGP) |
9 | 任何私有内部网关(Cisco在它的IGRP实现中使用) (IGP) |
10 | BBNRCC监视 |
11 | 网络语音协议 |
12 | PUP |
13 | ARGUS |
14 | EMCON |
15 | 网络诊断工具 |
16 | 混乱(Chaos) |
17 | 用户数据报文 (UDP) |
18 | 复用 |
19 | DCN测量子系统 |
20 | 主机监视 |
21 | 包无线测量 |
22 | XEROXNSIDP |
23 | Trunk-1 |
24 | Trunk-2 |
25 | leaf-1 |
26 | 1eaf-2 |
27 | 可靠的数据协议 |
28 | Internet可靠交易 |
29 | 1SO传输协议第四类 (TP4) |
30 | 大块数据传输协议 |
31 | MFE网络服务协议 |
32 | MERIT节点之间协议 |
33 | 序列交换协议 |
34 | 第三方连接协议 |
35 | 域之间策略路由协议 |
36 | XTP |
37 | 数据报文传递协议 |
38 | IDPR控制消息传输协议 |
39 | TP+ +传输协议 |
40 | IL传输协议 |
41 | IPv6 |
42 | 资源命令路由协议 |
43 | IPv6的路由报头 |
44 | IPv6的片报头 |
45 | 域之间路由协议 |
46 | 保留协议 |
47 | 通用路由封装 |
48 | 可移动主机路由协议 |
49 | BNA |
50 | IPv6封装安全有效负载 |
51 | IPv6验证报头 |
52 | 集成的网络层安全TUBA |
53 | 带加密的IP |
54 | NBMA地址解析协议 |
55 | IP可移动性 |
56 | 使用Kryptonet钥匙管理的传输层安全协议 |
57 | SKIP |
58 | IPv6的ICMP |
59 | IPv6的无下一个报头 |
60 | IPv6的信宿选项 |
61 | 任何主机内部协议 |
62 | CFTP |
63 | 任何本地网络 |
64 | SATNET和BackroomEXPAK |
65 | Kryptolan |
66 | MIT远程虚拟磁盘协议 |
67 | Internet Pluribus包核心 |
68 | 任何分布式文件系统 |
69 | SATNET监视 |
70 | VISA协议 |
71 | Internet包核心工具 |
72 | 计算机协议Network Executive |
73 | 计算机协议Heart Beat |
74 | Wang Span网络 |
75 | 包视频协议 |
76 | Backroom SATNET监视 |
77 | SUN ND PROTOCOL—临时 |
78 | WIDEBAND监视 |
79 | WIDEBAND EXPAK |
80 | ISO Internet协议 |
81 | VMTP |
82 | SECURE—VMTP(安全的VMTP) |
83 | VINES |
84 | TTP |
85 | NSFNET—IGP |
86 | 不同网关协议 |
87 | TCF |
88 | EIGRP |
89 | OSPF IGP |
90 | Sprite RPC协议 |
9] | Locus地址解析协议 |
92 | 多播传输协议 |
93 | AX.25帧 |
94 | IP内部的IP封装协议 |
95 | 可移动网络互连控制协议 |
96 | 旗语通讯安全协议 |
97 | IP中的以太封装 |
98 | 封装报头 |
99 | 任何私有加密方案 |
100 | GMTP |
101 | Ipsilon流量管理协议 |
102 | PNNI over IP |
103 | 协议独立多播 |
104 | ARIS |
105 | SCPS |
106 | QNX |
107 | 活动网络 |
108 | IP有效负载压缩协议 |
109 | Sitara网络协议 |
110 | Compaq对等协议 |
111 | IP中的IPX |
112 | 虚拟路由器冗余协议 |
113 | PGM可靠传输协议 |
114 | 任何0跳跃协议 |
115 | 第二层隧道协议 |
116 | D-II数据交换(DDX) |
117 | 交互式代理传输协议 |
118 | 日程计划传输协议 |
119 | SpectraLink无线协议 |
120 | UTI |
121 | 简单消息协议 |
122 | SM |
123 | 性能透明性协议 |
124 | ISIS over IPv4 |
125 | FIRE |
126 | Combat无线传输协议 |
127 | Combat无线用户数据报文 |
128 | SSCOPMCE |
129 | IPLT |
130 | 安全包防护 |
131 | IP中的私有IP封装 |
132 | 流控制传输协议 |
133~254 | 未分配 |
255 | 保留 |
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 -PO1 -sn -n |
指定IP 协议包探测目标主机是否开启,-PO1 表示使用ICMP协议 ,如果返回的话则说明这个IP 是活着的,并且跳过DNS 反向域名解析环节 |
8|*0***0x07 端口扫描**
8|*1***0x07-1 --top-ports 扫描最常用的端口**
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25 --top-ports 100 |
扫描前100个最常用的端口 |
8|*2***0x07-2 指定扫描端口**
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25 -p22,80,443,5000 |
扫描10.0.2.25 的22 、80 、443 、5000 端口 |
sudo nmap 10.0.2.25 -p1-100 |
扫描10.0.2.25 的1-100 端口 |
sudo nmap 10.0.2.25 -p- |
扫描10.0.2.25 的全部端口,也就是1-65535 端口 |
8|*3***0x07-3 -sS 发 TCP SYN 包扫描**
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 -sS |
发TCP 的SYN 数据包进行扫描 |
8|*4***0x07-4 -sA 发 TCP ACK 包扫描**
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 -sA |
发TCP 的ACK 数据包进行扫描 |
8|*5***0x07-5 -sT 三次握手建立完整的 TCP 连接**
有些特殊的应用可能会拒绝SYN
扫描,拒绝半开的连接,所以这时候必须要通过三次握手建立完成的TCP
连接才能发现端口是否是开放的
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 -sT |
通过三次握手建立完整的TCP 连接,来判断端口是否开放 |
8|*6***0x07-6 -sN 发送的 TCP 包 flag 位为空**
目标主机收到包之后丢弃掉,即不做响应代表这个端口是开放的,如果返回RST
数据包则表示这个端口是开放的;当然这和目标主机的安全配置有关,只是一般情况下是这样的
所以使用此参数进行端口扫描时要先确保目标IP
是活着的
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 -sN |
发送的TCP 包flag 位全设置为0,进行端口扫描 |
8|*7***0x07-7 -sF 发送的 TCP 包 flag 位的 Fin 设置为1**
目标主机收到包之后丢弃掉,即不做响应代表这个端口是开放的,如果返回RST
数据包则表示这个端口是开放的;当然这和目标主机的安全配置有关,只是一般情况下是这样的
所以使用此参数进行端口扫描时要先确保目标IP
是活着的
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 -sF |
发送的TCP 数据包flag 中Fin 设置为1 |
8|*8***0x07-8 -sX 发送的 TCP 包 flag 位的 Urgent、Push、Fin 设置为1**
目标主机收到包之后丢弃掉,即不做响应代表这个端口是开放的,如果返回RST
数据包则表示这个端口是开放的;当然这和目标主机的安全配置有关,只是一般情况下是这样的
所以使用此参数进行端口扫描时要先确保目标IP
是活着的
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 -sX |
发送的TCP 数据包flag 中Urgent 、Push 、Fin 设置为1 |
8|*9***0x07-9 --scanflags 自定义 TCP Flags设置**
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 --scanflags syn,ack,fin |
自定义发送的TCP 数据包flag 中syn 、ack 、Fin 设置为1 |
8|*10***0x07-10 重头戏:-sI 僵尸扫描**
参数:-sI
僵尸扫描
是非常非常隐蔽的扫描方式
原理
-
首先需要在被扫描的网络中找一台符合下面两个要求的计算机
- 非常非常空闲的计算机,空闲到没有和别的任何计算机进行通信(在一个大型的网络中这种空闲的机器还是比较好找的)
- 这台计算机的
IPID
必须是递增的,且增长方式是有规律的,比方说每次递增1
(IPID
即是IP
头部的ID
字段)很多的计算机的
IPID
都是递增的,比方说一天中的第一个数据包的IPID
是随即的,下一个数据包的IPID
则会在前一个的IPID
上加1或加2或者加一些有规律的数值
nmap
先探测僵尸机当前的IPID
是多少,并记录下来- 然后
nmap
将自己的IP
地址伪装成僵尸机的IP
地址,向要目标主机的端口发送SYN
包 -
目标主机端口接收到
SYN
包之后- 如果目标端口是开放的则会向僵尸机发送
SYN+ACK
,但是僵尸机从头到尾都没有发送过SYN
包,凭空接收到了目标主机的向它发送SYN+ACK
,僵尸机就会返回RST
数据包,此时僵尸机的IPID
递增1
- 如果目标端口是关闭的则会向僵尸机发送
RST
包,僵尸机莫名其妙的接收到这个RST
包之后会将这个包丢弃掉,此时僵尸机的IPID
不变化
- 如果目标端口是开放的则会向僵尸机发送
- 这时候
nmap
再次向僵尸机发送数据包,探测僵尸机当前的IPID
,如果数值为之前探测的基础上+2
,则表明目标主机的目标端口是开放的;如果数值为之前探测的基础上+1
,则表明目标主机的目标端口是关闭的 - 在整个过程中扫描者是完全隐蔽的,安全性很高。但是反向做路由追踪还是有可能发现的,不过难度特别大。
例子
- 僵尸机
IP
:10.0.2.11
- 目标
IP
:10.0.2.25
实施僵尸扫描
执行命令:sudo nmap 10.0.2.25 -sI 10.0.2.11 -Pn
注:利用此命令可以单独探测僵尸机的IPID
变化规律
执行命令:sudo nmap 10.0.2.11 -p445 --script=ipidseq.nse
使用nmap
专门用来扫描IPID
变化的脚本ipidseq.nse
8|*11***0x07-11 -sU 发 UDP 数据包扫 UDP 端口**
因为UDP
是不建立连接的,没有办法像TCP
那样在建立连接的过程中就可以判断出端口是否开放,所以扫UDP
端口挺不靠谱的
扫UDP
端口一般需要建立基于UDP
以上的应用层连接,发送应用层报文才可以判断UDP
端口是否开放
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 -sU |
发送UDP 数据包,扫描UDP 端口 |
8|*12***0x07-12 默认配置下端口扫描在做什么**
如果目标主机和kali不在同一网段中
执行命令:sudo nmap 192.168.123.1,2 -p80,5000
一图胜千言
如果目标主机和kali在同一网段中
执行命令:sudo nmap 10.0.2.2,25 -p22,5000
一图胜千言
9|*0***0x08 -sV 扫描服务版本**
结合多种方式,包括banner
,指纹等技术,判断目标端口上运行的到底是什么服务,准确率很高的
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25 -p22,5000 -sV |
探测22 和5000 端口运行的是什么服务 |
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 -p53 -sU -sV |
探测UDP 53 端口运行的是什么服务 |
10|*0***0x09 -O 扫描系统版本**
很多情况下没有办法100%判断出系统的具体版本,就会给出所有可能的结果
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25 -O |
探测系统版本 |
11|*0***0x0a 扫描速度控制**
11|*1***0x0a-1 -T 设置扫描速度等级**
0
最慢,5
最快,不过最快速度可能会更容易被发现
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25 -T3 |
限定扫描速度为等级3 |
11|*2***0x0a-2 --scan-delay 设置探测间隔时间**
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25 --scan-delay 10s |
每个扫描间隔10 秒 |
sudo nmap 10.0.2.25 --scan-delay 10m |
每个扫描间隔10 分钟 |
sudo nmap 10.0.2.25 --scan-delay 10h |
每个扫描间隔10 小时 |
11|*3***0x0a-3 --min-rate 最小扫描速度**
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25 --min-rate |
最小扫描速度 |
11|*4***0x0a-3 --min-rate 最大扫描速度**
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25 --max-rate |
最大扫描速度 |
11|*5***0x0a-4 解决扫描被卡住的问题(大范围地址空间)**
nmap
扫描大范围地址块时经常会被卡死在中间的一个IP
中。
绝大多数是由于目标系统的安全机制造成的,目标系统发现你在扫描时就估计将你的扫描请求挂在那不响应,让扫描进行不下去
例子 | 含义 |
---|---|
sudo nmap 10.0.2.0/24 --host-timeout 10m |
设置扫描超时时间为10分钟 ,超过了设置的时间就会扫描下一个 |
12|*0***0x0b 躲避安全检测**
12|*1***0x0b-1 -f 将 IP 数据段分片(8字节一片)**
将IP
数据段分片发送,使目标的安全机制IPS
等设备无法还原数据包的原始内容,从而使安全检测机制失效
比方说
标准的TCP
包头是20
个字节,加入了-f
参数后会将这个20
字节分3
个包发出去,第一个包8
字节,第二个包8
字节,第三个包4
字节再加上4
字节TCP
数据段的内容(如果有数据段的话也是每次发8
字节)
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25 -f |
将 IP 数据段分片(8字节一片) |
12|*2***0x0b-2 -D 伪造多个源IP,真实IP隐藏在其中**
ME
代表自己的IP
伪造多个源IP
发送扫描数据包,将真实的扫描IP
隐藏起来
据有些安全资料上说,当
ME
位于*第6个或者再之后**时,有些知名厂家安全设备不会记录到安全日志中
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25 -D 10.0.2.22,10.0.2.23,10.0.2.24,ME |
伪造10.0.2.22 10.0.2.23 10.0.2.24 和自己的真实IP ME 对目标10.0.2.25 进行扫描 |
12|*3***0x0b-3 -S 伪造源IP**
将源IP
进行伪造,使用此参数的话还需要别的方法判断伪造的源IP
是否接收到了回包
此参数需要搭配-e
指定网卡,-Pn
跳过主机发现这两个参数
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25 -S 10.0.2.11 -e eth0 -Pn |
伪造源IP 为10.0.2.11 进行探测,并且指定了发包网卡为eth0 ,跳过主机发现环节 |
12|*4***0x0b-4 -g 指定发包端口**
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25 -g 3333 |
指定扫描数据包发送的端口为3333 |
12|*5***0x0b-5 --proxies 挂上HTTP或SOCKS4代理进行扫描**
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25 --proxies http://10.0.2.11:8080 |
使用HTTP 代理进行发包扫描 |
12|*6***0x0b-6 --data 在扫描包中数据段附加自定义的16进制数据**
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 --data "AABB02" |
在扫描数据包附加16进制数据AABB02 |
sudo nmap 192.168.123.1 --data "\xAA\xBB\x02" |
在扫描数据包附加16进制数据\xAA\xBB\x02 |
sudo nmap 192.168.123.1 --data "0xaabb02" |
在扫描数据包附加16进制数据0xaabb02 |
12|*7***0x0b-7 --data-string 在扫描数据包数据段中附加自定义的ASCII字符**
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 --data-string aabbccdd |
在扫描数据包附加ASCII 数据aabbccdd |
sudo nmap 192.168.123.1 --data-string "aa bb cc dd" |
在扫描数据包附加ASCII 数据aa bb cc dd |
12|*8***0x0b-8 --ip-options 指定IP OPTION数据(暂时不知道咋用)**
12|*9***0x0b-9 --ttl 指定发送扫描包的TTL值**
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 --ttl 25 |
指定发送扫描包的TTL值为25 |
12|*10***0x0b-10 --spoof-mac 伪造扫描数据包中的MAC地址**
可能会造成收不到回包的情况
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 --spoof-mac AA:BB:CC:DD:EE:FF |
伪造数据包中的MAC 地址AA:BB:CC:DD:EE:FF |
12|*11***0x0b-11 --badsum 使用错误的checksum**
将IP
包头中的checksum
校验值故意写错,看看目标的安全检测机制会不会放弃这样的包,从而绕过安全机制
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 --badsum |
故意使用错误的checksu |
13|*0***0x0c 输出格式**
13|*1***0x0c-1 -oA 将扫描结果保存为三种根式日志**
三种主要的根式日志,分别是xml
、nmap
、gnmap
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 -oA a |
将扫描结果保存为三种主要的根式日志,文件名为a |
a.nmap
格式的内容就是屏幕输出的内容
a.gnmap
格式的内容是为了方便用grep
命令筛选结果的
比方说扫描了大量的IP
后,现在想要提取所有开放80
端口的IP
地址
可以这样执行命令:cat a.gnmap | grep 80
a.xml
格式就是xml
格式喽
13|*2***0x0c-2 -oX 将扫描结果保存为XML格式文件**
三种主要的根式日志,分别是xml
、nmap
、gnmap
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 -oX a |
将扫描结果保存为XML格式文件,文件名为a.xml |
13|*3***0x0c-3 显示详细信息**
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 -v |
显示详细信息 |
sudo nmap 192.168.123.1 -vv |
显示更详细信息 |
sudo nmap 192.168.123.1 -vvv |
显示更更详细信息 |
sudo nmap 192.168.123.1 -v3 |
等同于-vvv |
13|*4***0x0c-4 -d 显示debug信息**
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 -d |
显示debug 信息 |
13|*5***0x0c-5 --reason 显示判断端口状态的依据**
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25 --reason |
在结果中显示判断端口状态的依据 |
13|*6***0x07-6 --open 扫描结果中只显示开放的端口**
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25 --open |
只显示开放的端口 |
13|*7***0x07-7 --packet-trace 显示 nmap 都发了或收了什么包**
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25 --packet-trace |
显示nmap 都发了和都收了什么包 |
13|*8***0x07-8 --script-trace 只显示脚本都发了和都收了什么包**
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25 --script-trace |
只显示脚本都发了和都收了什么包 |
13|*9***0x07-9 --iflist 显示系统中都有哪些网卡**
例子 | 含义 |
---|---|
sudo nmap --iflist |
显示系统中都有哪些网卡 |
14|*0***0x0d -6 开启 IPV6 扫描**
例子 | 含义 |
---|---|
sudo nmap fe80::a00:27ff:fe6a:30e3 -6 |
开启IPV6 扫描 |
15|*0***0x0e NSE 脚本引擎(Nmap Scripting Engine)**
15|*1***0x0e-1 简介**
- 2006年发布4.21 ALPHA1版本时加入的
- 在第二届Google summer code大会上创造的
- 由于具有
NSE
脚本引擎,所以nmap
成为了全功能的扫描工具套件 - 基于
lua
语言特殊标记的脚本框架,脚本由NSE
执行
lua
是非常快速的解释性语言,很多waf
上会使用lua
- 升级脚本文件:
nmap --script-updatedb
- 脚本文件保存在:
/usr/share/nmap/scripts
- 脚本的描述和使用方法:https://nmap.org/nsedoc/ 或者 在脚本中查看
description
部分- 目前默认包含
600
多个脚本(14大类)
类型 | 中文 |
---|---|
Auth | 身份认证 |
Broadcast | 广播 |
Brute | 暴力 |
Default | 默认 |
Discovery | 发现类 |
Dos | 拒绝服务 |
Exploit | 漏洞利用 |
External | 外部类(查询第三方接口获取信息,比方说有的网站会公布这个IP是否已经中招了、遭泄露了等等) |
Fuzzer | 模糊测试 |
Intrusive | 入侵性探测 |
Malware | 恶意软件类 |
Safe | 安全 |
Version | 获取版本信息类 |
Vuln | 漏洞类 |
一般在企业中建议使用Default
,Safe
类型的脚本进行扫描,尽量避免使用Intrusive
、Dos
、Exploit
类型的脚本,尽量对自己家的服务器温柔一点
15|*2***0x0e-2 脚本使用**
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 --script=http-title |
使用http-title.nse 这个脚本 |
sudo nmap 10.0.2.25 -sC |
使用所有的Default 类脚本 |
sudo nmap 10.0.2.25 --script=default |
使用所有的Default 类脚本,与-sC 相同 |
sudo nmap 10.0.2.25 --script=vuln |
使用所有的Vuln 类脚本 |
sudo nmap 10.0.2.25 --script=dos,exploit,vuln |
使用所有的Dos 、Exploit 、Vuln 类脚本 |
sudo nmap 10.0.2.25 --script="not(dos or exploit or vuln)" |
使用除Dos 、Exploit 、Vuln 类外的所有脚本 |
sudo nmap 10.0.2.25 --script="whois-ip,banner,upnp-info" |
使用whois-ip.nse 、banner.nse 、upnp-info.nse 这三个脚本 |
sudo nmap 10.0.2.25 --script="http-*" |
使用所有的以http- 开头的脚本 |
sudo nmap 10.0.2.25 --script="http-* and not(http-slowloris or http-brute or http-enum or http-form-fuzzer)" |
使用除http-slowloris.nse 、http-brute.nse 、http-enum.nse 、http-form-fuzzer.nse 外所有以http- 开头的脚本 |
sudo nmap 10.0.2.25 --script=+vuln -p4343 |
使用所有的Vuln 类脚本扫描4343 端口;当服务不工作在非标准端口时,部分脚本就不工作了,使用+ 来强制Vuln 类所有脚本都要对4343 端口进行扫描 |
15|*3***0x0e-3 脚本参数**
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 --script=http-title --script-args=http.useragent="w00l00" |
使用http-title.nse 这个脚本,并设置其中的useragent 参数值为w00l00 |
例子 | 含义 |
---|---|
sudo nmap 192.168.123.1 --script=http-majordomo2-dir-traversal,http-axis2-dir-traversal --script-args=http-axis2-dir-traversal.uri=/axis2/,uri=/majordomo/ |
分别指定http-majordomo2-dir-traversal.nse 和http-axis2-dir-traversal.nse 两个脚本中的uri 参数值 |
15|*4***0x0e-4 使用实例**
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25 -sL --script=targets-sniffer -e eth0 |
targets-sniffer.nse 脚本的功能是做被动侦听 |
sudo nmap 10.0.2.25 -p3306 -script=mysql-brute |
针对mysql 3306 端口做简单的暴力破解密码 |
sudo nmap 10.0.2.25 -p25 -script=smtp-brute |
针对smtp 25 端口做简单的暴力破解密码 |
sudo nmap 10.0.2.25 -p3306 -script=mysql-audit --script-args='mysql-audit.username="root"',mysql-audit.password="pass",mysql-audit.filename=/usr/share/nmap/nselib/data/mysql-cis.audit |
提供mysql 账号root 密码pass ,连接之后,按照/usr/share/nmap/nselib/data/mysql-cis.audit 文件内容做相应的审计,检测是否存在漏洞 |
sudo nmap 10.0.2.25 -p445 -n --open --script=smb-vuln-ms17-010.nse |
检测ms17-010 漏洞 |
15|*5***0x0e-5 写自己的脚本**
使用Lua
的语法写就行,注意要把TAB
键改成2个空格长度
先来看一个现成的smb-vuln-ms17-010.nse
----------------------------------------------------------- 头部 -----------------------------------------------------------
----------------------------------------------------------- 头部 -----------------------------------------------------------
----------------------------------------------------------- 头部 -----------------------------------------------------------
-- 变量定义,应用模块
local nmap = require "nmap"
local smb = require "smb"
local vulns = require "vulns"
local stdnse = require "stdnse"
local string = require "string"
-- 描述,我这个脚本干嘛用的;[[ ]] 是多行注释
description = [[
Attempts to detect if a Microsoft SMBv1 server is vulnerable to a remote code
execution vulnerability (ms17-010, a.k.a. EternalBlue).
The vulnerability is actively exploited by WannaCry and Petya ransomware and other malware.
The script connects to the $IPC tree, executes a transaction on FID 0 and
checks if the error "STATUS\_INSUFF\_SERVER\_RESOURCES" is returned to
determine if the target is not patched against ms17-010. Additionally it checks
for known error codes returned by patched systems.
Tested on Windows XP, 2003, 7, 8, 8.1, 10, 2008, 2012 and 2016.
References:
* https://technet.microsoft.com/en-us/library/security/ms17-010.aspx
* https://blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/
* https://msdn.microsoft.com/en-us/library/ee441489.aspx
* https://github.com/rapid7/metasploit-framework/blob/master/modules/auxiliary/scanner/smb/smb\_ms17\_010.rb
* https://github.com/cldrn/nmap-nse-scripts/wiki/Notes-about-smb-vuln-ms17-010
]]
---
-- 告诉你这个脚本怎么用,怎么样执行命令
-- @usage nmap -p445 --script smb-vuln-ms17-010
-- @usage nmap -p445 --script vuln
--
-- @see smb-double-pulsar-backdoor.nse
--
-- @output
-- Host script results:
-- | smb-vuln-ms17-010:
-- | VULNERABLE:
-- | Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)
-- | State: VULNERABLE
-- | IDs: CVE:CVE-2017-0143
-- | Risk factor: HIGH
-- | A critical remote code execution vulnerability exists in Microsoft SMBv1
-- | servers (ms17-010).
-- |
-- | Disclosure date: 2017-03-14
-- | References:
-- | https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-0143
-- | https://technet.microsoft.com/en-us/library/security/ms17-010.aspx
-- |\_ https://blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/
--
-- @xmloutput
--
-- Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)
-- VULNERABLE
--
-- CVE:CVE-2017-0143
--
--
-- A critical remote code execution vulnerability exists in Microsoft SMBv1
servers (ms17-010).
--
--
--
-- 03
-- 2017
-- 14
--
--
-- 2017-03-14
--
-- https://technet.microsoft.com/en-us/library/security/ms17-010.aspx
-- https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-0143
-- https://blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/
--
--
--
-- @args smb-vuln-ms17-010.sharename Share name to connect. Default: IPC$
---
-- 作者是谁
author = "Paulino Calderon "
-- 这个脚本遵循的许可
license = "Same as Nmap--See https://nmap.org/book/man-legal.html"
-- 这个脚本属于哪些类
categories = {"vuln", "safe"}
----------------------------------------------------------- 规则 -----------------------------------------------------------
----------------------------------------------------------- 规则 -----------------------------------------------------------
----------------------------------------------------------- 规则 -----------------------------------------------------------
[[
Rule:决定在什么情况下运行后续的Action,满足设置的条件才运行后续的Action
有Prerule、Postrule、Portrule、Hostrule
比如 Portrule 通常用于检测服务匹配的特征字符串
]]
hostrule = function(host)
return smb.get\_port(host) ~= nil
end
local function check\_ms17010(host, port, sharename)
local status, smbstate = smb.start\_ex(host, true, true, "\\\\".. host.ip .. "\\" .. sharename, nil, nil, nil)
if not status then
stdnse.debug1("Could not connect to '%s'", sharename)
return false, string.format("Could not connect to '%s'", sharename)
else
local overrides = {}
local smb\_header, smb\_params, smb\_cmd
stdnse.debug1("Connected to share '%s'", sharename)
overrides['parameters\_length'] = 0x10
--SMB\_COM\_TRANSACTION opcode is 0x25
smb\_header = smb.smb\_encode\_header(smbstate, 0x25, overrides)
smb\_params = string.pack(">I2 I2 I2 I2 B B I2 I4 I2 I2 I2 I2 I2 B B I2 I2 I2 I2 I2 I2",
0x0, -- Total Parameter count (2 bytes)
0x0, -- Total Data count (2 bytes)
0xFFFF, -- Max Parameter count (2 bytes)
0xFFFF, -- Max Data count (2 bytes)
0x0, -- Max setup Count (1 byte)
0x0, -- Reserved (1 byte)
0x0, -- Flags (2 bytes)
0x0, -- Timeout (4 bytes)
0x0, -- Reserved (2 bytes)
0x0, -- ParameterCount (2 bytes)
0x4a00, -- ParameterOffset (2 bytes)
0x0, -- DataCount (2 bytes)
0x4a00, -- DataOffset (2 bytes)
0x02, -- SetupCount (1 byte)
0x0, -- Reserved (1 byte)
0x2300, -- PeekNamedPipe opcode
0x0, --
0x0700, -- BCC (Length of "\PIPE\")
0x5c50, -- \P
0x4950, -- IP
0x455c -- E\
)
stdnse.debug2("SMB: Sending SMB\_COM\_TRANSACTION")
local result, err = smb.smb\_send(smbstate, smb\_header, smb\_params, '', overrides)
if(result == false) then
stdnse.debug1("There was an error in the SMB\_COM\_TRANSACTION request")
return false, err
end
local result, smb\_header, \_, \_ = smb.smb\_read(smbstate)
if not result then
stdnse.debug1("Error reading SMB response: %s", smb\_header)
-- error can happen if an (H)IPS resets the connection
return false, smb\_header
end
local \_ , smb\_cmd, err = string.unpack(", smb\_header)
if smb\_cmd == 37 then -- SMB command for Trans is 0x25
stdnse.debug1("Valid SMB\_COM\_TRANSACTION response received")
--STATUS\_INSUFF\_SERVER\_RESOURCES indicate that the machine is not patched
if err == 0xc0000205 then
stdnse.debug1("STATUS\_INSUFF\_SERVER\_RESOURCES response received")
return true
elseif err == 0xc0000022 then
stdnse.debug1("STATUS\_ACCESS\_DENIED response received. This system is likely patched.")
return false, "This system is patched."
elseif err == 0xc0000008 then
stdnse.debug1("STATUS\_INVALID\_HANDLE response received. This system is likely patched.")
return false, "This system is patched."
end
stdnse.debug1("Error code received:%s", stdnse.tohex(err))
else
stdnse.debug1("Received invalid command id.")
return false, string.format("Unexpected SMB response:%s", stdnse.tohex(err))
end
end
end
----------------------------------------------------------- Action -----------------------------------------------------------
----------------------------------------------------------- Action -----------------------------------------------------------
----------------------------------------------------------- Action -----------------------------------------------------------
action = function(host,port)
local vuln\_status, err
local vuln = {
title = "Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)",
IDS = {CVE = 'CVE-2017-0143'},
risk\_factor = "HIGH",
description = [[
A critical remote code execution vulnerability exists in Microsoft SMBv1
servers (ms17-010).
]],
references = {
'https://technet.microsoft.com/en-us/library/security/ms17-010.aspx',
'https://blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/'
},
dates = {
disclosure = {year = '2017', month = '03', day = '14'},
}
}
local sharename = stdnse.get\_script\_args(SCRIPT\_NAME .. ".sharename") or "IPC$"
local report = vulns.Report:new(SCRIPT\_NAME, host, port)
vuln.state = vulns.STATE.NOT\_VULN
vuln\_status, err = check\_ms17010(host, port, sharename)
if vuln\_status then
stdnse.debug1("This host is missing the patch for ms17-010!")
vuln.state = vulns.STATE.VULN
else
vuln.state = vulns.STATE.NOT\_VULN
vuln.check\_results = err
end
return report:make\_output(vuln)
end
编写自己的脚本,内容如下
----------------------------------------------------------- Header -----------------------------------------------------------
----------------------------------------------------------- Header -----------------------------------------------------------
----------------------------------------------------------- Header -----------------------------------------------------------
local http = require "http"
local nmap = require "nmap"
description = [[
检查网站根目录下是否有 "robots.txt" 这个文件
]]
author = "w00l00"
license = "Same as Nmap--See https://nmap.org/book/man-legal.html"
categories = {"default", "discovery", "safe"}
----------------------------------------------------------- Rules -----------------------------------------------------------
----------------------------------------------------------- Rules -----------------------------------------------------------
----------------------------------------------------------- Rules -----------------------------------------------------------
-- 规则是 判断端口是否开放,开放则返回True
portrule = function(host, port)
return port.state == "open"
end
----------------------------------------------------------- Action -----------------------------------------------------------
----------------------------------------------------------- Action -----------------------------------------------------------
----------------------------------------------------------- Action -----------------------------------------------------------
-- 如果规则函数返回的是True,做下面的Action
action = function(host, port)
-- 请求目标主机目标端口下的 robots.txt 文件
local robots = http.get(host, port, "/robots.txt")
-- 如果返回的http状态码是200则表明文件存在
if robots.status == 200 then
return "robots.txt status 200"
else
return "robots.txt status: " .. robots.status
end
end
执行自己编写的脚本
16|*0***0x0f -A 综合参数,相当于 -O、-sV、-sC、traceroute 参数结合体**
例子 | 含义 |
---|---|
sudo nmap 10.0.2.25 -A |
-A 综合参数,相当于-O 、-sV 、-sC 、traceroute 参数结合体 |
- 对应的视频链接:点击查看
__EOF__
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fRBO3zEq-1648356069467)(https://blog.csdn.net/W00L00/p/16061496.html)]W00L00 本文链接:https://blog.csdn.net/W00L00/p/16061496.html关于博主:评论和私信会在第一时间回复。或者直接私信我。版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!