Nmap 扩展(三)

一、扩展脚本对象—主机

在进行主机扫描的时候会执行 hostrule 这个函数,从以往的 namp 扩展脚本代码中我们都可以发现在 hostrule 这个函数做了一些针对 host 操作的动作。

hostrule 有一个参数,变量名叫 host,我们可以把它理解为一个对象,在这里称之为对象是为了方便读者理解,在 lua 中实际它的数据类型是一个多维的 table(表),具有很多属性。由于这些 rule 函数都是被动调用的,只能在函数内部对形参进行操作了。

参考:https://nmap.org/book/nse-api.html

通过上面这个表格可以够清楚的了解到从host这个table中可以读取到哪些信息。

需求:使用Nmap扫描获得所有主机的MAC地址

由于Nmap没提供这个需求的解决方案,就需要我们自己来写一个扩展脚本

还是拿之前的test.nse来改一下:

local stdnse = require "stdnse"
prerule=function()
end
hostrule=function(host)
	mac = host.mac_addr
        print(stdnse.format_mac(mac))
end
portrule=function(host,port)
end
action=function()
end
postrule=function()
end

通过host.mac_addr获取的mac地址是二进制编码的,我们要转换成字符串,需要引入stdnse这个扩展包,stdnse包中有一个format_mac函数,能够将host.mac_addr转换成字符串。

执行效果如下:

 

00:0c:29:0f:09:c2

以上这些MAC地址就是当前内网中的所有主机了。 

二、扩展脚本对象—端口

端口相对于主机来说,属性较少,主要是针对端口状态、端口协议、端口服务、端口服务版本的一些描述。 

 

1. 完成一个需求

假设一个需求,解决这个需求:

需求:获取当前内网中开放HTTP服务的主机的MAC地址

首先可以分析一下这个需求: 

条件:开放了HTTP服务 开放了HTTP服务的主机一般都会开放80/443 目的:获取MAC地址 需要引入stdnse包,调用format_mac函数

从test.nse改起:

local stdnse = require "stdnse"
prerule=function()
end
hostrule=function(host)
end
portrule=function(host,port)
	if(port.number == 80 or port.number == 443)then
		print("[*]Host MAC -> " .. stdnse.format_mac(host.mac_addr))
	end
end
action=function()
end
postrule=function()
end

既然是针对服务/端口的需求,我们可以在portrule中进行编写,肯定有读者会产生疑问,nmap的-p参数就能指定端口,为何还要再portrule中判断。

是因为最终写的脚本可能不只是做这一件事,而是做多件事情,以不同的条件限定它去执行哪些代码。

扫描结果如下:

通过上面的扫描,获得了内网中开启HTTP服务的主机的MAC地址,虽然Nmap已经给出了,但是学习都是一步一步来的,后面还有更复杂的需求。

三、优化输出格式—表(table) 

在stdnse包中有一个函数叫output_table(),它能够返回一个table数据类型,通过操作这个table,将Key->Value的对应关系数据或列表数据放入,再return,就可以输出漂亮的格式。

就拿第一章中的test.nse来演示:

local stdnse = require "stdnse"
http_table = stdnse.output_table()
prerule=function()
end
hostrule=function(host)
end
portrule=function(host,port)
	if(port.number == 80 or port.number == 443)then
		http_table.http_host_mac = stdnse.format_mac(host.mac_addr)
		return true
	end
end
action=function()
	return http_table
end
postrule=function()
end

执行效果如下:

可见在portrule返回true的时候才会执行action函数,在脚本刚开始执行前,声明了一个http_table全局变量,当遇到端口80/443时,会把当前主机的MAC地址装入http_table,在action中返回。

对象结构图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值