Nse脚本编写基础

#nmap #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的脚本,用来快速扫内网的一些服务。