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:
+104
-34
@@ -6,17 +6,17 @@
|
||||
|
||||
### Tenant Enumeration
|
||||
|
||||
Es gibt einige **public Azure APIs**, bei denen ein Angreifer allein durch Kenntnis der **Tenant-Domain** weitere Informationen darüber abfragen kann.
|
||||
Es gibt einige **public Azure APIs**, bei denen ein Angreifer, nur durch Kenntnis der **Domain des Tenants**, weitere Informationen darüber abfragen kann.\
|
||||
Du kannst die API direkt abfragen oder die PowerShell-Bibliothek [**AADInternals**](https://github.com/Gerenios/AADInternals) verwenden (`Install-Module AADInternals`):
|
||||
|
||||
- **Login-Informationen inklusive Tenant ID**
|
||||
- **Login-Informationen einschließlich Tenant ID**
|
||||
- `Get-AADIntTenantID -Domain <domain>` (main API `login.microsoftonline.com/<domain>/.well-known/openid-configuration`)
|
||||
- **Alle gültigen Domains im Tenant**
|
||||
- `Get-AADIntTenantDomains -Domain <domain>` (main API `autodiscover-s.outlook.com/autodiscover/autodiscover.svc`)
|
||||
- **Login-Informationen des Users**. Wenn `NameSpaceType` `Managed` ist, bedeutet das, dass EntraID verwendet wird
|
||||
- `Get-AADIntLoginInformation -UserName <UserName>` (main API `login.microsoftonline.com/GetUserRealm.srf?login=<UserName>`)
|
||||
|
||||
Du kannst alle Informationen eines Azure-Tenants mit **nur einem Befehl aus** [**AADInternals**](https://github.com/Gerenios/AADInternals) abfragen:
|
||||
Du kannst alle Informationen eines Azure Tenants mit **nur einem Befehl von** [**AADInternals**](https://github.com/Gerenios/AADInternals) abfragen:
|
||||
```bash
|
||||
# Doesn't work in macos because 'Resolve-DnsName' doesn't exist
|
||||
Invoke-AADIntReconAsOutsider -DomainName corp.onmicrosoft.com | Format-Table
|
||||
@@ -35,33 +35,35 @@ company.mail.onmicrosoft.com True True True Managed
|
||||
company.onmicrosoft.com True True True Managed
|
||||
int.company.com False False False Managed
|
||||
```
|
||||
Es ist möglich, Details zum Tenant-Namen, zur Tenant-ID und zum „Brand“-Namen zu sehen. Zusätzlich wird der Status von Desktop Single Sign-On (SSO), auch bekannt als [**Seamless SSO**](https://docs.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-sso), angezeigt. Wenn aktiviert, erleichtert diese Funktion die Feststellung (enumeration), ob ein bestimmter Benutzer in der Zielorganisation vorhanden ist.
|
||||
Es ist möglich, Details über den Namen des Tenants, die ID und den „brand“ Namen zu beobachten. Zusätzlich wird der Status von Desktop Single Sign-On (SSO), auch bekannt als [**Seamless SSO**](https://docs.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-sso), angezeigt. Wenn diese Funktion aktiviert ist, erleichtert sie die Feststellung der Präsenz (enumeration) eines bestimmten Users innerhalb der Zielorganisation.
|
||||
|
||||
Außerdem zeigt die Ausgabe die Namen aller verifizierten Domains des Ziel-Tenants sowie deren jeweilige Identity-Typen. Bei föderierten Domains wird außerdem der Fully Qualified Domain Name (FQDN) des verwendeten Identity Providers, typischerweise ein ADFS-Server, offengelegt. Die Spalte "MX" gibt an, ob E-Mails an Exchange Online geleitet werden, während die Spalte "SPF" angibt, ob Exchange Online als E-Mail-Sender aufgeführt ist. Es ist wichtig zu beachten, dass die aktuelle reconnaissance-Funktion die "include"-Anweisungen in SPF-Records nicht parst, was zu false negatives führen kann.
|
||||
Außerdem zeigt die Ausgabe die Namen aller verifizierten Domains, die dem Ziel-Tenant zugeordnet sind, zusammen mit ihren jeweiligen identity types. Im Fall von federated domains wird auch der Fully Qualified Domain Name (FQDN) des verwendeten identity provider, typischerweise eines ADFS servers, offengelegt. Die „MX“-Spalte gibt an, ob emails an Exchange Online weitergeleitet werden, während die „SPF“-Spalte die Nennung von Exchange Online als email sender kennzeichnet. Es ist wichtig zu beachten, dass die aktuelle reconnaissance function die „include“-Statements innerhalb von SPF records nicht parst, was zu false negatives führen kann.
|
||||
|
||||
### User Enumeration
|
||||
|
||||
> [!TIP]
|
||||
> Beachte, dass selbst wenn ein Tenant mehrere E-Mails für denselben Benutzer verwendet, der **username ist eindeutig**. Das bedeutet, dass es nur mit der Domain funktioniert, die der Nutzer zugeordnet hat, und nicht mit anderen Domains.
|
||||
> Beachte, dass selbst wenn ein Tenant mehrere emails für denselben User verwendet, der **username eindeutig** ist. Das bedeutet, dass es nur mit der Domain funktioniert, die der User verknüpft hat, und nicht mit den anderen domains.
|
||||
|
||||
Es ist möglich zu **prüfen, ob ein username innerhalb eines Tenants existiert**. Dies schließt auch **guest users** ein, deren username im Format:
|
||||
Es ist möglich zu **prüfen, ob ein username innerhalb eines Tenants existiert**. Dies umfasst auch **guest users**, deren username im folgenden Format vorliegt:
|
||||
```
|
||||
<email>#EXT#@<tenant name>.onmicrosoft.com
|
||||
```
|
||||
Die E-Mail ist die E-Mail-Adresse des Benutzers, wobei das „@“ durch einen Unterstrich „\_“ ersetzt ist.
|
||||
|
||||
Mit [**AADInternals**](https://github.com/Gerenios/AADInternals) können Sie leicht prüfen, ob der Benutzer existiert oder nicht:
|
||||
Mit [**AADInternals**](https://github.com/Gerenios/AADInternals) kannst du einfach prüfen, ob der Benutzer existiert oder nicht:
|
||||
```bash
|
||||
# Check does the user exist
|
||||
Invoke-AADIntUserEnumerationAsOutsider -UserName "user@company.com"
|
||||
```
|
||||
Bitte den Inhalt von src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md hier einfügen, damit ich ihn ins Deutsche übersetzen kann.
|
||||
## Unauthenticated Enum and Initial Entry
|
||||
|
||||
TODO
|
||||
```
|
||||
UserName Exists
|
||||
-------- ------
|
||||
user@company.com True
|
||||
```
|
||||
Sie können auch eine Textdatei verwenden, die pro Zeile eine E-Mail‑Adresse enthält:
|
||||
Du kannst auch eine Textdatei verwenden, die pro Zeile eine E-Mail-Adresse enthält:
|
||||
```
|
||||
user@company.com
|
||||
user2@company.com
|
||||
@@ -75,22 +77,22 @@ external.user_outlook.com#EXT#@company.onmicrosoft.com
|
||||
# Invoke user enumeration
|
||||
Get-Content .\users.txt | Invoke-AADIntUserEnumerationAsOutsider -Method Normal
|
||||
```
|
||||
Derzeit gibt es **4 verschiedene enumeration methods** zur Auswahl. Weitere Informationen finden Sie in `Get-Help Invoke-AADIntUserEnumerationAsOutsider`:
|
||||
Aktuell gibt es **4 verschiedene Enumeration-Methoden** zur Auswahl. Du kannst Informationen in `Get-Help Invoke-AADIntUserEnumerationAsOutsider` finden:
|
||||
|
||||
Es unterstützt folgende enumeration methods: Normal, Login, Autologon, and RST2.
|
||||
Es unterstützt folgende Enumeration-Methoden: Normal, Login, Autologon und RST2.
|
||||
|
||||
- Die **Normal**-Methode scheint derzeit mit allen tenants zu funktionieren. Früher erforderte sie jedoch Desktop SSO (aka Seamless SSO), das für mindestens eine Domain aktiviert sein musste.
|
||||
- Die **Normal**-Methode scheint aktuell mit allen Tenants zu funktionieren. Früher erforderte sie, dass Desktop SSO (aka Seamless SSO) für mindestens eine Domain aktiviert ist.
|
||||
|
||||
- Die **Login**-Methode funktioniert mit jedem tenant, aber enumeration queries werden im Azure AD sign-in log als failed login events protokolliert!
|
||||
- Die **Login**-Methode funktioniert mit jedem Tenant, aber die Enumeration-Queries werden im Azure AD sign-in log als fehlgeschlagene Login-Events protokolliert!
|
||||
|
||||
- Die **Autologon**-Methode scheint nicht mehr bei allen tenants zu funktionieren. Vermutlich erfordert sie, dass DesktopSSO oder directory sync aktiviert ist.
|
||||
- Die **Autologon**-Methode scheint nicht mehr mit allen Tenants zu funktionieren. Wahrscheinlich ist erforderlich, dass DesktopSSO oder directory sync aktiviert ist.
|
||||
|
||||
|
||||
Nachdem Sie die gültigen Benutzernamen entdeckt haben, können Sie **info about a user** mit:
|
||||
Nachdem du die gültigen Usernames entdeckt hast, kannst du **Info über einen user** mit:
|
||||
```bash
|
||||
Get-AADIntLoginInformation -UserName root@corp.onmicrosoft.com
|
||||
```
|
||||
Das Skript [**o365spray**](https://github.com/0xZDH/o365spray) ermöglicht es Ihnen außerdem, zu prüfen, ob eine E‑Mail gültig ist.
|
||||
Das Skript [**o365spray**](https://github.com/0xZDH/o365spray) ermöglicht es dir ebenfalls, herauszufinden, **ob eine E-Mail gültig ist**.
|
||||
```bash
|
||||
git clone https://github.com/0xZDH/o365spray
|
||||
cd o365spray
|
||||
@@ -105,11 +107,11 @@ python3 ./o365spray.py --enum -d carloshacktricks.onmicrosoft.com -U /tmp/users.
|
||||
|
||||
Eine weitere gute Informationsquelle ist Microsoft Teams.
|
||||
|
||||
Die API von Microsoft Teams ermöglicht die Suche nach Benutzern. Insbesondere die "user search"-Endpoints **externalsearchv3** und **searchUsers** können verwendet werden, um allgemeine Informationen über bei Teams registrierte Benutzerkonten abzufragen.
|
||||
Die API von Microsoft Teams erlaubt die Suche nach Benutzern. Insbesondere könnten die "user search"-Endpunkte **externalsearchv3** und **searchUsers** verwendet werden, um allgemeine Informationen über in Teams registrierte Benutzerkonten abzufragen.
|
||||
|
||||
Abhängig von der API-Antwort ist es möglich, zwischen nicht existierenden Benutzern und existierenden Benutzern zu unterscheiden, die ein gültiges Teams-Abonnement haben.
|
||||
|
||||
Das Skript [**TeamsEnum**](https://github.com/lucidra-security/TeamsEnum) kann verwendet werden, um eine gegebene Menge von Benutzernamen gegen die Teams-API zu validieren, allerdings benötigen Sie Zugriff auf einen Benutzer mit Teams-Zugang, um es zu nutzen.
|
||||
Das Skript [**TeamsEnum**](https://github.com/lucidra-security/TeamsEnum) könnte verwendet werden, um eine gegebene Liste von Usernames gegen die Teams-API zu validieren, aber du benötigst Zugriff auf einen Benutzer mit Teams-Zugriff, um es zu nutzen.
|
||||
```bash
|
||||
# Install
|
||||
git clone https://github.com/lucidra-security/TeamsEnum
|
||||
@@ -119,13 +121,40 @@ 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
|
||||
```
|
||||
Bitte den Inhalt der Datei src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md hier einfügen, damit ich ihn ins Deutsche übersetzen kann.
|
||||
## Azure unauthenticated enum and initial entry
|
||||
|
||||
Azure has several endpoints and methods that can be used for unauthenticated enumeration and, in some cases, initial entry.
|
||||
|
||||
### Common unauthenticated enumeration techniques
|
||||
|
||||
- **Tenant discovery**: Identify the Azure tenant name and related metadata.
|
||||
- **Open service endpoints**: Check for exposed services, such as storage accounts, web apps, and management interfaces.
|
||||
- **Metadata and configuration leaks**: Look for exposed configuration files, environment variables, or public metadata.
|
||||
- **OAuth/OpenID endpoints**: Enumerate identity-related endpoints for tenant and application information.
|
||||
|
||||
### Initial entry opportunities
|
||||
|
||||
- Misconfigured storage accounts with public read/write access
|
||||
- Publicly exposed management or admin interfaces
|
||||
- Weak or exposed authentication flows
|
||||
- Misconfigured SaaS integrations that leak tokens or credentials
|
||||
|
||||
### Useful areas to inspect
|
||||
|
||||
- Azure Storage containers and blobs
|
||||
- Azure App Service public endpoints
|
||||
- Azure AD-related discovery endpoints
|
||||
- Public DNS records and subdomains
|
||||
|
||||
### Notes
|
||||
|
||||
Unauthenticated enumeration is often limited, but it can reveal valuable attack surface for further assessment.
|
||||
```
|
||||
[-] 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)
|
||||
```
|
||||
Außerdem ist es möglich, Verfügbarkeitsinformationen über vorhandene Benutzer wie folgt abzufragen:
|
||||
Darüber hinaus ist es möglich, Verfügbarkeitsinformationen über vorhandene Benutzer zu enumerieren, wie die folgenden:
|
||||
|
||||
- Available
|
||||
- Away
|
||||
@@ -133,11 +162,13 @@ Außerdem ist es möglich, Verfügbarkeitsinformationen über vorhandene Benutze
|
||||
- Busy
|
||||
- Offline
|
||||
|
||||
Wenn eine **Abwesenheitsnotiz** konfiguriert ist, ist es außerdem möglich, die Nachricht mit TeamsEnum abzurufen. Falls eine Ausgabedatei angegeben wurde, werden die Abwesenheitsnachrichten automatisch in der JSON-Datei gespeichert:
|
||||
Wenn eine **out-of-office message** konfiguriert ist, ist es auch möglich, die Nachricht mit TeamsEnum abzurufen. Wenn eine Output-Datei angegeben wurde, werden die out-of-office messages automatisch innerhalb der JSON-Datei gespeichert:
|
||||
```
|
||||
jq . teamsenum-output.json
|
||||
```
|
||||
Bitte füge hier den Inhalt der Datei src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md ein. Ich übersetze ihn dann ins Deutsche und behalte dabei exakt alle Markdown-/HTML-Tags, Links, Pfade und die nicht zu übersetzenden Begriffe bei.
|
||||
# Azure Security: Unauthenticated Enum and Initial Entry
|
||||
|
||||
In diesem Abschnitt werden Techniken behandelt, um ohne Authentifizierung Informationen aus Azure-Umgebungen zu enumerieren und einen ersten Zugang zu erlangen.
|
||||
```json
|
||||
{
|
||||
"email": "user2@domain",
|
||||
@@ -192,10 +223,10 @@ Bitte füge hier den Inhalt der Datei src/pentesting-cloud/azure-security/az-una
|
||||
az-password-spraying.md
|
||||
{{#endref}}
|
||||
|
||||
## Azure-Services mit Domains
|
||||
## Azure Services using domains
|
||||
|
||||
Es ist auch möglich, zu versuchen, **exponierte Azure Services** in gängigen Azure-Subdomains zu finden, wie in diesem [Beitrag:
|
||||
](https://www.netspi.com/blog/technical-blog/cloud-penetration-testing/enumerating-azure-services/)
|
||||
Es ist auch möglich, zu versuchen, **Azure services exposed** in üblichen azure-Subdomains zu finden, wie sie in diesem [post:
|
||||
](https://www.netspi.com/blog/technical-blog/cloud-penetration-testing/enumerating-azure-services/) dokumentiert sind.
|
||||
|
||||
- App Services: `azurewebsites.net`
|
||||
- App Services – Management: `scm.azurewebsites.net`
|
||||
@@ -216,30 +247,69 @@ Es ist auch möglich, zu versuchen, **exponierte Azure Services** in gängigen A
|
||||
- Search Appliance: `search.windows.net`
|
||||
- API Services: `azure-api.net`
|
||||
|
||||
You can use a method from [**MicroBust**](https://github.com/NetSPI/MicroBurst) for such goal. This function will search the base domain name (and a few permutations) in several **Azure-Domains:**
|
||||
Du kannst eine Methode aus [**MicroBust**](https://github.com/NetSPI/MicroBurst) für dieses Ziel verwenden. Diese Funktion durchsucht den Basis-Domainnamen (und einige Permutationen) in mehreren **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) für credentials oder über [OAuth Apps](az-oauth-apps-phishing.md)
|
||||
- [**Common Phishing**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html) für credentials oder via [OAuth Apps](az-oauth-apps-phishing.md)
|
||||
- [**Device Code Authentication** Phishing](az-device-code-authentication-phishing.md)
|
||||
|
||||
## Dateisystem-Credentials
|
||||
### Exchange Online direct-to-tenant SMTP spoofing
|
||||
|
||||
Wenn ein target **Exchange Online / EOP** nutzt, sein öffentliches **MX** aber auf ein **third-party mail gateway** zeigt (Mimecast, Proofpoint, Mailgun, on-prem filtering, etc.), teste, ob Exchange Online weiterhin Mail akzeptiert, die **direkt** an den tenant host `*.mail.protection.outlook.com` gesendet wird. In diesem Fall kann ein attacker das **external gateway** umgehen und phishing mail direkt an EOP übermitteln.
|
||||
|
||||
Das ist nützlich für **initial access / phishing**, weil die Zustellung auch dann funktionieren kann, wenn der gespoofte sender **SPF**, **DKIM** und **DMARC** nicht besteht. Für interne sender kann Outlook den gespooften sender außerdem als echten Mitarbeiter auflösen, was das Vertrauen erhöht.
|
||||
|
||||
**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.
|
||||
```
|
||||
Der direkte EOP-Host ist normalerweise der tenant-spezifische `mail.protection.outlook.com`-Name (zum Beispiel `target-com.mail.protection.outlook.com`). Du kannst das Tenant-Namensmuster oft aus der öffentlichen Tenant/Domain-Enumeration und Exchange-bezogenen autodiscover-Antworten zurückgewinnen.
|
||||
|
||||
**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
|
||||
```
|
||||
**Validation signals:**
|
||||
- Mail wird an `*.mail.protection.outlook.com` statt an den öffentlichen MX-Host gesendet.
|
||||
- Die Nachricht wird zugestellt, obwohl Header Fehler wie `spf=fail`, `dkim=none`, `dmarc=fail` oder `compauth=none` zeigen.
|
||||
- Ein sicherer Partner connector weist die `RCPT TO`-Phase normalerweise mit `5.7.51 TenantInboundAttribution; Rejecting.` zurück.
|
||||
|
||||
**Technical notes / defensive hunting:**
|
||||
- **Enhanced Filtering for Connectors** hilft Exchange dabei, den ursprünglichen Absender korrekt zuzuordnen, ist aber allein **nicht** die Grenze, die direkte Zustellung an den Tenant blockiert.
|
||||
- Microsoft dokumentiert zwei praktische Controls, wenn ein externer MX vor Exchange Online verwendet wird:
|
||||
- Erstelle einen **Partner inbound connector** mit `SenderDomains *` und `RestrictDomainsToCertificate` oder `RestrictDomainsToIPAddresses`, sodass nur das freigegebene Gateway an den Tenant zustellen kann.
|
||||
- Erstelle eine **priority 0 transport rule**, die eingehende Mails in Quarantäne verschiebt, es sei denn, die Sender-IP gehört zu den freigegebenen Gateway-Bereichen **oder** `X-MS-Exchange-Organization-AuthAs` enthält `Internal`.
|
||||
- Suche nach Mails, bei denen **Received** `*.mail.protection.outlook.com` als den ersten Microsoft-Hop zeigt, aber die Sender-Authentifizierungs-Header weiterhin **SPF/DKIM/DMARC failures** anzeigen.
|
||||
- Falls das Ziel **Direct Send** weiterhin erlaubt, reduziert das Deaktivieren hauptsächlich das Spoofing **interner** Absender; es ersetzt nicht die connector-/transport-rule-Mitigierung für beliebiges **externes** Spoofing.
|
||||
|
||||
## Filesystem Credentials
|
||||
|
||||
Das **`az cli`** speichert viele interessante Informationen in **`<HOME>/.Azure`**:
|
||||
- **`azureProfile.json`** enthält Informationen über in der Vergangenheit angemeldete Benutzer
|
||||
- **`clouds.config`** enthält Informationen über Abonnements
|
||||
- **`service_principal_entries.json`** enthält Anwendungs-credentials (tenant id, clients und secret)
|
||||
- **`msal_token_cache.json`** enthält **access tokens und refresh tokens**
|
||||
- **`clouds.config`** enthält Informationen über Subscriptions
|
||||
- **`service_principal_entries.json`** enthält applications **credentials** (tenant id, clients und secret)
|
||||
- **`msal_token_cache.json`** enthält **access tokens and refresh tokens**
|
||||
|
||||
Beachte, dass unter macOS und linux diese Dateien **ungeschützt** im Klartext gespeichert sind.
|
||||
Beachte, dass diese Dateien unter macOS und linux **ungeschützt** im Klartext gespeichert werden.
|
||||
|
||||
## Referenzen
|
||||
|
||||
|
||||
## 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