Covenant C2 Framework: La guida completa
Dec 16, 2022
Covenant is one of the latest and greatest command and control (C2) post-exploitation frameworks. This post will walk you through the process of configuring Covenant and using it to execute payloads on compromised hosts.
Nota: Questo post dimostra le capacità di Covenant a partire da metà settembre 2019.
1. Installare Covenant
Innanzitutto, dobbiamo installare Covenant su una macchina host che fungerà sia da database di Covenant sia da applicazione di gestione che controlla gli agenti applicativi, noti come grunts.
Prerequisiti
Per questo post sul blog, ho installato Covenant su una postazione Windows 10, ma qualsiasi recente sistema operativo Windows Server o distribuzione Linux che supporti .NET Core dovrebbe andare altrettanto bene.
Le seguenti applicazioni devono essere installate sulla macchina che ospita Covenant:
Contenuti correlati selezionati:
Processo di installazione
Data l'architettura moderna e cross-platform di Covenant, non fornisce un eseguibile di installazione antiquato. Invece, dobbiamo clonare il repository git del progetto e poi costruire ed eseguire l'applicazione utilizzando i seguenti comandi:
git clone --recurse-submodules https://github.com/cobbr/Covenant
cd Covenant/Covenant
dotnet build
dotnet run
In alternativa, potremmo eseguire Covenant in un container Docker.
2. Crea un account.
Con il servizio Covenant attivo e funzionante, possiamo navigare verso l'interfaccia dell'applicazione Covenant sulla sua porta web predefinita 7443. Ci verrà chiesto di configurare un account utente:
Dopo aver completato il processo di registrazione, verremo reindirizzati alla pagina di User Management:
Il menu sulla sinistra ci permette di navigare tra le varie funzionalità di Covenant.
3. Configura un listener.
I Listener consentono ai grunt di comunicare con l'applicazione Covenant. Non ci sono Listener configurati di default, quindi dobbiamo configurarne uno. Clicca su Listeners nel menu a sinistra per aprire la pagina dei Listener:
Quindi fare clic sul pulsante "Create" per aprire la pagina di creazione dell'HTTP Listener:
Dovremo aggiornare alcuni dei valori forniti:
- Nome — Per impostazione predefinita, Covenant fornisce un semplice nome di tipo “GUID”. Sentiti libero di cambiarlo in qualcosa di più leggibile.
- BindAddress e ConnectAddress — Assicurati che entrambi specifichino un indirizzo raggiungibile dai grunt.
- UseSSL — Se desideri utilizzare SLL, dovrai specificare un file di certificato SSL e una password.
Una volta completata la configurazione, fare clic sul pulsante Create per creare e abilitare il listener.
4. Crea un lanciatore.
Successivamente, dobbiamo creare un launcher. I launcher sono utilizzati per trasformare gli host remoti in grunts e collegarli all'applicazione Covenant. Di solito si presentano sotto forma di un pacchetto payload che viene eseguito su un host remoto. Ogni launcher è abbinato a un listener.
Dal menu a sinistra della pagina di gestione degli utenti, clicca su Launchers. Vedrai un elenco di tipi di launcher. Il launcher Binario, che viene utilizzato per generare binari personalizzati, è uno dei launcher più facili da usare, quindi selezioniamo Binary come nostro primo launcher.
La pagina di configurazione si aprirà:
Specificare le seguenti opzioni di configurazione:
- Listener — Specificare il listener che il nuovo launcher utilizzerà. Utilizziamo il listener HTTP creato in precedenza:
- Template — Utilizziamo il template predefinito GruntHTTP:
- Ritardo e Jitter — Queste impostazioni controllano la frequenza con cui un grunt comunica con Covenant. Possiamo mantenere i valori predefiniti.
- ConnectAttempts e KillDate — Queste impostazioni controllano quando un grunt smetterà di tentare di comunicare con Covenant. Anche in questo caso, possiamo lasciare i valori predefiniti.
Una volta completata la configurazione, fare clic sul pulsante Generate per creare il nuovo launcher e tornare alla pagina di configurazione.
5. Crea un grunt eseguendo il launcher.
Successivamente dobbiamo salvare il payload del launcher: Cliccando su Download e poi su Salva File.
Successivamente, copia il file salvato sul host desiderato ed eseguilo.
Il nuovo grunt registrato apparirà sulla nostra dashboard in Covenant:
6. Assegna compiti al sottoposto.
Dal menu a sinistra della pagina di gestione degli utenti, clicca su Grunts e poi apri il grunt che abbiamo appena registrato. La scheda Info fornisce dettagli sullo stato della connessione e sulla funzionalità:
Per assegnare un compito al nostro sottoposto, dobbiamo cliccare sulla scheda Task.
Esempio 1: Fai uno screenshot.
Innanzitutto, supponiamo di voler che il grunt scatti una schermata del desktop dell'utente attivo. Selezioniamo Screenshot dal menu a tendina Task e poi clicchiamo sul pulsante Task qui sotto per eseguire immediatamente questa azione sul grunt:
Aggiorna la pagina per vedere lo stato aggiornato del compito. Mostrerà che il compito è stato completato e fornirà il suo output, che in questo caso è semplicemente uno screenshot. Nota che l'output per un compito dipende dal tipo di compito.
Esempio 2: Esegui Mimikatz.
Facciamo svolgere un altro compito al sottoposto: Esegui Mimikatz.
Dobbiamo tornare alla scheda Attività della pagina dei dettagli del nostro grunt. Poi selezioneremo Mimikatz dal menu a discesa delle Attività.
Molti compiti hanno un insieme di parametri di input personalizzabili. I compiti Mimikatz hanno un parametro di input “Command” che ci permette di specificare quale comando Mimikatz vogliamo eseguire. Comodamente, è preimpostato con il comando sekurlsa::logonPasswords, che scopre le password memorizzate nella memoria. Assegniamo questo compito al nostro grunt e vediamo cosa succede.
Si è verificato che un account di Domain Admin era connesso a questo host di base — quindi nell'output del task, possiamo vedere la password del Domain Admin in chiaro!
L'esecuzione di Mimikatz tramite Covenant aiuta gli avversari a evitare il rilevamento perché Covenant non memorizza direttamente i compiti sull'host grunt. Invece, compila dinamicamente e distribuisce il payload del compito tramite la sua connessione client al momento dell'assegnazione del compito. Inoltre, ogni volta che viene creato un nuovo grunt o viene assegnato un nuovo compito a un grunt, il codice rilevante viene ricompilato e offuscato con ConfuserEx, il che evita payload statici che sarebbero più facili da individuare. Infatti, quando ho eseguito i passaggi qui sulla mia macchina, Windows Defender era attivato e aggiornato, eppure i compiti Mimikatz del grunt sono stati eseguiti senza problemi.
Revisione della cronologia e dell'output dei compiti.
Covenant fornisce una chiara cronologia dei compiti eseguiti. Dal menu a sinistra della pagina di User Management, clicca su Taskings:
Puoi vedere sia il compito dello screenshot che il compito di mimikatz che abbiamo eseguito in precedenza. Clicca su una qualsiasi riga per visualizzare i parametri del compito e l'output completo.
Si noti che molte attività salvano anche elementi del loro output nella pagina Data. Fare clic sulle varie schede per visualizzare credenziali, indicatori, artefatti scaricati e screenshot. Ad esempio, ecco le credenziali scoperte dalla nostra attività Mimikatz:
Ed ecco uno screenshot catturato dal nostro altro compito:
Esempio 3: Scarica un file.
Ora, eseguiamo un altro compito sul nostro grunt per scaricare un file così possiamo visualizzarlo nella scheda Downloads.
Supponiamo di aver scoperto che c'è un file sul nostro host grunt chiamato MySecretDocument.txt. Usiamo il task Download per ottenere una copia di questo file per noi stessi!
Eseguendo questo compito verrà recuperata una copia del file e resa immediatamente disponibile nella scheda Download:
Questo compito è semplice di per sé, ma presenta alcuni casi d'uso affascinanti dato il fatto che possiamo eseguire questo compito utilizzando i diritti dell'utente che ha eseguito il lanciatore grunt o le credenziali che abbiamo ottenuto tramite altri compiti.
Conclusione
Covenant offre già un'ampia varietà di compiti, e la lista cresce ogni giorno grazie al coinvolgimento della comunità open-source. Questo progetto avrà molto probabilmente un futuro entusiasmante ed è sicuramente degno di attenzione!
Condividi su
Scopri di più
Informazioni sull'autore
Joe Dibley
Ricercatore di sicurezza
Ricercatore di sicurezza presso Netwrix e membro del Netwrix Security Research Team. Joe è un esperto in Active Directory, Windows e una vasta gamma di piattaforme software aziendali e tecnologie, Joe ricerca nuovi rischi per la sicurezza, tecniche di attacco complesse e relative mitigazioni e rilevamenti.
Scopri di più su questo argomento
Esempio di Analisi del Rischio: Come Valutare i Rischi
Il Triangolo CIA e la sua applicazione nel mondo reale
Creare utenti AD in massa e inviare le loro credenziali tramite PowerShell
Come aggiungere e rimuovere gruppi AD e oggetti nei gruppi con PowerShell
Attributi di Active Directory: Ultimo accesso