nmap之nse脚本简单学习

news2024/12/25 9:12:41

nmap之nse脚本简单学习

环境:centos8

nmap安装

yum -y install nmap

-- 版本
[root@qingchen /]# nmap -version
Nmap version 7.70 ( https://nmap.org )

脚本入门学习

cd /usr/share/nmap

[root@qingchen nmap]# ls
nmap.dtd  nmap-mac-prefixes  nmap-os-db  nmap-payloads  nmap-protocols  nmap-rpc  nmap-service-probes  nmap-services  nmap.xsl  nselib  nse_main.lua  scripts

-- nselib scripts是脚本库和脚本都是lua语言编写的

cd /usr/share/nmap/scripts

nmap的脚本存放路径,自己写的脚本放进去就可以使用了,脚本语言是 lua

lua学习参考菜鸟或者https://blog.csdn.net/qq_40893942/article/details/127986572

NSE脚本基本格式

一个完整的NSE脚本通常都有这么几个部分的代码字段:

  • description 字段:本脚本的说明介绍。

  • categories 字段:本脚本的分类。Nmap执行脚本除了指定单个脚本外,还可以指定某一类脚本,比如default类,我们没有使用–script参数时,默认会加载这一类的脚本。

  • rule 字段:本脚本的执行规则,也即触发脚本执行的条件会在rule字段定义。一般执行规则是一个lua函数,返回值只有true和false两种。

  • action字段:脚本执行的具体内容。rule字段返回true时会执行action字段定义的函数。

local shortport = require "shortport"
description = [[demo]]
author = "qingchen"
license = "Same as Nmap--See http://nmap.org/book/man-legal.html"
categories = {"default"}

portrule = function( host, port )
   return true
end

action = function(host, port)

end

Demo中rule字段是portrule,NSE脚本的执行规则是和nmap的扫描相结合的,两者执行的先后顺序目前有如下4种。

  1. prerule():规则早于nmap的扫描,执行的顺序是先执行脚本,后nmap扫描。
  2. hostrule():nmap完成了主机发现之后运行脚本。
  3. portrule():nmap执行了端口扫描后运行脚本。
  4. postrule():nmap完成所有的扫描后才执行脚本。

编写脚本

在前面脚本demo代码的基础上,只需修改portrule函数的代码和让action函数来输出。

栗子:

编写文件名为qingchen-simple-test.nse的脚本放在/usr/share/nmap/scripts,判断80端口是不是tcp协议。内容如下:

-- 引用shortport脚本库
local shortport = require "shortport"
-- 描述
description = [[qingchen port simple test]]
-- 作者
author = "qingchen"
-- license
license = "Same as Nmap--See http://nmap.org/book/man-legal.html"
-- 类别
categories = {"default"}

portrule = function(host,port)
    return port.protocol == "tcp" and port.number == 80
end

action = function(host, port)
print(host.ip)
return "qingchen-script-test"
end

nmap --script-updatedb命令用来更新脚本库(貌似不更新也是可以直接在scripts文件夹下识别到自定义脚本的)

nmap -p 80 127.0.0.1 --script qingchen-simple-test.nse 运行脚本

[root@qingchen scripts]# vim qingchen-simple-test.nse 
[root@qingchen scripts]# nmap --script-updatedb
[root@qingchen scripts]# nmap -p 80 127.0.0.1 --script qingchen-simple-test.nse 
Starting Nmap 7.70 ( https://nmap.org ) at 2022-11-24 13:41 CST
127.0.0.1
Nmap scan report for VM-4-3-centos (127.0.0.1)
Host is up (0.000052s latency).

PORT   STATE SERVICE
80/tcp open  http
|_qingchen-simple-test: qingchen-script-test

Nmap done: 1 IP address (1 host up) scanned in 0.45

-- 换8080试试

[root@qingchen scripts]# nmap -p 8080 127.0.0.1 --script qingchen-simple-test.nse 
Starting Nmap 7.70 ( https://nmap.org ) at 2022-11-24 13:44 CST
Nmap scan report for VM-4-3-centos (127.0.0.1)
Host is up (0.000046s latency).

PORT     STATE  SERVICE
8080/tcp closed http-proxy

Nmap done: 1 IP address (1 host up) scanned in 0.44 seconds

编写脚本库文件

/nselib/文件夹下新建一个名为qingchenlib.lua的文件,填入如下内容:

function Porttest(port)
    return string.format("The port '%s' is open",port)
end

作用是查看哪些端口是开放的

使用脚本库

编写脚本 qingchen-lib-test.nse

local shortport = require "shortport"
local qingchenlib = require "qingchenlib"

description = [[引用库文件测试]]

author = "qingchen"
license = "Same as Nmap--See http://nmap.org/book/man-legal.html"
categories = {"default"}

portrule = function( host, port )
    return true
end

action = function(host,port)
    return Porttest(port.number)
end

引用库文件使用local,格式一般为: local 库文件名 = require “库文件名”,引用后可直接使用库里面的方法和属性值

Nmap 命令:nmap -Pn 127.0.0.1 --script qingchen-lib-test.nse(可以不带后缀)

[root@qingchen nselib]# nmap -Pn 127.0.0.1 --script qingchen-lib-test
Starting Nmap 7.70 ( https://nmap.org ) at 2022-11-24 13:58 CST
Nmap scan report for VM-4-3-centos (127.0.0.1)
Host is up (0.0000050s latency).
Not shown: 996 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
|_qingchen-lib-test: The port '22' is open
80/tcp   open  http
|_qingchen-lib-test: The port '80' is open
3306/tcp open  mysql
|_qingchen-lib-test: The port '3306' is open
9000/tcp open  cslistener
|_qingchen-lib-test: The port '9000' is open

Nmap done: 1 IP address (1 host up) scanned in 1.80 seconds

自定义脚本对mysql数据库操作

涉及库文件

  • mysql:用来进行数据库操作。
  • nmap:通过nmap建立socket连接mysql。
  • shortport:基本的port规则库。

创建数据库和存放结果的表

在你的MySql中建一个名为nmap的数据库,然后建立表和字段:

CREATE TABLE IF NOT EXISTS nmap.scanData (
    date varchar(40),
    hostos varchar(256),
    hostname varchar(100), 
    ip varchar(16), 
    port integer(5), 
    protocol varchar(3), 
    state varchar(20), 
    service varchar(256), 
    version varchar(256)
);

脚本

mysql-test.nse

local mysql = require "mysql"
local nmap = require "nmap"
local shortport = require "shortport"

-- 登陆mysql
local function mysqlLogin(socket, username, password)
    local status, response = mysql.receiveGreeting( socket )
    if ( not(status) ) then
        return response
    end
    return mysql.loginRequest( socket, { authversion = "post41", charset = response.charset }, username, password, response.salt )
end

description = [[mysql test]]
author = "qingchen"
license = "Same as Nmap--See http://nmap.org/book/man-legal.html"
categories = {"default"}
portrule = function () return true end

function portaction (host,port)
    local host_local="127.0.0.1"
    local port_local="3306"
    local username="root"
    local password="1234"
    local hostos_str= host.os
    local version = port.version

    if (port.version.product~=nil) then
        version = port.version.product
    end
    if (port.version.version~=nil) then
        version = version .. port.version.version
    end

    local date=os.date("%Y-%m-%d %H:%M:%S")
    local sql = string.format("INSERT INTO nmap.scanData (date,hostos,hostname,ip, port,protocol,state,service,version) VALUES ('%s','%s','%s', '%s', %d, '%s', '%s', '%s', '%s');select 1",date,hostos_str,host.name,host.ip, port.number,port.protocol,port.state,port.service,version)

    local socket = nmap.new_socket()

    if ( not(socket:connect(host_local, port_local)) ) then
        return fail("Failed to connect to server")
    end
    local status, response = mysqlLogin(socket, username, password)
    if ( status ) then
        local status, rs = mysql.sqlQuery( socket, sql )
        socket:close()
    else
        socket:close()
    end
end
local ActionsTable = {
  portrule = portaction
}
-- execute the action function corresponding to the current rule
action = function(...) return ActionsTable[SCRIPT_TYPE](...) end

执行 nmap -O 127.0.0.1 --script mysql-test

[root@qingchen nselib]# nmap -O 127.0.0.1 --script mysql-test
Starting Nmap 7.70 ( https://nmap.org ) at 2022-11-24 14:08 CST
Nmap scan report for VM-4-3-centos (127.0.0.1)
Host is up (0.0000050s latency).
Not shown: 996 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
3306/tcp open  mysql
9000/tcp open  cslistener
Device type: general purpose
Running: Linux 3.X
OS CPE: cpe:/o:linux:linux_kernel:3
OS details: Linux 3.7 - 3.10
Network Distance: 0 hops

OS detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 4.11 seconds

查看数据库已经写入数据了

在这里插入图片描述

但是其中hostos和version是lua中table格式的数据这里没有转成string所以看不到具体数据

可以写一个lua库文件作用是:把table转成string

table2string.lua

放入nselib库中

function ToStringEx(value)
    if type(value)=='table' then
        return TableToStr(value)
    elseif type(value)=='string' then
        return "\\'"..value.."\\'"
    else
        return tostring(value)
    end
end

function TableToStr(t)
    if t == nil then return "" end
    local retstr= "{"

    local i = 1
    for key,value in pairs(t) do
        local signal = ","
        if i==1 then
            signal = ""
        end

        if key == i then
            retstr = retstr..signal..ToStringEx(value)
        else
            if type(key)=='number' or type(key) == 'string' then
                retstr = retstr..signal..'['..ToStringEx(key).."]="..ToStringEx(value)
            else
                if type(key)=='userdata' then
                    retstr = retstr..signal.."*s"..TableToStr(getmetatable(key)).."*e".."="..ToStringEx(value)
                else
                    retstr = retstr..signal..key.."="..ToStringEx(value)
                end
            end
        end

        i = i+1
    end

    retstr = retstr.."}"
    return retstr
end

注意return "\\'"..value.."\\'"这里要加两个转义字符不然就会报错 like this

connect sucess
INSERT INTO nmap.scanData (date,hostos,hostname,ip, port,protocol,state,service,version) VALUES ('2022-11-24 14:51:45','nil','VM-4-3-centos', '127.0.0.1', 9000, 'tcp', 'open', 'cslistener', '{['cpe']={},['service_tunnel']='none',['service_dtype']='table',['name']='cslistener',['name_confidence']=3.0}');
false
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'cpe']={},['service_tunnel']='none',['service_dtype']='table',['name']='http',['n' at line 1
false
-- 插入数据库时也需要对单引号转义否则插入失败

写完库文件后,我们只需要引用一下我们写的库调用一下table2string

完整代码如下:

local mysql = require "mysql"
local nmap = require "nmap"
local shortport = require "shortport"
local table2string = require "table2string"

local function mysqlLogin(socket, username, password)
    local status, response = mysql.receiveGreeting( socket )
    if ( not(status) ) then
        return response
    end
    return mysql.loginRequest( socket, { authversion = "post41", charset = response.charset }, username, password, response.salt )
end
description = [[mysql save test]]
author = "qingchen"
license = "Same as Nmap--See http://nmap.org/book/man-legal.html"
categories = {"default"}
portrule = function () return true end
function portaction (host,port)
    local host_local="127.0.0.1"
    local port_local="3306"
    local username="root"
    local password="1234"
    local hostos_str = ToStringEx(host.os)
    local version = ToStringEx(port.version)

    if (port.version.product~=nil) then
        version = port.version.product
    end
    if (port.version.version~=nil) then
        version = version .. port.version.version
    end

    local date=os.date("%Y-%m-%d %H:%M:%S")
    local sql = string.format("INSERT INTO nmap.scanData (date,hostos,hostname,ip, port,protocol,state,service,version) VALUES ('%s','%s','%s', '%s', %d, '%s', '%s', '%s', '%s');",date,hostos_str,host.name,host.ip, port.number,port.protocol,port.state,port.service,version)

    local socket = nmap.new_socket()

    if ( not(socket:connect(host_local, port_local)) ) then
        return fail("Failed to connect to server")
    end
    local status, response = mysqlLogin(socket, username, password)
    -- 这里我打印了连接状态和sql语句,方便查看定位错误
    if ( status ) then
        print("connect sucess")
        print(sql)
        local status, rs = mysql.sqlQuery( socket, sql )
        print(status)
        print(rs)
        socket:close()
    else
        socket:close()
    end
end
local ActionsTable = {
  portrule = portaction
}
-- execute the action function corresponding to the current rule
action = function(...) return ActionsTable[SCRIPT_TYPE](...) end

执行命令:nmap -O 127.0.0.1 --script mysql-save-test

在这里插入图片描述

可以看到打印出数据了

end

到此就是完成对nmap脚本nse的简单学习了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32160.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

300dpi等于多少分辨率?如何给图片修改分辨率大小?

​图片是我们在生活中经常需要接触使用到的东西,无论是工作中还是生活中都离不开图片,在使用图片时我们会接触到“图片分辨率”、“dpi”这个概念,那么到底什么是图片分辨率?300DPI等于多少分辨率?如何给图片修改分辨率…

Lidar和IMU(INS)外参标定----常用开源项目总结

写在前面:博主主要关注的是自动驾驶中Lidar和RTK组合导航设备的标定,大部分的开源项目都把其转化为Lidar和IMU的标定过程。 1. ETH的lidar_align (Github)A simple method for finding the extrinsic calibration between a 3D lidar and a 6-dof pose …

推特精准客户开发手册

你要在巷子里营造出热闹的气氛,人为把热度炒起来,虚假的繁荣是做给别人看的,是用来吸引别人而不是说你自己沉迷于此,而“虚假的繁荣”又是个怎么的虚法呢?它需要外界看起来是真的。 可是问题来了,我们都知…

NTP时钟系统为制造业信息化产业提供守时保障

随着科学技术的发展,工业信息化高速迈进,高精度的同步时钟系统显得尤为重要。利用网络同步时钟系统技术对各个设备之间进行时间统一,对制造业和信息化产业提高产能,让生产力更高效提供守时保障。NTP时钟系统是基于网络时间协议而衍…

你问我答 | 解决关于入托的8个疑问

很多新手家长对于送孩子入托有很多顾虑,这次我们通过“你问我答”让家长更了解托班的意义。 Q:不好好吃饭的小宝宝,适合入托吗? A:适合。吃饭是孩子生活能力培养的重要部分,大部分孩子在入托前&#xff0c…

C. Binary String(思维+贪心)

Problem - 1680C - Codeforces 给你一个由字符0和/或1组成的字符串s。 你必须从字符串的开头去除几个(可能是零)字符,然后从字符串的结尾去除几个(可能是零)字符。移除后,字符串可能会变成空的。删除的代价…

【跟学C++】C++STL标准模板库——算法详细整理(中)(Study18)

文章目录1、简介2、STL算法分类及常用函数2.1、变序算法(一)2.2.1 初始化算法(2个)2.2.2 修改算法(2个)2.2.3 复制算法(6个)2.2.4 删除算法(6个)3、总结 【说明】 大家好,本专栏主要是跟学C内容,自己学习了这位博主【 AI菌】的【C21天养成计划】&#x…

大学生静态HTML网页设计--公司官网首页

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 公司官网网站 | 企业官网 | 酒店官网 | 等网站的设计与制 HTML期末大学生网页设计作业,Web大学生网页 HTML:结构 CSS&#xf…

容器服务 ACK 结合 MSE Ingress,让集群入口流量管理更丰富、更容易

作者:扬少 随着云原生技术不断普及,越来越多的业务应用开始向云原生架构转变,借助容器管理平台 Kubernetes 的不可变基础设施、弹性扩缩容和高扩展性,助力业务迅速完成数字化转型。其中,集群入口流量管理方式在云原生…

斐波那契数列、跳台阶、矩形覆盖、而进制中1的个数、判断是否是素数

文章目录1、斐波那契数列2、跳台阶3、矩形覆盖4、二进制中1的个数5、判断是否是素数1、斐波那契数列 本题考点: 间复杂度,fib理解,剪枝重复计算 牛客链接 题目描述: 解题思路: 代码: class Solution {…

ozon、Joom等俄罗斯跨境电商卖家想要爆单需要具备哪些条件—自养号测评

Ozon成立于1998年,目前不仅是俄罗斯多品类电子商务平台领导者、俄罗斯最知名的电子商务品牌,是俄罗斯最早的电子商务公司之一 Joom平台是俄罗斯知名的电商平台,Joom平台成立于2016年6月份,joom平台在16年11月份就对中国地区卖家进…

项目上线整体流程

文章目录一、上线前准备二、阿里云机器购买三、上线架构图四、安装Git五、云服务器安装MySQL六、云服务器安装Redis七、云服务器安装源码安装Python八、云服务器安装Uwsgi九、安装虚拟环境十、安装nginx十一、前端项目部署十二、后端项目部署1)Git拉取最新代码安装依…

Docker——容器命令介绍、创建Nginx容器与Redis容器

目录 一、容器命令 二、创建并运行Nginx容器 1.1 去dockerhub查看Nginx容器运行命令 1.2 怎么访问Nginx? 1.3 查看容器日志 1.4总结 三、进入Nginx容器并修改HTML内容 3.1 进入容器 3.2 进入Nginx的HTML所在目录 3.3 修改index.html文件(容器内修…

零基础上手unity VR开发【将项目安装到Oculus头套中】

📌个人主页:个人主页 ​🧀 推荐专栏:Unity VR 开发成神之路 --【着重解决VR项目开发难,国内资料匮乏的问题。从零入门,一步一个脚印,带你搞定VR开发! 😻😻】 &#x1f4d…

leetcode39. 组合总和

文章目录题目思考代码和注释总结题目 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同…

【全志T113-S3_100ask】15-1 内核5.4驱动spi屏幕——ILI9341

【全志T113-S3_100ask】15-1 内核5.4驱动spi屏幕——ILI9341背景(一)spi设备树1、修改设备树2、完善设备树(二)使能内核(三)兼容性修改(四)测试背景 本来想直接驱动mipi屏幕的&…

香蕉派BPI-M6 采用深蕾半导体Vs680芯片设计,板载4G LPDDR4和16G eMMC存储

Banana PI BPI-M6 香蕉派BPI-M6是香蕉派社区在2022年推出的新一代单板计算机,它采用深蕾半导体(Synaptics) VS680四核Cortex-A73 (2.1GHz)和一个Cortex-M3处理器,Imagination GE9920 GPU。 NPU高达6 .75 tops算力。 板载4GB LPDDR4内存和16GB EMMC存储&a…

React 编写网页聊天界面(仿钉钉)

效果图 文件结构 对话框 一、 难点 对话框的难点主要在样式上 双方对话分布在左右长对话的长度不能超过整个对话框宽度的一半图片的大小最大不能超过整个对话框宽度的一半,并且需要按比例进行收缩 二、与要引入的插件 1、 阿里巴巴的iconfont 可以去这篇博客里面…

Qt QTreeWidget树形控件用法详解

文章目录QTreeWidget控件的创建QTreeWidget\QTreeView的关系和区别QTreeWidgetItem类QTreeWidget的实际应用1) 添加结点2) 给结点添加图标3) 给结点添加复选框4) 多列树形控件5) QTreeWidget中添加其它控件QTreeWidget信号和槽已剪辑自: http://c.biancheng.net/view/vip_9659.…

PS-HDR图像编辑与应用

每天一个PS/PR小技巧(原理实践)https://blog.csdn.net/tiao_god/article/details/124186746用PS打开一张HDR图像。 一般打开的图像会很黑,只有少部分光源处比较亮,这是因为默认显示时高动态范围的值都除以了一个统一的值来归一化…