NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

admin 2024年5月21日22:31:38评论9 views字数 18152阅读60分30秒阅读模式

这个分享的内容比较长慢慢看,大概有一万字左右!!

这个笔记已经写的有一些年头了大概是20年写的,主要看的书是《诸神之眼NMAP》进行的总结,基本上是“整个《诸神之眼NMAP》书的全部总结笔记“还有一些自己的总结“估计应该是全网最全的“

因为前两天在做线上的渗透测试的时候,由于内网不能上网无法传任何东西,但是主机上有一个nmap,就想到可以通过nmap编写poc进行内网大批量扫描,然后就回过来翻了翻之前看了下nmap的笔记,现在看我之前写的“笔记多多少少还是干货还是挺多的“,拿出来分享分享

这个工具就不多介绍了很有名的曾在《黑客帝国1-2电影里面出现过

 

nmap范围扫描

192.168.0.1-255  //指定范围
192.168.0.1/24     //对整个子网进行扫描
192.168.0.1,192.168.0.50,192.168.0.30 //对多个主机进行扫描
nmap [目标]  --exclude  [指定不扫描的主机]  //排除主机扫描
-iL a.txt  //指定a.txt 文件内容进行扫描
-iR  [数量]   //要指定的随机ip扫面

探测存活主机

nmap发送的那些数据包可以用--packet-trace来查看

ARP扫描探测存活主机

交换机里面中每个接口都有寻址寄存器,里面存放这物理地址表 ARP扫描原理就是,向内网送ARP包如果主机给我相应了,就说明主机存活 注意:这个ARP扫描很难防御,在内网扫描ARP扫描是最佳的扫描 列

nmap -PR [目标]

例如:

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

ICMP探测探测存活主机

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测
在这里插入图片描述

请求和响应应答探测存活主机

发送ICMP响应请求,如果得到目标主机发回的ICMP响应,则说明该主机处于活跃状态,就和ping命令一样

nmap -PE [目标地址]

例如:

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测
image-20240519212144108

时间戳请求和响应探测存活主机

nmap   -sn  -PP [目标]

地址俺码请求和响应探测存活主机

nmap  -sn   -PM  [端口,或多个端口] [目标]

TCP探测存活主机

SYN探测存活主机

原理是客户端发送SYN目标会返回SYN ACK创建连接,如果端口没有开放就断开连接回RST数据包,如何有一个返回就说明目标存活 格式

nmap  -sn  -PS [端口,或多个端口] [目标]

ACK探测存活主机

这个被防火墙过滤 原理客户端发送一个ACK数据包给服务器,如果服务器存活就发送RST数据包,如果没有存活就没有都不响应 格式

nmap  -sn -PA [端口,或多个端口] [目标]

UDP探测存活主机

当目标收到UDP数据包如果这个端口是关闭的,就返回ICMP端口不可达数据包, 这个扫描不太准 格式

nmap -sn PU  [端口,或多个端口] [目标]

SCTP探测存活主机

SCTP用的比较少 流控制传输协议(SCTP,Stream Control Transmission Protocol)是一种在网络连接两端之间同时传输多个数据流的协议。SCTP提供的服务于UDP和TCP类似 SCTP是可以确保数据传输的,和TCP类似,也是通过确认机制来实现的。和TCP不同的是:

TCP是以字节为单位传输的,SCTP是以数据块为单位传输的

TCP接收端确认的是收到的字节数,SCTP接收端确认的是接收到的数据块。SCTP的这种数据块(被称为DATA CHUNK)通常会携带应用的一个数据包,或者说是应用要发送的一个消息。

在实际的应用中,TCP发送方的可以将应用程序需要发送的多个消息打包到一个TCP包里面发出去。比如,应用程序连续调用两次send()向对端发送两条消息,TCP协议可能把这两条消息都打包放在同一个TCP包中。接收端在收到这个TCP包时,回给对端的ACK只是表明自己接收到了多少个字节,TCP协议本身并不会把收到的数据重新拆散分成两条应用层消息并通知应用程序去接收。事实上,应用程序可能只需要调用一次receive(),就会把两条消息都收上来,然后应用需要根据应用程序自己定义的格式去拆成两条消息。

与TCP不同,SCTP是将应用程序的每次调用sendmsg()发送的数据当作一个整体,放到一个被称为DATA CHUNK的数据块里面,接收端也是以DATA CHUNK为单位接收数据,并重新组包,通知应用程序接收。通常,应用程序每次调用recvmesg()都会收到一条完整的消息。

在SCTP的发送端,多条短的应用层消息可以被SCTP协议打包放在同一个SCTP包中,此时在SCTP包中可以看到多个DATA CHUNK。另一方面,一条太长(比如,超过了路径MTU)的应用层消息也可能被SCTP协议拆分成多个片段,分别放在多个DATA CHUNK并通过不同的SCTP包发送给对端。这两种情况下,SCTP的接收端都能重新组包,并通知应用程序去接收。 格式

nmap -sn  -PY [端口,多个端口]   [目标]

使用IP进行主机发现

ICMP为1 IGMP为2 TCP为6 UDP为7 GRE4为7 ESP为50

格式

nmap -sn PO 号  [目标]

如果不指定号默认是1 这个方法容易被被目标检查出来 可以加上--data-length添加随机数据包

DNS活跃主机发现和DNS相关选项

在对一台主机扫描的时候,如果它有域名的话,nmap会向域名服务器提出请求,显示ip对映的域名,扫描的时候可以指定范围

无论是活跃的主机和不活跃的主机都叫域名给列出来 -R 列

 nmap -R  192.168.1.1-20

这个扫描可能会消耗大量的时间

端口扫描技术

1. nmap对端口的状态的定义

  1. 1. open:如果目标端口的状态为open,这表明在该端口有应用程序接收TCP连接或者UDP报文。
  2. 2. closed:如果目标端口的状态为closed,这里要注意closed并不意味着没有任何反应,状态为closed的端口是可访问的,这种端口可以接收Nmap探测报文并做出响应。相比较而言,没有应用程序在open上监听。
  3. 3. filtered:产生这种结果的原因主要是存在目标网络数据包过滤,由于这些设备过滤了探测数据包,导致Nmap无法确定该端口是否开放。这种设备可能是路由器、防火墙甚至专门的安全软件。
  4. 4. unfiltered:这种结果很少见,它表明目标端口是可以访问的,但是Nmap却无法判断它到底是open还是closed的。通常只有在进行ACK扫描时才会出现这种状态。
  5. 5. open | filtered:无法确定端口是开放的还是被过滤了,开放的端口不响应就是一个例子。
  6. 6. closed|filtered:无法确定端口是关闭的还是被过滤了。只有在使用idle扫描时才会发生这种情况。

端口扫描

SYN扫描

nmap默认就是SYN扫描,扫描速度快 nmap会像主机发送一个SYN数据包,目标会返回SYN加ACK进行应答。然后nmap会返回给服务器RST数据包断开连接,没有建立三次握手,目标主机是不记录的 响应状态

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测
在这里插入图片描述

扫描语法

nmap -sS [目标]

Connect扫描

和SYN扫描方式一样,只是完成三次握手了 格式

nmap -sT [目标]

UDP扫描

响应状态

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测
在这里插入图片描述

格式

nmap -sU [目标]

TCP FIN扫描

发一个FIN数据包目标端口返回RST就说明端口是关闭的 格式

nmap -sF [目标]

NULL扫描

NULL扫描发送一个没有包含任何数据的数据包,目标端口返回RST就说明端口是关闭的 格式

nmap -sN [目标]

Xmas Tree 扫描

是向目标端发送一个含有FIN,URG和PUSH标志的数据包,目标端口返回RST就说明端口是关闭的 格式

nmap -sX [目标]

idle扫描

僵尸机扫描端口开发 1.攻击端给僵尸机发一个SYN/ACK僵尸机回RST/包里面有IPID=x 2.攻击端发服务器端口SYN是伪造僵尸机ip服务器发给僵尸 机SYN/ACK,应为没有建立连接僵尸机就回RST/IPID=x+1 3.攻击端在给僵尸机发一个SYN/ACK僵尸机回RST/IPIF=x+2 僵尸机扫描端口开发 1.攻击端给僵尸机发一个SYN/ACK僵尸机回RST/IPID=x 2.攻击端发服务器端口SYN是伪造僵尸机ip服务器发给僵尸机没有建立连接服务器回发僵尸机RST 3.攻击端在给僵尸机发一个SYN/ACK僵尸机回RST/IPIF=x+1

判断是否是僵尸机--script是使用脚本

nmap -p端口 要判断是僵尸机的ip  --script=ipidseq.nse  

使用僵尸机扫描目标端口 -sI是僵尸扫描

nmap 目标ip -sI 僵尸机ip -Pn -p 0-100  

指定扫描的端口

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测
在这里插入图片描述

1、指定常见的100个端口 格式

nmap -F [目标]

2、指定一个端口扫描 格式

nmap -p [端口]  [目标]

3、使用名字指定扫描端口 格式 nmap -p U:53 [目标]

4、扫描所有的端口 格式

nmap -p *  [目标]

5、常用的端口扫描 格式

nmap  --top-ports [目标]

远程系统与服务探测

主机探测

查看返回的ttl值查看主机的系统 ttl值Windows 是128(65——128) Linux 和 Unix = 64 (1-64) Unix = 255

nmap -O [目标]

版本探测

发送探针报文,得到返回确认值,得到服务的版本

探测服务器版本参数-sV

nmap  -sV [目标]

1.如果想对全端口扫描可以加上--allport 2.设置版本扫描的强度加上--version-intensity [1到9] 3.如果轻量级模式扫描可以加上--version-light 4.尝试每个探测相当于--version-intensity 9 加上--version-all 6.--version-trace这个参数将会打印出关于正在进行的扫描的详细调试信息 7.-sR(RPC扫描) 这个方法和许多端口扫描方法联合使用。它对所有的被发现的开发的TCP/UDP端口执行SunRPC程序NULL命令试图确定他们是否RPC端口,如果是,可以确定是什么程序和版本号 nmap -sP [目标]

例如 --script-args 是用来指定参数的

nmap --script smtp-brute --script-args brute.mode=指定的用户名  192.168.30.39 

2.2密码模式 这种模式先取一个密码,然后使用所有的用户名与其配对,当所有组合都结束后,再开始下一个密码 例如

nmap --script smtp-brute --script-args brute.mode=指定的密码  192.168.30.39 

2.3文件格式取用户密码 这种模式与前两种不同,creds中所有的用户名和密码都写在同一个文件中,格式类似于admin/123456这种形式,Nmap会读取其中的每一行,然后访问服务器进行匹配 例如

Nmap --script smtp-brute --script-args brute.mode=creds,brute.credfile=文件名   192.168.30.39 

漏洞扫描类脚本

脚本http-slowloris.NSE

http-slowloris.NSE脚本查看目标是否存在预防slowloris的 DoS攻击 Slowloris是在2009年Web安全专家RSnake提出的一种攻击方法,其原理是以极低的速度向服务器发送HTTP请求。由于Web Server对于并发的连接数都有一定的上限,导致拒绝服务 例如  --max-parallelism这些选项控制用于主机组的探测报文数量

nmap -p 80 --script http-slowloris  --max-parallelism 300 192.168.30.39 

这个方法是直接去打目标系统

http-slowloris.NSE脚本扩展http-slowloris.send_interval参数

http-slowloris.send_interval参数可以指定发送http header datas的间隔,默认值为100 --script-args 是用来指定参数的  --max-parallelism这些选项控制用于主机组的探测报文数量 例如

Nmap -p 80 --script http-slowloris --script-args http-slowloris.send_interval=200 --max-parallelism 300   192.168.30.39 

http-slowloris.NSE脚本扩展http-slowloris.timelimit参数

攻击时间,默认是30分钟 --script-args 是用来指定参数的

15m就是15分钟

nmap -p 80 --script http-slowloris --script-args http-slowloris.timelimit=15m  192.168.30.39 

http-slowloris.NSE脚本扩展http-slowloris.runforever参数

这个参数是对目标系统进行一直DoS攻击 --script-args 是用来指定参数的

Nmap -p 80 --script http-slowloris --script-args http-slowloris.runforever 192.168.30.39 

还有一个名为http-slowloris-check.NSE的脚本也是用来发送slowloris的,都是他只会发送2个请求 例如

nmap -p 80 --script http-slowloris-check 192.168.30.39 

POODLE漏洞扫描ssl-poodle脚本

POODLE漏洞(亦即CVE-2014-3566)最早是由谷歌团队发现的,可以攻击者可以盗取,已经使用了的SSL3.0数据进行解密 需要攻击者完全控制网络的流量,比如ARP欺骗,钓鱼wifi等等 名为ssl-poodle的脚本来检查POODLE漏洞 --version-all相当于--version-intensity 9 扫描强度

nmap -sV --version-all --script ssl-poodle -p 443 192.168.30.39 

Lua语言基础语法

我们要学习NSE开发我们必须要了解Lua语言下面就简单介绍一下Lua语言的基础语法

输出print("Hello")

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

1.if

Lua认为false和nil为假,true和非nil为真。 和其他语言有点不同 为真才会执行then里面的,如果是假会跳过then里面的

if (真)
then
print("会执行这个")
end

1、true例如: 代码

#!/usr/bin/lua
if  true
then
   print("Hello")
end

执行结果

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

2、falsee例如 代码

#!/usr/bin/lua
if false
then
   print("Hello")
end
   print("Hello1111")
NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

实咧 代码

#!/usr/bin/lua
a="abc"
if (a=="abc")
then
   print("a变量是abc")
end
   print("##########")

结果

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

1.2 if …else

咧 代码

#!/usr/bin/lua
a="qwe"
if (a=="abc")
then
print("a变量是abc")
elseif(a=="qwe")
then
print("a变量啥qwe")
end 
print("##########")

结果

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

while循环

为真就循环do里面的

while(真)
do
print("a")
end

咧 代码

#!/usr/bin/lua
a=1
while(a<10)
do
print(a)
a=a+1
end
print("结束")

结果

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

for循环语句

与while不同的是,for语句可以直接控制循环重复执行的次数 咧

#!/usr/bin/lua
for a=1,10
do 
print(a)
end 
print("结束")

结果

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

repeat循环

repeat…until结构也是Lua的一种循环结构,这个结构不断地重复执行循环,直到指定的条件为真时为止 如果一直为假就一直执行print("a")

repeat
print("a")
until(假)

#!/usr/bin/lua
a=1
repeat
print(a)
a=a+1
until(a>10)

结果

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

break循环语句

break语句是一种循环控制语句,可以实现退出当前循环或语句

Lua数据类型

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测
在这里插入图片描述

咧 函数type是用来查看类型的

#!/usr/bin/lua
a=1
print(type(a))

结果

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

string库

1、全部转为大写字母 string.upper() upper函数将字符串中的字符全部转为大写字母

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测
在这里插入图片描述

2、全部转为小写字母

string.lower() lower函数将字符串中的字符全部转为小写字母

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测
在这里插入图片描述

3、替换

string.gsub("adadadadadad","a","4",2)

adadadadadad里面的a替换2个替换成4 结果

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测
在这里插入图片描述

4、查询字符在的位置 函数find() 咧 代码

print(string.find("abcdefg","f",2))

上面的意思就是在abcdefg字符里面的第2的位置查看是否有f这个字符 如果没有找到就返回nil 结果

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测
在这里插入图片描述

5、数字转换成字符 string.char(xxx,xxx,xxx,xxx) char函数将整型数字转成字符并连接, 就是对应的ASCII码值 咧 代码

print(string.char(65,66,67,68))
NMAP 从 原理 到 全参数实践在 到 开发漏洞探测
在这里插入图片描述

6、字符转换成数字 string.byte(xx,xx,xx) byte函数转换字符为整数值 他好像只能转换一个字符 可以指定字符 1.咧

print(string.byte("B"))
NMAP 从 原理 到 全参数实践在 到 开发漏洞探测
在这里插入图片描述

7、计算字符串的长度 string.len() len函数计算字符串长度 代码

a="ABCD"
print(string.len(a))
NMAP 从 原理 到 全参数实践在 到 开发漏洞探测
在这里插入图片描述

8、重复显示字符串和连接 string.rep() 1.rep函数返回字符串string的n个拷贝 咧

print(string.rep("ACBD:",3))

结果

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测
在这里插入图片描述

上面的意思就是重复3次

Lua文件I/O操作

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测
在这里插入图片描述

打开文件,读一行和关闭文件 代码 函数io.open("文件名","打开方式")打开文件 函数read()读取文件第一行 函数close()关闭文件还可以格式io.close(a)

例如:

#!/usr/bin/lua
--读的方式打开文件
a=io.open("a.txt","r")

--输出文件第一行
print(a:read())

--关闭打开的文件
a:close()

a.txt文件内容

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测
在这里插入图片描述

执行结果

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测
在这里插入图片描述

Lua协同程序

  1. 1. 协同程序和线程类似拥有独立的堆栈、独立的局部变量、独立的指令指针,同时又与其他协同程序共享全局变量和其他大部分东西
  2. 2. 线程与协同程序的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作运行。在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确要求挂起的时候才会被挂起。协同程序有点类似同步的多线程,在等待同一个线程锁的几个线程有点类似协同。

Lua协同程序语法

  1. 1. coroutine.create() 这个方法用来创建一个coroutine,将要进行多线程的函数作为参数,返回值是一个coroutine。
  2. 2. coroutine.resume() 这个方法用来完成coroutine重启操作,与create配合使用。
  3. 3. coroutine.yield() 这个方法用来实现coroutine的挂起操作,将coroutine设置为挂起状态。
  4. 4. coroutine.status() 这个方法用来查看coroutine的状态。这里coroutine的状态一共有dead、suspend、running三种。
  5. 5. coroutine.wrap() 这个方法创建一个coroutine,用于返回一个函数,一旦调用这个函数,就进入协同程序,与create功能相同。
  6. 6. coroutine.running()这个方法返回正在运行的coroutine。一个coroutine就是一个线程,当使用running时,返回的是当前正在运行的协同程序的线程号。

NSE库文件编写

nmap NSE中的API

Nmap中的引擎会向脚本传递两个类型的参数hostport host 的table(表)存放这目标主机信息 port 的table(表)存放这目标端口信息 他和port和host详细程度取决,扫描过程中选项选项的设定,例如,如果在扫描时没有指定要对主机的操作系统进行扫描的话,那么host.os的内容就是空的

host table

host.os字段

里面存放这目标主机的类型 这个字段中包括了一个我们常见的操作系统信息的数组,涉及操作系统的供应商、所属系列、具体型号、设备类型、CPE等。如果某个字段没有被定义的话,这个字段可以为nil

例如: 代码 我保存到了名为wode.nse

local shortport = require "shortport"

description = [[]]

author = "kali"
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 host.os

end

上面的代码的意思是return true(真)执行return host.os返回host.os 叫wode.nse移动到/usr/share/nmap/scripts/文件下面 复制进去要更新一下nmap脚本的数据库 命令

nmap --script-updatedb

结果 用上面的脚本

命令

sudo nmap --script wode 192.168.43.244 -O -p 3389
NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

host.ip字段

里面包含了的IP地址 咧 代码 我保存到了名为wode.nse

local shortport = require "shortport"

description = [[]]

author = "root"

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 host.ip

end

wode.nse移动到/usr/share/nmap/scripts/文件下面 复制进去要更新一下nmap脚本的数据库 命令

nmap --script-updatedb

结果 用上面的脚本命令

sudo nmap --script wode www.baidu.com -p 80
NMAP 从 原理 到 全参数实践在 到 开发漏洞探测
在这里插入图片描述

host.name字段

里面包含了目标的反向DNS域名 咧 代码 我保存到了名为wode.nse

local shortport = require "shortport"

description = [[]]

author = "root"

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 host.name

end

wode.nse移动到/usr/share/nmap/scripts/文件下面 复制进去要更新一下nmap脚本的数据库 命令

nmap --script-updatedb

结果 不知道怎么回事好像不能检查到

host.targetname字段

里面包含了主机的在命令中的命令

host.directly_connected字段‘

字段是一个布尔值true和false,表示目标计算机是否与我们同在一个子网 咧 代码 我保存到了名为wode.nse

local shortport = require "shortport"

description = [[]]

author = "root"

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 host.directly_connected

end

wode.nse移动到/usr/share/nmap/scripts/文件下面 复制进去要更新一下nmap脚本的数据库 命令

nmap --script-updatedb

结果1是true,这个我扫描的是我内网 命令

sudo nmap --script wode 192.168.43.221 -p 80
NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

结果2是false我扫描的是百度,不是在我内网的 命令

sudo nmap --script wode www.baidu.com -p 80
NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

host.mac_addr字段

这个字段是目标的MAC地址,注意:要是扫描的不是同一个网段的话可能就没有效果,应为扫描外网是通用IP寻址的 咧 代码 我保存到了名为wode.nse

local shortport = require "shortport"

description = [[]]

author = "root"

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 host.mac_addr

end

wode.nse移动到/usr/share/nmap/scripts/文件下面 复制进去要更新一下nmap脚本的数据库 命令

nmap --script-updatedb

结果 命令

sudo nmap --script wode 192.168.43.221 -p 80
NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

host.mac_addr_src

段中是使用的计算机的MAC地址 咧 代码 我保存到了名为wode.nse

local shortport = require "shortport"

description = [[]]

author = "root"

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 host.mac_addr_src

end

wode.nse移动到/usr/share/nmap/scripts/文件下面 复制进去要更新一下nmap脚本的数据库 命令

nmap --script-updatedb

结果 命令

sudo nmap --script wode 192.168.43.1
NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

host.interface_mtu

字段中是网络中的MTU值 咧 代码 我保存到了名为wode.nse

local shortport = require "shortport"

description = [[]]

author = "root"

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 host.interface_mtu

end

wode.nse移动到/usr/share/nmap/scripts/文件下面 复制进去要更新一下nmap脚本的数据库 命令

nmap --script-updatedb

结果 命令

sudo nmap --script wode 192.168.43.1
NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

host.bin_ip字段

字段中的内容是使用4字节字符串表示的IPv4目标地址以及使用16字节字符串来表示IPv6目标地址 咧 代码 我保存到了名为wode.nse

local shortport = require "shortport"

description = [[]]

author = "root"

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 host.bin_ip

end

wode.nse移动到/usr/share/nmap/scripts/文件下面 复制进去要更新一下nmap脚本的数据库 命令

nmap --script-updatedb

结果 命令

sudo nmap --script wode 192.168.31.22 -p 3389
NMAP 从 原理 到 全参数实践在 到 开发漏洞探测
  1. 1. host.bin_ip_src

里面字段中包含两个地址,一个是使用IPv4格式表示所使用的计算机地址,另一个是用IPv6格式表示所使用的计算机地址 咧 代码 我保存到了名为wode.nse

local shortport = require "shortport"

description = [[]]

author = "root"

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 host.bin_ip_src
end

wode.nse移动到/usr/share/nmap/scripts/文件下面 复制进去要更新一下nmap脚本的数据库 命令

nmap --script-updatedb

结果

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

host.times

里面字段中的内容是目标的时序数据 咧 代码 我保存到了名为wode.nse

local shortport = require "shortport"

description = [[]]

author = "root"

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 host.times

end

wode.nse移动到/usr/share/nmap/scripts/文件下面 复制进去要更新一下nmap脚本的数据库 命令

nmap --script-updatedb

结果

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

host.traceroute

字段中的数据只有指定--traceroute才会出现, --traceroute参数是跟踪路由用于检测您的计算机数据包从路由器到ISP的路由到互联网直至其特定目的地 咧 代码 我保存到了名为wode.nse

local shortport = require "shortport"

description = [[]]

author = "root"

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 host.traceroute

end

wode.nse移动到/usr/share/nmap/scripts/文件下面 复制进去要更新一下nmap脚本的数据库 命令

nmap --script-updatedb

结果

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

port table(表)

port.number字段

这个字段标识了目标端口 咧 代码 我保存到了名为wode.nse

local shortport = require "shortport"

description = [[]]

author = "root"

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 port.number

end

wode.nse移动到/usr/share/nmap/scripts/文件下面 复制进去要更新一下nmap脚本的数据库 命令

nmap --script-updatedb

结果 命令

sudo nmap --script wode 192.168.31.21
NMAP 从 原理 到 全参数实践在 到 开发漏洞探测
image-20240519214219924

port.protocol

这个字段是识别TCP和UDP的端口的类型 咧 代码 我保存到了名为wode.nse

local shortport = require "shortport"

description = [[]]

author = "root"

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 port.protocol
end

wode.nse移动到/usr/share/nmap/scripts/文件下面 复制进去要更新一下nmap脚本的数据库 命令

nmap --script-updatedb

结果 命令

sudo nmap --script wode 192.168.31.21
NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

port.service字段

字段是目标的端口的运行的服务 咧 代码 我保存到了名为wode.nse

local shortport = require "shortport"

description = [[]]

author = "root"

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 port.service
end

wode.nse移动到/usr/share/nmap/scripts/文件下面 复制进去要更新一下nmap脚本的数据库 命令

nmap --script-updatedb

结果 命令

sudo nmap --script wode 192.168.31.21 
NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

port.version字段

字段中保存了通过服务扫描发现的版本信息,包括name、name_confidence、product、version、extrainfo、hostname、ostype、devicetype、service_tunnel、service_ftp以及cpe_code等字段。注意这个字段需要使用参数-sV 咧 代码

local shortport = require "shortport"

description = [[]]

author = "root"

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 port.version
end

wode.nse移动到/usr/share/nmap/scripts/文件下面 复制进去要更新一下nmap脚本的数据库 命令

nmap --script-updatedb

结果 命令

sudo nmap --script wode 192.168.31.21 -sV
NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

port.state字段

存放端口的状态 咧 代码

local shortport = require "shortport"

description = [[]]

author = "root"

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 port.state
end

wode.nse移动到/usr/share/nmap/scripts/文件下面 复制进去要更新一下nmap脚本的数据库 命令

nmap --script-updatedb

结果 命令

sudo nmap --script wode 192.168.31.21
NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

NSE中的异常处理

代码

local nmap = require "nmap"
local comm = require "comm"
local shortport = require "shortport"

description = [[]]

author = "root"

license = "Same as Nmap--See http://nmap.org/book/man-legal.html"

categories = {"default,discovery,safe"}



portrule = shortport.port_or_service(79, "finger")

action = function(host, port)
try = nmap.new_try()
return try(comm.exchange(host, port, "rn", 
{lines=100, timeout=5000}))
end

上面代码说明 nmap提供了nmap库,叫nmap 监控异常的代码放置在Nmap.new_try()函数的括号中即可,这个函数的第一个返回值就表明了状态。如果返回值为false或者nil,第二个返回值就是一个错误相关的字符串 如果comm.exchange正常执行的话,就可以返回原本的值,如果出现异常,就可以返回这个异常

NSE中的注册表

NSE注册表也是一个Lua tablc 类型的数据文件,他主要用来保持住一次扫描中各个脚本之间共享的变量,这个注册表保持住一个名为nmap.refistry的变量中。举个例子,在使用脚本对目标的口令进行爆破的时候,就可以使用这个注册表把已经破解的用户密码保持起来,已提供其他脚本的使用。例如,爆破得到目标的用户admin,密码123456,就会执行一个插入操作

table.iNSErt(Nmap.registry.credentials.http, 
{ username = admin, password =123456 } )

NSE中的库文件

库文件的位置

库文件在/usr/share/nmap/nselib

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

halcyon编辑器会自动按照nmap的路径进行找到库

NMAP 从 原理 到 全参数实践在 到 开发漏洞探测
在这里插入图片描述

这些库文件涵盖了几乎当前所有的流行协议、常见的字符串处理操作,甚至包含了用来实现对用户名和密码进行破解的brute库文件。当在编写NSE脚本的时候,你可能会考虑到代码重构的问题。最好的解决方法还是将核心的代码创建为NSE的库文件。事实上,NSE库文件的创建是非常简单的。NSE中的库文件大都是使用Lua语言编写的,但是如果你使用C或者C++语言也是可行的

NSE库文件编写和调用

NSE库文件编写

咧 代码

保存的文件名a.lua保持到/usr/share/nmap/nselib目录里面

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

代码说明 function 定义函数的,定义了一个a函数传参是port string.format函数是一个类似printf的格式化字符串我看到了一个写的很详细的在这个地址https://blog.csdn.net/hello_crayon/article/details/50667927

调用

NSE脚本调用 编写一个NSE脚本 代码 保持的文件名为wode.nse

local shortport = require "shortport"
local a = require "a"


description = [[]]

author = "root"

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 b(port.number)

end

代码调用说明 上面的代码local a = require "a"就是调用上面编写的a.lua的脚本文件 上面的代码 return b(port.number)代码就是b就是a.lua的脚本文件里面的函数,port.number传参给a.lua的脚本文件文件里面的port

wode.nse移动到/usr/share/nmap/scripts/文件下面 复制进去要更新一下nmap脚本的数据库 命令

nmap --script-updatedb

结果 命令

sudo nmap --script wode 192.168.31.21
NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用!!!

原文始发于微信公众号(W啥都学):【万字总结】 NMAP 从 原理 到 全参数实践在 到 开发漏洞探测

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年5月21日22:31:38
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   NMAP 从 原理 到 全参数实践在 到 开发漏洞探测https://cn-sec.com/archives/2756744.html

发表评论

匿名网友 填写信息