Nmap源码分析(脚本引擎)
2012年9月6日
Nmap提供了强大的脚本引擎(NSE),以支持通过Lua编程来扩展Nmap的功能。目前脚本库已经包含300多个常用的Lua脚本,辅助完成Nmap的主机发现、端口扫描、服务侦测、操作系统侦测四个基本功能,并补充了其他扫描能力:如执行HTTP服务详细的探测、暴力破解简单密码、检查常见的漏洞信息等等。如果用户需要对特定的应用做更深入的探究,可以按照NSE脚本格式编写Lua脚本来增强Nmap的扫描能力。
1 简单引入
1.1 实现原理
NSE(Nmap Scripting Engine)是Nmap最为强大、最为灵活的功能之一。
NSE主要分为两大部分:内嵌Lua解释器与NSE library。
解释器:Nmap采用嵌入的Lua解释器来支持Lua脚本语言。Lua语言小巧简单而且扩展灵活,能够很好地与Nmap自身的C/C++语言融合。
NSE library:为Lua脚本与Nmap提供了连接,负责完成基本初始化及提供脚本调度、并发执行、IO框架及异常处理,并且提供了默认的实用的脚本程序。
1.2 脚本分类
NSE中提供的Lua脚本分为不同的类别(Category),目前的类别如下:
- auth 负责处理鉴权证书(绕开鉴权)的脚本
- broadcast 在局域网内探查更多服务开启状况,如dhcp/dns/sqlserver等服务。
- brute 提供暴力破解方式,针对常见的应用如http/snmp等
- default 这是使用-sC或-A选项扫描时候默认的脚本,提供基本脚本扫描能力
- discovery 对网络进行更多的信息,如SMB枚举、SNMP查询等
- dos 用于进行拒绝服务攻击(denial of service)
- exploit 利用已知的漏洞入侵系统
- external 利用第三方的数据库或资源,例如进行whois解析
- fuzzer 模糊测试的脚本,发送异常的包到目标机,探测出潜在漏洞
- intrusive 入侵性的脚本,此类脚本可能引发对方的IDS/IPS的记录或屏蔽
- malware 探测目标机是否感染了病毒、开启了后门等信息
- safe 此类与intrusive相反,属于安全性脚本
- version 负责增强服务与版本扫描(Version Detection)功能的脚本。
- vuln 负责检查目标机是否有常见的漏洞(Vulnerability),如是否有MS08_067。
1.3 命令行选项
Nmap提供的命令行参数如下:
-sC: 等价于--script=default,使用默认类别的脚本进行扫描。
--script=<Lua scripts>: <Lua scripts>使用某个或某类脚本进行扫描,支持通配符描述
--script-args=<n1=v1,[n2=v2,...]>: 为脚本提供默认参数
--script-args-file=filename: 使用文件来为脚本提供参数
--script-trace: 显示脚本执行过程中发送与接收的数据
--script-updatedb: 更新脚本数据库
--script-help=<Lua scripts>: 显示脚本的帮助信息,其中<Lua scripts>部分可以逗号分隔的文件或脚本类别。
2 实现框架
2.1 文件组织
Nmap脚本引擎所需要的的文件:
- nse_main.cc/nse_main.h/nse_main.lua,这是核心流程文件,负责脚本的初始化与调度执行。
- nmap/nse_*文件,nmap源码目录下以nse开头的文件