Nmap插件编写之MySQL写库

大数据

作者:010sec

0×01 Nmap介绍

Nmap是一款针对大型网络的端口扫描工具,尽管它也适用于单机扫描。在不同情况下,你可能需要隐藏扫描、越过防火墙扫描或者使用不同的协议进行扫描,比如:UDP、TCP、ICMP 等。它支持:Vanilla TCP connect 扫描、TCP SYN(半开式)扫描、TCP FIN、Xmas、或NULL(隐藏)扫描、TCP ftp代理(跳板)扫描、SYN/FIN IP 碎片扫描(穿越部分数据包过滤器)、TCP ACK和窗口扫描、UDP监听ICMP端口无法送达扫描、ICMP扫描(狂ping)、TCP Ping扫描、直接RPC扫描(无端口映射)、TCP/IP指纹识别远程操作系统,以及相反身份认证扫描等。Namp同时支持性能和可靠性统计,例如:动态延时计算,数据包超时和转发,并行端口扫描,通过并行ping侦测下层主机。

Nmap的插件也极其强大,目前大部分的人都在使用python,perl等语言调用Nmap,然后等待扫面完毕在读取结果进而下一步操作,不过如果我们使用Nmap的插件进行整改,可以急速优化我们的扫描器。

0×02 NSE脚本介绍

Nse脚本需要根据Nmap的脚本规范编写,包含author, description,license,categories,rule,action等字段,其中author,license,license,categories都是描述内容,而重点则是rule和action。在Nmap规范中,根据脚本的运行阶段不同分为了四类rule,prerule、hostrule、portrule和postrule,另外必须包含一个action字段。
我们模拟测试下四种rule之间的区别,编写如下代码。

-- four-rule-to-show.nse
-- 导入nmap依赖包
local nmap= require "nmap"
-- 描述
description = [[ 
	this is test script 
]]
-- 作者
author = "010sec"
-- license
license = "Same as Nmap -- See https://namp.org/book/man-legal.html"
-- 分类
categories = {"default","discovery","safe"}


-- 对4种类型进行使用
prerule = function () return true end
hostrule = function() return true end
portrule = function() return true end
postrule = function () return true end


--  启动于Nmap扫描之前,并在扫描之前结束
function preaction()
	print("this is a preaction test")
	local pre1action="preaction test"
	return pre1action
end

-- 启动于prerule之后,Nmap扫描之前,并在扫描之后结束。
function hostaction()
	print("this is a hostaction test")
	local host1action="hostaction test"
	return host1action
end

-- 在Nmap执行端口扫描或版本侦测时触发,在下一个端口或者版本探测之前结束
function portaction()
	print("this is a portaction test")
	local port1action="portaction test"
	return port1action
end

-- Nmap执行完毕所有扫描后,归纳总结
function postaction()
	print("this is a postaction test")
	local post1action="postaction test"
	return post1action	
end


-- 定义4重脚本函数类型,通过ActionsTable作为action
local ActionsTable = {
	prerule  = preaction,
	hostrule = hostaction,
	portrule = portaction,
	postrule = postaction
}

-- execute the action function corresponding to the current rule
action = function(...) return ActionsTable[SCRIPT_TYPE](...) end

执行结果如下:

大数据

由上图可以知晓:

– prerule,在Nmap扫描之前触发脚本执行,Nmap扫描之前结束,该类脚本作为初始化脚本。

– hostrule,在Nmap执行主机发现完毕时触发脚本执行,Nmap扫描结束,在postrule前结束,通过主机发现的结果来触发该类脚本,该类脚本可以作为探测脚本。

– portrule,在Nmap执行端口扫描或版本侦测时触发,在下一个端口或者版本探测之前结束,该类脚本可以作为探测脚本。

– postrule,在Nmap执行完毕所有扫描后,通常用于扫描结果的数据提取和整理,该类型脚本用于归纳总结。

另外,Nmap针对于nse脚本提供了API,具体可以参考 官网

https://nmap.org/book/nse-api.htm

0×03 环境安装

由于nse脚本是基于lua的语法,所以我们还需要安装lua环境和mysql环境,这里我才用的是一个centos7。

安装nmap

yum install https://nmap.org/dist/nmap-7.60-1.x86_64.rpm

安装依赖环境

yum install readline-devel  gcc gcc-c++ git -y

安装lua下载lua安装包

curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz

解压lua

tar zxf lua-5.3.0.tar.gz

编译安装

cd lua-5.3.0 && make linux test && make install

下载mysql源

rpm -ivh  http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm

安装mysql

yum install mysql-community-server mysql-devel -y

启动mysql

service mysqld start

修改数据库密码

mysqladmin  -uroot password "123456"

创建test数据库和nmap数据库

echo "create database IF NOT EXISTS nmap default charset utf8 COLLATE utf8_general_ci;" | mysql -uroot -p123456
echo "create database IF NOT EXISTS nmap default charset utf8 COLLATE utf8_general_ci;" | mysql -uroot -p123456

0×04 插件编写

首先咱们需要熟悉下lua结合mysql编写,以下是一个mysql-test.lua脚本内容

--  导入MySQL
mysql = require "luasql.mysql"
-- 启动mysql和建立连接test数据库
local env  = mysql.mysql()
local conn = env:connect('test','root','123456')
-- 创建数据库,通过这里可以返回两点,如果status为nil,则查看报错信息
-- 语句也可以是这样 status,errorString = conn:execute("CREATE TABLE user (id INTEGER, name varchar(20),pass varchar(32))")
status,errorString = conn:execute([[CREATE TABLE IF NOT EXISTS user (id INTEGER, name varchar(20),pass varchar(32))]])
if status ~= nil then
  print(status,errorString )
end
-- 写入数据库,通过这里可以返回两点,如果status为nil,则查看报错信息
-- 方法1 使用[[]]
status,errorString = conn:execute([[INSERT INTO user values(1,'admin','123456')]])
if status ~= nil then
  print(status,errorString )
end
-- 方法2 使用引号
status,errorString = conn:execute("INSERT INTO user values(2,'apple','88888')")
if status ~= nil then
  print(status,errorString )
end
-- 方法3 引号+变量
status,errorString = conn:execute(string.format("INSERT INTO user values(%d,'%s','%s')",3,"banana","10.00"))
if status ~= nil then
  print(status,errorString )
end
-- 更新某条数据[也可以使用双引号]
status,errorString = conn:execute([[UPDATE user SET name='mango',pass="30.00" where id ='3']])
if status ~= nil then
  print(status,errorString )
end
-- 删除某条数据[也可以使用双引号]
status,errorString = conn:execute([[DELETE from user where id ='3']])
if status ~= nil then
  print(status,errorString )
end
-- 查询数据库,通过这里可以返回两点,如果status为nil,则查看报错信息
-- 语句也可以是这样 status,errorString = conn:execute("select * from user")
cursor,errorString = conn:execute([[select * from user]])
print(cursor,errorString)
-- 通过游标循环读取
row = cursor:fetch ({}, "a")
while row do
  print(string.format("Id: %d, Name: %s, Pass: %s", row.id, row.name,row.pass))
  row = cursor:fetch (row, "a")
end
-- 关闭游标
cursor:close()
-- 关闭数据库连接和mysql环境
conn:close()
env:close()

上述讲的是对于Lua调用MySQL的使用,现在我们开始编写nse脚本。首先,我们没有建立表,需要准备和数据库,然后我们需要一个实时读写,那么就是对每次读取端口或者版本检测是,进行写数据操作,最后,我们需要进行关闭数据库的操作,所以这里我们需要使用prerule,portrule,postrule,结合mysql的操作

-- 调入初始化模块
local luasql = require "luasql.mysql"
local nmap = require "nmap"
description = [[
This script stores the following nmap output into a mysql database: Hostname, IP, port number, protocol (tcp/udp), service and version
]]
---
-- you must have database
--
-- mysql -uroot -p123456 -e "CREATE DATABASE IF NOT EXISTS NmapScan default character set utf8 COLLATE utf8_general_ci";
--
-- @usage
-- nmap --script mysql-output <target>
--
-- @example
-- $ nmap -sS -A -F --script mysql-output  127.0.0.1
-- $ mysql -uroot -p123456 -e "select * from NmapScan.scanData";
--
-- +-----------+-----------+------+----------+-------+---------+---------------+
-- | hostname  | ip        | port | protocol | state | service | version       |
-- +-----------+-----------+------+----------+-------+---------+---------------+
-- | localhost | 127.0.0.1 |   22 | tcp      | open  | ssh     | OpenSSH6.6.1  |
-- | localhost | 127.0.0.1 |   25 | tcp      | open  | smtp    | Postfix smtpd |
-- | localhost | 127.0.0.1 | 3306 | tcp      | open  | mysql   | MySQL5.6.37   |
-- | localhost | 127.0.0.1 |   80 | tcp      | open  | http    | nginx1.10.2   |
-- +-----------+-----------+------+----------+-------+---------+---------------+
--
--
---  
author = "010sec"
license = "Same as Nmap--See http://nmap.org/book/man-legal.html"
categories = {"external", "safe"}
prerule = function () return true end
portrule = function () return true end
postrule = function () return true end
--
-- 调用MySQL
--
local env = luasql.mysql()
local conn = env:connect("NmapScan","root","123456")
conn:execute"SET NAMES UTF8"
local cur,sql
--
-- 在执行之前检测如果表不存在则创建
--
function preaction()
  local cur = conn:execute("CREATE TABLE IF NOT EXISTS scanData (hostname varchar(100), ip varchar(16), port integer(5), protocol varchar(3), state varchar(20), service varchar(100), version varchar(100))")
  if (cur~=nil) then
      print("Create tables success")
  else
   print("Crteat tables error")
  end 
end
--
-- 将端口信息存入数据库
--
function portaction (host, port)
    local version = ""
    if (port.version.product~=nil) then
        version = port.version.product
    end
    if (port.version.version~=nil) then
        version = version .. port.version.version
    end
    sql = string.format("INSERT INTO scanData VALUES ('%s', '%s', %d, '%s', '%s', '%s', '%s')" ,  conn:escape(host.name), conn:escape(host.ip), port.number, conn:escape(port.protocol), conn:escape(port.state), conn:escape(port.service), conn:escape(version))
    cur = conn:execute(sql)
    if (cur~=nil) then
        print("Insert success")
    else
        print("Insert  error")
    end 
end
--
-- 关闭MySQL环境
--
function postaction ()
    conn:close()
    env:close()
end
local ActionsTable = {
    prerule  = preaction,
    portrule = portaction,
    postrule = postaction
}
-- execute the action function corresponding to the current rule
action = function(...) return ActionsTable[SCRIPT_TYPE](...) end

运行我们的脚本,

nmap -sS -A -F --script mysql-output  127.0.0.1

查看数据库,结果如下:

大数据

0×04 扩展思路

Lua是一门小巧的语言,在我的记忆力,最开始知晓他的,应该是neuss,到后续的游戏开发,再后面就是春哥的OpenResty,还有就是今年倾悬等人写的Nmap脚本编写,具体的思路上大同小异,感谢一切给我们思路的demo。关于上述Nmap脚本,有一个木有解决,就是我调用一个脚本,那么是否可以获取他的返回值,看了一遍nse_mian.lua和nse的580个脚本,木有获得太大的帮助,返回值好像是直接交给Nmap,然后进行优化输出。

0×05 相关资料

http://www.cnblogs.com/liun1994/p/7041373.htm
lhttp://blog.csdn.net/xumesang/article/details/51859344

https://zhuanlan.zhihu.com/p/27224457


https://github.com/Z-0ne/ScanS2-045-Nmap/blob/master/struts2-scan.nse

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

End.

转载请注明来自36大数据(36dsj.com):36大数据 » Nmap插件编写之MySQL写库

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值