29 lines
2.6 KiB
Markdown
29 lines
2.6 KiB
Markdown
### NSE 脚本原理
|
||
|
||
**1. NSE 脚本的运行机制**
|
||
|
||
NSE 的核心是一个脚本解释器,它运行用 **Lua 语言**编写的脚本。Nmap 会在扫描过程中加载并执行这些脚本,以扩展其核心功能。整个运行机制可以概括为以下几个步骤:
|
||
|
||
1. **脚本加载**:Nmap 在启动时,会根据你的命令行参数(如 `-sC` 或 `--script <脚本名>`),加载相应的 NSE 脚本。这些脚本文件通常位于 Nmap 的安装目录下的 `scripts` 文件夹中
|
||
2. **事件触发**:NSE 脚本不会无缘无故地运行。它依赖于一系列的**事件触发器(Triggers)**,这些触发器会在 Nmap 的不同扫描阶段被激活
|
||
- `pre-scan`:在任何主机扫描开始之前运行。通常用于一些全局性任务,如收集 DNS 信息
|
||
- `host-scan`:在扫描每个主机时运行。通常用于对单个主机进行枚举或漏洞检测
|
||
- `port-scan`:在扫描每个端口时运行。这是最常用的触发器,用于针对特定端口的服务进行探测,如 HTTP、FTP、SSH 等
|
||
- `post-scan`:在所有主机扫描完成后运行。通常用于汇总结果或生成报告
|
||
3. **脚本执行**:当一个事件被触发时,Nmap 会调用相应脚本中的**`action()` 函数**。这个函数包含了脚本要执行的核心逻辑
|
||
4. **结果返回**:`action()` 函数执行完毕后,会将结果返回给 Nmap。Nmap 会将这些结果以标准的格式(如 XML、文本等)显示给用户
|
||
|
||
|
||
|
||
**2. 编写 NSE 脚本的核心结构**
|
||
|
||
一个典型的 NSE 脚本由以下几个关键部分组成:
|
||
|
||
1. **脚本描述(`description`)**:一个简短的字符串,描述脚本的功能
|
||
2. **分类(`categories`)**:脚本的分类,如 `safe`(安全)、`vuln`(漏洞)、`auth`(认证)等。这些分类使得用户可以通过 `-sC` 或 `--script=safe` 等参数来批量运行某一类脚本
|
||
3. **依赖关系(`dependencies`)**:如果脚本依赖于其他脚本,可以在这里声明
|
||
4. **触发器(`hostrule`、`portrule` 等)**:指定脚本在什么条件下运行。例如,`portrule` 规定了脚本只在发现某个特定端口开放时才运行
|
||
- `portrule = "tcp or udp"`:在所有 TCP 或 UDP 端口上运行
|
||
- `portrule = "port:80"`:只在 80 端口上运行
|
||
- `hostrule`:在整个主机上运行,不依赖于特定端口
|
||
5. **主函数(`action()`)**:这是脚本的核心代码,包含了所有业务逻辑。在这个函数中,你可以使用 Nmap 提供的各种库函数(如 `http.get`、`nmap.set_port_state` 等),来完成网络交互和数据处理 |