Nmap网络安全审计(六)

Nmap脚本引擎NSE

NSE中的脚本采用Lua语言编写。NSE设计出来是为了提供Nmap的灵活性,式版的NSE包含14个大类的脚本,总数达500多个,这些脚本的功能包括对各种网络口令强度的审计,对各种服务器安全性配置的审计,对各种服务器漏洞的审计等。

NSE脚本的运行

我们使用NSE脚本测试一台主机,我们来看一下这条指令使用的参数,-O进行操作系统检测,-sV对目标系统的服务进行检测,这里我们没有使用脚本的参数所有使用的是默认脚本,默认脚本会使用-sC参数。默认脚本一般不会对目标系统造成危害,但是其他的一些脚本可能会引起安全防御设备的报警。

nmap -sV -sC -O scanme.Nmap.org

Nmap脚本引擎NSE

默认分类中的脚本:

  • banner.NSE:这是一个用来收集目标banner信息的脚本,它会连接到目标的一个开放的TCP端口,然后输出任何在5秒内接受到的信息。(banner信息有欢迎或表示身份的含义)
  • broadcast-ping.NSE:这个脚本使用广播ping来发现网络中的主机。
  • dns-recursion.NSE:这个脚本用来检测一个DNS服务器是否允许第三方的查询,允许的话可能会导致服务器受到DNS放大GJ。
  • upnp-info.NSE:这个脚本尝试通过UPnP服务来提取系统信息。
  • firewalk.NSE:这个脚本通过使用IP协议中的TTL过期机制来完成对防火墙设备的发现。

NSE中脚本的分类

  • auth:这个分类中包含的都是负责处理鉴权证书的脚本(绕开权限)
  • broadcast:这个分类中包含的都是在局域网内嗅探更多服务开启状况,如DNS、SQL Server等服务
  • brute:这些都是针对常见的应用,如HTTP、SSH、FTP等破解密码的脚本
  • default:这是使用-sC或-A参数扫描时候的脚本,提供基础的扫描能力
  • discovery:对网络进行更多的信息搜集,如SMB枚举,SNMP查询等
  • dos:用来发起拒绝服务GJ的脚本
  • exploit:用来完成对目标系统安全漏洞的脚本
  • external:针对第三方服务的脚本
  • fuzzer:进行模糊测试的脚本,发送异常的包到目标主机,探测出潜在的漏洞
  • intrusive:可能会引起目标系统崩溃或对目标网络造成极大负担的脚本,这类脚本很容易被防火墙或IPS发现
  • malware:用来检测恶意软件的脚本
  • safe:在任何情况下都是安全无害的脚本
  • version:负责增强服务于版本扫描功能的脚本
  • vuln:负责检查目标主机是否有常见漏洞
    这就是NSE的14个分类的脚本

NSE脚本的选择

我们可以在命令行中输入 --script 选项来进行对脚本的选择,--script 后跟脚本的名字、脚本的种类或脚本存放的路径,或一个包含多个脚本的目录...
我这里是随便用了一个,检测主机是否有常见漏洞(直接用脚本的分类名称作为参数的话,扫描的时候是调用该分类下所有脚本去扫描)

nmap -script vuln 192.168.126.139

Nmap脚本引擎NSE

可以使用http-methods方法来枚举目标web服务器上所运行的服务

nmap -p 80,443 --script http-methods www.*****.com

Nmap脚本引擎NSE
从检测的结果中可以看到,目标服务器支持的方法有GET、HEAD、POST、OPTIONS 、TRACE。

另外也可以同时使用多个分类中的脚本去扫描

nmap --script exploit,malware 192.168.126.139

Nmap脚本引擎NSE

使用指定路径来执行NSE脚本,脚本在nmap目录下,/nmap/scripts/xxx.nse

nmap --script D:/Nmap/scripts/banner.nse 192.168.126.139

Nmap脚本引擎NSE

如果你会编写扫描脚本的话,可以在创建完成后放到文件夹里,如果这个文件夹有多个脚本,你可以将路径只写到目录,这样会使用这个目录下所有脚本进行扫描,也可以将路径指定到文件里的脚本,这样是使用单个脚本进行扫描。

使用运算符来选择使用的脚本:

使用除 exploit分类以外的脚本进行扫描

nmap --script "not exploit" 192.168.126.139

使用除intrusive、dos、exploit分类以外的脚本进行扫描

nmap --script "not (intrusive or dos or exploit)"  192.168.126.139

只使用safe和vuln进行扫描

nmap --script "safe and vuln" 192.168.126.139

此外,NSE中也支持通配符 * ,对一台运行SNMP服务的计算机进行检测,使用所有与SNMP相关的脚本

nmap --script "snmp-*" 192.168.126.139

这些分类和运算符可以结合操作

nmap --script "ftp-* and not(intrusive)" 192.168.126.139

如何向NSE脚本传递参数

Nmap中使用 --script-args 来指定NSE脚本运行时的参数

nmap -p80 --script http-methods www.***.com

当执行这个脚本的时候,Nmap会向目标服务器发送数据包,Nmap的数据包中包含的默认客户端信息。
Nmap脚本引擎NSE

这种客户端一般会被安全机制拦截,我们可以使用 --script-args 修改客户端信息为Mozilla 50

nmap -p 80 --script http-methods --script-args http.useragent="Mozilla 50" www.***.com

Nmap脚本引擎NSE

Nmap脚本引擎NSE

NSE脚本调试

如果想看nmap扫描时候的具体操作,这样可能会使操作过程更加清晰,在之前我们也讲过可以使用 --script-trace来查看

nmap -p 80 --script-trace --script http-methods --script-args "http.useragent=Mozilla 50" www.***.com

Nmap脚本引擎NSE

也可以使用 -d [ 1-9 ] 切换调试模式,使用-d参数1-9,数字越大输出信息越详细

nmap -d3 --script-trace --script http-methods www.***.com

Nmap脚本引擎NSE

NSE常见脚本的应用

Nmap的基本功能只包括主机发现,端口扫描,操作系统和服务检测功能,而NSE进一步实现了大量高级功能。

信息搜集类脚本

NSE中大量脚本实现了这个功能,这些脚本使用不同的技术完成了对目标的各种信息的搜集。利用脚本 http-methods查看目标服务器所支持的HTTP方法。
基于脚本http-methods的审计目的,web服务器需要支持HTTP方法,才能正确提供HTTP服务,常见的有以下几种:

  • GET:请求指定的页面信息
  • HEAD:获取报头
  • POST:向指定资源提交数据进行处理请求
  • PUT:从客户端向服务器传送的数据取代指定的文档内容
  • DELETE:请求服务器删除指定的页面
  • OPTIONS:允许客户端查看服务器的性能
  • TRACE:回显服务器收到的请求

    目前HTTP的TRACE、CONNECT、PUT、DELETE方法可能是web服务器潜在的安全风险,尤其是服务器支持TRACE方法,有可能会遭到XSTGJ。将恶意代码嵌入一台已经被控制的主机的web文件中,当访问者浏览时恶意代码在浏览器执行,然后访问者的cookie、HTTP基本验证等信息会被传到已被控制的主机,同时传送Trace请求给目标服务器,导致cookie欺骗或中间人GJ。

高级主机发现类脚本

  1. 脚本broadcast-ping.NSE

    审计目的:发现本地网络中的活跃主机
    审计方法:这个脚本向整个本地网络中所有IP地址发送广播包,以自己所在网络为目标
    审计命令:

    nmap --script broadcast-ping

    审计结果:
    Nmap脚本引擎NSE

  2. 脚本 targets-sniffer

    审计目的:发现本地网络中的活跃主机
    审计方法:这个脚本会对你的本地网络进行嗅探,然后发现网络中的所有主机,以自己所在网络为目标
    审计命令:

    nmap -sL --script=target-sniffer -e xxx

    审计结果:
    Nmap脚本引擎NSE
    可以使用-e监听网卡设备

密码审计类脚本

网络上提供的服务一般都具有一定的认证措施,目前应用最为广泛的认证措施还是用户名和密码。这种认证措施的优势在于简单易行,而缺点在于很多用户意识不到密码强度的重要性,一般会选择一些比较简单容易记住的密码,而这些密码很容易被猜出来,因此网络的管理者需要一个有效的工具来对自己网络中各种服务的密码强度进行审计。

  1. 脚本mysql-brute.NSE

    审计目的:发现网络中弱口令的MySQL数据库

    审计方法:脚本mysql-brute.NSE的审计方法很简单,在Nmap中有两个数据文件,是一些常见的用户名和密码,这个脚本将这两个文件进行组合然后尝试登陆。

    审计命令:

    nmap -p 3306 -packet-trace --script mysql-brute 192.168.126.141

    这里是没有破解出密码,破解的成功率取决于字典的大小哈,自己感兴趣的可以试试,github上也有爆破字典可以使用的。
    Nmap脚本引擎NSE

2.脚本smtp-brute.NSE

smtp-brute.NSE脚本用来检测目标邮件服务器SMTP服务的密码是否合规。

审计目的:邮件服务器中经常会存储一些非常重要的信息,而对用户进行认证的方式就是用户和密码,这里存在一些简单的账户名和密码,他们很容易成为被GJ的对象,因此需要先对服务器进行弱口令检查。.

审计方法:对密码审计的方法采用穷解的方式。这个脚本可以对SMTP密码的穷解,它支持LOGIN、PLAIN、CRAM-MD5、DIGEST-MD5、NTLM四种登录方式。默认情况下,smtp-brute.NSE会使用/NSElib/data/username.lst文件中的内容作为用户名,/NSElib/data/passwords.lst 文件中的内容作为密码。

审计命令:

nmap -p 25 --script smtp-brute 192.168.0.1

审计结果:我这里没有搭建smtp就不做演示了,有条件的可以自己试试

漏洞扫描类脚本

NSE脚本扩充漏洞扫描的功能,利用这些脚本,就可以使用Nmap对目标进行扫描。

1.脚本 http-slowloris.NSE

slowloris是一种GJ方法,原理是以极低的速度向服务器发送http请求。由于web server对于并发的连接数都有一个上限值,如果恶意连接不释放,那么web server的所有连接都会被恶意连接占用,导致拒绝服务。

审计方法:使用http-slowloris脚本,向目标发送连接,并保持这个连接,构造了一个畸形的http请求,是一个不完整的http请求。
 审计命令:
nmap -p 80 --script http-slowloris --max-parallelism 300 www.xxx.com

审计结果:这里不做实验,不要随意对网站进行测试
审计拓展:我们可以通过调整http-slowloris.send_interval参数来改变扫描的过程。这个参数可以指定发送http header datas的间隔,默认为100,我们来修改一下

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

http-slowloris.timeklimit参数指定Dos持续运行时间,默认为30分钟,我们修改为10分钟

nmap -p 80 --script http-slowloris --script-args http-slowloris.timelimit=10m www.***.com

http-slowloris.runforever参数对指定目标一直发动DoSGJ。默认值为false

nmap -p 80 --script http-slowloris --script-args http-slowloris.runforever www.***.com

Nmap中还有一个http-slowloris-check.NSE的脚本,这个脚本不会发起DoS GJ,而是检测目标是否具备抵抗DOS GJ的能力。

nmap -p 80 --script http-slowloris-check www.***.com