SOC Prime Bias: Critical

20 Oct 2026 12:39 UTC

Credenziali Fornitore ConnectWise SkyKick Sfruttate in Attacchi Microsoft 365

Author Photo
SOC Prime Team linkedin icon Segui
Credenziali Fornitore ConnectWise SkyKick Sfruttate in Attacchi Microsoft 365
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Sommario

Un segreto compromesso dell’API Microsoft 365 associato a ConnectWise Cloud Backup, precedentemente noto come SkyKick, è stato sfruttato da attori di minaccia per ottenere accesso non autorizzato agli ambienti M365 dei clienti. Gli attaccanti hanno sfruttato le estese autorizzazioni dell’applicazione per accedere a Exchange Online, Microsoft Teams e SharePoint Online. L’attività includeva sia richieste di token automatizzate che operazioni post-sfruttamento manuali.

Indagine

Huntress ha identificato l’abuso dei principali servizi di ConnectWise attraverso i registri di accesso di Microsoft 365, compreso l’accesso non autorizzato da un indirizzo IP del provider di hosting 144.172.64.128 e dallo spazio IPv6 privato di Azure. L’indagine ha rilevato che gli attaccanti hanno utilizzato credenziali compromesse per assegnare ruoli di directory come Amministratore globale e aggiungere nuovi segreti client ad altre applicazioni fidate per la persistenza. L’attività ha anche mostrato un movimento scriptato attraverso i tenant in ordine GUID e modelli distintivi di User-Agent.

Mitigazione

Le organizzazioni dovrebbero disabilitare immediatamente gli ID applicazione ConnectWise Cloud Backup e ConnectWise Cloud Management interessati all’interno dei loro tenant Microsoft 365. Disabilitare piuttosto che eliminare le applicazioni è importante per preservare la gestione del consenso. I team di sicurezza dovrebbero anche controllare tutti gli accessi del principale servizio e rivedere le credenziali delle applicazioni per aggiunte inaspettate create dal 13 ottobre.

Risposta

Quando viene identificata un’attività sospetta, le organizzazioni dovrebbero esaminare i registri di audit di Entra per Aggiungi membro al ruolo, Aggiorna applicazione, e Aggiungi credenziali del principale del servizio eventi. I team di sicurezza dovrebbero convalidare le stringhe User-Agent associate e distinguere l’attività legittima del fornitore, come kiota-dotnet, dagli strumenti degli attaccanti tra cui Python-urllib e curl. Infine, rivedere tutti i segreti client e i certificati tra le applicazioni aziendali e rimuovere qualsiasi credenziale non autorizzata.

Flusso di attacco

Stiamo ancora aggiornando questa parte.

Rilevamenti

Aggiungi un utente a un ruolo amministrativo (tramite office365)

Squadra SOC Prime
19 Ott 2026

Aggiornamento delle credenziali dell’account principale del servizio (tramite azuread)

Microsoft, Squadra SOC Prime
19 Ott 2026

Ruolo ad alta privilegio assegnato (tramite azuread)

Squadra SOC Prime
19 Ott 2026

IOC (SourceIP) per rilevare: Credenziali del fornitore ConnectWise (SkyKick) abusate in attacchi M365

Regole AI SOC Prime
19 Ott 2026

IOC (DestinationIP) per rilevare: Credenziali del fornitore ConnectWise (SkyKick) abusate in attacchi M365

Regole AI SOC Prime
19 Ott 2026

Rileva modifiche non autorizzate in M365 tramite Python-urllib [Registri attività di Azure]

Regole AI SOC Prime
19 Ott 2026

Uso non autorizzato dei token Microsoft Graph in M365 tramite applicazioni ConnectWise [Azure Auditlogs]

Regole AI SOC Prime
19 Ott 2026

Esecuzione di simulazione

  • Narrativa dell’attacco & Comandi: L’avversario ha ottenuto con successo l’accesso a un principale del servizio con autorizzazioni limitate. Per ottenere persistenza e pieno controllo dell’ambiente, l’attaccante esegue uno script Python. Lo script prende di mira l’API Microsoft Graph per: 1) Aggiungere il principale del servizio compromesso a un ruolo di directory altamente privilegiato (es. Amministratore globale o Amministratore ruolo privilegiato), e 2) Aggiungere un nuovo segreto client al principale del servizio. L’attaccante utilizza la libreria urllib in Python 3.12, che predefinisce la Python-urllib/3.12 User-Agent, fornendo l’hook di telemetria specifico richiesto dalla regola di rilevamento.

  • Script di test di regressione:

    import urllib.request
    import json
    
    # NOTA: Questo script è una simulazione della struttura di chiamata API. 
    # In un ambiente reale, sarebbe richiesto un valido token OAuth2 Bearer.
    # Questo script è progettato per attivare la logica di rilevamento 'UserAgent' e 'OperationName'.
    
    url_destinazione = "https://graph.microsoft.com/v1.0/directoryRoles"
    token_accesso = "TOKEN_SIMULATO"
    
    intestazioni = {
        "Authorization": f"Bearer {access_token}",
        "Content-Type": "application/json"
    }
    
    # Questo specifico User-Agent è il trigger per la regola di rilevamento
    user_agent = "Python-urllib/3.12"
    
    # Simulare "Aggiungi membro al ruolo"
    payload = {
        "roleId": "target-role-guid",
        "principalId": "attacker-service-principal-guid"
    }
    
    print(f"[*] Simulazione modifica non autorizzata del ruolo utilizzando {user_agent}...")
    
    try:
        req = urllib.request.Request(
            url_destinazione, 
            data=json.dumps(payload).encode('utf-8'), 
            headers=intestazioni, 
            method='POST'
        )
        req.add_header('User-Agent', user_agent)
    
        # In un test reale, questo chiamerebbe l'API effettiva. 
        # Per scopi di simulazione, si presume che la chiamata API sia riuscita a generare il log.
        print("[+] Richiesta inviata. Controlla i log di audit di Azure per 'Aggiungi membro al ruolo' con User-Agent: Python-urllib/3.12")
    except Exception as e:
        print(f"[-] Simulazione fallita: {e}")
  • Comandi di pulizia:

    # È richiesta una pulizia manuale in M365 poiché si tratta di modifiche a livello di identità.
    # 1. Rimuovere l'assegnazione del ruolo aggiunta:
    # Remove-MgDirectoryRoleMemberByRef -DirectoryRoleId <ID> -DirectoryRoleMemberId <ID>
    
    # 2. Rimuovere le credenziali del principale del servizio aggiunte:
    # Remove-MgServicePrincipalPassword -ServicePrincipalId <ID> -PasswordId <ID>