简介
nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting)。它是网络管理员必用的软件之一,以及用以评估网络系统安全。
nmap支持很多扫描技术,例如:UDP、TCP connect()、TCP SYN(半开扫描)、ftp代理(bounce攻击)、反向标志、ICMP、FIN、ACK扫描、圣诞树(Xmas Tree)、SYN扫描和null扫描。从扫描类型一节可以得到细节。
nmap还提供了一些高级的特征,例如:通过TCP/IP协议栈特征探测操作系统类型,秘密扫描,动态延时和重传计算,并行扫描,通过并行ping扫描探测关闭的主机,诱饵扫描,避开端口过滤检测,直接RPC扫描(无须端口影射),碎片扫描,以及灵活的目标和端口设定。
Nmap在命令行下的用法
其中,目标参数<target specification>为必选项。
例1:判断10.1.1.100的操作系统:nmap -O -T5 10.1.1.100
例2:在测试中为了不在服务器10.1.1.100上留下连接痕迹,可以采用半开扫描(即非TCP三次握手连接):nmap -sS 10.1.1.100
例3:扫描目标主机10.1.1.100所有端口(1-65535):nmap -p 1-65535 10.1.1.100
Nmap的脚本使用
1.Nmap在kali中的路径如下所示
脚本扩展分类包括:auth 处理身份验证,broadcast 网络广播,brute 暴力猜解,default 默认,
discovery 服务发现,dos 拒绝服务,exploit 漏洞利用……
2.以http-methods脚本为例
- 知道脚本的用法,所以需要用到--script-help。
nmap --script-help=http-methods 10.1.1.100 -
使用该脚本。
nmap --script=http-methods 10.1.1.100 -
使用通配符”*”来对目标机器检测时使用所有的与某种相关的脚本,比如使用所有与rpc相关的脚本。
nmap --script "rpc-*" 10.1.1.100
3.一些网站会通过判断user-agent来判断请求是否合法,那nmap在请求时有没有带上自己的特征呢?
- 打开wireshark抓包,同时启动下面的命令看看
nmap --script=http-methods 10.1.1.100
-
抓包如下
-
右键跟踪http流
可以看到在user-agent中有nmap的标志“nmap scripting engine”,如果目标站点根据这个标志拒绝nmap的请求时该怎么办呢?
此时我们就可以通过--script-args修改useragent,命令如下。
nmap --script=http-methods --script-args http.useragent="Mozilla 42" 10.1.1.100 -
抓包可以看到此时的useragent已经和我们在命令中传入的一样了
4.我们不仅限于使用,还想知道这其中的细节呢?
- 我们可以使用--script-trace打印出所有收发的数据。
nmap --script-trace --script=http-methods 10.1.1.100 -
使用--packet-trace查看所有发送和收到的数据包
nmap --packet-trace --script=http-methods 10.1.1.100 -
也能使用-d进入调试模式,-d后面需要跟数字(1-9),数字越大,输出越详细,以-d3为例。
nmap -d3 --script=http-methods 10.1.1.100
5.http-method这个脚本为例看看主体结构
-
cat http-methods.nse
-
完整的NSE包括如下几个部分:
description字段:这部分内容是介绍该脚本的功能
categories字段:给出了该nse所在的分类
action字段:脚本具体的执行内容,当脚本通过rule字段的检查被触发执行时,就会调用action字段定义的函数
rule字段:描述脚本执行的规则,也就是确定脚本触发执行的条件,这个规则是一个lua函数,返回值只有true和false两种,只有返回true时,action中的函数才会执行 -
Nmap的扩展脚本语言都基于lua来开发的,执行也是调用了内部封装的lua解释器。正常情况下,调用任何一个扩展脚本会首先执行nse_main.lua,其定义的执行规则如下。
prerule和postrule是在开始和结束运行,并且只运行一次。
hostrule是扫描一个主机就运行一次,有N个主机就会运行N次。
portrule是扫描到一个端口就运行一次,有N个端口就运行N次。
Nmap的脚本编写
Halcyon是一个开源的专门设计用于开发Nmap脚本的IDE。
新建一个新项目,生成了一个nse脚本的模板文件。
- 编写个简单的nmap脚本实现对web服务器的检测功能。做一个简单的功能:如果发现目标开放了80端口,并在这个端口上运行http服务,则输出”this is a webserver”。
- description字段没有什么好修改的。关键部分要用到portrule规则。修改return ture为:
return port.protocol == "tcp" and port.number == 80 and port.service == "http" and port.state =="open"port的protocol,number,service,state是哪儿来的?
这些是nmap提供给我们的API。API的核心功能就是向脚本提供关于主机和端口的信息。 - 这样当目标服务器上开放的80端口运行着http服务时,就命中了规则,接着去执行action部分,再来编写action部分的代码。
-
然后ctrl+s保存,再点击file->update script DB。接着测试一下:
nmap --script demo 10.1.1.100可以看到在扫描出80端口开放之后就打印出了This is a WebServer。
Nmap的API和库文件
Nmap中的引擎会向脚本传递如下两个Lua table类型的参数:host table,port table
这两个table中包含了目标主机的host和port信息。
1.host
以mac_addr为例,看看通过它能得到什么信息。
我们想要得到的是mac_addr,所以在action中return回host.mac_addr。通过host.mac_addr获取的mac地址是二进制编码的,我们要转换成字符串,需要引入stdnse库,stdnse包中有一个format_mac函数,能够将host.mac_addr转换成字符串。
保存并update script db
测试 nmap --script apitest 10.1.1.100
2.port
脚本就是通过API提供的protocol,number,service,state判断80端口开放,运行着http,然后打印出this is a webserver的。
结果,可以看到分别打印出了对应的protocol,图中都是tcp。