mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['', 'src/pentesting-cloud/azure-security/az-unauthenticated-
This commit is contained in:
+166
-43
@@ -1,22 +1,22 @@
|
||||
# Az - Enumeração Não Autenticada & Entrada Inicial
|
||||
# Az - Unauthenticated Enum & Initial Entry
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Tenant do Azure
|
||||
## Azure Tenant
|
||||
|
||||
### Enumeração do Tenant
|
||||
### Tenant Enumeration
|
||||
|
||||
Existem algumas **APIs públicas do Azure** que, apenas conhecendo o **domínio do tenant**, um atacante pode consultar para coletar mais informações sobre ele.\
|
||||
Você pode consultar diretamente a API ou usar a biblioteca PowerShell [**AADInternals**](https://github.com/Gerenios/AADInternals) (`Install-Module AADInternals`):
|
||||
There are some **public Azure APIs** that just knowing the **domain of the tenant** an attacker could query to gather more info about it.\
|
||||
You can query directly the API or use the PowerShell library [**AADInternals**](https://github.com/Gerenios/AADInternals) (`Install-Module AADInternals`):
|
||||
|
||||
- **Informações de login incluindo o ID do tenant**
|
||||
- `Get-AADIntTenantID -Domain <domain>` (API principal `login.microsoftonline.com/<domain>/.well-known/openid-configuration`)
|
||||
- **Todos os domínios válidos no tenant**
|
||||
- `Get-AADIntTenantDomains -Domain <domain>` (API principal `autodiscover-s.outlook.com/autodiscover/autodiscover.svc`)
|
||||
- **Informações de login do usuário**. Se `NameSpaceType` for `Managed`, significa que EntraID está sendo usado
|
||||
- `Get-AADIntLoginInformation -UserName <UserName>` (API principal `login.microsoftonline.com/GetUserRealm.srf?login=<UserName>`)
|
||||
- **Login information including tenant ID**
|
||||
- `Get-AADIntTenantID -Domain <domain>` (main API `login.microsoftonline.com/<domain>/.well-known/openid-configuration`)
|
||||
- **All valid doimains in the tenant**
|
||||
- `Get-AADIntTenantDomains -Domain <domain>` (main API `autodiscover-s.outlook.com/autodiscover/autodiscover.svc`)
|
||||
- **Login information of the user**. If `NameSpaceType` is `Managed`, it means EntraID is used
|
||||
- `Get-AADIntLoginInformation -UserName <UserName>` (main API `login.microsoftonline.com/GetUserRealm.srf?login=<UserName>`)
|
||||
|
||||
Você pode consultar todas as informações de um tenant do Azure com **apenas um comando do** [**AADInternals**](https://github.com/Gerenios/AADInternals):
|
||||
You can query all the information of an Azure tenant with **just one command from** [**AADInternals**](https://github.com/Gerenios/AADInternals):
|
||||
```bash
|
||||
# Doesn't work in macos because 'Resolve-DnsName' doesn't exist
|
||||
Invoke-AADIntReconAsOutsider -DomainName corp.onmicrosoft.com | Format-Table
|
||||
@@ -35,27 +35,49 @@ company.mail.onmicrosoft.com True True True Managed
|
||||
company.onmicrosoft.com True True True Managed
|
||||
int.company.com False False False Managed
|
||||
```
|
||||
É possível observar detalhes sobre o tenant's name, ID, e o "brand" name. Além disso, o status do Desktop Single Sign-On (SSO), também conhecido como [**Seamless SSO**](https://docs.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-sso), é exibido. Quando habilitado, esse recurso facilita a determinação da presença (enumeração) de um usuário específico dentro da organização alvo.
|
||||
É possível observar detalhes sobre o nome do tenant, ID e nome de "brand". Além disso, o status do Desktop Single Sign-On (SSO), também conhecido como [**Seamless SSO**](https://docs.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-sso), é exibido. Quando habilitado, esse recurso facilita a determinação da presença (enumeration) de um usuário específico dentro da organização-alvo.
|
||||
|
||||
Além disso, a saída apresenta os nomes de todos os domínios verificados associados ao tenant alvo, juntamente com seus respectivos identity types. No caso de domínios federados, o Fully Qualified Domain Name (FQDN) do identity provider em uso, tipicamente um servidor ADFS, também é divulgado. A coluna "MX" especifica se os e-mails são roteados para Exchange Online, enquanto a coluna "SPF" indica a listagem do Exchange Online como remetente de e-mail. É importante notar que a função de reconhecimento atual não faz o parsing das declarações "include" dentro dos registros SPF, o que pode resultar em falsos negativos.
|
||||
Além disso, a saída apresenta os nomes de todos os domínios verificados associados ao tenant-alvo, junto com seus respectivos tipos de identidade. No caso de domínios federados, o Fully Qualified Domain Name (FQDN) do identity provider em uso, normalmente um servidor ADFS, também é revelado. A coluna "MX" especifica se os emails são roteados para Exchange Online, enquanto a coluna "SPF" indica a listagem de Exchange Online como remetente de email. É importante observar que a função atual de reconnaissance não faz parsing das instruções "include" dentro de registros SPF, o que pode resultar em false negatives.
|
||||
|
||||
### User Enumeration
|
||||
|
||||
> [!TIP]
|
||||
> Observe que, mesmo que um tenant esteja usando vários e-mails para o mesmo usuário, o **username é único**. Isso significa que ele só vai funcionar com o domínio que o usuário associou e não com os outros domínios.
|
||||
> Observe que, mesmo que um tenant esteja usando vários emails para o mesmo usuário, o **username é único**. Isso significa que isso só funcionará com o domínio que o usuário associou e não com os outros domínios.
|
||||
|
||||
É possível **verificar se um username existe** dentro de um tenant. Isso inclui também **guest users**, cujo username está no formato:
|
||||
```
|
||||
<email>#EXT#@<tenant name>.onmicrosoft.com
|
||||
```
|
||||
O email é o endereço de e-mail do usuário onde o “@” é substituído por underscore “\_“.
|
||||
O email é o endereço de email do usuário, onde “@” é substituído por underscore “\_“.
|
||||
|
||||
Com [**AADInternals**](https://github.com/Gerenios/AADInternals), você pode verificar facilmente se o usuário existe ou não:
|
||||
```bash
|
||||
# Check does the user exist
|
||||
Invoke-AADIntUserEnumerationAsOutsider -UserName "user@company.com"
|
||||
```
|
||||
Não há conteúdo fornecido. Por favor cole o conteúdo do arquivo src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md para que eu possa traduzir.
|
||||
## Enumeração não autenticada e initial entry
|
||||
|
||||
Em Azure, se o banco de dados ou a VM estiver exposto à internet, o primeiro passo é tentar enumeração não autenticada. Dependendo da configuração, isso pode revelar informações úteis para initial entry.
|
||||
|
||||
Alguns caminhos comuns incluem:
|
||||
|
||||
- Serviços expostos com autenticação fraca ou ausente
|
||||
- Credenciais hardcoded em configurações, scripts ou backups
|
||||
- Informações sensíveis em storage público, logs ou metadados
|
||||
- Falhas de misconfiguração em APIs, endpoints ou painéis de administração
|
||||
|
||||
Durante a enumeração, procure por:
|
||||
|
||||
- nomes de hosts
|
||||
- usuários
|
||||
- subscriptions
|
||||
- resource groups
|
||||
- storage accounts
|
||||
- keys, tokens e connection strings
|
||||
|
||||
A partir daí, você pode encontrar uma superfície de ataque maior para pivot, privilege escalation ou acesso inicial.
|
||||
|
||||
Se quiser, posso também traduzir o restante do arquivo mantendo o mesmo formato.
|
||||
```
|
||||
UserName Exists
|
||||
-------- ------
|
||||
@@ -75,22 +97,22 @@ external.user_outlook.com#EXT#@company.onmicrosoft.com
|
||||
# Invoke user enumeration
|
||||
Get-Content .\users.txt | Invoke-AADIntUserEnumerationAsOutsider -Method Normal
|
||||
```
|
||||
Atualmente existem **4 diferentes métodos de enumeração** para escolher. Você pode encontrar informações em `Get-Help Invoke-AADIntUserEnumerationAsOutsider`:
|
||||
Atualmente, existem **4 different enumeration methods** para escolher. Você pode encontrar informações em `Get-Help Invoke-AADIntUserEnumerationAsOutsider`:
|
||||
|
||||
Ele suporta os seguintes métodos de enumeração: Normal, Login, Autologon, and RST2.
|
||||
It supports following enumeration methods: Normal, Login, Autologon, and RST2.
|
||||
|
||||
- O **Normal** method parece atualmente funcionar com todos os tenants. Anteriormente exigia Desktop SSO (aka Seamless SSO) estar habilitado para pelo menos um domínio.
|
||||
- O método **Normal** parece funcionar atualmente com todos os tenants. Antes, ele exigia que Desktop SSO (aka Seamless SSO) estivesse habilitado para pelo menos um domínio.
|
||||
|
||||
- O **Login** method funciona com qualquer tenant, mas enumeration queries serão registradas no Azure AD sign-in log como failed login events!
|
||||
- O método **Login** funciona com qualquer tenant, mas as queries de enumeration serão registradas no Azure AD sign-in log como failed login events!
|
||||
|
||||
- O **Autologon** method aparentemente não funciona mais com todos os tenants. Provavelmente requer que DesktopSSO ou directory sync esteja habilitado.
|
||||
- O método **Autologon** não parece mais funcionar com todos os tenants. Provavelmente requer que DesktopSSO ou directory sync esteja habilitado.
|
||||
|
||||
|
||||
Após descobrir os nomes de usuário válidos você pode obter **info about a user** com:
|
||||
After discovering the valid usernames you can get **info about a user** with:
|
||||
```bash
|
||||
Get-AADIntLoginInformation -UserName root@corp.onmicrosoft.com
|
||||
```
|
||||
O script [**o365spray**](https://github.com/0xZDH/o365spray) também permite descobrir **se um e-mail é válido**.
|
||||
O script [**o365spray**](https://github.com/0xZDH/o365spray) também permite descobrir **se um email é válido**.
|
||||
```bash
|
||||
git clone https://github.com/0xZDH/o365spray
|
||||
cd o365spray
|
||||
@@ -101,15 +123,15 @@ python3 ./o365spray.py --enum -d carloshacktricks.onmicrosoft.com -u carlos
|
||||
# Check a list of emails
|
||||
python3 ./o365spray.py --enum -d carloshacktricks.onmicrosoft.com -U /tmp/users.txt
|
||||
```
|
||||
**Enumeração de Usuários via Microsoft Teams**
|
||||
**User Enumeration via Microsoft Teams**
|
||||
|
||||
Outra boa fonte de informação é o Microsoft Teams.
|
||||
|
||||
A API do Microsoft Teams permite buscar usuários. Em particular os endpoints de "user search" **externalsearchv3** e **searchUsers** podem ser usados para solicitar informações gerais sobre contas de usuário inscritas no Teams.
|
||||
A API do Microsoft Teams permite pesquisar users. Em particular, os endpoints de "user search" **externalsearchv3** e **searchUsers** podem ser usados para solicitar informação geral sobre contas de users inscritas no Teams.
|
||||
|
||||
Dependendo da resposta da API, é possível distinguir entre usuários inexistentes e usuários existentes que possuem uma assinatura válida do Teams.
|
||||
Dependendo da resposta da API, é possível distinguir entre users inexistentes e users existentes que têm uma subscription válida do Teams.
|
||||
|
||||
O script [**TeamsEnum**](https://github.com/lucidra-security/TeamsEnum) pode ser usado para validar um conjunto de usernames contra a Teams API, mas é necessário acesso a uma conta com acesso ao Teams para utilizá-lo.
|
||||
O script [**TeamsEnum**](https://github.com/lucidra-security/TeamsEnum) pode ser usado para validar um conjunto dado de usernames contra a API do Teams, mas você precisa de acesso a um user com acesso ao Teams para usá-lo.
|
||||
```bash
|
||||
# Install
|
||||
git clone https://github.com/lucidra-security/TeamsEnum
|
||||
@@ -119,13 +141,41 @@ python3 -m pip install -r requirements.txt
|
||||
# Login and ask for password
|
||||
python3 ./TeamsEnum.py -a password -u <username> -f inputlist.txt -o teamsenum-output.json
|
||||
```
|
||||
Por favor, forneça o conteúdo do arquivo src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md para que eu possa traduzi-lo.
|
||||
# Enumeração Não Autenticada e Entrada Inicial
|
||||
|
||||
## Graphman
|
||||
|
||||
Se você tiver acesso ao **Graphman**, pode ser usado para explorar o **Azure AD Graph** e executar consultas sem necessidade de autenticação forte em alguns cenários legados.
|
||||
|
||||
## Azure AD Enumeration
|
||||
|
||||
Em alguns ambientes, é possível fazer enumeração de usuários, grupos e aplicativos usando endpoints públicos ou respostas de erro que vazam informação.
|
||||
|
||||
## Initial Access
|
||||
|
||||
A entrada inicial pode acontecer por meio de configurações incorretas em serviços expostos, segredos vazados, credenciais fracas ou aplicações com permissões excessivas.
|
||||
|
||||
## Resource Enumeration
|
||||
|
||||
Depois de obter algum nível de acesso, faça enumeração de recursos para identificar subscriptions, resource groups, storage accounts, Key Vaults e outras superfícies relevantes.
|
||||
|
||||
## Common Misconfigurations
|
||||
|
||||
- permissões excessivas em **Azure AD App Registrations**
|
||||
- **Storage Accounts** públicos
|
||||
- **Key Vaults** com políticas de acesso mal configuradas
|
||||
- **Managed Identities** com privilégios elevados
|
||||
- endpoints expostos sem autenticação adequada
|
||||
|
||||
## Next Steps
|
||||
|
||||
Com a enumeração inicial concluída, o próximo passo geralmente é validar impacto, buscar escalation of privileges e mapear caminhos de movimento lateral no ambiente.
|
||||
```
|
||||
[-] 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)
|
||||
```
|
||||
Além disso, é possível enumerar informações de disponibilidade sobre usuários existentes a seguir:
|
||||
Além disso, é possível enumerar informações de disponibilidade sobre usuários existentes, como as seguintes:
|
||||
|
||||
- Available
|
||||
- Away
|
||||
@@ -133,11 +183,47 @@ Além disso, é possível enumerar informações de disponibilidade sobre usuár
|
||||
- Busy
|
||||
- Offline
|
||||
|
||||
Se uma **mensagem de ausência** estiver configurada, também é possível recuperar a mensagem usando TeamsEnum. Se um arquivo de saída foi especificado, as mensagens de ausência são armazenadas automaticamente no arquivo JSON:
|
||||
Se uma **out-of-office message** estiver configurada, também é possível recuperar a mensagem usando TeamsEnum. Se um arquivo de saída foi especificado, as out-of-office messages são automaticamente armazenadas dentro do arquivo JSON:
|
||||
```
|
||||
jq . teamsenum-output.json
|
||||
```
|
||||
Por favor, cole o conteúdo do arquivo src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md que você quer que eu traduza para o português.
|
||||
{#include ./banners/hacktricks-training.md}
|
||||
|
||||
## Initial Entry
|
||||
|
||||
This section focuses on how to gain an initial foothold in Azure when you do not have valid credentials or authenticated access.
|
||||
|
||||
### Common Initial Access Vectors
|
||||
|
||||
- Publicly exposed services
|
||||
- Misconfigured storage accounts
|
||||
- Overly permissive SAS tokens
|
||||
- Leaked credentials
|
||||
- OAuth consent abuse
|
||||
- Azure Active Directory misconfigurations
|
||||
|
||||
### Unauthenticated Enumeration
|
||||
|
||||
Before attempting initial access, it is often possible to enumerate public Azure resources without authentication.
|
||||
|
||||
Common targets include:
|
||||
|
||||
- Storage accounts
|
||||
- Blob containers
|
||||
- Public files
|
||||
- Metadata exposed through misconfigurations
|
||||
|
||||
### Typical Techniques
|
||||
|
||||
- Brute-force or guess storage account names
|
||||
- Check for publicly accessible blobs and containers
|
||||
- Enumerate subdomains tied to Azure services
|
||||
- Search for leaked keys, tokens, or credentials
|
||||
- Identify exposed management interfaces
|
||||
|
||||
### Notes
|
||||
|
||||
Many Azure services are not directly accessible without authentication, but misconfigurations can still reveal useful information or allow limited access.
|
||||
```json
|
||||
{
|
||||
"email": "user2@domain",
|
||||
@@ -192,9 +278,9 @@ Por favor, cole o conteúdo do arquivo src/pentesting-cloud/azure-security/az-un
|
||||
az-password-spraying.md
|
||||
{{#endref}}
|
||||
|
||||
## Serviços do Azure usando domínios
|
||||
## Azure Services using domains
|
||||
|
||||
Também é possível tentar encontrar **serviços do Azure expostos** em subdomínios comuns do Azure como os documentados neste [post:
|
||||
Também é possível tentar encontrar **Azure services exposed** em subdomínios comuns do Azure, como os documentados neste [post:
|
||||
](https://www.netspi.com/blog/technical-blog/cloud-penetration-testing/enumerating-azure-services/)
|
||||
|
||||
- App Services: `azurewebsites.net`
|
||||
@@ -216,32 +302,69 @@ Também é possível tentar encontrar **serviços do Azure expostos** em subdom
|
||||
- Search Appliance: `search.windows.net`
|
||||
- API Services: `azure-api.net`
|
||||
|
||||
You can use a method from [**MicroBurst**](https://github.com/NetSPI/MicroBurst) for such goal. This function will search the base domain name (and a few permutations) in several **azure domains:**
|
||||
Você pode usar um método do [**MicroBust**](https://github.com/NetSPI/MicroBurst) para esse objetivo. Essa função vai pesquisar o nome de domínio base (e algumas permutações) em vários **azure domains:**
|
||||
```bash
|
||||
Import-Module .\MicroBurst\MicroBurst.psm1 -Verbose
|
||||
Invoke-EnumerateAzureSubDomains -Base corp -Verbose
|
||||
```
|
||||
## Phishing
|
||||
|
||||
- [**Common Phishing**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html) for credentials or via [OAuth Apps](az-oauth-apps-phishing.md)
|
||||
- [**Common Phishing**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html) para credenciais ou via [OAuth Apps](az-oauth-apps-phishing.md)
|
||||
- [**Device Code Authentication** Phishing](az-device-code-authentication-phishing.md)
|
||||
|
||||
### Exchange Online direct-to-tenant SMTP spoofing
|
||||
|
||||
Se um alvo usa **Exchange Online / EOP** mas seu público **MX** aponta para um **third-party mail gateway** (Mimecast, Proofpoint, Mailgun, on-prem filtering, etc.), teste se o Exchange Online ainda aceita mail enviado **diretamente** para o host do tenant `*.mail.protection.outlook.com`. Nesse caso, um attacker pode **bypassar o external gateway** e enviar mail de phishing diretamente para o EOP.
|
||||
|
||||
Isso é útil para **initial access / phishing** porque a entrega ainda pode acontecer mesmo quando o sender spoofado falha em **SPF**, **DKIM** e **DMARC**. Para senders internos, o Outlook também pode resolver o sender spoofado como um employee real, aumentando a confiança.
|
||||
|
||||
**Recon / triage:**
|
||||
```bash
|
||||
# If the MX already points to Microsoft, this specific path is usually not the issue
|
||||
dig +short MX target.com
|
||||
|
||||
# Typical vulnerable pattern: the MX points to a third-party filter
|
||||
# 10 mxb.eu.mailgun.org.
|
||||
```
|
||||
O host direto de EOP geralmente é o nome `mail.protection.outlook.com` específico do tenant (por exemplo `target-com.mail.protection.outlook.com`). Você pode frequentemente recuperar o padrão de nomenclatura do tenant a partir da enumeração pública de tenant/domínio e de respostas autodiscover relacionadas ao Exchange.
|
||||
|
||||
**Minimal PoC:**
|
||||
```powershell
|
||||
Send-MailMessage -SmtpServer target-com.mail.protection.outlook.com -To victim@target.com -From ceo@target.com -Subject "Urgent" -Body "Review the attached payment change" -BodyAsHTML
|
||||
```
|
||||
**Sinais de validação:**
|
||||
- Mail é enviado para `*.mail.protection.outlook.com` em vez do public MX host.
|
||||
- A mensagem é entregue mesmo que os headers mostrem falhas como `spf=fail`, `dkim=none`, `dmarc=fail` ou `compauth=none`.
|
||||
- Um secure Partner connector normalmente rejeita a etapa `RCPT TO` com `5.7.51 TenantInboundAttribution; Rejecting.`
|
||||
|
||||
**Notas técnicas / defensive hunting:**
|
||||
- **Enhanced Filtering for Connectors** ajuda o Exchange a atribuir corretamente o sender original, mas, por si só, **não** é a boundary que bloqueia a entrega direta ao tenant.
|
||||
- A Microsoft documenta dois controles práticos ao usar um external MX na frente do Exchange Online:
|
||||
- Crie um **Partner inbound connector** com `SenderDomains *` e `RestrictDomainsToCertificate` ou `RestrictDomainsToIPAddresses` para que apenas o gateway aprovado possa entregar ao tenant.
|
||||
- Crie uma **priority 0 transport rule** que coloque mail inbound em quarantine, a menos que o sender IP pertença aos ranges aprovados do gateway **ou** `X-MS-Exchange-Organization-AuthAs` contenha `Internal`.
|
||||
- Faça hunting de mail em que **Received** mostra `*.mail.protection.outlook.com` como o primeiro Microsoft hop, mas os sender-authentication headers ainda mostram **SPF/DKIM/DMARC failures**.
|
||||
- Se o target ainda permitir **Direct Send**, desabilitá-lo reduz principalmente spoofing de sender **interno**; isso não substitui a mitigação por connector / transport-rule para spoofing **externo** arbitrário.
|
||||
|
||||
## Filesystem Credentials
|
||||
|
||||
O **`az cli`** armazena muitas informações interessantes dentro de **`<HOME>/.Azure`**:
|
||||
- **`azureProfile.json`** contém informações sobre usuários que fizeram login no passado
|
||||
- **`clouds.config`** contém informações sobre assinaturas
|
||||
- **`service_principal_entries.json`** contém aplicações **credentials** (tenant id, clients and secret)
|
||||
- **`msal_token_cache.json`** contém **access tokens and refresh tokens**
|
||||
O **`az cli`** armazena muita informação interessante dentro de **`<HOME>/.Azure`**:
|
||||
- **`azureProfile.json`** contém info sobre users logados no passado
|
||||
- **`clouds.config`** contém info sobre subscriptions
|
||||
- **`service_principal_entries.json`** contém applications **credentials** (tenant id, clients e secret)
|
||||
- **`msal_token_cache.json`** contém **access tokens e refresh tokens**
|
||||
|
||||
Observe que no macOS e linux esses arquivos são armazenados **sem proteção**, em texto não criptografado.
|
||||
Note que em macOS e linux esses files são **unprotected** armazenados em clear text.
|
||||
|
||||
|
||||
|
||||
## Referências
|
||||
## References
|
||||
|
||||
- [https://aadinternals.com/post/just-looking/](https://aadinternals.com/post/just-looking/)
|
||||
- [https://www.securesystems.de/blog/a-fresh-look-at-user-enumeration-in-microsoft-teams/](https://www.securesystems.de/blog/a-fresh-look-at-user-enumeration-in-microsoft-teams/)
|
||||
- [https://www.netspi.com/blog/technical-blog/cloud-penetration-testing/enumerating-azure-services/](https://www.netspi.com/blog/technical-blog/cloud-penetration-testing/enumerating-azure-services/)
|
||||
- [https://labs.infoguard.ch/posts/ghost-sender/](https://labs.infoguard.ch/posts/ghost-sender/)
|
||||
- [https://learn.microsoft.com/en-us/exchange/mail-flow-best-practices/manage-mail-flow-using-third-party-cloud](https://learn.microsoft.com/en-us/exchange/mail-flow-best-practices/manage-mail-flow-using-third-party-cloud)
|
||||
- [https://learn.microsoft.com/en-us/defender-office-365/anti-phishing-policies-about](https://learn.microsoft.com/en-us/defender-office-365/anti-phishing-policies-about)
|
||||
- [https://techcommunity.microsoft.com/blog/exchange/direct-send-vs-sending-directly-to-an-exchange-online-tenant/4439865](https://techcommunity.microsoft.com/blog/exchange/direct-send-vs-sending-directly-to-an-exchange-online-tenant/4439865)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user