Credenziali Fornitore ConnectWise SkyKick Sfruttate in Attacchi Microsoft 365
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)
Aggiornamento delle credenziali dell’account principale del servizio (tramite azuread)
Ruolo ad alta privilegio assegnato (tramite azuread)
IOC (SourceIP) per rilevare: Credenziali del fornitore ConnectWise (SkyKick) abusate in attacchi M365
IOC (DestinationIP) per rilevare: Credenziali del fornitore ConnectWise (SkyKick) abusate in attacchi M365
Rileva modifiche non autorizzate in M365 tramite Python-urllib [Registri attività di Azure]
Uso non autorizzato dei token Microsoft Graph in M365 tramite applicazioni ConnectWise [Azure Auditlogs]
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 urllibin Python 3.12, che predefinisce laPython-urllib/3.12User-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>