
Aggrokatz è un'estensione del plugin aggressor per Cobalt Strike che consente a pypykatz di interfacciarsi con i beacon in remoto e di analizzare i file dump LSASS e i file hive del registro per estrarre credenziali e altri segreti memorizzati, senza scaricare il file e senza caricare alcun codice sospetto sul beacon.

aggrokatz è un'estensione plugin Aggressor per CobaltStrike che consente a pypykatz di interfacciarsi con i beacon in remoto.
La versione corrente di aggrokatz permette a pypykatz di analizzare file dump LSASS e file del Registro di sistema per estrarre credenziali e altri segreti memorizzati, senza scaricare il file e senza caricare alcun codice sospetto nel beacon (Cobalt Strike è già presente comunque).
In futuro questo progetto mira a fornire funzionalità aggiuntive per operazioni coperte come la ricerca e la decifratura di tutti i segreti DPAPI/kerberoasting/ecc.
Abbiamo pubblicato un breve post sul blog per il rilascio di questo strumento, che include anche alcuni screenshot.
Il dump di LSASS/Registro non è l'obiettivo di questo progetto, solo l'analisi. Motivi:
CredBandit che scrive i byte grezzi su disco invece del base64. Bel tool, dai un'occhiata.Nel client CS, non usare "reload" né provare a scaricare e ricaricare manualmente lo script se lo hai modificato. DEVI rimuoverlo, chiudere il client e riavviarlo, quindi caricare lo script modificato. Altrimenti avrai più versioni in esecuzione contemporaneamente e un sacco di errori e comportamenti strani!
Durante l'analisi dei file LSASS/Registro in remoto, non interagire con il beacon specifico su cui hai avviato lo script. Normalmente non creerebbe problemi, ma non posso dare garanzie.
pycobalt. C'è un readme sulla loro pagina GitHub.pypykatz versione >=0.4.8aggressor.cna di pycobalt sia configurato e sappia la posizione del tuo interprete Pythonaggrokatz.cna per puntare a pycobalt.cnaView > Script Console e Cobalt Strike > Script Manager. Usando Script Manager, carica lo script aggkatz.cna.aggkatz.cna è stato caricato con successo, avrai una nuova voce di menu pypykatz quando fai clic destro su un beacon.Script Console.Script Console che nella finestra del Beacon.File LSASS: La posizione del file lsass.dmp sul computer remoto. Puoi anche usare percorsi UNC per accedere a file lsass.dmp condivisi via SMBchunksize : La quantità massima che verrà letta in una voltaFile BOF : Il file BOF (Beacon Object File) che consente letture a blocchi. Questo file verrà caricato ed eseguito (in memoria) ogni volta che viene letto un nuovo blocco.(modulo) : Specifica quali moduli verranno analizzati. Predefinito: allOutput : Specifica i formati di outputPopola scheda Credenziali : Dopo un'analisi riuscita, tutte le credenziali ottenute saranno disponibili nella scheda Credenziali di Cobalt Strike. Questa funzionalità è in betaElimina file remoto dopo l'analisi : Dopo un'analisi riuscita, il file dump LSASS verrà rimosso dal targetFile SYSTEM: La posizione del file SYSTEM.reg sul computer remoto. Puoi anche usare percorsi UNC per accedere a file condivisi via SMBFile SAM (opzionale): La posizione del file SAM.reg sul computer remoto. Puoi anche usare percorsi UNC per accedere a file condivisi via SMBFile SECURITY (opzionale): La posizione del file SECURITY.reg sul computer remoto. Puoi anche usare percorsi UNC per accedere a file condivisi via SMBFile SOFTWARE (opzionale): La posizione del file SOFTWARE.reg sul computer remoto. Puoi anche usare percorsi UNC per accedere a file condivisi via SMBchunksize : La quantità massima che verrà letta in una voltaFile BOF : Il file BOF (Beacon Object File) che consente letture a blocchi. Questo file verrà caricato ed eseguito (in memoria) ogni volta che viene letto un nuovo blocco.Output : Specifica i formati di outputIl BOF di lettura file attualmente supporta letture fino a 4 GB. Può essere esteso con alcune modifiche, ma finora non sono stati osservati file così grandi.
Normalmente il parser di pypykatz esegue una serie di operazioni di lettura file su disco, ma con l'aiuto di aggrokatz queste operazioni di lettura vengono tunnelizzate al beacon utilizzando un BOF (Beacon Object File) appositamente progettato che consente di leggere il contenuto del file remoto a blocchi. Questo permette a pypykatz di estrarre tutti i segreti dai file remoti senza leggere l'intero file, prelevando solo i blocchi necessari in cui si trovano i segreti.
Per avere un quadro completo dell'intero processo, ci sono due parti da evidenziare:
pypykatz si integra con CobaltStrikepypykatz esegue l'estrazione delle credenziali senza leggere l'intero fileCobaltStrike (agente) è scritto in Java, pypykatz è scritto in Python. Questo è un problema. Fortunatamente per noi, un'entità sconosciuta ha creato pycobalt che fornisce un'interfaccia pulita tra i due mondi, completa di API utili che possono essere invocate direttamente da Python. Nonostante pycobalt sia un pezzo di ingegneria meraviglioso, ci sono alcuni problemi/svantaggi che dobbiamo segnalare:
pycobalt:pycobalt sarà mantenuto in futuro.pycobalt.pycobalt e CobaltStrike. Ciò comporta che alcune chiamate API restituiscano byte che non possono essere utilizzati perché alcuni byte vengono alterati dal codificatore. Esaminando il codice, concludiamo che la maggior parte dei problemi di codifica/decodifica sono dovuti al fatto che pycobalt usa STDOUT/STDIN per comunicare con il processo Java.bof_pack, cruciale per questo progetto, ha dovuto essere implementata come script puramente Aggressor e invocata solo da Python utilizzando strutture dati di base (stringa e int) e non byte.pycobalt senza supporto per il threading. Beh, almeno abbiamo osservato che il threading si rompe in modo casuale, ma in un certo senso ce lo aspettavamo.pypykatz e il suo modulo compagno minidump hanno dovuto essere modificati per consentire un'analisi a blocchi più efficiente rispetto a quanto implementato in precedenza, ma questo è un argomento per un'altra occasione.
Dopo che pypykatz è stato in grado di interfacciarsi con CobaltStrike tramite pycobalt, il passo successivo è stato consentire la lettura a blocchi dei file. Purtroppo questa funzionalità non è disponibile per impostazione predefinita in nessuna delle soluzioni C2 che abbiamo visto, quindi abbiamo dovuto implementarla. Il modo in cui abbiamo affrontato questo problema è implementando la lettura a blocchi tramite l'uso dell'interfaccia Beacon Object Files di CobaltStrike, abbreviata in BOF. I BOF sono programmi C che vengono eseguiti sul beacon non come eseguibile separato ma come parte del beacon già in esecuzione. Questa interfaccia è molto utile perché rende i BOF molto più furtivi, poiché tutto il codice viene eseguito in memoria senza scrivere nulla su disco.
La nostra soluzione BOF è una semplice funzione che accetta 4 argomenti:
fileName : Percorso completo del file dump LSASS o hive del registro (sull'endpoint remoto)buffsize : Quantità (in byte) da leggere dal fileseekSize : Posizione da cui iniziare l'operazione di lettura (dall'inizio del file)rplyid : Numero di identificazione da incorporare nella risposta per evitare possibili collisioniCon questi parametri, pypykatz (in esecuzione sull'agente) può emettere operazioni di lettura file sul beacon (computer target) che mirano specificamente a determinate parti del file.
Dall'altra parte (in CobaltStrike) aggrokatz registra un callback per monitorare ogni messaggio restituito dal beacon target. Se l'intestazione del messaggio corrisponde all'intestazione di un'operazione di lettura file, verrà elaborato come un blocco di un file minidump e inviato al parser minidump, che invierà il risultato a pypykatz. Nel caso sia necessaria un'ulteriore lettura, pypykatz emetterà una lettura utilizzando il lettore minidump che invierà un nuovo comando di lettura sul beacon tramite l'interfaccia BOF. Questo processo si ripete fino a quando il file non viene analizzato.
Dopo aver analizzato circa 100 dump LSASS con questo metodo, possiamo affermare quanto segue (la dimensione del blocco utilizzata era 20k):
dcsync - autore di pycobalt
@anthemtotheego Twitter - Creatore di CredBandit
Nicol Jos @shinepaw - design del logo