nmap还用介绍吗?搞安全的人还有不知道或者不会用nmap的吗?据我观察,能够全面灵活运用nmap的人其实并不多见。其实nmap早已经不再是你眼中那个网络层的扫描器软件了,早在十年前它就已经进化成为一个全功能的安全评估框架。今天,利用nmap强大的脚本功能,你可以轻松开发出任何漏洞检测和利用的功能,甚至完全不需要掌握那些常见的编程语言。本课我向你介绍了nmap几乎全部参数功能,同时演示了如何自己开发一个脚本的过程。
本文使用的nmap
版本是7.92
- 诞生于1997年
- 最早的版本只有2000行代码,没有版本号
- 只作为端口扫描工具
- 6个月后成为黑客社区中网路扫描的事实标准
- 2003年发布3.45版本
- Fyodor开始全职维护nmap
- 增加了服务检测、OS检测、时间控制等功能
- 进入成熟期
- 2006年集成NSE
- 从单一的网络扫描工具,转变为可扩展的全功能漏洞评估引擎
- 默认
TCP
syn
扫描,利用TCP
的三次握手机制,当发送syn
包后,如果目标主机的那个端口是开着的,就会返回syn
+ack
数据包,同时nmap
接收到之后不再返回ack
的确认包,不会建立完成的TCP
连接,节约扫描发起者机器的资源 - 默认扫描
1000个
常用端口,包括http
、https
、ftp
、smtp
、ssh
等等
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
得是一个一行的形式写入文件中
0x03-2 指定扫描域名
sudo nmap www.baidu.com
扫描www.baidu,com
这个域名对应的IP
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
0x04 反向域名查询
0x04-1 -R 一定要做DNS反向域名查询
sudo nmap 220.181.38.251 -R -sn
在扫描时一定要做DNS
反向域名查询,也就是查询IP
地址对应的域名,并且只做主机发现
0x04-2 -n 不做DNS反向域名查询
sudo nmap 220.181.38.251 -n -sn
在扫描时不做DNS
反向域名查询,也就是不查询IP
地址对应的域名,并且只做主机发现
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
,并且只做主机发现
0x05 -e <iface> 指定发包网卡
sudo nmap 10.0.2.25 -e eth0
指定发扫描数据包的网卡为eth0
如果没有指定发包网卡,nmap
就会使用本机序号为第一个的网卡发扫描包
0x06-1 -sn 使用ICMP,TCP ping扫描,只做主机发现做扫描的时候,先做主机发现,别一上来就对所有的
IP
发送大量数据包进行端口扫描,不要做这种莽撞的行为,因为在扫描的时候经常会触发安全机制的报警,所以做扫描的时候要越隐蔽越好,先做主机发现再做端口扫描,不仅节省自己的时间,还能避免被发现,何乐而不为呢?
向目标系统的80
或443
端口发送ICMP
和TCP
ping
扫描,如果目标系统返回了ICMP
响应包、SYN+ACK
包、RST+ACK
包,就认为这个IP
是活着的
并且判断完IP
是否是活着的之后,就会结束,不会再发送端口扫描数据包
sudo nmap -sn 192.168.123.2
扫描192.168.123.2
是否是活着的
0x06-2 -Pn 跳过主机发现环节
跳过主机发现环节,直接将IP
视为在线状态,直接发送大量的端口扫描数据包;不加此参数的情况是:若发现此IP
不在线,则不进行端口扫描
因为会发出大量的扫描数据包,一点也不隐蔽,所以用此参数来进行主机发现是不可取的
sudo nmap -Pn 192.168.123.2
扫描192.168.123.2
,不管此IP
是否是活着的状态
0x06-3 --traceroute 显示经过的路由
sudo nmap www.baidu.com --traceroute -sn
在扫描结果种显示每一跳经过的路由IP
,而且只做主机发现这一步
0x06-4 -PS 发送 TCP SYN 包
加入这个参数之后只会发送TCP
SYN
数据包包
sudo nmap 192.168.123.1 -PS -sn
只发送TCP
SYN
包进行主机发现
0x06-5 -PA 发送 TCP ACK 包
加入这个参数之后只会发送TCP
ACK
数据包
sudo nmap 192.168.123.1 -PA -sn -n
只发送TCP
ACK
包进行主机发现,并且跳过DNS
反向域名解析环节
0x06-6 -PU 发送 UDP 包
加入这个参数之后只会发送UDP
数据包
sudo nmap 192.168.123.1 -PU -sn -n
只发送UDP
包进行主机发现,并且跳过DNS
反向域名解析环节
0x06-7 -PY 发送 SCTP 包
加入这个参数之后只会发送SCTP
数据包
sudo nmap 192.168.123.1 -PY -sn -n
只发送SCTP
包进行主机发现,并且跳过DNS
反向域名解析环节
0x06-8 -PE 发送 ICMP 包
加入这个参数之后只会发送ICMP
数据包,跟使用ping
命令是完全一回事
sudo nmap 192.168.123.1 -PE -sn -n
只发送ICMP
包进行主机发现,并且跳过DNS
反向域名解析环节
0x06-9 -PP 请求目标系统时间戳
请求目标系统时间戳,如果返回的话则说明这个IP
是活着的
sudo nmap 192.168.123.1 -PP -sn -n
请求目标系统时间戳,如果返回的话则说明这个IP
是活着的,并且跳过DNS
反向域名解析环节
抓包结果显示发送了两次 ICMP 数据包请求目标系统时间戳都没有得到回复,但其实这个IP
是活着的
注意:每个参数的使用场景不一样,没有哪个参数可以全场景覆盖,要针对当前扫描的环境使用相对应的扫描参数
0x06-10 -PM 请求目标系统子网掩码请求目标子网掩码,如果返回的话则说明这个IP
是活着的
sudo nmap 192.168.123.1 -PM -sn -n
请求目标系统子网掩码,如果返回的话则说明这个IP
是活着的,并且跳过DNS
反向域名解析环节
抓包结果显示发送了两次 ICMP 数据包请求目标系统子网掩码都没有得到回复,但其实这个IP
是活着的
注意:每个参数的使用场景不一样,没有哪个参数可以全场景覆盖,要针对当前扫描的环境使用相对应的扫描参数
0x06-11 -PO[protocol list] 指定IP协议包探测目标主机是否开启指定IP
协议包探测目标主机是否开启,如果返回的话则说明这个IP
是活着的
sudo nmap 192.168.123.1 -PO1 -sn -n
指定IP
协议包探测目标主机是否开启,-PO1
表示使用ICMP协议
,如果返回的话则说明这个IP
是活着的,并且跳过DNS
反向域名解析环节
0x07 端口扫描
0x07-1 --top-ports <number> 扫描最常用的端口
sudo nmap 10.0.2.25 --top-ports 100
扫描前100个最常用的端口
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
端口
0x07-3 -sS 发 TCP SYN 包扫描
sudo nmap 192.168.123.1 -sS
发TCP
的SYN
数据包进行扫描
0x07-4 -sA 发 TCP ACK 包扫描
sudo nmap 192.168.123.1 -sA
发TCP
的ACK
数据包进行扫描
0x07-5 -sT 三次握手建立完整的 TCP 连接
有些特殊的应用可能会拒绝SYN
扫描,拒绝半开的连接,所以这时候必须要通过三次握手建立完成的TCP
连接才能发现端口是否是开放的
sudo nmap 192.168.123.1 -sT
通过三次握手建立完整的TCP
连接,来判断端口是否开放
0x07-6 -sN 发送的 TCP 包 flag 位为空
目标主机收到包之后丢弃掉,即不做响应代表这个端口是开放的,如果返回RST
数据包则表示这个端口是开放的;当然这和目标主机的安全配置有关,只是一般情况下是这样的
所以使用此参数进行端口扫描时要先确保目标IP
是活着的
sudo nmap 192.168.123.1 -sN
发送的TCP
包flag
位全设置为0,进行端口扫描
0x07-7 -sF 发送的 TCP 包 flag 位的 Fin 设置为1
目标主机收到包之后丢弃掉,即不做响应代表这个端口是开放的,如果返回RST
数据包则表示这个端口是开放的;当然这和目标主机的安全配置有关,只是一般情况下是这样的
所以使用此参数进行端口扫描时要先确保目标IP
是活着的
sudo nmap 192.168.123.1 -sF
发送的TCP
数据包flag
中Fin
设置为1
0x07-8 -sX 发送的 TCP 包 flag 位的 Urgent、Push、Fin 设置为1
目标主机收到包之后丢弃掉,即不做响应代表这个端口是开放的,如果返回RST
数据包则表示这个端口是开放的;当然这和目标主机的安全配置有关,只是一般情况下是这样的
所以使用此参数进行端口扫描时要先确保目标IP
是活着的
sudo nmap 192.168.123.1 -sX
发送的TCP
数据包flag
中Urgent
、Push
、Fin
设置为1
0x07-9 --scanflags <flags> 自定义 TCP Flags设置
sudo nmap 192.168.123.1 --scanflags syn,ack,fin
自定义发送的TCP
数据包flag
中syn
、ack
、Fin
设置为1
0x07-10 重头戏:-sI <zombie host[:probeport]> 僵尸扫描
参数:-sI <zombie host[:probeport]>
僵尸扫描
是非常非常隐蔽的扫描方式
原理
-
首先需要在被扫描的网络中找一台符合下面两个要求的计算机
-
非常非常空闲的计算机,空闲到没有和别的任何计算机进行通信(在一个大型的网络中这种空闲的机器还是比较好找的)
-
这台计算机的
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
因为UDP
是不建立连接的,没有办法像TCP
那样在建立连接的过程中就可以判断出端口是否开放,所以扫UDP
端口挺不靠谱的
扫UDP
端口一般需要建立基于UDP
以上的应用层连接,发送应用层报文才可以判断UDP
端口是否开放
sudo nmap 192.168.123.1 -sU
发送UDP
数据包,扫描UDP
端口
0x07-12 默认配置下端口扫描在做什么
如果目标主机和kali不在同一网段中
执行命令:sudo nmap 192.168.123.1,2 -p80,5000
一图胜千言
如果目标主机和kali在同一网段中
执行命令:sudo nmap 10.0.2.2,25 -p22,5000
一图胜千言
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
端口运行的是什么服务
0x09 -O 扫描系统版本
很多情况下没有办法100%判断出系统的具体版本,就会给出所有可能的结果
sudo nmap 10.0.2.25 -O
探测系统版本
0x0a 扫描速度控制
0x0a-1 -T<0-5> 设置扫描速度等级
0
最慢,5
最快,不过最快速度可能会更容易被发现
sudo nmap 10.0.2.25 -T3
限定扫描速度为等级3
0x0a-2 --scan-delay <time> 设置探测间隔时间
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
小时
0x0a-3 --min-rate 最小扫描速度
sudo nmap 10.0.2.25 --min-rate
最小扫描速度
0x0a-3 --max-rate 最大扫描速度
sudo nmap 10.0.2.25 --max-rate
最大扫描速度
0x0a-4 解决扫描被卡住的问题(大范围地址空间)
nmap
扫描大范围地址块时经常会被卡死在中间的一个IP
中。
绝大多数是由于目标系统的安全机制造成的,目标系统发现你在扫描时就估计将你的扫描请求挂在那不响应,让扫描进行不下去
sudo nmap 10.0.2.0/24 --host-timeout 10m
设置扫描超时时间为10分钟
,超过了设置的时间就会扫描下一个
0x0b 躲避安全检测
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字节一片)
0x0b-2 -D <decoy1,decoy2[,ME],...> 伪造多个源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
进行扫描
0x0b-3 -S <IP_Address> 伪造源IP
将源IP
进行伪造,使用此参数的话还需要别的方法判断伪造的源IP
是否接收到了回包
此参数需要搭配-e <iface>
指定网卡,-Pn
跳过主机发现这两个参数
sudo nmap 10.0.2.25 -S 10.0.2.11 -e eth0 -Pn
伪造源IP
为10.0.2.11
进行探测,并且指定了发包网卡为eth0
,跳过主机发现环节
0x0b-4 -g <portnum> 指定发包端口
sudo nmap 10.0.2.25 -g 3333
指定扫描数据包发送的端口为3333
0x0b-5 --proxies <url1,[url2],...> 挂上HTTP或SOCKS4代理进行扫描
sudo nmap 10.0.2.25 --proxies http://10.0.2.11:8080
使用HTTP
代理进行发包扫描
0x0b-6 --data <hex string> 在扫描包中数据段附加自定义的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
0x0b-7 --data-string <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
0x0b-8 --ip-options <options> 指定IP OPTION数据(暂时不知道咋用)
0x0b-9 --ttl <val> 指定发送扫描包的TTL值
sudo nmap 192.168.123.1 --ttl 25
指定发送扫描包的TTL值为25
0x0b-10 --spoof-mac <mac address/prefix/vendor name> 伪造扫描数据包中的MAC地址
可能会造成收不到回包的情况
sudo nmap 192.168.123.1 --spoof-mac AA:BB:CC:DD:EE:FF
伪造数据包中的MAC
地址AA:BB:CC:DD:EE:FF
0x0b-11 --badsum 使用错误的checksum
将IP
包头中的checksum
校验值故意写错,看看目标的安全检测机制会不会放弃这样的包,从而绕过安全机制
sudo nmap 192.168.123.1 --badsum
故意使用错误的checksu
0x0c 输出格式
0x0c-1 -oA <basename> 将扫描结果保存为三种根式日志
三种主要的根式日志,分别是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
格式喽
三种主要的根式日志,分别是xml
、nmap
、gnmap
sudo nmap 192.168.123.1 -oX a
将扫描结果保存为XML格式文件,文件名为a.xml
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
0x0c-4 -d 显示debug信息
sudo nmap 192.168.123.1 -d
显示debug
信息
0x0c-5 --reason 显示判断端口状态的依据
sudo nmap 10.0.2.25 --reason
在结果中显示判断端口状态的依据
0x07-6 --open 扫描结果中只显示开放的端口
sudo nmap 10.0.2.25 --open
只显示开放的端口
0x07-7 --packet-trace 显示 nmap 都发了或收了什么包
sudo nmap 10.0.2.25 --packet-trace
显示nmap
都发了和都收了什么包
0x07-8 --script-trace 只显示脚本都发了和都收了什么包
sudo nmap 10.0.2.25 --script-trace
只显示脚本都发了和都收了什么包
0x07-9 --iflist 显示系统中都有哪些网卡
sudo nmap --iflist
显示系统中都有哪些网卡
0x0d -6 开启 IPV6 扫描
sudo nmap fe80::a00:27ff:fe6a:30e3 -6
开启IPV6
扫描
0x0e NSE 脚本引擎(Nmap Scripting Engine)
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
类型的脚本,尽量对自己家的服务器温柔一点
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
端口进行扫描
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
参数值
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
漏洞
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 <target>
-- @usage nmap -p445 --script vuln <target>
--
-- @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
-- <table key="CVE-2017-0143">
-- <elem key="title">Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)</elem>
-- <elem key="state">VULNERABLE</elem>
-- <table key="ids">
-- <elem>CVE:CVE-2017-0143</elem>
-- </table>
-- <table key="description">
-- <elem>A critical remote code execution vulnerability exists in Microsoft SMBv1
 servers (ms17-010).
</elem>
-- </table>
-- <table key="dates">
-- <table key="disclosure">
-- <elem key="month">03</elem>
-- <elem key="year">2017</elem>
-- <elem key="day">14</elem>
-- </table>
-- </table>
-- <elem key="disclosure">2017-03-14</elem>
-- <table key="refs">
-- <elem>https://technet.microsoft.com/en-us/library/security/ms17-010.aspx</elem>
-- <elem>https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-0143</elem>
-- <elem>https://blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/</elem>
-- </table>
-- </table>
--
-- @args smb-vuln-ms17-010.sharename Share name to connect. Default: IPC$
---
-- 作者是谁
author = "Paulino Calderon <paulino()calderonpale.com>"
-- 这个脚本遵循的许可
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("<c4 B I4", 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
执行自己编写的脚本
0x0f -A 综合参数,相当于 -O、-sV、-sC、traceroute 参数结合体sudo nmap 10.0.2.25 -A
-A
综合参数,相当于-O
、-sV
、-sC
、traceroute
参数结合体
- 对应的视频链接:点击查看