Nse脚本编写基础
nmap nse脚本
Nmap Scripting Engine(NSE)是Nmap的脚本引擎,用Lua编写,可以扩展Nmap的功能。之前用nmap扫端口的时候发现有一些内置脚本挺好用的,比如http-title可以直接拿到网站标题,就想着自己写几个试试。
用法
-sC 全部脚本,运行default类别的脚本
--script 指定脚本,如 --script http-title
--script-args 指定脚本参数,如 --script-args 'user=admin,pass=123456'
--scripts-args-file 从文件读取脚本参数
--script-trace 调试开发,显示脚本执行过程中的输出
--script-updatedb 更新脚本数据库
类别
通过脚本中categories = {}来说明,有auth、broadcast、brute、default、discovery、dos、exploit、external、fuzzer、intrusive、malware、safe、version和vuln
常用的几个类别:
- auth:鉴别认证绕过相关
- brute:暴力破解
- discovery:信息收集
- safe:对目标影响较小的脚本
- intrusive:可能影响目标服务的脚本
- vuln:漏洞检测
参考链接:https://nmap.org/book/nse-usage.html
运行阶段
prerule:在扫描所有目标前进行
在目标主机上执行一些预扫描任务,以确定要应用的脚本集合。这些脚本可用于发现可利用的服务和漏洞,以及为后续扫描选择最佳的脚本。
postrule:在扫描所有目标后运行
在完成端口扫描和主机扫描之后,执行额外的任务,如输出结果的整理、报告生成、服务指纹识别、漏洞验证等。这些脚本可以在扫描结束后对收集到的数据进行进一步处理和分析。
hostrule:Nmap 对目标主机执行主机发现、端口扫描、版本检测和操作系统检测后,扫描过程中运行
对目标主机进行更全面的扫描,包括操作系统检测、探测已开放端口关联的服务和配置等。这些脚本可以提供更详细的主机信息,帮助进行目标环境的评估和漏洞分析。
portrule:扫描中扫到特定端口上面的服务的时候运行(service rule)如果主机的 Web 服务器在多个端口上运行,则这些脚本可能会运行多次(每个端口一个)
在端口级别对目标主机进行扫描,根据特定的脚本策略来选择要执行的脚本。这些脚本可以用于识别目标主机上开放的端口、服务版本信息和其他相关的网络特征。
脚本参数
可通过get_script_args获取命令行传入的参数或直接使用生成的lua table(nmap.registry.args)
命令:nmap localhost -p 7848 –script test.nse –script-args ‘user=admin’
local shortport = require "shortport"
local stdnse = require "stdnse"
author = "pbuff07"
license = "Same as Nmap--See https://nmap.org/book/man-legal.html"
-- 扫描指定端口会调用action
portrule = shortport.port_or_service(7848)
categories = {"discovery", "safe"}
local arg_path = stdnse.get_script_args("user") or "/"
-- 扫描主机过程中会调用action
hostrule = function()
return true
end
-- 扫描主机完成后会调用action
postrule = function()
return true
end
-- 扫描主机前进行预检查会调用action
prerule = function()
return true
end
action = function(host, port)
print(arg_path)
end
脚本格式
基本的nse脚本结构:
description = [[短描述]]
author = "pbuff07"
license = "Same as Nmap--See https://nmap.org/book/man-legal.html"
categories = {"discovery", "safe"}
local shortport = require "shortport"
local http = require "http"
local stdnse = require "stdnse"
portrule = shortport.http
action = function(host, port)
local response = http.get(host, port, "/")
if response.status == 200 then
return "Server is up!"
end
end
常用的几个库:
- shortport:端口匹配规则
- http:HTTP请求
- stdnse:标准函数库
- nmap:Nmap核心功能
- comm:数据通信
- json:JSON处理
之前写了个检测web标题的脚本:
local shortport = require "shortport"
local http = require "http"
local stdnse = require "stdnse"
description = [[获取网页标题]]
author = "pbuff07"
license = "Same as Nmap--See https://nmap.org/book/man-legal.html"
categories = {"discovery", "safe"}
portrule = shortport.http
action = function(host, port)
local response = http.get(host, port, "/")
if response.status ~= 200 then
return nil
end
local title = response.body:match("<title>(.-)</title>")
if title then
return "Title: " .. title
end
end
保存为 http-title.nse,使用:
nmap -p 80,443 --script http-title.nse target.com
不过这个脚本其实nmap自带的已经有了,写出来主要是为了熟悉一下nse的写法。后面又写了个检测某个特定banner的脚本,用来快速扫内网的一些服务。