SOC Prime Bias: Critical

20 Oct 2026 12:39 UTC

Missbrauch von ConnectWise SkyKick-Anmeldeinformationen bei Microsoft 365-Angriffen

Author Photo
SOC Prime Team linkedin icon Folgen
Missbrauch von ConnectWise SkyKick-Anmeldeinformationen bei Microsoft 365-Angriffen
shield icon

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)

SOC Prime Team
19. Okt. 2026

Aktualisierung der Anmeldedaten des Dienstprinzips (via azuread)

Microsoft, SOC Prime Team
19. Okt. 2026

Rolle mit hohen Privilegien zugewiesen (via azuread)

SOC Prime Team
19. Okt. 2026

IOCs (SourceIP) zur Erkennung: ConnectWise (SkyKick) Anbieteranmeldeinformationen in M365-Angriffen missbraucht

SOC Prime AI-Regeln
19. Okt. 2026

IOCs (DestinationIP) zur Erkennung: ConnectWise (SkyKick) Anbieteranmeldeinformationen in M365-Angriffen missbraucht

SOC Prime AI-Regeln
19. Okt. 2026

Unbefugte Änderungen in M365 über Python-urllib erkennen [Azure Activity Logs]

SOC Prime AI-Regeln
19. Okt. 2026

Unbefugte Nutzung von Microsoft Graph Tokens in M365 über ConnectWise-Anwendungen [Azure Auditlogs]

SOC Prime AI-Regeln
19. Okt. 2026

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 urllib Bibliothek in Python 3.12, die standardmäßig die Python-urllib/3.12 User-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>