在域中获取域管理员权限的多种方法及一些缓解措施

翻译:hac425

前言



现在攻击者有很多方法可以用来获取域管理员权限.这篇文章的目的是介绍一些当前较受欢迎的方式。这里所介绍的技术的基本点是攻击者已经拿到了一台域中的服务器,并已获得域用户凭据。

对大多数企业来说有一个不幸的现实:对于一个攻击者来说,从域用户权限提升到域管理员权限往往不需要太长的时间。为什么会这样呢?本文会介绍其中使用的一些技巧.

现在针对一个企业,组织的攻击越来越频繁通过一些钓鱼手法来开始.比如通过发送大量的钓鱼邮件给目标的成员来在目标网络的机器上执行代码.一旦攻击者能够在企业内部网络中执行代码,攻击者要做的第一件事情就是尽可能的搜集有用的信息,比如网络拓扑,一些配置文件,账号密码等等,然后使用这些信息来提升权限,维持访问,最后当然是最重要的一步,获取目标的核心数据.虽然具体到每次的攻击可能其攻击的具体细节不同,但是他们一般都会有以下的几个大步骤:

恶意代码执行(通过钓鱼, web方面的攻击等等)

内网信息探测

窃取内网用户的凭据

利用各种信息,exploit等进行提权

拿到数据并外传

持久化(植入后门)

本文所介绍的各种域渗透的技巧都是基于攻击者已经拿到了一台域内服务器的权限,这是因为在现代的网络环境下这一般都不是太困难.

在域中获取域管理员权限的多种方法



1.在SYSVOL和组策略首选项中保存的密码

该方法是最简单的,因为不需要特别的“黑客”的工具。所有攻击者所要做的就是打开Windows资源管理器 然后 搜索域SYSVOL DFS共享的XML文件。大多数时候,下面的XML文件将包含凭据:groups.xml,scheduledtasks.xml,与services.xml。

SYSVOL是域中针对所有已被认证过的具有读取权限的用户的共享。SYSVOL包含登录脚本,组策略的数据,以及其他需要被域控制器访问的数据。所有域组策略都存储在这里: \\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\

当创建一个新的GPP时,有在SYSVOL中会创建一个相关联的XML文件 ,其内容为相关配置数据并且如果为GPP提供了密码,密码会被AES-256 加密.但是微软在MSDN上发布的AES加密密钥可用于解密它。又由于在受信任域中的任何域用户或用户都对SYSVOL具有读取访问权限,所以任何域中的用户都可以在SYSVOL共享搜索包含“cpassword”的XML文件.一个示例文件如下:

攻击者在访问该XML文件后,可以使用AES私钥来解密文件中加密的GPP密码。除此之外,我们可以使用PowerSploit其中的一个功能 Get-GPPPassword来解密那个被加密的秘钥。下面是一个使用示例

当然其他文件类型也可能会包含一些密码(通常是明文),如VBS和bat文件中,这就需要我们做好信息搜集了.

你可能会认为只要打上一个防止管理员在Group Policy Preferences中放置凭证的补丁就能够解决这个问题,但我在对客户进行安全评估的时候依旧会在SYSVOL中搜索凭据。

解决方案:

在每台计算机上安装KB2962486补丁来管理管理GPO以防止在Group Policy Preferences中放置新的凭据

删除现有的包含SYSVOL密码的GPP XML文件。

不要将密码保存在所有经过验证的用户都可以访问的文件中。

关于这种攻击的的更多信息可以在这篇文章中找到: Finding Passwords in SYSVOL & Exploiting Group Policy Preferences.

2.在没打补丁的域控制器上利用MS14-068漏洞

虽然这个漏洞已经过了很久了,但是这并不意味着所有的域控制器都已经打上了补丁。大多数组织在该漏洞爆出来后都为域控制器打上了补丁但这并不意味着之后的每一台新的的域控制器也都被打上了补丁. 感谢Gavin Millard(@gmillard在Twitter上),我们有一个比较好的图来诠释这个漏洞

简单地说,利用MS14-068漏洞,只需不到5分钟就能使攻击者重新写一个有效的Kerberos TGT身份验证票据,使他们可以直接获取域管理员权限。如上图所示,只要在一张普通的机票上写上“飞行员”,然后在登机,你就可以享受飞行员的待遇了......

首次公布的针对MS14-068漏洞的exploit 在漏洞补丁被发布的第二个星期被发布.该exploit由Sylvain Monné (@BiDOrD) 编写,exploit的名字为PyKEK。PyKEK是一个可以运行在任何支持python并且能与域控制器交互的机器上的python脚本.脚本执行完毕后会生成一个ccache文件。然后使用Mimikatz把刚才PyKEK生成的ccache文件注入TGT到内存中,攻击者就可以拿到一个可以被当做域管理员的票据了!使用这张票据,攻击者就可以访问域控制器上的admin$ 共享了.下面是整个利用过程.

缓解:

打上补丁.

利用MS14-068漏洞的过程:

1.以标准用户申请一个没有PAC的Kerberos TGT身份验证票证,域控制器会返回一个无PAC的TGT.

2.不使用key生成一个伪造的PAC,所以产生的PAC会使用当前域用户的密码数据来进行MD5而不是HMAC_MD5“签名”。

3.发送 PAC-less TGT和伪造的PAC给域控制器,作为TGS服务票据请求的数据的一部分。

4.之后域控制器会被这个迷惑,它会丢弃由用户发送的PAC-less TGT,并且创建一个新的TGT然后在它自己的授权数据中插入伪造的PAC ,接着发送该TGT给用户。

5.这个拥有伪造PAC的TGT使用户对于一个有漏洞的DC而言成为了一个域管理员。

Benjamin Delpy(Mimikatz的作者)写了一个MS14-068漏洞利用工具他的名称为Kekeo。这个工具的效果比pykek要好.下面是一个示范>

缓解措施:

1.运行DCPromo进程前检测是否安装了KB3011780补丁.使用powershell快速检测:get-hotfix 3011780

2.此外,实施自动化的过程,确保强制安装严重漏洞的补丁

3.离线破解 Kerberos TGS Service Ticket( Kerberoast)

Kerberoast可以作为一种从Active Directory中以一个普通用户权限提取服务帐户凭据的有效的方法,而且不需要发送任何数据包到目标系统。因为人们往往会使用弱口令,因而这种攻击是有效的。

Note: 使用这种方式,不需要提升权限,也不会向目标发送流量.

针对这种攻击的详细情况:https://files.sans.org/summit/hackfest2014/PDFs/Kicking%20the%20Guard%20Dog%20of%20Hades%20-%20Attacking%20Microsoft%20Kerberos%20%20-%20Tim%20Medin%281%29.pdf

工具:https://github.com/nidem/kerberoast

缓解措施:

1.域管理员的账号不能以任何形式在普通主机上登录.

2.所以机器的本地管理员账号密码要复杂,随机.

访问域数据库文件(NTDS.DIT)

域数据库文件(NTDS.DIT)包含了域中所有对象的信息,其中我们最为关注的是其中还包含了所有用户的账号和密码的hash值.NTDS.DIT文件只有能登录到域控制器上的用户才有可能访问得到.显然保护该文件非常重要.

下面是一些不需要域管理员权限来获取NTDS.DIT文件的方法.

找NTDS.DIT文件备份位置

在成员服务器上找NTDS.DIT文件

拿到了虚拟机宿主机的权限,把虚拟机中的域控制器中的 NTDS.DIT拷贝出来

域中有很多的组,其中能登录到域控制器的组有

Enterprise Admins (member of the domain Administrators group in every domain in the forest)

Domain Admins (member of the domain Administrators group)

Administrators

Backup Operators

Account Operators

Print Operators

这意味着如果我们能拿到一个位于这些组中的用户的账号密码我们就可以登录到域控制器了.

缓解措施:

限制能登录到域控制器的用户和组

限制拥有完全域权限的用户

保护NTDS.DIT文件.

当我们有了域管理员权限之后......



当我们拿到域管理员权限后,要做的最重要的事就是 dump所有域用户的凭证.

使用mimikatz dump所有域凭据

mimikatz可以在域控制器上dump所有域凭据

Dump LSASS memory with Mimikatz (拿到域管理员凭据)

mimikatz可以被用来dump LSASS然后从LSASS.dmp 文件中导出所有已经登录了的账号密码.在域控制器中这通常会得到域管理员的凭据.

使用ntdsutil拿到NTDS.dit文件

从NTDS.dit文件中dump用户凭据

一旦攻击者从注册表中拿到了 system hive(reg save hklm\system c:\system.hive)和NTDS.dit文件,就意味着他拿到了域中的所有凭据.

时间: 2024-12-26 00:35:47

在域中获取域管理员权限的多种方法及一些缓解措施的相关文章

window8.1中用户的管理员权限的提升方法

1.使用命令netplwiz 2.点击确定后出现如下所示的内容,选择待修改的用户 3.然后点击属性,出现如图的内容 在上图中选中管理员左侧的单选按钮便可以了,将当前用户提升为管理员账户.

SpringMVC从Request域中获取数据

SpringMVC从Request域中获取数据的三种方式 SpringMVC环境自行搭建, 约定存在如下目录和文件:/WEB-INF/pages/success.jsp 方式一:传入Model对象 前端界面 <a href="${pageContext.request.ContextPath}/项目名/getRequestValue">获取request域中的值</a>${value} 后台代码 @RequestMapping("/getRequest

win10 系统怎么获取最高管理员权限删除文件

http://www.xitongcity.com/jiaocheng/win8_content_3473.html 很多win8.1系统用户在对磁盘文件进行清理时,经常会遇到“文件夹访问被拒绝,您需要权限来执行此操作,您需要来自管理员Administrator的权限才能对此文件夹进行更改”,但是明明是使用管理员身份运行系统的,要怎么解决这个问题呢?在遇到这个问题时我们可以获取最高管理员权限来执行删除更改操作,下面小编以win8.1 64位系统为例跟大家介绍具体的操作方法. 系统获取最高管理员权

indows 2008 r2/做了SPS2007---2013后,发现添加原来域中的域组添加不上

根据上次的网络包的分析, 我们在AD中找到了wtc-beijing-it的组, 不过在SharePoint日志中我们没有发现搜索成功的记录. - SearchResultEntry: CN=WTC-BeiJing-IT,OU=Groups,OU=BeiJing,OU=WTC User,OU=WesTrac China,DC=westrac,DC=com,DC=cn + ObjectName: CN=WTC-BeiJing-IT,OU=Groups,OU=BeiJing,OU=WTC User,O

win10里面怎么获取最高管理员权限

Windows10专业版 1,按下win+R键唤出“运行”窗口,输入gpedit.msc. 2,这时打开了组策略编辑器,在左边找到“计算机配置-Windows 设置”,再进入右边“安全设置”,如图. 3,进入“本地策略”,如图. 4,进入“安全选项”,如图. 5,向下滑,找到“用户账户控制:以管理员批准模式运行所有管理员”和“用户账户控制:用于内置管理员账户的管理员批准模式”这两项,如图. 6,分别选中并点击鼠标右键,再点击“属性”,进入配置窗口,将这两项都分别设置为“已禁用”,再点击“确定”,

Java中获取键盘输入值的三种方法

Java中获取键盘输入值的三种方法     Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!Java没有提供这样的函数也不代表遇到这种情况我们就束手无策,请你看以下三种解决方法吧: 以下将列出几种方法: 方法一:从控制台接收一个字符,然后将其打印出来 import java.io.*; public static void main(String [] args) throws

linux c程序中获取shell脚本输出的实现方法

linux c程序中获取shell脚本输出的实现方法 1. 前言Unix界有一句名言:“一行shell脚本胜过万行C程序”,虽然这句话有些夸张,但不可否认的是,借助脚本确实能够极大的简化一些编程工作.比如实现一个ping程序来测试网络的连通性,实现ping函数需要写上200~300行代码,为什么不能直接调用系统的ping命令呢?通常在程序中通过 system函数来调用shell命令.但是,system函数仅返回命令是否执行成功,而我们可能需要获得shell命令在控制台上输出的结果.例如,执行外部

java小知识点(一)---Java中获取键盘输入值的三种方法

Java中获取键盘输入值的三种方法   程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!Java没有提供这样的函数也不代表遇到这种情况我们就束手无策,请你看以下三种解决方法吧:   以下将列出几种方法:   方法一:从控制台接收一个字符,然后将其打印出来   publicstatic void main(String [] args) throws IOException{   Sys

驱动程序中获取当前进程的进程名的方法

在内核驱动程序中,可以通过PsGetCurrentProcess函数来获取当前调用驱动的进程的EPROCESS结构的地址.很多文章都说在EPROCESS结构的0x174偏移处存放着进程名.这里提供另外一种方法来获取这个进程名.思路如下:驱动程序的加载函数DriverEntry是运行在System进程中的.通过PsGetCurrentProcess可以获取System进程的内核EPROCESS结构的地址,然后从该地址开始寻找"System"字符串.找到后,便是EPROCESS的进程名存放