Missbrauch von ConnectWise SkyKick-Anmeldeinformationen bei Microsoft 365-Angriffen
Detection stack
- AIDR
- Alert
- ETL
- Query
Zusammenfassung
Ein kompromittiertes Microsoft 365 API-Geheimnis, das mit ConnectWise Cloud Backup, ehemals SkyKick, verbunden ist, wurde von Bedrohungsakteuren missbraucht, um unbefugten Zugriff auf M365-Umgebungen von Kunden zu erlangen. Die Angreifer nutzten die umfassenden Berechtigungen der Anwendung, um auf Exchange Online, Microsoft Teams und SharePoint Online zuzugreifen. Die Aktivitäten umfassten sowohl automatisierte Token-Anfragen als auch manuelle Nachbereitungsoperationen.
Untersuchung
Huntress identifizierte den Missbrauch von ConnectWise-Dienstprinzipalen über Microsoft 365-Anmeldeprotokolle, einschließlich unbefugten Zugriffs von der Hosting-Anbieter-IP-Adresse 144.172.64.128 und privatem Azure-IPv6-Raum. Die Untersuchung ergab, dass Angreifer kompromittierte Anmeldedaten nutzten, um Verzeichnisrollen wie Global Administrator zuzuweisen und neue Client-Geheimnisse zu anderen vertrauenswürdigen Anwendungen hinzuzufügen, um die Persistenz zu gewährleisten. Die Aktivitäten zeigten auch ein skriptbasiertes Vorgehen durch Mieter in GUID-Reihenfolge und bestimmte User-Agent-Muster.
Abschwächung
Organisationen sollten die betroffenen ConnectWise Cloud Backup und ConnectWise Cloud Management Anwendungs-IDs innerhalb ihrer Microsoft 365-Mieter sofort deaktivieren. Das Deaktivieren anstelle des Löschens der Anwendungen ist wichtig, um das Einwilligungsmanagement zu erhalten. Sicherheitsteams sollten außerdem alle Anmeldungen von Dienstprinzipalen überprüfen und die Anwendungsanmeldedaten auf unerwartete Hinzufügungen seit dem 13. Oktober überprüfen.
Antwort
Wenn verdächtige Aktivitäten identifiziert werden, sollten Organisationen die Entra-Auditprotokolle überprüfen für Mitglied zur Rolle hinzufügen, Anwendung aktualisieren, und Dienstprincipal-Anmeldeinformationen hinzufügen Ereignisse. Sicherheitsteams sollten zugehörige User-Agent-Zeichenfolgen validieren und legitime Anbieteraktivitäten, wie kiota-dotnet, von Angreifer-Tools wie Python-urllib und curl unterscheiden. Schließlich sollten alle Client-Geheimnisse und Zertifikate über Unternehmensanwendungen hinweg überprüft und alle unbefugten Anmeldeinformationen entfernt werden.
Angriffsablauf
Wir aktualisieren diesen Abschnitt noch.
Erkennungen
Benutzer zu einer Admin-Rolle hinzufügen (via office365)
Aktualisierung der Anmeldedaten des Dienstprinzips (via azuread)
Rolle mit hohen Privilegien zugewiesen (via azuread)
IOCs (SourceIP) zur Erkennung: ConnectWise (SkyKick) Anbieteranmeldeinformationen in M365-Angriffen missbraucht
IOCs (DestinationIP) zur Erkennung: ConnectWise (SkyKick) Anbieteranmeldeinformationen in M365-Angriffen missbraucht
Unbefugte Änderungen in M365 über Python-urllib erkennen [Azure Activity Logs]
Unbefugte Nutzung von Microsoft Graph Tokens in M365 über ConnectWise-Anwendungen [Azure Auditlogs]
Simulation Ausführung
-
Angriffserzählung & Befehle: Der Gegner hat erfolgreich Zugriff auf einen Dienstprinzipal mit begrenzten Berechtigungen erlangt. Um Persistenz und volle Umgebungskontrolle zu erreichen, führt der Angreifer ein Python-Skript aus. Das Skript zielt auf die Microsoft Graph API, um: 1) Den kompromittierten Dienstprinzipal zu einer hoch privilegierten Verzeichnisrolle hinzuzufügen (z.B. Global Administrator oder Privileged Role Administrator), und 2) ein neues Client-Geheimnis zum Dienstprinzipal hinzuzufügen. Der Angreifer verwendet die
urllibBibliothek in Python 3.12, die standardmäßig diePython-urllib/3.12User-Agent bereitstellt, der den spezifischen Telemetrie-Hook liefert, der von der Erkennungsregel benötigt wird. -
Regression Test Script:
import urllib.request import json # HINWEIS: Dieses Skript ist eine Simulation der API-Call-Struktur. # In einer realen Umgebung wäre ein gültiges OAuth2 Bearer-Token erforderlich. # Dieses Skript ist darauf ausgelegt, die 'UserAgent'- und 'OperationName'-Erkennungslösung auszulösen. target_url = "https://graph.microsoft.com/v1.0/directoryRoles" access_token = "SIMULATED_TOKEN" headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/json" } # Diese spezielle User-Agent ist der Auslöser für die Erkennungsregel user_agent = "Python-urllib/3.12" # "Mitglied zur Rolle hinzufügen" simulieren payload = { "roleId": "target-role-guid", "principalId": "attacker-service-principal-guid" } print(f"[*] Simuliere unbefugte Rollenänderung mit {user_agent}...") try: req = urllib.request.Request( target_url, data=json.dumps(payload).encode('utf-8'), headers=headers, method='POST' ) req.add_header('User-Agent', user_agent) # In einem realen Test würde dies die tatsächliche API aufrufen. # Zu Simulationszwecken nehmen wir an, dass der API-Aufruf erfolgreich ist, um das Protokoll zu erzeugen. print("[+] Anfrage gesendet. Überprüfen Sie die Azure-Audit-Protokolle auf 'Mitglied zur Rolle hinzufügen' mit User-Agent: Python-urllib/3.12") except Exception as e: print(f"[-] Simulation fehlgeschlagen: {e}") -
Bereinigung Befehle:
# Manuelle Bereinigung ist in M365 erforderlich, da dies Änderungen auf Identitätsebene sind. # 1. Entfernen Sie die hinzugefügte Rollenzuordnung: # Remove-MgDirectoryRoleMemberByRef -DirectoryRoleId <ID> -DirectoryRoleMemberId <ID> # 2. Entfernen Sie die hinzugefügten Anmeldeinformationen des Dienstprinzips: # Remove-MgServicePrincipalPassword -ServicePrincipalId <ID> -PasswordId <ID>