一、实验背景:
网络入侵的一般流程是确定目标、信息收集、漏洞挖掘、实施攻击、留下后门、清除日志。在信息收集环节又可分为网络踩点、网络扫描和网络查点。在网络扫描部分,按照攻击者的入侵流程又可分为主机扫描、端口扫描、系统类型探测和漏洞扫描。
网络扫描是针对整个目标网络或单台主机,网络扫描可以全面、快速、准确的获取目标系统的信息;通过网络扫描发现对方,获取对方的信息是进行网络攻防的前提。至今,互联网上有许多开源的优秀网络扫描工具,Nmap(简称Network Mapper)就是世界上最流行功能、最强大的网络扫描工具。
Nmap是一款开源免费的网络发现(Network Discovery)和安全审计(Security Auditing)工具,由Fyodor在1997年创建,是渗透测试人员必用的软件之一,用以评估网络系统安全。一般情况下,Nmap用于列举网络主机清单、管理服务升级调度、监控主机或服务运行状况;可以检测目标机是否在线、端口开放情况、侦测运行的服务类型及版本信息、侦测操作系统与设备类型等信息。
Nmap有很多优点。一是NMAP支持很多扫描技术,如UDP、TCP connect()、TCP SYN(半开扫描)、FTP bounce scan、反向标志扫描、ICMP、FIN、ACK扫描、Xmas Tree、null扫描等扫描技术。二是支持主流操作系统:Windows/Linux/Unix/MacOS等,源码开放,方便移植。三是Nmap官网提供了详细的文档描述,互联网上的参考资料也比较丰富。四是Nmap功能强大,Nmap可以扫描互联网上大规模的计算机,可以通过TCP/IP协议栈特征探测操作系统类型,可以进行秘密扫描、并行扫描、诱饵扫描、避开端口过滤检测、RPC扫描、碎片扫描、脚本扫描等。
Zenmap是Nmap官方提供的图形界面,是用Python语言编写的开源免费的图形界面,能在Windows/Linux/Unix/Mac OS等操作系统上运行;Zenmap旨在为nmap提供更加简单的操作方式。简单常用的操作命令可以保存成为profile,用户扫描时可以在Profile栏位选择profile即可,可以很方便地比较不同的扫描结果;Topology选项卡中还可以提供有网络拓扑结构的图形显示功能,用于显示扫描到的目标机与本机之间的拓扑结构。NMAP的功能架构图如图1所示:
图1 功能架构图
从图1中也可以看出Nmap的功能:主机发现(Host Discovery)、端口扫描(Port Scanning)、版本侦测(Version Detection)、操作系统侦测(Operating System Detection),以及NMAP的高级用法防火墙/IDS规避、NSE脚本引擎。其中,nmap脚本引擎(NSE,Nmap scripting Engine)也是nmap最强大、最灵活的功能之一,它允许用户使用lua编程语言编写、共享简单的脚本,以自动化执行各种网络任务。
二、实验原理:
本次实验使用nmap工具,需要预先掌握IP、ICMP、TCP和UDP等协议原理与一些编程知识。使用NMAP进行扫描,可分为以下几类,首先是常规扫描,通过TCP的三次连接进行扫描,如图2所示:
图2 常规扫描
然后是半打开扫描,没有完成三次连接进行扫描,如图3所示:
图3 半打开扫描(SYN扫描)
另一类是ACK扫描,ACK扫描通过发送一个ACK包给目标主机,不论目标主机的端口是否开启,都会返回相应的RST包,通过判断RST包中的TTL来判断端口是否开启。如图4所示
图4 ACK扫描
还有一类是UDP扫描,UDP扫描是由扫描主机发出UDP数据包给目标主机的UDP Port,并等待目标主机Port送回ICMP Unreachable信息,如图5所示:
图5 半打开扫描
三、实验环境:
Windows系统、Nmap软件、靶机系统。本次实验的网络拓扑如图6所示:
图6 nmap网络扫描器实验环境
四、实验目的及要求:
深入Nmap网络扫描器的原理,并通过使用Nmap发现目标主机、开放端口、服务类型、版本和操作系统,进行nmap脚本及库文件编写,深入掌握网络扫描器的作用,达到以下要求:
- 深入掌握信息探测技术中的nmap网络扫描器原理,掌握常用网络服务对应的端口号。
- 熟练使用nmap常用参数对网络环境进行扫描,并通过扫描结果对目标进行分析。
- 掌握nmap脚本的基本使用方法和开发方法,理解并掌握nmap的API和库文件的使用。
- 本次实验需连接SUSE校园网;完成实验后,提交电子实验报告1份,命名格式:学号+姓名+实验名。
五、实验内容:
- 安装Nmap,掌握windows下nmap的安装方法
- 通过扫描目标计算机熟悉nmap图形界面Zenmap的基本应用
- 通过nmap命令行的使用,掌握nmap命令行下常用的参数。
- 掌握nmap脚本的使用和简单Nmap脚本开发。
- 利用Halcyon编写简单的nmap脚本,实现对web服务器的检测。
- 掌握nmap的API和库文件的使用。
六、实验步骤:
(1)安装Nmap:
双击nmap-7.92-setup.exe安装,在安装过程中,保持默认设置,按照提示进行安装即可。
(2)Zenmap应用:
2.1)单机扫描:
通过扫描自己的PC,熟悉nmap图形界面Zenmap的基本使用。打开Zenmap,点击“扫描”—>“新建窗口”,在目标框中输入IP地址172.26.10.102,不修改配置直接点击扫描,等待返回扫描结果。点击状态界面的“扫描”选项卡,可以看到扫描进度,扫描完成后,可以看到被扫描对象的各种状态,包括端口、拓扑图、主机操作系统类型等信息。扫描效果如图7所示:
图7 单机扫描效果(截图需展示端口对应的服务类型和版本号)
问题1:请在实验报告上回答该IP地址最有可能的OS类型及OS版本?
接着继续在zenamp界面,将配置改为:Intense scan, all TCP ports,重新对目标172.26.10.102进行扫描,观察返回结果有何不同。对比扫描效果如图8所示:
图8 对比扫描结果
2.2)网段扫描:
对本机所处网段进行扫描,分析本网段环境:根据图7的目标栏,在扫描目标中输入:172.22.252.0/24,将配置改为:Intense scan, all TCP ports,然后运行扫描任务,扫描任务停止后即可查看返回结果。在左侧“主机”中会列举出被扫描网段中所有存活的主机以及操作系统类型,点击相关主机即可查看主机的详细信息。接着,选择“扫描”菜单中“保存扫描”选项可以保存扫描结果,保存类型选用默认的XML格式。可用IE浏览器打开并查看该XML文件。效果如图9所示:
图9 网段扫描效果(截图需展示存活的主机IP列表)
问题2:请在实验报告上回答存活的主机IP列表以及有SSH服务的IP有哪些?
(3)Nmap命令行的使用:
3.1)Nmap命令行用法及参数说明:
打开CMD命令提示符,在CMD命令提示符窗口中输入“nmap”命令,按下回车键,nmap会返回使用说明。可以看到nmap的用法如图10所示,其中目标参数<target specification>为必选项:
图10 nmap的命令行用法
根据图10,常用扫描类型及参数说明如图11所示,扫描类型-sT、-sS、-sA、-sU的原理分别对应图2、图3、图4、图5:
图11 常用扫描类型及参数说明
3.1)Nmap命令行使用案例:
基于图11,若要判断172.26.10.102的操作系统,则nmap命令行的命令为:nmap -O -T5 172.26.10.102。若要在测试中不在服务器172.26.10.102上留下连接痕迹,可以采用半开扫描(即非TCP三次握手连接),nmap命令行的命令为:nmap -sS 172.26.10.102。若要扫描目标主机172.26.10.102所有端口(1-65535),nmap命令行的命令为:nmap -p 1-65535 172.26.10.102。
(4)nmap脚本的使用:
虽然nmap内嵌的服务与版本探测很强大,但是在某些情况下需要多伦次的交互才能够探测到更多的服务器信息,这时就需要自己编写NSE插件来实现。NSE插件能够完成网络发现、复杂版本探测、脆弱性探测、简单漏洞利用等功能。
nmap执行时,首先需要理解Nmap脚本引擎原理,如图12所示:
图12 nmap执行原理
在图12中,根据脚本的运行阶段不同分为四类:Prerule scripts、Host scripts、Service scripts、Postrule scripts。 Service scripts应用最多,Post scripts是对Nmap输出进行格式化,Host scripts在Nmap运行完主机发现、端口扫描、版本探测、OS侦测后执行;Prerule scripts执行一些资源操作,先于各探测执行。
4.1)使用--script、--script-help选项的脚本扫描:
Nmap安装后已自带了很多脚本,这些可使用的脚本处于nmap的scripts目录下,也是nmap的脚本库。在使用nmap时,通过在命令中加上--scritp就可以调用nmap脚本来配合网络扫描;这些脚本分为以下几类,如表1所示:
表1 nmap常用脚本类型及说明
脚本类别 | 脚本类别说明 |
auth | 负责处理鉴权证书的脚本,以绕开鉴权 |
broadcast | 通过网络广播,在局域网内探查更多服务开启状况,如dhcp/dns/sqlserver等服务 |
brute | 提供暴力破解方式,针对常见的应用如http/snmp等 |
default | 使用-sC或-A选项扫描时候默认的脚本,提供基本脚本扫描能力 |
discovery | 对网络进行更多的信息,如SMB枚举、SNMP查询等,以进行服务发现 |
dos | 用于进行拒绝服务攻击 |
exploit | 利用已知的漏洞入侵系统,进行漏洞利用 |
external | 利用第三方的数据库或资源,例如进行whois解析 |
fuzzer | 模糊测试的脚本,发送异常的包到目标机,探测出潜在漏洞 |
intrusive | 入侵性的脚本,此类脚本可能引发对方的IDS/IPS的记录或屏蔽,造成不良后果 |
malware | 探测目标机是否感染了病毒、开启了后门等信息 |
safe | 此类与intrusive相反,属于安全性脚本,扫描危害较小 |
version | 负责增强服务与版本扫描(Version Detection)功能的脚本,进行版本识别 |
vuln | 负责检查目标机是否有常见的漏洞(Vulnerability),如是否有MS08_067 |
在使用nmap时,一种调用脚本的方式是使用种类的名字就可调用该分类下的全部脚本,如--scritp vuln;但这种调用方式比较费时。另一种就是调用单个nmap脚本的方式,如以自带的http-methods脚本为例,用以查看web server支持的http methods。
使用http-methods脚本时,可先用--script-help查看http-methods脚本的用法,命令为:nmap --script-help http-methods;可以看到脚本的类别和使用该脚本的描述。要使用该脚本,则使用--script加载该脚本,就会在结果中会打印出目标对象支持HTTP协议的请求方法,使用该脚本的命令为:nmap --script=http-methods 172.26.10.2
问题3:请在实验报告上回答以上命令支持支持HTTP协议的请求方法有哪些?
在nmap的scripts目录中仔细分析一下,可以看到与http相关的脚本都是以http-的方式命名的,如与ssh相关的都是以ssh-的方式命名。如图13所示:
图13 nmap脚本
因此,在使用nmap对目标对象进行检测时,可以使用通配符”*”来匹配所有的与某类相关的脚本;比如使用所有与ssh相关的脚本的命令为:nmap --script "ssh-*" 172.26.10.2。
4.2)使用 --script-args选项的脚本扫描:
一般普通用户在向一些Web网站发送HTTP请求时,网站会提取HTTP请求中的user-agent来判断该请求是否合法。事实上,在nmap使用http-methods脚本扫描时,会发送带有nmap特征的请求报文。输入命令:nmap --script=http-methods 172.26.10.2时,并使用wireshark抓取该命令的扫描请求报文,并追踪HTTP流,可得图14所示:
图14 使用wireshark抓取http-methods脚本的扫描请求报文
在图14中,可以看到在user-agent中有nmap的特征“nmap scripting engine”,这也验证了在nmap使用http-methods脚本扫描时,会发送带有nmap特征的请求报文。
因此,在使用某个脚本时,若该脚本支持传入参数,可以利用--script-args选项来修改数据包。在上面的http-methods脚本扫描案例中,若目标站点根据nmap特征来拒绝nmap的HTTP请求;此时,若攻击者还想让网站通过判断nmap的HTTP请求是合法请求,以绕过网站的对nmap请求包的检测,就可以利用--script-args修改nmap的HTTP请求包中的user-agent,命令为:nmap --script=http-methods --script-args http.useragent="Mozilla 42" 172.26.10.2;再使用wireshark抓包,可发现此时nmap的HTTP请求包中含有的useragent与命令中传入的http.useragent一样。
4.3)理解Nmap脚本扫描的细节:
要理解Nmap脚本扫描的细节,还是以http-methods脚本扫描为例,若攻击者想知道脚本扫描的细节,就可以使用--script-trace,以16进制形式来打印所有收发的数据,命令为:nmap --script-trace --script=http-methods 172.26.10.2,如图15所示:
图15 使用--script-trace以16进制形式来打印所有收发的数据
也使用--packet-trace查看所有发送和收到的数据包。命令为:nmap --packet-trace --script=http-methods 172.26.10.2。还可以使用-d进入调试模式,-d后面需要跟1-9的某个数字,数字越大,输出越详细以-d3为例,命令为:nmap -d3 --script=http-methods 172.26.10.2。
4.4)简单Nmap脚本开发:
事实上,攻击者可以自己写脚本,以解决一些定制化的nmap脚本扫描任务。要实现这一目的,先以http-method这个脚本为例,观察该脚本主体结构,如图16所示:
图16 脚本文件http-method.nse的主体结构
根据图16,description字段介绍了该脚本的功能;categories给出了该nse所在的脚本类别;rule字段描述了脚本执行的规则,确定了脚本触发执行的条件,这个规则是一个lua函数,返回值只有true和false两种,只有返回true时,action中的函数才会执行。action字段给出了脚本具体的执行内容,若rule字段的检查通过并被触发执行时,就会调用action字段定义的函数。
由于nmap的扩展脚本语言都基于lua来开发的,执行脚本时调用了内部封装的lua解释器;正常情况下,调用任何一个扩展脚本会首先执行nse_main.lua,该脚本主要加载一些Nmap的核心库(nselib文件夹中)、定义多线程函数、定义输出结果处理函数、读取、加载扩展脚本、定义扩展脚本函数接口、执行扩展脚本。nse_main.lua文件处于nmap的安装目录下,并且扩展脚本执行的规则也定义在nse_main.lua中,如图17所示:
图17 扩展脚本的执行规则
根据图17,通过开发一个脚本就可以验证图17中的规则含义。首先在scripts目录下创建一个test.nse文件,写入如下脚本代码:
prerule=function() print("1-个人姓名拼音+prerule()") end hostrule=function(host) print("2-个人姓名拼音+hostrule()") end portrule=function(host , port) print("3-个人姓名拼音+portrule()") end action=function() print("4-个人姓名拼音+action()") end postrule=function() print("5-个人姓名拼音+postrule()") end |
执行命名:nmap --script test 127.0.0.1;可以看到prerule和postrule是在开始和结束运行且只运行一次;hostrule是扫描一个主机就运行一次,有N个主机就会运行N次;portrule是扫描到一个端口就运行一次,有N个端口就运行N次。效果如图18所示:
图18 test.nse脚本文件执行效果
再以http-method.nse脚本文件为例,在图16的文件中只有一个portrule,也就是该脚本先进行端口扫描,再运行action函数。理解了图16中脚本主体结构以及图17中脚本的运行规则后,参照http-method.nse的基本结构,就可以编写一个简单的nse脚本进行测试。新建test-simple.nse文件,输入如下代码:
local shortport = require "shortport" description = [[]] author = "test" categories = {"default"} portrule = function(host,port) return true end action = function(host,port) end |
接着执行命令:nmap --script test-simple 127.0.0.1。可以看到该命令执行后,能正确输出结果,说明脚本代码没有问题。
(5)基于Halcyon的nmap脚本开发:
Halcyon是一个开源的、专门设计开发Nmap脚本的IDE。利用Halcyon可以开发从侦察到利用的各类Nmap高级扫描脚本。
5.1)安装jdk、启动并配置Halcyon:
根据参考资料9,通过本实验提供的工具jdk-8u271-windows-x64.exe安装JDK。接着根据参考资料10,下载Halcyon_IDE_v2.0.2.jar后,在cmd中进入Halcyon_IDE_v2.0.2.jar所在的目录,输入命令:java -jar Halcyon_IDE_v2.0.2.jar,启动Halcyon。
接着在Project->Settings->Environment Settings中,配置Nmap Executable Path、Nmap Script Path、Nmap Library Path。如图19所示:
图19 在Halcyon中配置nmap环境
然后将nselib目录下的data文件夹复制到Nmap的安装目录,并重命名为nselibdata;接着再关闭Halcyon,在cmd中输入命令:java -jar Halcyon_IDE_v2.0.2.jar,重新启动Halcyon。
5.2)创建nse模板文件、查看Halcyon的布局:
接下来可以新建一个项目:File->New,在弹出的对话框中,要求填写存储位置、脚本分类等信息;这里在nmap的scripts目录下新建一个名为demo.nse的脚本,并点击Create New,就自动生成了一个NSE的模板文件;如图20所示:
图20 在Halcyon中新建一个名为demo.nse的脚本
在图20的右图中的左侧,可以看到Nmap Scripts是namp脚本;NSE Data是nse需要的数据,比如爆破时的字典、指纹等文件;Nmap Libraries是nmap的库文件。在图20右图中右侧是编辑代码的窗口。
5.3)Halcyon模板代码生成功能、利用Halcyon编写nmap脚本:
利用Halcyon来编写nmap脚本,功能是非常强大的;比如使用project->code generator功能,可以快速生成对应的功能代码或相应的模板;以socket为例,点击Project->Code Generator->Socket->Connect and Send,就会在编辑代码的窗口插入三行代码。效果如图21所示:
图21 生成socket代码
删掉图21中刚刚插入的三行代码;本部分实验仅需编写一个简单的nmap脚本,以实现对web服务器的检测功能;该功能描述为:如果发现目标开放了80端口,并在这个端口上运行了http服务,则输出"this is a webserver"。若要实现该功能,在demo.nse文件中,可以发现description、author、license、categories字段无需修改;portrule、action字段需要修改。
在portrule部分的true修改为规则A:port.protocol == "tcp" and port.number == 80 and port.service == "http" and port.state == "open",用以实现上述功能;当目标服务器上开放的80端口且运行着http服务时,就会命中了规则A(既同时满足规则A的四个条件),接着会执行action部分。此时,在action部分加入代码:return "this is a webserver",并按ctrl+s保存,再点击file->update script DB。在CMD中执行命令:nmap --script=demo www.baidu.com,就可以看到在扫描出80端口开放后就打印出了this is a webserver,效果如图22所示:
图22 实现对web服务器的检测功能
(6)Nmap的API和库文件的使用:
NSE 脚本可以访问多个 Nmap 工具,用于编写灵活而优雅的脚本。 Nmap API提供了目标主机详细信息,例如端口状态和版本检测结果。它还提供了Nsock 库的接口,以实现高效的网络I/O。
6.1)理解并使用Nmap关于主机信息的API:
在5.3节,利用Halcyon编写nmap脚本部分;我们将portrule部分的true修改为规则A:port.protocol == "tcp" and port.number == 80 and port.service == "http" and port.state == "open";其中port有protocol 、number 、service、state属性,这些其实是Nmap提供的API;Nmap中的API的核心功能就是向脚本提供关于主机和端口的信息,例如名字解析、主机和端口的状态、服务发现等内容。
Nmap引擎会向脚本传递如下两个Lua table类型的参数:host table,port table。这两个table分别包含了目标主机的host和port信息。host table包括的字段如表2所示:
表2 host table包括的字段
字段 | 类型 | 具体含义 |
host.os | Array(数组) | 一组操作系统匹配表;操作系统匹配由一个可读的名称和一系列操作系统类组成。 每个OS类由供应商、OS系列、OS代、设备类型和该类的CPE(Common Platform Enumeration)条目数组组成。 |
host.ip | 字符串 | 以字符串形式表示目标主机 IP 地址。 如果扫描是针对主机名运行的,并且其 DNS 查找返回了多个 IP 地址,则使用相同的 IP 地址作为为扫描选择的 IP 地址。 |
host.name | 字符串 | 包含以字符串表示的已扫描目标主机的反向 DNS 条目。 如果主机没有反向 DNS 条目,则该字段的值为空字符串。 |
host.targetname | 字符串 | 包含在命令行中指定的主机名称。如果命令行中给出的目标包含网络掩码或 IP 地址,则该字段的值为0。 |
host.reason | 字符串 | 以字符串形式表示目标主机处于其当前状态的原因。 |
host.reason_tll | 字符串 | 包含响应数据包的TTL值,用于确定目标主机到达时的状态。 这个响应包也是用来设置host.reason的包。 |
host.directly_connected | 布尔型 | 指示目标主机是否直接连到运行Nmap 的主机(即在同一网段上) |
host.mac_addr | 字符串 | 如果有,则为目标主机的MAC地址(六字节长的二进制字符串),否则为零。 通常仅适用于直接连接在LAN上的主机,且仅当Nmap正在执行原始数据包扫描(如 SYN 扫描)时。 |
host.mac_addr_next_hop | 字符串 | 到主机的路由中第一跳的 MAC 地址,如果不可用,则为0; |
host.mac_addr_src | 字符串 | 我们自己的 MAC 地址,用于连接到主机(一般是我们的网卡,或使用--spoof-mac伪造的欺骗地址)。 |
host.interface | 字符串 | 包含接口名称的字符串,通过该接口将数据包发送到主机。 |
host.interface_mtu | 字符串 | host.interface 的 MTU(最大传输单元),如果未知,则为 0。 |
host.bin_ip | 字符串 | 目标主机的IP地址为4字节 (IPv4) 或16字节 (IPv6) 字符串。 |
host.bin_ip_src | 字符串 | 自己运行Nmap主机的源IP地址为4字节 (IPv4) 或 16 字节 (IPv6) 字符串。 |
host.times | Table(表) | 此表包含主机的 Nmap 时间数据(请参阅“往返时间估计”一节)。 它的键是 srtt(平滑往返时间)、rttvar(往返时间方差)和 timeout(探测超时),均以浮点秒数给出。 |
host.traceroute | Array(数组) | 是一个跟踪路由跳跃点数组,在使用--traceroute选项时出现。 每一条都是一个host table,其中包含字段名称、ip 和 srtt(往返时间),条目的 TTL 是隐含的。 一个空表代表一个超时的跳跃点。 |
在表2中,以host.os表为例来理解Nmap API,host.os表的整体结构如下:
host.os = { { name = <string>, classes = { { vendor = <string>, osfamily = <string>, osgen = <string>, type = <string>, cpe = { "cpe:/<...>", [More CPE] } }, [More classes] }, }, [More OS matches] } |
为了深入理解host.os;举个例子,若一个操作系统能够匹配nmap-os-db(nmap的主机指纹库)中的条目:
Fingerprint Linux 2.6.32 - 3.2 Class Linux | Linux | 2.6.X | general purpose CPE cpe:/o:linux:linux_kernel:2.6 Class Linux | Linux | 3.X | general purpose CPE cpe:/o:linux:linux_kernel:3 |
则会返回类似如下的详细信息:
host.os = { { name = "Linux 2.6.32 - 3.2", classes = { { vendor = "Linux", osfamily = "Linux", osgen = "2.6.X", type = "general purpose", cpe = { "cpe:/o:linux:linux_kernel:2.6" } }, { vendor = "Linux", osfamily = "Linux", osgen = "3.X", type = "general purpose", cpe = { "cpe:/o:linux:linux_kernel:3" } } }, } } |
在表2中,我们再以host.mac_addr为例来理解Nmap API,它表示目标主机的mac地址,目标主机只有与运行nmap的主机处于同一子网的设备,这个参数才有效。
首先在cmd中进入Halcyon_IDE_v2.0.2.jar所在的目录,输入命令:java -jar Halcyon_IDE_v2.0.2.jar,启动Halcyon;接着在nmap安装目录的scripts文件夹下,创建一个名为apitest.nse的脚本,并将portrule改为hostrule(因为host.mac_addr是host表的字段,所以执行规则是hostrule);若我们想要得到的是mac_addr,所以在action中,使用return返回host.mac_addr;完整代码如图23所示:
图23 创建一个名为apitest.nse的脚本,返回host.mac_addr
保存并update script db。在cmd中输入命令:nmap --script apitest 172.22.128.1,其中目标172.22.128.1为本机网关。此时就可以看到打印出来的mac地址,这个mac地址和我们平时见到的格式不太一样。这是因为通过host.mac_addr获取的mac地址是二进制编码的,还需要将该结果转换成字符串。通过引入stdnse库,stdnse包的format_mac函数就能够将host.mac_addr转换成字符串。所以在apitest.nse脚本开头加上:local stdnse = require "stdnse",且action的return部分改为:stdnse.format_mac(host.mac_addr)。此时,完整代码如图24所示:
图23 将host.mac_addr转换成字符串
保存并update script db。在cmd中输入命令:nmap --script apitest 172.22.128.1,此时得到可读的mac地址。测试效果如图24所示:
图24 apitest.nse脚本的测试host.mac_addr转换成字符串效果
问题4:请根据上述方法测试host的字段host.directly_connected,测试对象为自己主机网关和百度,并分别回答返回结果。
6.2)理解并使用Nmap关于端口信息的API:
接下来理解Nmap关于端口信息的API。port table以与host table相同的方式传递给 NSE 服务脚本(即仅具有端口规则而不是主机规则)。 port table包含有关运行脚本的端口的信息。 虽然port table未传递给主机脚本,但仍可以通过Nmap 使用 nmap.get_port_state() 和 nmap.get_ports() 函数,发送请求获取目标上的端口状态。
Port的字段比较少,包括number,protocol,service,verison,state等。以在5.3节写的nmap脚本为例,其中规则A为:return port.protocol == "tcp" and port.number == 80 and port.service == "http" and port.state == "open"。此时,protocol标志了目标端口的类型,为tcp或udp;number是目标端口号,service是端口上运行的服务,state是端口上运行的状态。demo.nse脚本就是通过判断目标的80端口开放、并运行http服务后,通过执行action打印出this is a webserver。
与6.1一样,在apitest.nse中,将hostrule改回portrule,action返回port.protocol,port.number,port.service,port.state;如图25所示:
图25 返回port.protocol,port.number,port.service,port.state
此时在cmd输入命令:nmap --script apitest baidu.com,测试效果如图26所示:
图26 apitest.nse脚本输出端口信息效果
可以在图26中看到,端口的protocol、number、service、state打印出tcp、80、http、open与tcp、443、https、open。
6.3)理解并编写Nmap的库文件:
本节我们来学习nse中的库文件;在6.1节中,我们在格式化host.mac_addr返回的mac地址时,使用了stdnse库文件。Nmap自带的库文件都在Nmap安装目录的nselib文件夹下,在Halcyon中也列出了这些库文件,如图27所示:
图27 在Halcyon中列出的nmap库文件
接下来,在Nmap安装目录的nselib文件夹下,新建一个名为mylib.lua的库文件(可用notepad++编辑),以实现打印出某端口是否开放的功能。
首先,先声明所需的库文件"stdnse",它保存了一些用于输入的函数。然后,定义一个PrintPort函数,它需要一个port参数,将参数传递给stdnse库的format函数,用于格式化输出;最后保存一下。
接下来利用Halcyon,接着在nmap安装目录的scripts文件夹下,创建一个名为apitestlib.nse的脚本,在其中导入mylib.lua库文件,在action部分调用PrintPort函数,保存并Update Script DB。代码如图28所示:
图28 编写测试mylib.lua库文件的脚本
在cmd中输入命令:nmap --script apitestlib baidu.com,就可观察我们成功地从apitestlib 脚本文件里引用了的mylib库文件,成功执行了mylib库的PrintPort函数。运行测试效果如图29所示:
图29 nmap测试apitestlib脚本的效果
七、分析与思考:
1)在使用Nmap扫描时,TCP connect()扫描(-sT)与TCP SYN扫描(-sS)有什么区别?
2)Nmap对局域网中主机扫描与互联网扫描有什么区别?Nmap在进行扫描时,应该怎样选择相应参数?
3)如果你是网络管理员,为了防止其他人扫描你管理的服务器以获取信息,有哪些解决办法?
八、参考资料:
- https://www.nmap.org/
- https://blog.csdn.net/aspirationflow/article/details/7694274
- https://jsj.bift.edu.cn/wlaq/wlaqzs/68701.htm
- https://nmap.org/nsedoc/
- https://www.secpulse.com/archives/73804.html
- https://www.secpulse.com/archives/73817.html
- https://www.cnblogs.com/liun1994/p/7041373.html
- https://zhuanlan.zhihu.com/p/27224457
- https://jingyan.baidu.com/article/6dad5075d1dc40a123e36ea3.html
- https://github.com/s4n7h0/Halcyon-IDE
- https://nmap.org/book/nse-api.html
- https://blog.csdn.net/weixin_43745072/article/details/112256829
- https://blog.csdn.net/AspirationFlow/article/details/7797708
- https://blog.csdn.net/AspirationFlow/article/details/7853234
- https://blog.csdn.net/AspirationFlow/article/details/7884735
- https://blog.csdn.net/AspirationFlow/article/details/7910350
- https://blog.csdn.net/AspirationFlow/article/details/7932319
- https://blog.csdn.net/AspirationFlow/article/details/7956928