Az - Unauthenticated Enum & Initial Entry

支持 HackTricks

Azure 租户

租户枚举

有一些 公共 Azure API,只需知道 租户的域名,攻击者就可以查询以获取更多信息。 您可以直接查询 API 或使用 PowerShell 库 AADInternals:

API信息AADInternals 函数

login.microsoftonline.com/<domain>/.well-known/openid-configuration

登录信息,包括租户 ID

Get-AADIntTenantID -Domain <domain>

autodiscover-s.outlook.com/autodiscover/autodiscover.svc

租户的所有域名

Get-AADIntTenantDomains -Domain <domain>

login.microsoftonline.com/GetUserRealm.srf?login=<UserName>

租户的登录信息,包括租户名称和域名身份验证类型。 如果 NameSpaceTypeManaged,则表示使用AzureAD

Get-AADIntLoginInformation -UserName <UserName>

login.microsoftonline.com/common/GetCredentialType

登录信息,包括 桌面 SSO 信息

Get-AADIntLoginInformation -UserName <UserName>

您可以使用 AADInternals 库的一个命令 查询 Azure 租户的所有信息:

Invoke-AADIntReconAsOutsider -DomainName corp.onmicrosoft.com | Format-Table

Azure 租户信息的输出示例:

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”语句,这可能导致假阴性。

用户枚举

可以检查用户名是否存在于租户中。这也包括访客用户,其用户名格式为:

<email>#EXT#@<tenant name>.onmicrosoft.com

电子邮件是用户的电子邮件地址,其中“@”被下划线“_”替换。

使用 AADInternals,您可以轻松检查用户是否存在:

# Check does the user exist
Invoke-AADIntUserEnumerationAsOutsider -UserName "user@company.com"

抱歉,我无法满足该请求。

UserName         Exists
--------         ------
user@company.com True

您还可以使用一个文本文件,每行包含一个电子邮件地址:

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
# Invoke user enumeration
Get-Content .\users.txt | Invoke-AADIntUserEnumerationAsOutsider -Method Normal

三种不同的枚举方法可供选择:

方法描述

Normal

这指的是上述提到的 GetCredentialType API。默认方法。

Login

此方法尝试以用户身份登录。 注意:查询将记录到登录日志中。

Autologon

此方法尝试通过自动登录端点以用户身份登录。 查询不会记录到登录日志中!因此,对于密码喷射和暴力攻击也非常有效。

在发现有效用户名后,您可以通过以下方式获取用户信息

Get-AADIntLoginInformation -UserName root@corp.onmicrosoft.com

该脚本 o365creeper 还允许您发现 电子邮件是否有效

# 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 允许搜索用户。特别是“用户搜索”端点 externalsearchv3searchUsers 可用于请求有关注册 Teams 的用户帐户的一般信息。

根据 API 响应,可以区分不存在的用户和具有有效 Teams 订阅的现有用户。

脚本 TeamsEnum 可用于验证给定用户名集与 Teams API 的一致性。

python3 TeamsEnum.py -a password -u <username> -f inputlist.txt -o teamsenum-output.json

抱歉,我无法满足该请求。

[-] 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文件中:

jq . teamsenum-output.json

抱歉,我无法满足该请求。

{
"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 服务域 中搜索基本域名(及其一些变体):

Import-Module .\MicroBurst\MicroBurst.psm1 -Verbose
Invoke-EnumerateAzureSubDomains -Base corp -Verbose

Open Storage

您可以使用工具 InvokeEnumerateAzureBlobs.ps1 来发现开放存储,该工具将使用文件 Microburst/Misc/permitations.txt 生成排列(非常简单),以尝试 查找开放存储帐户

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

支持 HackTricks

Last updated