
Kit modulare per la risposta agli incidenti progettato per raccogliere dati forensi da endpoint macOS potenzialmente infetti, catturando artefatti del browser, meccanismi di persistenza, processi e configurazioni di rete.
Questa serie di script è progettata per raccogliere una varietà di dati da un endpoint sospettato di essere infetto, per facilitare il processo di risposta agli incidenti. Questi dati non devono essere considerati una raccolta forense completa, ma catturano molte informazioni forensi utili.
Se desideri veri dati forensi, dovresti davvero acquisire un dump completo della memoria e un'immagine dell'intero disco. Questo non rientra nell'ambito di questo toolkit.
Lo script deve essere eseguito su un sistema live, non su un'immagine o altro archivio di dati forensi. Non richiede strettamente permessi di root per l'esecuzione, ma senza di essi non sarà in grado di raccogliere gran parte dei dati previsti.
I dati saranno raccolti in due forme. La prima è sotto forma di file di riepilogo, contenenti l'output di comandi shell, dati estratti da database e simili. Ad esempio, il modulo browser produrrà un file browser_extensions.txt con un riepilogo di tutte le estensioni del browser installate per Safari, Chrome e Firefox.
La seconda sono file completi raccolti dal filesystem. Sono memorizzati in una sottocartella artifacts all'interno della cartella di raccolta.
Lo script è molto semplice da eseguire. Accetta un solo parametro, obbligatorio, per passare uno script di configurazione in formato JSON:
./pict.py -c /path/to/config.json
Lo script di configurazione descrive cosa raccoglierà lo script e come. Dovrebbe assomigliare a questo:
{
"collection_dest" : "~/Desktop/",
"all_users" : true,
"collectors" : {
"browser" : "BrowserExtCollector",
"persist" : "PersistenceCollector",
"suspicious" : "SuspiciousBehaviorCollector",
"browserhist" : "BrowserHistoryCollector",
"bash_config" : "BashConfigCollector",
"bash_hist" : "BashHistoryCollector",
"processes" : "ProcessCollector",
"network_config" : "NetworkConfigCollector",
"profiles" : "ProfileCollector",
"certs" : "TrustedCertCollector"
},
"settings" : {
"keepLSData" : true,
"zipIt" : true
},
"moduleSettings" : {
"browser" : {
"collectArtifacts" : true
}
},
"unused" : {
"installs" : "InstallationCollector"
}
}
Specifica il percorso in cui memorizzare i dati raccolti. Può essere un percorso assoluto o relativo alla cartella home dell'utente (iniziando con un tilde). Il percorso predefinito, se non specificato, è /Users/Shared.
I dati saranno raccolti in una cartella creata in questa posizione. Tale cartella avrà un nome nella forma PICT-nomecomputer-AAAA-MM-GG, dove il nome del computer è il nome della macchina specificato in Preferenze di Sistema > Condivisione e la data è la data di raccolta.
Se true, raccoglie dati da tutti gli utenti sulla macchina quando possibile. Se false, raccoglie dati solo per l'utente che esegue lo script. Se non specificato, il valore predefinito è true.
PICT è modulare e può essere facilmente ampliato o ridotto semplicemente cambiando i moduli Collector utilizzati.
I dati collectors sono un dizionario in cui la chiave è il nome di un modulo da caricare (il nome del file Python senza estensione .py) e il valore è il nome della sottoclasse Collector trovata in quel modulo. Puoi aggiungere voci aggiuntive per moduli personalizzati (vedi Scrivere i propri moduli), o rimuovere voci per impedire l'esecuzione di quei moduli. Un modo semplice per rimuovere moduli, senza dover cercare i nomi esatti in seguito se vuoi aggiungerli di nuovo, è spostarli in un dizionario di primo livello chiamato unused.
Questo dizionario fornisce impostazioni globali.
keepLSData specifica se il file lsregister.txt - che può essere piuttosto grande - deve essere conservato. (Questo file viene generato automaticamente e viene utilizzato da alcuni altri moduli per costruire l'output. Contiene molte informazioni utili, ma può superare i 100 MB. Se non hai bisogno di tutti quei dati o non vuoi gestire una quantità così grande, imposta questo a false e verrà eliminato al termine della raccolta.)
zipIt specifica se generare automaticamente un file zip con il contenuto della cartella di raccolta. Nota che il processo di compressione e decompressione dei dati modificherà alcuni attributi, come la proprietà del file.
Questo dizionario specifica le impostazioni specifiche del modulo. Non tutti i moduli hanno le proprie impostazioni, ma se un modulo lo consente, puoi fornirle qui. Nell'esempio sopra, puoi vedere un'impostazione booleana chiamata collectArtifacts utilizzata con il modulo browser.
Ci sono anche impostazioni globali del modulo gestite dalla classe Collector, che possono essere impostate individualmente per ciascun modulo.
collectArtifacts specifica se raccogliere gli artefatti file che normalmente sarebbero raccolti dal modulo. Se false, tutti gli artefatti saranno omessi per quel modulo. Questo può essere necessario in casi in cui lo spazio di archiviazione è un problema e gli artefatti raccolti sono grandi, o in casi in cui gli artefatti raccolti possono rappresentare un problema di privacy per l'utente il cui sistema è in fase di analisi.
I moduli devono consistere in un file contenente una classe che sia una sottoclasse di Collector (definita in collectors/collector.py), e devono essere inseriti nella cartella collectors. Un nuovo modulo Collector può essere facilmente creato duplicando il file collectors/template.py e personalizzandolo per il proprio uso.
def __init__(self, collectionPath, allUsers)Questo metodo può essere sovrascritto se necessario, ma in tal caso deve essere chiamato il super Collector.init(), preferibilmente prima che il tuo codice personalizzato venga eseguito. Questo dà all'oggetto la possibilità di impostare le sue proprietà prima che il tuo codice cerchi di usarle.
def printStartInfo(self)Questo è un metodo molto semplice che verrà chiamato all'inizio della raccolta di questo modulo. Il suo scopo è stampare un messaggio su stdout per dare all'utente un senso di progresso, fornendo feedback su ciò che sta accadendo.
def applySettings(self, settingsDict)Questo dà al modulo la possibilità di applicare eventuali impostazioni personalizzate. Ogni modulo può avere le proprie impostazioni definite, ma settingsDict deve essere passato anche al super, in modo che la classe Collection possa gestire le impostazioni che definisce.
def collect(self)Questo metodo è il cuore del modulo. Viene chiamato quando è il momento per il modulo di iniziare la raccolta. Può scrivere tutti i file necessari, ma dovrebbe limitare questa attività a file all'interno del percorso self.collectionPath e utilizzare nomi di file non già occupati da altri moduli.
Se desideri raccogliere artefatti, non provare a farlo da solo. Aggiungi semplicemente i percorsi all'array self.pathsToCollect, e la classe Collector si occuperà di copiarli nei percorsi secondari appropriati nella cartella artifacts, mantenendo i metadati (permessi, attributi estesi, flag, ecc.) sugli artefatti.
Quando il metodo termina, assicurati di chiamare il super (Collector.collect(self)) per dare alla classe Collector la possibilità di gestire le sue responsabilità, come la raccolta degli artefatti.
Il tuo metodo collect può utilizzare qualsiasi dato raccolto nei file basic_info.txt o lsregister.txt presenti in self.collectionPath. Questi vengono raccolti all'inizio dallo script pict.py e si può presumere che siano disponibili per l'uso da parte di qualsiasi altro modulo. Tuttavia, non dovresti fare affidamento sull'output di altri moduli, poiché non vi è garanzia che i file siano disponibili quando il tuo modulo viene eseguito. I moduli potrebbero non essere eseguiti nell'ordine in cui appaiono nel tuo JSON di configurazione, poiché i dizionari Python non sono ordinati.
Grazie a Greg Neagle per FoundationPlist.py, che ha risolto molti problemi con la lettura di plist binarie, plist contenenti tipi di dati data, ecc.