- 浏览: 287817 次
文章分类
- 全部博客 (276)
- burp+hydra暴力破解 (1)
- kali linux工具集 (6)
- kali (59)
- linux (54)
- password (14)
- web (63)
- 渗透测试 (50)
- windows (40)
- metasploit (9)
- 信息收集 (32)
- burp suit (4)
- 安全审计 (9)
- https://github.com/secretsquirrel/the-backdoor-factory (0)
- nmap (4)
- arachni (2)
- 工具 (5)
- sql (3)
- 网络 (2)
- 后渗透测试 (10)
- 内网 (5)
- 无线 (2)
- C (3)
- bios (1)
- RoR (12)
- mongodb (1)
- linxu (1)
- gdb (1)
- linux,虚拟化 (1)
- python (4)
最新评论
原文地址:http://resources.infosecinstitute.com/nmap-scripting-example/
http://resources.infosecinstitute.com/nmap-scripting-engine-categories/
basic
dependencies:作为iyige包含脚本名字的数组来列举依赖关系,这些脚本需要在我们的脚本执行之前来执行。依赖关系仅仅是通过–script选项来强制脚本的执行顺序。
rule:用来确定脚本是否运行。每一个rule必须是返回true或false,如果rule是真,那么action将会被调用。一个脚本必须含有prerule, hostrule, portrule和postrule中的一个来确定action是否运行。prerule在主机扫描之前运行,hostrule和portrule在每一个扫描完成之后运行,而postrule在所有的扫描完成之后运行。postrule被用于做报告。例如
每一个脚本包含三个本地变量。SCRIPT_PATH指明脚本的路径,SCRIPT_NAME 指明脚本的名字,SCRIPT_TYPE 指明脚本的类型。
Nmap API
首先演示一个banner.nse的例子:
我们可以看到action函数接收两个参数,host和port。host传递的是我们要扫描的主机,而port参数则是要扫描的端口。然后我们可以在nse脚本中使用host和post object来请求我们需要的信息。
host object包含下列属性:
host.iphost.ip: 目标主机IP
host.name: 目标主机的反向DNS记录
host.targetname: nmap命令中声明的host名
host.directly_connected: 指明被扫描的主机和扫描的主机是否在同一内网
host.mac_addr: 目标主机的MAC地址(host.directly_connected为真时可用)
host.mac_addr_src: 我们自己的MAC地址
host.interface: 我们的网卡接口
host.interface_mtu: 我们网卡的最大传输单元
host.bin_ip: 目标的IP
host.bin_ip_src: 我们的IP
host.times: 包含关于目标主机的RTT, SRTT, RTTVAR 和timeout的信息。
port object包含如下成员:
port.number: 目标端口
port.protocol: 目标协议
port.service: 目标主机运行的协议
port.version: 目标主机上运行的服务的额外信息
port.state: 目标端口的状态: open, open|filtered, filtered, closed。
当写NSE脚本的时候,我们直接访问nsock,它是一个nmap socket lib。我们可以使用nsock lib来实现并行非阻塞操作,它提供有力的机制来运行同时运行多个脚本。当使用nsock lib的时候,我们可以实现下列情况:我们可以创建一个socket然后连接到一个指定的ip和端口。发送/接收数据,然后关闭端口。我们可以调用new_socket函数,然后一个socket object,含有下列方法:
send
receive
close
set_timeout
receive_bytes
receive_lines
receive_buf
在nsock中,我们可以创建由libpcap处理的原始套接字。
当脚本执行完成后,我们需要将结果打印在显示器上,因此我们需要组织一个包含特殊keys的表,被用于自动化格式,然后将数据打印在显示器上。当我们运行时,LUA自动的将字符串转换成通常我们可以看见的输出。每一个嵌套的表是一个新的层级。
还有一个叫registry的特殊表,它存有所有脚本都使用的变量。这是一个全局的存储位置,可以用来让所有脚本设置/获得变量的值,提供我们在不同脚本之间共享变量的能力。registry中的值只存储当前运行的nmap中的值。当写一个key到全局registry中,我们需要确保这个key是唯一的从而不会被其他脚本覆盖该值。当某一个脚本依赖其他脚本的输出时,我们必须在开始的时候声明依赖关系,来确保脚本的正确执行。
2. An Example
本本例子我们写一个脚本来parse一个服务器能处理的所有http方法。我们可以通过执行如下的请求,然后从服务器获得的响应来知道结果:
OPTIONS / HTTP/1.0
我们需要创建一个socket,将会连接到目标机器,80端口,然后发送由CRLF结尾的 “OPTIONS / HTTP/1.0″命令。服务器将会相应他支持的HTTP方法。例子如下:
我们使用telnet来连接到www.gentoo.org的80端口,然后执行“OPTIONS / HTTP/1.0″命令。请求被接受,然后响应支持的http方法GET, HEAD, POST and OPTIONS.
现在我们现在开始写NSE脚本,我们必须首先定义description, categories, dependencies, license和author。如下
description = [[
Attempts to find the HTTP methods available on the target HTTP server.
]]
author = "Dejan Lukan"
license = "GPL 2.0"
categories = {"default"}
脚本的rule来决定脚本是否将被执行。如果我们没有接收正确的host和port信息,我们可以退出脚本什么也不做。在rule函数中,我们坚持host和port来确定该指定端口是否开放。一个脚本必须包含下列中的一条来决定脚本是否运行:prerule, hostrule, portrule或者postrule。本例中,我们使用psotrule来决定端口是否开放,如下:
-- returns true if port is likely to be HTTP, false otherwise
portrule = shortport.http
当nmap认为端口使用http协议时,将会返回true。然后我们需要指定action,用来指定脚本的功能。如下:
local http = require "http"
local nmap = require "nmap"
local stdnse = require "stdnse"
local shortport = require "shortport"
local table = require "table"
description = [[
Attempts to find the HTTP methods available on the target HTTP server.
]]
author = "Dejan Lukan"
license = "GPL 2.0"
categories = {"default"}
-- returns true if port is likely to be HTTP, false otherwise
portrule = shortport.http
action = function(host, port)
local out = {}
-- make the "OPTIONS" request
response = http.generic_request(host, port, "OPTIONS", "/")
-- form the output
table.insert(out, string.format("Request : OPTIONS / HTTP/1.0"))
table.insert(out, string.format("Host : %s (%s)", host.ip, host.name))
table.insert(out, string.format("Port : %s", port.number))
table.insert(out, string.format("Allowed Methods : %s", response.header['allow']))
return stdnse.format_output(true, out)
end
当指定端口使用http协议时,脚本首先发送“OPTIONS” http方法到server上,然后它将会通过将结果插入table中来构建输出。然后使用stdnse.format_output来输出结果。
脚本输出如下:
我们可以看到nmap脚本只返回GET和HEAD方法,而telnet显示支持GET, HEAD, POST和OPTIONS。来检查一下原因,我们使用 –script-trace和-dd选项:
我们可以看到nmap使用 “OPTIONS / HTTP/1.1″命令而不是 “OPTIONS / HTTP/1.0″命令。看起来http.generic_request不支持http/1.0版本。但是不要担心,我们可以使用raw socket来发送请求。如下:
local http = require "http"
local nmap = require "nmap"
local stdnse = require "stdnse"
local shortport = require "shortport"
local table = require "table"
description = [[
Attempts to find the HTTP methods available on the target HTTP server.
]]
author = "Dejan Lukan"
license = "GPL 2.0"
categories = {"default"}
-- returns true if port is likely to be HTTP, false otherwise
portrule = shortport.http
action = function(host, port)
local out = {}
-- make the "OPTIONS / HTTP/1.0" request
local socket = nmap.new_socket()
socket:connect(host, port)
socket:send("OPTIONS / HTTP/1.0rnrn")
s,response = socket:receive()
socket:close()
-- form the output
table.insert(out, string.format("Request : OPTIONS / HTTP/1.0"))
table.insert(out, string.format("Host : %s (%s)", host.ip, host.name))
table.insert(out, string.format("Port : %s", port.number))
table.insert(out, string.match(response, "Allow: [^r]*rn"));
return stdnse.format_output(true, out)
end
执行脚本,显示结果如下:
nmap --script=/home/user/testing/http_options.nse www.gentoo.org -p 80
Starting Nmap 6.01 ( http://nmap.org ) at 2012-10-01 22:12 CEST
Nmap scan report for www.gentoo.org (89.16.167.134)
Host is up (0.052s latency).
PORT STATE SERVICE
80/tcp open http
| http_options2:
| Request : OPTIONS / HTTP/1.0
| Host : 89.16.167.134 (www.gentoo.org)
| Port : 80
|_ Allow: GET,HEAD,POST,OPTIONS
Nmap done: 1 IP address (1 host up) scanned in 0.30 seconds
http://resources.infosecinstitute.com/nmap-scripting-engine-categories/
basic
dependencies:作为iyige包含脚本名字的数组来列举依赖关系,这些脚本需要在我们的脚本执行之前来执行。依赖关系仅仅是通过–script选项来强制脚本的执行顺序。
rule:用来确定脚本是否运行。每一个rule必须是返回true或false,如果rule是真,那么action将会被调用。一个脚本必须含有prerule, hostrule, portrule和postrule中的一个来确定action是否运行。prerule在主机扫描之前运行,hostrule和portrule在每一个扫描完成之后运行,而postrule在所有的扫描完成之后运行。postrule被用于做报告。例如
--- -- Script is executed for any TCP port. portrule = function( host, port ) return port.protocol == "tcp" end
每一个脚本包含三个本地变量。SCRIPT_PATH指明脚本的路径,SCRIPT_NAME 指明脚本的名字,SCRIPT_TYPE 指明脚本的类型。
Nmap API
首先演示一个banner.nse的例子:
action = function( host, port ) local out = grab_banner(host, port) return output( out ) end
我们可以看到action函数接收两个参数,host和port。host传递的是我们要扫描的主机,而port参数则是要扫描的端口。然后我们可以在nse脚本中使用host和post object来请求我们需要的信息。
host object包含下列属性:
host.iphost.ip: 目标主机IP
host.name: 目标主机的反向DNS记录
host.targetname: nmap命令中声明的host名
host.directly_connected: 指明被扫描的主机和扫描的主机是否在同一内网
host.mac_addr: 目标主机的MAC地址(host.directly_connected为真时可用)
host.mac_addr_src: 我们自己的MAC地址
host.interface: 我们的网卡接口
host.interface_mtu: 我们网卡的最大传输单元
host.bin_ip: 目标的IP
host.bin_ip_src: 我们的IP
host.times: 包含关于目标主机的RTT, SRTT, RTTVAR 和timeout的信息。
port object包含如下成员:
port.number: 目标端口
port.protocol: 目标协议
port.service: 目标主机运行的协议
port.version: 目标主机上运行的服务的额外信息
port.state: 目标端口的状态: open, open|filtered, filtered, closed。
当写NSE脚本的时候,我们直接访问nsock,它是一个nmap socket lib。我们可以使用nsock lib来实现并行非阻塞操作,它提供有力的机制来运行同时运行多个脚本。当使用nsock lib的时候,我们可以实现下列情况:我们可以创建一个socket然后连接到一个指定的ip和端口。发送/接收数据,然后关闭端口。我们可以调用new_socket函数,然后一个socket object,含有下列方法:
send
receive
close
set_timeout
receive_bytes
receive_lines
receive_buf
在nsock中,我们可以创建由libpcap处理的原始套接字。
当脚本执行完成后,我们需要将结果打印在显示器上,因此我们需要组织一个包含特殊keys的表,被用于自动化格式,然后将数据打印在显示器上。当我们运行时,LUA自动的将字符串转换成通常我们可以看见的输出。每一个嵌套的表是一个新的层级。
还有一个叫registry的特殊表,它存有所有脚本都使用的变量。这是一个全局的存储位置,可以用来让所有脚本设置/获得变量的值,提供我们在不同脚本之间共享变量的能力。registry中的值只存储当前运行的nmap中的值。当写一个key到全局registry中,我们需要确保这个key是唯一的从而不会被其他脚本覆盖该值。当某一个脚本依赖其他脚本的输出时,我们必须在开始的时候声明依赖关系,来确保脚本的正确执行。
2. An Example
本本例子我们写一个脚本来parse一个服务器能处理的所有http方法。我们可以通过执行如下的请求,然后从服务器获得的响应来知道结果:
OPTIONS / HTTP/1.0
我们需要创建一个socket,将会连接到目标机器,80端口,然后发送由CRLF结尾的 “OPTIONS / HTTP/1.0″命令。服务器将会相应他支持的HTTP方法。例子如下:
# telnet www.gentoo.org 80 Trying 89.16.167.134... Connected to www.gentoo.org. Escape character is '^]'. OPTIONS / HTTP/1.0 HTTP/1.1 200 OK Date: Thu, 27 Sep 2012 21:11:04 GMT Server: Apache Allow: GET,HEAD,POST,OPTIONS Content-Length: 0 Connection: close Content-Type: text/html; charset=utf-8 Connection closed by foreign host.
我们使用telnet来连接到www.gentoo.org的80端口,然后执行“OPTIONS / HTTP/1.0″命令。请求被接受,然后响应支持的http方法GET, HEAD, POST and OPTIONS.
现在我们现在开始写NSE脚本,我们必须首先定义description, categories, dependencies, license和author。如下
description = [[
Attempts to find the HTTP methods available on the target HTTP server.
]]
author = "Dejan Lukan"
license = "GPL 2.0"
categories = {"default"}
脚本的rule来决定脚本是否将被执行。如果我们没有接收正确的host和port信息,我们可以退出脚本什么也不做。在rule函数中,我们坚持host和port来确定该指定端口是否开放。一个脚本必须包含下列中的一条来决定脚本是否运行:prerule, hostrule, portrule或者postrule。本例中,我们使用psotrule来决定端口是否开放,如下:
-- returns true if port is likely to be HTTP, false otherwise
portrule = shortport.http
当nmap认为端口使用http协议时,将会返回true。然后我们需要指定action,用来指定脚本的功能。如下:
local http = require "http"
local nmap = require "nmap"
local stdnse = require "stdnse"
local shortport = require "shortport"
local table = require "table"
description = [[
Attempts to find the HTTP methods available on the target HTTP server.
]]
author = "Dejan Lukan"
license = "GPL 2.0"
categories = {"default"}
-- returns true if port is likely to be HTTP, false otherwise
portrule = shortport.http
action = function(host, port)
local out = {}
-- make the "OPTIONS" request
response = http.generic_request(host, port, "OPTIONS", "/")
-- form the output
table.insert(out, string.format("Request : OPTIONS / HTTP/1.0"))
table.insert(out, string.format("Host : %s (%s)", host.ip, host.name))
table.insert(out, string.format("Port : %s", port.number))
table.insert(out, string.format("Allowed Methods : %s", response.header['allow']))
return stdnse.format_output(true, out)
end
当指定端口使用http协议时,脚本首先发送“OPTIONS” http方法到server上,然后它将会通过将结果插入table中来构建输出。然后使用stdnse.format_output来输出结果。
脚本输出如下:
nmap --script=/home/eleanor/testing/http_options.nse www.gentoo.org -p 80 Starting Nmap 6.01 ( http://nmap.org ) at 2012-10-01 22:05 CEST Nmap scan report for www.gentoo.org (89.16.167.134) Host is up (0.051s latency). PORT STATE SERVICE 80/tcp open http | http_options: | Request : OPTIONS / HTTP/1.0 | Host : 89.16.167.134 (www.gentoo.org) | Port : 80 |_ Allowed Methods : GET,HEAD Nmap done: 1 IP address (1 host up) scanned in 0.31 seconds
我们可以看到nmap脚本只返回GET和HEAD方法,而telnet显示支持GET, HEAD, POST和OPTIONS。来检查一下原因,我们使用 –script-trace和-dd选项:
NSE: TCP 192.168.1.2:57257 > 89.16.167.134:80 | CONNECT NSE: TCP 192.168.1.2:57257 > 89.16.167.134:80 | 00000000: 4f 50 54 49 4f 4e 53 20 2f 20 48 54 54 50 2f 31 OPTIONS / HTTP/1 00000010: 2e 31 0d 0a 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 .1 Connection: 00000020: 63 6c 6f 73 65 0d 0a 55 73 65 72 2d 41 67 65 6e close User-Agen 00000030: 74 3a 20 4d 6f 7a 69 6c 6c 61 2f 35 2e 30 20 28 t: Mozilla/5.0 ( 00000040: 63 6f 6d 70 61 74 69 62 6c 65 3b 20 4e 6d 61 70 compatible; Nmap 00000050: 20 53 63 72 69 70 74 69 6e 67 20 45 6e 67 69 6e Scripting Engin 00000060: 65 3b 20 68 74 74 70 3a 2f 2f 6e 6d 61 70 2e 6f e; http://nmap.o 00000070: 72 67 2f 62 6f 6f 6b 2f 6e 73 65 2e 68 74 6d 6c rg/book/nse.html 00000080: 29 0d 0a 48 6f 73 74 3a 20 77 77 77 2e 67 65 6e ) Host: www.gen 00000090: 74 6f 6f 2e 6f 72 67 0d 0a 0d 0a too.org
我们可以看到nmap使用 “OPTIONS / HTTP/1.1″命令而不是 “OPTIONS / HTTP/1.0″命令。看起来http.generic_request不支持http/1.0版本。但是不要担心,我们可以使用raw socket来发送请求。如下:
local http = require "http"
local nmap = require "nmap"
local stdnse = require "stdnse"
local shortport = require "shortport"
local table = require "table"
description = [[
Attempts to find the HTTP methods available on the target HTTP server.
]]
author = "Dejan Lukan"
license = "GPL 2.0"
categories = {"default"}
-- returns true if port is likely to be HTTP, false otherwise
portrule = shortport.http
action = function(host, port)
local out = {}
-- make the "OPTIONS / HTTP/1.0" request
local socket = nmap.new_socket()
socket:connect(host, port)
socket:send("OPTIONS / HTTP/1.0rnrn")
s,response = socket:receive()
socket:close()
-- form the output
table.insert(out, string.format("Request : OPTIONS / HTTP/1.0"))
table.insert(out, string.format("Host : %s (%s)", host.ip, host.name))
table.insert(out, string.format("Port : %s", port.number))
table.insert(out, string.match(response, "Allow: [^r]*rn"));
return stdnse.format_output(true, out)
end
执行脚本,显示结果如下:
nmap --script=/home/user/testing/http_options.nse www.gentoo.org -p 80
Starting Nmap 6.01 ( http://nmap.org ) at 2012-10-01 22:12 CEST
Nmap scan report for www.gentoo.org (89.16.167.134)
Host is up (0.052s latency).
PORT STATE SERVICE
80/tcp open http
| http_options2:
| Request : OPTIONS / HTTP/1.0
| Host : 89.16.167.134 (www.gentoo.org)
| Port : 80
|_ Allow: GET,HEAD,POST,OPTIONS
Nmap done: 1 IP address (1 host up) scanned in 0.30 seconds
相关推荐
nmap漏扫的全部600+脚本,"acarsd-info.nse", "address-info.nse", "afp-brute.nse", "afp-ls.nse", "afp-path-vuln.nse", "afp-serverinfo.nse", "afp-showmount.nse", "ajp-auth.nse", "ajp-brute.nse", "ajp-...
最初的想法是为从事Nmap脚本开发的信息安全社区提供一个更简单的开发界面。 该项目最初是为个人使用而开发的,后来与社区一起发布了开源版本,希望能够帮助志趣相投的nmap脚本开发人员。特征IDE当然只是普通的文本...
### 一、Nmap脚本调试 当使用自编脚本时遇到错误,Nmap提供了一个调试选项`-debug`来帮助我们定位问题。例如,运行命令`nmap -sV --script=demo -d 127.0.0.1`会显示详细的报错信息,这对于理解脚本执行过程和找出...
CVE-2021-21975 Nmap脚本检查漏洞CVE-2021-21975 漏洞参考: 博客 例子 nmap -p443 --script cve-2021-21975.nse --script-args vulns.showall IP
Nmap脚本扫描Winnti感染 此Nmap脚本可用于扫描主机以检查Winnti感染。 它使用Winnti协议的部分内容(如2016/2017年的野外观察)来检查感染并收集其他信息。 温蒂 Winnti是一些APT组使用的恶意软件。 至少从2013年...
其中,nmap脚本引擎(NSE)是一个可扩展的框架,允许开发者编写自定义脚本来增强nmap的功能。`Python-NSEInfo` 是一个基于Python的命令行工具,旨在帮助用户更方便地管理和利用nmap的NSE脚本进行交互式搜索。 **1. ...
清单一个Nmap脚本,用于生成与各种工具一起使用的目标列表。安装为了使脚本默认作为所有脚本扫描( -sC )的一部分运行,它将需要与nlist.conf文件一起保存在Nmap数据目录的scripts子目录中。 一个.nlist放置在用户...
是nnposter的Nmap脚本http-default-accounts的备用指纹数据集。 概要 $ nmap --script http-default-accounts -p 80 192.168.1.1 ... PORT STATE SERVICE 80/tcp open http | http-default-accounts: | [Cacti] at ...
针对S7工控协议的nmap扫描脚本,使用该脚本可以获得基于S7协议的组件的详细信息
5. **脚本扫描**:`nmap -sC` 使用内置的NMap脚本库进行高级检测。 以上是NMap的一些基础使用技巧,通过灵活组合这些参数,可以实现各种复杂的网络扫描任务,有效地进行网络安全管理和维护。在实际使用中,应根据...
5. 使用脚本扫描:nmap的脚本扫描(`-sC`或`--script`)功能可以运行预定义的Nmap脚本库,用于检测漏洞和收集更多信息。 四、nmap安全应用 1. 网络审计:定期对内部网络进行扫描,发现未授权的服务和潜在的安全...
nmap还有许多高级功能,例如脚本扫描(`-sC`或`--scripts`),通过内置的Nmap脚本语言(NSEL)执行各种自动化任务;操作系统指纹识别(`-O`)尝试识别目标系统的具体类型;以及使用防火墙规则探测(`-F`)等。 **8....
Nmap 的功能还可以通过结合 Nmap 脚本引擎(通常缩写为 NSE)进一步被扩展。这个脚本引擎允许管理员快速创建可用于确定其网络上是否存在新发现的漏洞的脚本。 使用 Nmap 的注意事项 使用 Nmap 的人既可能是善意的...
参考:有爆破,历史漏洞验证,版本探测,端口扫描,特定服务的扫描等其实讲道理,目前个人只用了script-vuln 这个脚本,其他的脚本用专门的工具可能效果要更好
用于检查漏洞CVE-2021-21972的Nmap脚本-vCenter Server RCE 漏洞参考: 例子 nmap -p443 --script cve-2021-21972.nse --script-args vulns.showall IP 学分 建立在Alex Hernandez aka 开发的脚本 :
"nmap-scripts"是Nmap官方维护的脚本库,包含了一系列预编写的NSE脚本,用于执行各种网络安全任务。 标题中的"nmap-scripts:Nmap NSE脚本的集合"指出,这个压缩包包含的是Nmap NSE脚本的完整集合。这些脚本旨在...
Nmap脚本引擎(Nmap Scripting Engine, NSE)是其一大特色,允许用户编写和分享自定义的脚本来扩展Nmap的功能。这些脚本覆盖了各种网络审计任务,如漏洞检测、认证破解、信息收集等。 ### 四、Nmap在安全审计中的...
此外,Nmap脚本引擎(NSE)支持用户编写和执行自定义脚本,进行更复杂的功能扩展,如HTTP头部检查、FTP匿名访问测试等。 **6. 应用场景** Nmap适用于多种场景,包括但不限于: - 网络映射:了解网络中的设备和...
Dracnmap:Dracnmap是一个开源程序,用于利用网络并在nmap帮助下收集信息。 Nmap命令带有许多选项,这些选项可以使... 因此,Dracnmap设计为使用nmap脚本引擎执行快速扫描,而nmap可以使用高级命令执行各种自动扫描技术