NMAP脚本使用

0x01
在使用nmap时,通过在命令中加上—scritp就可以调用nmap的脚本来配合扫描。Nmap自带后已经安装了很多脚本,kali中的路径如下所示
NMAP脚本使用
脚本扩展分类包括:
auth 处理身份验证
broadcast 网络广播
brute 暴力猜解
default 默认
discovery 服务发现
dos 拒绝服务
exploit 漏洞利用
external 外部扩展
fuzzer 模糊测试
intrusive 扫描可能造成不良后果
malware 检测后门
safe 扫描危害较小
version 版本识别
vuln 漏洞检测
可以使用种类的名字调用该分类下的全部脚本,比如—scritp vuln,不过这比较费时间,在此就不演示了
我们来演示单个的,比如以自带的http-methods脚本为例
首先我们要知道脚本的用法,所以需要用到—script-help
如下所示—scritp-hep后面指定脚本名称即可
NMAP脚本使用
接下来使用该脚本
NMAP脚本使用
使用—script加载该脚本,在结果中会打印出支持的http方法
我们在脚本库中看到和http相关的脚本都是以http-的方式命名的,其他的也是一样,比如与ssh相关的都是以ssh-的方式命名
NMAP脚本使用
那么我们就可以使用通配符”*”来对目标机器检测时使用所有的与某种相关的脚本,比如使用所有与rpc相关的脚本
NMAP脚本使用

0x02
在使用脚本时,如果脚本支持,我们还可以通过—script-args传入参数,还是以http-method为例,我们知道一些网站会通过判断user-agent来判断请求是否合法,那nmap在请求时有没有带上自己的特征呢?
我们打开wireshark抓包,同时启动下面的命令看看
NMAP脚本使用
抓包如下

NMAP脚本使用
右键跟踪http流
NMAP脚本使用
可以看到在user-agent中有nmap的标志“nmap scripting engine”,如果目标站点根据这个标志拒绝nmap的请求时该怎么办呢?
此时我们就可以通过—script-args修改useragent
命令如下
NMAP脚本使用
抓包可以看到此时的useragent已经和我们在命令中传入的一样了

NMAP脚本使用
0x02
那么我们不仅限于使用,还想知道这其中的细节呢?我们可以使用—script-trace打印出所有收发的数据
NMAP脚本使用
使用—packet-trace查看所有发送和收到的数据包
NMAP脚本使用
也能使用-d进入调试模式,-d后面需要跟数字(1-9),数字越大,输出越详细
以-d3为例,如下图所示
NMAP脚本使用
这些脚本用起来很方便,难道你不想动手试一下吗?
在自己写之前,我们先以http-method这个脚本为例看看主体结构是什么样的
NMAP脚本使用
可以看到一个完整的NSE包括如下几个部分
description字段:这部分内容是介绍该脚本的功能
NMAP脚本使用
categories给出了该nse所在的分类
NMAP脚本使用
action字段,脚本具体的执行内容,当脚本通过rule字段的检查被触发执行时,就会调用action字段定义的函数
NMAP脚本使用
rule字段,描述脚本执行的规则,也就是确定脚本触发执行的条件,这个规则是一个lua函数,返回值只有true和false两种,只有返回true时,action中的函数才会执行
NMAP脚本使用
Nmap的扩展脚本语言都基于lua来开发的,执行也是调用了内部封装的lua解释器。正常情况下,调用任何一个扩展脚本会首先执行nse_main.lua,该脚本主要做了以下几件事:
加载一些Nmap的核心库(nselib文件夹中)
定义多线程函数
定义输出结果处理函数
读取、加载扩展脚本
定义扩展脚本函数接口
执行扩展脚本。。。
扩展脚本执行的规则在nse_main.lua中有定义:
NMAP脚本使用
prerule 在扫描任何主机之前,prerule函数运行一次
hostrule 在扫描一个主机后运行一次
portrule 在扫描一个主机的端口后运行一次
postrule 在全部扫描完毕以后运行一次
这个结论很好验证,写一个脚本就行了
NMAP脚本使用
测试如下
NMAP脚本使用
也就是说,prerule和postrule是在开始和结束运行,并且只运行一次,hostrule是扫描一个主机就运行一次,有N个主机就会运行N次,portrule是扫描到一个端口就运行一次,有N个端口就运行N次。
以http-method为例,只有一个portrule,就是先端口扫描,再运行。
了解了这些基础后,我们可以写一个简单的nse脚本测试
NMAP脚本使用
测试结果如图
NMAP脚本使用