原文链接:http://www.labofapenetrationtester.com/2018/10/deploy-deception.html

欺骗一直是我感兴趣的。作为军事历史的学生,我一直对它在战争中的实施着迷,并将欺骗视为有效且通常成本低的东西!
几年前,我参与了几个月的企业欺骗解决方案的开发和广泛测试(从红色团队的角度来看)。在2018年初,在我的一个Active Directory课程中,一名学生询问并最终聘请我(谢谢!)测试他们正在评估的三种欺骗产品。

通过这些经验,我意识到Active Directory(AD)中欺骗的大部分焦点都集中在honeyuser / honeytokens / honeycredentials上。像dcept等工具很受欢迎。如果我们想要在攻击的域枚举阶段利用欺骗来检测攻击者,那么AD的自由和开源欺骗解决方案就会缺乏。这是我们即将解决的问题。

此外,为了增加兴趣和社区参与,我在几周前(2018年10月)在BruCON夫妇的一个关于“在Active Directory中伪造欺骗信任”的演讲。幻灯片和视频都在这篇文章的最后。

什么是欺骗?

欺骗是一种心理学游戏。长期以来,红色团队和对手一直用它来对付毫无戒心的用户,以欺骗他们打开恶意附件或点击链接。进入AD环境后,攻击者会尝试使用其他用户的凭据,并通过其他计算机与现有日志和流量混合使用。

蓝队通过提供对手正在寻找的服务,特权或信息来利用欺骗。在心理学和技术控制方面,恕我直言,蓝队在欺骗方面占据上风。

攻击者的心理

有一种被称为虚幻优势的心理状态,适用于大多数对手和红队。他们认为自己比蓝队更聪明,更有天赋。与此同时,追求最低悬而未决的果实的倾向,以及迅速获得DA特权的冲动,使它们成为欺骗的富有成效的目标。

所以,防御者向对手展示他们想要看到的东西。例如,密码永不过期的用户或服务器2003计算机。

期望的诱饵属性

直接从我的幻灯片中获取诱饵所需的属性:

  1. 应该是足够可取的,以便攻击者枚举对象。
  2. 应该很容易配置。
  3. 端点上不需要更改配置。
  4. 不应该触发正常的管理活动。
    上面的4号是最难实现的。如果我们的目标是枚举,我们必须使攻击者活动或工具脱颖而出,以避免误报。

部署欺骗

那么,我们如何才能通过AD中的内置工具实现上述所需的属性?我们可以使用组策略来设置AD Access日志记录,配置“有趣”对象并过滤掉误报!

AD Access所需的组策略设置是Windows设置| 安全设置| 高级审计策略配置| DS Access - 审核目录服务访问

无论何时访问AD对象,上述设置都会产生安全事件4662。需要在对象级别配置日志记录。对于该配置,我们需要修改对象的SACL并添加相关的ACE。

让我们看一下AddAuditAccessObjectAce函数来理解ACE:

因此,作为一个例子,我们可以在“每个人”使用'ReadProperty''成功'时完全针对用户设置审计。这有助于检测针对该用户的任何枚举。

介绍Deploy-Deception

可以使用GUI完成这些设置。也可以使用PowerShell和ActiveDirectory模块,使它自动化执行。

为了自动设置具有有趣属性和鲜为人知的属性的诱饵对象以避免误报,我编写了Deploy-Deception。它是一个PowerShell模块,它利用ActiveDirectory模块轻松高效地部署诱饵。您可以在这里找到Github上的Deploy-Deception:https://github.com/samratashok/Deploy-Deception

让我们看一下在攻击的不同阶段设置不同类型的对象诱饵。

枚举 - 诱饵用户对象

用户对象是具有攻击者感兴趣的某些用户属性的最有趣的对象:

我们可以使用Deplou-UserDeception函数来创建一个诱饵用户。
让我们创建一个诱饵用户'usermanager',其密码永不过期,每当每个人都读取其任何属性时都会记录4662:

PS C:\> Import-Module C:\Deploy-Deception\Deploy-Deception.psd1
PS C:\> Create-DecoyUser -UserFirstName user -UserLastName manager -Password Pass@123 | Deploy-UserDeception -UserFlag PasswordNeverExpires -Verbose

请注意,在域中创建了实际的用户对象。现在,由于我们在任何人都读取用户usermanager的任何属性时启用了默认日志记录,因此上述内容会被频繁触发。这意味着即使有人只是列出域中的所有用户,也会记录4662。这意味着,这个诱饵将触发所有可能的使用(正常或其他)的记录,如

网络用户/域

Get-WmiObject -Class Win32_UserAccount

Get-ADUser -Filter *(MS ActiveDirectory模块)

Get-NetUser(PowerView)

查找用户,联系人和组GUI

那看起来不太好吧?因此,我们需要找到将攻击者枚举与正常活动区分开来的方法。攻击者枚举工具有一些非常有趣的东西,他们喜欢尽可能多地提取对象的信息(这是有道理的,因为你不想重复连接到域控制器)。现在,这意味着如果我们为一个不常见的属性启用审计,那么很有可能(是的,可能性 - 请与我分享您的误报:P)只有激进的枚举才会触发日志记录。有很多这样的属性,看看所有属性的列表。我曾经喜欢这样的属性 - x500uniqueIdentifier(GUID d07da11f-8a3d-42b6-b0aa-76c962be719a)

因此,我们现在删除我们之前添加的ACE并添加一个新的,仅在读取x500uniqueIdentifier属性时触发日志记录:

PS C:\> Deploy-UserDeception -DecoySamAccountName usermanager -RemoveAuditing $true -Verbose
PS C:\> Deploy-UserDeception -DecoySamAccountName usermanager -UserFlag PasswordNeverExpires -GUID d07da11f-8a3d-42b6-b0aa-76c962be719a -Verbose

此审核仅由PowerView(或其他工具,如ADExplorer)等工具触发,这些工具可获取对象的所有属性。虽然不完美,但这是一个巨大的进步。

如果您有足够的信心,您的监控或管理工具都不会读取用户对象的所有属性,则还可以设置对SPN等属性的审计,只有在读取SPN(或所有属性)时才会触发记录

PS C:\> Create-DecoyUser -UserFirstName user -UserLastName manager-spn -Password Pass@123 | Deploy-UserDeception -SPN 'MSSQLSvc/dc' -GUID f3a64788-5306-11d1-a9c5-0000f80367c1 -Verbose

还有太多的日志?以下命令仅在读取诱饵用户对象的DACL(或所有属性)时记录4662日志:

PS C:\> Create-DecoyUser -UserFirstName user -UserLastName manager-control -Password Pass@123 | Deploy-UserDeception -UserFlag AllowReversiblePasswordEncryption -Right ReadControl -Verbose

枚举 - 诱饵计算机对象

虽然通常建议使用实际的计算机或虚拟机来作为诱饵计算机对象,以避免诱饵的识别。但是,可以在域中创建计算机对象作为诱饵,而不需要映射到该对象的实际计算机。

攻击者感兴趣的一些计算机对象属性:

上面的命令创建一个启用了无约束委托的诱饵计算机,并且只要读取x500uniqueIdentifier或计算机的所有属性,就会记录4662。

PS C:\> Deploy-ComputerDeception -DecoyComputerName comp1 -PropertyFlag TrustedForDelegation -Right ReadControl -Verbose

以上命令使用现有计算机对象并设置无约束委派。只要读取DACL或计算机的所有属性,就会触发记录。

我们还可以使用DCShadow来修改看似DC的计算机对象。我在这里简单地谈到这一点,以后会为有关此特定主题讲解更多信息。

枚举 - 诱饵组对象

我们还可以部署诱饵组对象。哪些属性对对手有意义?

团体提供有趣的机会。我们可以使诱饵用户成为诱饵组的成员,从而创建“分层”诱饵。这样,当列出诱饵组的成员资格以及列出诱饵用户的属性时,我们都会获取日志。我们很快就会看到如何使用Logon限制来避免错误使用用户的权限。

因此,在下面的命令中,我们创建一个诱饵用户'dnsmanager',其密码永远不会在读取隐藏属性时记录,创建名为“Forest Admins”的组,使dnsmanager成为林管理员组的一部分并添加林管理员组成内置的dnsadmins组。读取组的成员资格时会触发记录。我们可以使用Deploy-GroupDeception:

PS C:\> Create-DecoyUser -UserFirstName dns -UserLastName manager -Password Pass@123 | Deploy-UserDeception -UserFlag PasswordNeverExpires -GUID d07da11f-8a3d-42b6-b0aa-76c962be719a -Verbose 

PS C:\> Create-DecoyGroup -GroupName 'Forest Admins' -Verbose | Deploy-GroupDeception -AddMembers dnsmanager -AddToGroup dnsadmins -GUID bc0ac240-79a9-11d0-9020-00c04fc2d4cf -Verbose

枚举和横向移动 - 特权诱饵用户对象

我们还可以部署高权限用户诱饵来定位枚举和横向移动。我们可以创建具有高权限的诱饵用户,例如域管理员的成员资格,执行DCSync的权限等。

现在,拥有如此高权限的诱饵用户的风险是,如果这样的用户受到攻击,其权限可能被滥用。为避免这种情况,我们可以使用几种保护措施:

有了这些知识,让我们使用Deploy-PrivilegedUserDeception创建高权限用户诱饵:

PS C:\> Create-DecoyUser  -UserFirstName dec -UserLastName da -Password Pass@123 | Deploy-PrivilegedUserDeception -Technique DomainAdminsMemebership -Protection DenyLogon -Right ReadControl -Verbose


上面的命令创建了一个名为“decda”的用户,该用户是Domain Admins的一部分,但无法登录到任何计算机。任何列出用户的DACL或列出所有属性的尝试都会产生4662日志。

对于横向移动部分,我们使用了DenyLogon保护。这意味着即使用户的密码或散列或密钥被泄露,也无法重用这些凭据。要在使用此类用户的凭据时获取有意义的日志,我们必须启用以下组策略:
配置| Windows设置|安全设置|高级审核策略配置|审核策略|帐户登录| 审核Kerberos身份验证服务| 失败

这就是GUI中失败的样子。

并在域控制器上记录4768(故障)。在像OverPass-The-Hash这样的攻击的情况下,不会返回这样的详细错误。

另一种选择是将LogonWorkstation设置为不存在的计算机。使用类似于与您的实际机器类似的工作站的名称总是有意义的。

PS C:\> Create-DecoyUser  -UserFirstName dec -UserLastName da -Password Pass@123 | Deploy-PrivilegedUserDeception-Technique DCSyncRights -Protection LogonWorkStation revert-webserver1 -Right ReadControl -Verbose

上面的命令创建一个诱饵用户调用'decda',为其提供DCSync权限并将LogonWorkStation设置为不存在的机器。如果用户凭据被泄露并重新使用,则错误与DenyLogon的情况完全相同,并记录4768。

这两种保护措施也可以与非DA帐户一起使用。恕我直言,这比在内存中留下错误的密码或哈希更好(这是一种众所周知的技术)。

这种技术总是可以与其他技术相结合。例如,在定位横向移动时,让对手“检索”诱饵用户的凭据的一种更简单的方法是使用Deploy-UserDeception的-PasswordInDescription选项。然后,我们可以使该用户成为特权用户并使用上面讨论的保护之一:

PS C:\> Create-DecoyUser  -UserFirstName new -UserLastName da -Password Pass@123 | Deploy-UserDeception -PasswordInDescription 'The new password is Pass@123' -Verbose

PS C:\> Deploy-PrivilegedUserDeception -DecoySamAccountName newda -Technique DomainAdminsMemebership -Protection DenyLogon -Right ReadControl -Verbose

上面的第一个命令创建一个名为'newda'的新用户,将字符串'新密码为Pass @ 123'设置为其描述。第二个命令使newda成为域管理员组的成员,拒绝登录用户并在读取DACL或newda的所有属性时配置审计。

从描述中获取密码不需要特殊工具!记住瞄准'寻找最低限度的果实'

在讨论具有特权的用户时,还有另一个必须讨论的重要方面。这是关于ACL的。对其他用户具有有趣权限的用户始终对攻击者感兴趣。(旁注:确保ACL审核是安全方法的一部分 - 包括域对象和其他 安全性)。

我们可以使用Deploy-SlaveDeception来部署诱饵用户,其中一个用户拥有对其他用户的FullControl / GenericAll权限。这对于攻击者来说很有意思,并且可以用于针对枚举和横向移动阶段。

要定位枚举,可以使用以下命令:

PS C:\> Create-DecoyUser -UserFirstName master -UserLastName user -Password Pass@123 | Deploy-UserDeception -GUID d07da11f-8a3d-42b6-b0aa-76c962be719a -Verbose

PS C:\> Create-DecoyUser -UserFirstName slave -UserLastName user -Password Pass@123 | Deploy-UserDeception -GUID d07da11f-8a3d-42b6-b0aa-76c962be719a -Verbose

PS C:\> Deploy-SlaveDeception -SlaveSamAccountName slaveuser -DecoySamAccountName masteruser -Verbose

上面的第一个和第二个命令分别创建用户masteruser和slaveuser,并仅在读取一个模糊属性时设置审计。第三个命令为slaveuser提供masteruser GenericAll权限。任何枚举或扫描域中有趣ACL的对手都会触发4662对象。

为了横向移动,我们可以为masteruser使用PasswordInDescription选项,或者使用其他常用方法保留其凭据而不进行任何保护。我们已经准备好让masteruser受到危害和使用(请在执行此操作之前仔细考虑风险)。如果masteruser修改了slaveuser的DACL,除了使用honeytoken / honeyuser时触发的任何其他警报,我们还会获得4662日志:

PS C:\> Create-DecoyUser -UserFirstName master -UserLastName user -Password Pass@123

PS C:\> Create-DecoyUser -UserFirstName slave -UserLastName user -Password Pass@123

PS C:\> Deploy-SlaveDeception -SlaveSamAccountName slaveuser -DecoySamAccountName masteruser -Verbose

PS C:\> Deploy-UserDeception -DecoySamAccountName slaveuser -Principal masteruser -Right WriteDacl -Verbose

在上面的命令中,仅当masteruser更改slaveuser的DACL时才会记录4662。

枚举 - 域和森林信任对象

当然要自动化!虽然有很多有趣的可能性!例如,我们可以拥有一个诱饵森林信任(我们称之为蓝森林),我们可以允许枚举用户,计算机和组,但拒绝访问任何其他资源。这可以通过使用选择性身份验证设置森林信任来实现,其中“允许身份验证”仅在DC上设置,但不在其他计算机上设置。这将允许攻击者枚举对象,但是他们无法访问其他计算机上的资源。

Red Team Revenge - 识别欺骗

那么红队如何识别哪些物体是实际的,哪些是陷阱或诱饵?正如我在帖子开头提到的那样,我在过去几个月里测试了多种欺骗解决方案。有多个企业解决方案使用可以通过查看其属性来识别的对象。一些这样的属性:

最好的方法是将对象与众所周知的“好”对象进行匹配。例如,如果您怀疑域中所有计算机列表中的计算机对象是诱饵,请将其与域控制器的属性或您自己的立足点计算机的属性进行比较。实际的dc始终列在logonserver环境变量中。对于用户对象,内置DA始终具有RID 500.将其属性与您怀疑为诱饵的用户对象进行比较。

对于依赖于不在域中创建实际对象的多个解决方案,使用WMI检索域信息显示正确的对象而不是伪造的对象。

Red Team Revenge - 避免欺骗

蓝队 - 避免识别

如果使用实际的域对象,则识别的机会减少。例如,未映射到实际计算机的计算机对象具有更高的识别机会。

对于用户诱饵,如前所述,具有至少一个登录会话减少了识别的机会。我们来试试吧。

我们来看一个简单的例子。有一个众所周知的欺骗识别脚本叫做HoneypotBuster。让我们创建一个诱饵DA并运行脚本:

我们的诱饵DA被检测到了。Deploy-PrivilegedUserDeception有一个选项'CreateLogon'。此参数使用诱饵DA用户启动和停止DC上的计算器,该用户填充用户的登录相关属性。要使用此参数,必须将LogonWorkstation保护设置为执行模块的DC。您可以随时更改用户的行为。

PS C:\> Create-DecoyUser -UserFirstName dec -UserLastName da -Password Pass@123 | Deploy-PrivilegedUserDeception -Technique DomainAdminsMemebership -Protection LogonWorkStation -LogonWorkStation revert-dc -CreateLogon -Verbose

上面的命令创建decda,使其成为Domain Admins组的成员,限制登录到DC并创建登录会话(也在DC上创建配置文件)。现在,如果我们运行Honeypot Buster

honey,FakeRank或该工具的信心降至50.蜜罐破坏者使用对象的排名系统,如果用户的logonCount小于6,那么总会有一些信心是伪造的。如果我们通过启动带有6次凭据的进程将logonCount设置为6以进行decda,则它将不会显示在此工具中。

PS C:\> Create-DecoyUser -UserFirstName dec -UserLastName da -Password Pass@123 | Deploy-PrivilegedUserDeception -Technique DomainAdminsMemebership -Protection LogonWorkStation -LogonWorkStation revert-dc -CreateLogon -logonCount 6 -Verbose


现在,如果我们运行HoneypotBuster,则不会检测到decda!但是,这将针对这一特定工具,我们不要认为这个适用于所有的情况。

未来的工作和社区参与

如果您在域环境中部署诱饵并与我共享结果,那将会很棒。这样,即使您无法为代码做出贡献,您也将极大地帮助该项目。

OU对象即将到来,不应该花费很长时间才能包含在工具中。我也在致力于自动化域和森林信任诱饵。我还有超级雄心勃勃的计划,使用虚拟化实时部署诱饵森林和计算机!

源链接

Hacking more

...