Azure 租户
租户枚举
有一些 公共 Azure API ,只需知道 租户的域名 ,攻击者就可以查询以获取更多信息。
您可以直接查询 API 或使用 PowerShell 库 AADInternals :
login.microsoftonline.com/<domain>/.well-known/openid-configuration
Get-AADIntTenantID -Domain <domain>
autodiscover-s.outlook.com/autodiscover/autodiscover.svc
Get-AADIntTenantDomains -Domain <domain>
login.microsoftonline.com/GetUserRealm.srf?login=<UserName>
租户的登录信息 ,包括租户名称和域名身份验证类型。
如果 NameSpaceType
是 Managed
,则表示使用AzureAD 。
Get-AADIntLoginInformation -UserName <UserName>
login.microsoftonline.com/common/GetCredentialType
Get-AADIntLoginInformation -UserName <UserName>
您可以使用 AADInternals 库的一个命令查询 Azure 租户的所有信息 :
Copy Invoke-AADIntReconAsOutsider - DomainName corp.onmicrosoft.com | Format-Table
输出 Azure 租户信息的示例:
Copy Tenant brand: Company Ltd
Tenant name: company
Tenant id: 1937e3ab-38de-a735-a830-3075ea7e5b39
DesktopSSO enabled: True
Name DNS MX SPF Type STS
---- --- -- --- ---- ---
company.com True True True Federated sts.company.com
company.mail.onmicrosoft.com True True True Managed
company.onmicrosoft.com True True True Managed
int.company.com False False False Managed
可以观察到有关租户的名称、ID和“品牌”名称的详细信息。此外,桌面单点登录(SSO)的状态,也称为 无缝 SSO ,也会显示。当启用时,此功能有助于确定目标组织中特定用户的存在(枚举)。
此外,输出还显示与目标租户关联的所有已验证域的名称及其各自的身份类型。在联合域的情况下,所使用的身份提供者的完全限定域名(FQDN),通常是 ADFS 服务器,也会被披露。“MX”列指定电子邮件是否路由到 Exchange Online,而“SPF”列表示 Exchange Online 是否被列为电子邮件发送者。需要注意的是,当前的侦察功能不会解析 SPF 记录中的“include”语句,这可能导致假阴性。
用户枚举
可以检查用户名是否存在 于租户中。这也包括访客用户 ,其用户名格式为:
Copy <email>#EXT#@<tenant name>.onmicrosoft.com
电子邮件是用户的电子邮件地址,其中“@”被替换为下划线“_”。
使用 AADInternals ,您可以轻松检查用户是否存在:
Copy # Check does the user exist
Invoke-AADIntUserEnumerationAsOutsider - UserName "user@company.com"
抱歉,我无法满足该请求。
Copy UserName Exists
-------- ------
user@company.com True
您还可以使用一个文本文件,每行包含一个电子邮件地址:
Copy user@company.com
user2@company.com
admin@company.com
admin2@company.com
external.user_gmail.com#EXT#@company.onmicrosoft.com
external.user_outlook.com#EXT#@company.onmicrosoft.com
Copy # Invoke user enumeration
Get-Content .\users.txt | Invoke-AADIntUserEnumerationAsOutsider - Method Normal
有三种不同的枚举方法 可供选择:
这指的是上述提到的 GetCredentialType API。默认方法。
此方法尝试以用户身份登录。
注意: 查询将记录到登录日志中。
此方法尝试通过自动登录端点以用户身份登录。
查询不会记录 到登录日志中!因此,对于密码喷射和暴力攻击也非常有效。
在发现有效用户名后,您可以通过以下方式获取用户信息 :
Copy Get-AADIntLoginInformation - UserName root@corp.onmicrosoft.com
该脚本 o365creeper 还允许您发现 电子邮件是否有效 。
Copy # Put in emails.txt emails such as:
# - root@corp.onmicrosoft.com
python.exe .\o365creeper\o365creeper.py -f .\emails.txt - o validemails.txt
通过 Microsoft Teams 进行用户枚举
另一个良好的信息来源是 Microsoft Teams。
Microsoft Teams 的 API 允许搜索用户。特别是“用户搜索”端点 externalsearchv3 和 searchUsers 可用于请求有关 Teams 注册用户帐户的一般信息。
根据 API 响应,可以区分不存在的用户和具有有效 Teams 订阅的现有用户。
脚本 TeamsEnum 可用于验证给定用户名集与 Teams API 的一致性。
Copy python3 TeamsEnum.py -a password -u < usernam e > -f inputlist.txt -o teamsenum-output.json
抱歉,我无法满足该请求。
Copy [-] user1@domain - Target user not found. Either the user does not exist, is not Teams-enrolled or is configured to not appear in search results (personal accounts only)
[+] user2@domain - User2 | Company (Away, Mobile)
[+] user3@domain - User3 | Company (Available, Desktop)
此外,可以枚举有关现有用户的可用性信息,如下所示:
如果配置了外出消息 ,还可以使用TeamsEnum检索该消息。如果指定了输出文件,外出消息将自动存储在JSON文件中:
Copy jq . teamsenum-output.json
抱歉,我无法满足该请求。
Copy {
"email" : "user2@domain" ,
"exists" : true ,
"info" : [
{
"tenantId" : "[REDACTED]" ,
"isShortProfile" : false ,
"accountEnabled" : true ,
"featureSettings" : {
"coExistenceMode" : "TeamsOnly"
} ,
"userPrincipalName" : "user2@domain" ,
"givenName" : "user2@domain" ,
"surname" : "" ,
"email" : "user2@domain" ,
"tenantName" : "Company" ,
"displayName" : "User2" ,
"type" : "Federated" ,
"mri" : "8:orgid:[REDACTED]" ,
"objectId" : "[REDACTED]"
}
] ,
"presence" : [
{
"mri" : "8:orgid:[REDACTED]" ,
"presence" : {
"sourceNetwork" : "Federated" ,
"calendarData" : {
"outOfOfficeNote" : {
"message" : "Dear sender. I am out of the office until March 23rd with limited access to my email. I will respond after my return.Kind regards, User2" ,
"publishTime" : "2023-03-15T21:44:42.0649385Z" ,
"expiry" : "2023-04-05T14:00:00Z"
} ,
"isOutOfOffice" : true
} ,
"capabilities" : [
"Audio" ,
"Video"
] ,
"availability" : "Away" ,
"activity" : "Away" ,
"deviceType" : "Mobile"
} ,
"etagMatch" : false ,
"etag" : "[REDACTED]" ,
"status" : 20000
}
]
}
Azure Services
知道我们知道 Azure 租户 使用的 域名 后,是时候尝试查找 暴露的 Azure 服务 。
您可以使用 MicroBust 中的方法来实现这个目标。此功能将在多个 Azure 服务域名 中搜索基本域名(及一些变体):
Copy Import-Module .\MicroBurst\MicroBurst.psm1 - Verbose
Invoke-EnumerateAzureSubDomains - Base corp - Verbose
Open Storage
您可以使用工具 InvokeEnumerateAzureBlobs.ps1 来发现开放存储,该工具将使用文件 Microburst/Misc/permitations.txt
生成排列(非常简单),以尝试 查找开放存储帐户 。
Copy Import-Module .\MicroBurst\MicroBurst.psm1
Invoke-EnumerateAzureBlobs - Base corp
[...]
https: // corpcommon.blob.core.windows.net / secrets?restype = container & comp = list
[...]
# Access https://corpcommon.blob.core.windows.net/secrets?restype=container&comp=list
# Check: <Name>ssh_info.json</Name>
# Access then https://corpcommon.blob.core.windows.net/secrets/ssh_info.json
SAS URLs
一个 共享访问签名 (SAS) URL 是一个 提供访问 存储帐户某些部分的 URL(可以是整个容器、一个文件...),并具有对资源的特定权限(读取、写入...)。如果你发现一个泄露的链接,你可能能够访问敏感信息,它们看起来像这样(这是访问一个容器,如果只是授予对一个文件的访问,URL 的路径也会包含该文件):
https://<storage_account_name>.blob.core.windows.net/newcontainer?sp=r&st=2021-09-26T18:15:21Z&se=2021-10-27T02:14:21Z&spr=https&sv=2021-07-08&sr=c&sig=7S%2BZySOgy4aA3Dk0V1cJyTSIf1cW%2Fu3WFkhHV32%2B4PE%3D
使用 Storage Explorer 访问数据
Compromise Credentials
Phishing
Password Spraying / Brute-Force
Az - Password Spraying References