Vai al contenuto
Leo

Libreria

Forense

Analisi dei file, forense di base e analisi dei log (DIFENSIVA e didattica).

  • 43 voci

Funzioni 43

tipo_dai_byte(dati)#

Il vero tipo di dati in memoria (testo, lista di byte o dati_binari).

Come riconosci_tipo_file ma su dati che hai già, senza file. Riconosce decine di formati dai "numeri magici". Restituisce un dizionario con "tipo", "descrizione", "estensioni", "categoria" (immagine, documento, archivio, eseguibile, audio, video...) ed "eseguibile" (vero o falso).

Esempiocontrollato con Leo
stampa(tipo_dai_byte(dati_binari("89504E470D0A1A0A", "esadecimale"))["tipo"])

elenca_firme()#

L'elenco di tutti i formati che Leo riconosce dai "numeri magici".

Restituisce una lista di dizionari con "tipo", "descrizione", "categoria", "estensioni" ed "eseguibile". Utile per sapere che cosa tipo_dai_byte e riconosci_tipo_file sanno distinguere.

Esempiocontrollato con Leo
stampa(lunghezza(elenca_firme()))

estensione_coerente(percorso)#

L'estensione del file corrisponde al suo vero contenuto?

Restituisce un dizionario con "coerente" (vero, falso o nulla se non si sa), "estensione" (quella scritta nel nome), "tipo_vero", "estensioni_attese" e "avviso" (un testo di allerta o nulla). Un file "foto.jpg" che in realtà è un EXE è un classico travestimento di un programma dannoso.

Esempiocontrollato con Leo
estensione_coerente("compiti.pdf")["coerente"]

impronta_albero(cartella)#

Una "fotografia" di una cartella: ogni file con impronta, dimensione e data.

Restituisce un dizionario percorso -> {"impronta" (SHA-256), "dimensione", "modifica"}. Salvalo con scrivi_json e più avanti usalo con confronta_alberi per accorgerti di modifiche non volute. A differenza di impronta_cartella, tiene anche dimensione e data di ogni file.

Esempiocontrollato con Leo
scrivi_json("stato.json", impronta_albero("documenti"))

confronta_alberi(prima, dopo)#

Che cosa è cambiato tra due "fotografie" di una cartella (con dettagli).

prima e dopo sono risultati di impronta_albero (o dopo è direttamente il nome della cartella). Restituisce "aggiunti", "tolti" e "cambiati" (ognuno con prima/dopo di dimensione, data e impronta), il numero "uguali" e "intatta". Serve per accorgersi di modifiche non volute.

Esempiocontrollato con Leo
confronta_alberi(leggi_json("stato.json"), "documenti")["cambiati"]

verifica_integrita(cartella, impronte_note)#

Controlla una cartella rispetto a un elenco di impronte noto.

impronte_note è un risultato di impronta_albero o di impronta_cartella (percorso -> impronta). Restituisce "integra" (vero/falso), "intatti" (quanti combaciano), "modificati", "mancanti" (nell'elenco ma non più sul disco) ed "estranei" (sul disco ma non nell'elenco).

Esempiocontrollato con Leo
verifica_integrita("sito", leggi_json("impronte_ufficiali.json"))["integra"]

condizione_testo(testo, offset = nulla, ignora_maiuscole = falso)#

Cerca un testo dentro un file.

Un pezzetto di una regola per regola_schema. Se dai offset, il testo deve stare esattamente lì; con ignora_maiuscole = vero "ERRORE" trova anche "errore".

Esempiocontrollato con Leo
condizione_testo("-----BEGIN", offset = 0)

condizione_byte(byte, offset = nulla)#

Cerca una sequenza di byte (numeri magici) dentro un file.

byte è un testo esadecimale ("4D5A"), una lista di numeri 0-255 o dei dati_binari. Un pezzetto di regola per regola_schema; con offset = 0 la firma deve stare all'inizio.

Esempiocontrollato con Leo
condizione_byte("4D5A", offset = 0)

condizione_regex(espressione, ignora_maiuscole = falso)#

Cerca un'espressione regolare dentro un file.

Un pezzetto di regola per regola_schema, per schemi flessibili (per

Esempiocontrollato con Leo
condizione_regex("[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]\{2,\}")

regola_schema(nome, condizioni, operatore = "o", descrizione = "")#

Costruisce una regola in stile YARA.

condizioni è una condizione (condizione_testo/condizione_byte/condizione_regex) o una lista. operatore è "o" (basta una condizione) oppure "e" (devono esserci tutte). Usa la regola con cerca_schema, cerca_schema_cartella o applica_regole.

Esempiocontrollato con Leo
regola_schema("chiave privata", condizione_testo("PRIVATE KEY"))

descrivi_regola(regola)#

Spiega a parole una regola fatta con regola_schema.

Restituisce un testo leggibile, utile per controllare una regola prima di usarla.

Esempiocontrollato con Leo
stampa(descrivi_regola(regola_schema("eseguibile", condizione_byte("4D5A", offset = 0))))

cerca_schema(regola, dati)#

Cerca una regola (regola_schema) dentro dati in memoria.

dati è un testo, una lista di byte o dei dati_binari. regola può essere anche solo un testo o una condizione. Restituisce "trovata" (vero/falso) e "riscontri" (dove e che cosa ha trovato).

Esempiocontrollato con Leo
stampa(cerca_schema("password", "config: password = 1234")["trovata"])

cerca_schema_cartella(regola, cartella)#

Cerca una regola in tutti i file di una cartella.

Restituisce una lista con, per ogni file in cui la regola è stata trovata, "percorso" e "riscontri".

Esempiocontrollato con Leo
cerca_schema_cartella(condizione_testo("TODO"), "progetto")

applica_regole(regole, percorso)#

Prova un insieme di regole su un file e dice quali scattano.

regole è una regola o una lista di regole (regola_schema, o regole_pronte()). Restituisce la lista delle regole trovate, ognuna con "nome" e "riscontri".

Esempiocontrollato con Leo
applica_regole(regole_pronte(), "sorgente.py")

applica_regole_cartella(regole, cartella)#

Prova un insieme di regole su tutti i file di una cartella.

Restituisce una lista con, per ogni file che fa scattare almeno una regola, "percorso" e "regole" (i nomi delle regole trovate).

Esempiocontrollato con Leo
applica_regole_cartella(regole_pronte(), "progetto")

regole_pronte()#

Un insieme di regole già fatte per schemi noti e legittimi, a scopo difensivo.

Trova (per PROTEGGERE, non per attaccare): eseguibili, archivi, chiavi private lasciate in chiaro, token/segreti dimenticati nel codice, indirizzi email, IP e numeri di carta in un testo. Dalle a applica_regole o applica_regole_cartella.

Esempiocontrollato con Leo
applica_regole(regole_pronte(), "config.txt")

metadati_pdf(percorso)#

I metadati di un documento PDF (autore, titolo, programma, date).

Restituisce un dizionario con "titolo", "autore", "oggetto", "parole_chiave", "creatore", "programma" (il software che l'ha prodotto), "creato", "modificato" e "pagine" (circa). Utile per sapere chi e con che cosa ha fatto un PDF.

Esempiocontrollato con Leo
metadati_pdf("relazione.pdf")["programma"]

metadati_zip(percorso)#

Che cosa c'è dentro un archivio ZIP (anche docx, xlsx, apk, epub...).

Restituisce "numero" (quanti file), "commento", "compresso" e "disteso" (byte totali) e "voci": per ogni file nome, dimensione, compressa, data e se è cifrato. Non estrae niente.

Esempiocontrollato con Leo
metadati_zip("documento.docx")["numero"]

metadati_office(percorso)#

I metadati di un documento Office o OpenDocument (autore, date, programma).

Vale per docx, xlsx, pptx (dentro docProps) e odt, ods, odp (dentro meta.xml). Restituisce "autore", "ultimo_autore", "titolo", "oggetto", "creato", "modificato", "programma" e "azienda" (quelli che ci sono).

Esempiocontrollato con Leo
metadati_office("lettera.docx")["autore"]

metadati_audio(percorso)#

I metadati di un file audio (MP3 con ID3, FLAC, WAV).

Restituisce "formato" e, quando ci sono, "titolo", "artista", "album", "anno" e un dizionario "campi" con tutto il resto. Per il WAV dà anche la "durata" in secondi.

Esempiocontrollato con Leo
metadati_audio("canzone.mp3")["artista"]

togli_metadati(percorso, destinazione = nulla)#

Toglie i metadati da un file (privacy).

Per le foto (JPEG, PNG, WebP) usa togli_exif; per i documenti Office/OpenDocument e gli archivi ZIP toglie le proprietà (autore, date, programma). Se non dai destinazione aggiunge "_pulito" al nome. Restituisce un dizionario con "destinazione" e "tolti".

Esempiocontrollato con Leo
togli_metadati("lettera.docx")

date_file(percorso)#

Le date di un file (modifica, accesso, creazione dove il sistema la dà) e la dimensione.

Restituisce un dizionario con "modifica", "accesso", "creazione" (o nulla) in formato ISO e "dimensione". Le date aiutano a ricostruire che cosa è successo a un file.

Esempiocontrollato con Leo
date_file("prova.txt")["modifica"]

date_incoerenti(percorso)#

Cerca stranezze nelle date di un file (segnali di manomissione).

Restituisce un dizionario con "avvisi" (una lista di messaggi) e le date stesse. Segnala per

Esempiocontrollato con Leo
date_incoerenti("sospetto.doc")["avvisi"]

analizza_log_web(percorso)#

Legge un log di accessi web (Apache/Nginx) e lo trasforma in eventi.

Capisce sia il formato "combined" sia "common". Ogni evento ha "ip", "data", "ora", "metodo", "risorsa", "stato", "dimensione", "referer" e "agente".

Esempiocontrollato con Leo
lunghezza(analizza_log_web("access.log"))

analizza_syslog(percorso)#

Legge un log di sistema (syslog) e lo trasforma in eventi.

Ogni evento ha "data", "ora", "host", "programma", "pid", "livello" (se c'è), "ip" (se compare) e "messaggio".

Esempiocontrollato con Leo
analizza_syslog("/var/log/syslog")

analizza_log_firewall(percorso)#

Legge un log di firewall (iptables/UFW) e lo trasforma in eventi.

Legge le coppie SRC/DST/PROTO/SPT/DPT e l'azione (BLOCK, DROP, ACCEPT...). Ogni evento ha "ip", "destinazione", "protocollo", "porta_destinazione" e "azione".

Esempiocontrollato con Leo
analizza_log_firewall("ufw.log")

analizza_log_csv(percorso)#

Legge un CSV di eventi (con intestazione) e lo trasforma in eventi.

La prima riga sono i nomi delle colonne. Riconosce colonne come "ip", "data"/"ora"/"timestamp", "livello"/"level" e "messaggio" e le normalizza, tenendo anche tutte le altre.

Esempiocontrollato con Leo
analizza_log_csv("eventi.csv")

leggi_log(percorso, formato = "auto")#

Legge un file di log riconoscendo da solo il formato.

formato può essere "auto", "web", "syslog", "firewall" o "csv". Restituisce la lista degli eventi (vedi le funzioni analizza_...). Con "auto" prova a indovinare dal contenuto.

Esempiocontrollato con Leo
leggi_log("access.log")leggi_log("eventi.csv", "csv")

raggruppa_eventi(eventi, campo)#

Raggruppa gli eventi di un log per un campo (ip, ora, stato, livello...).

Restituisce un dizionario valore_del_campo -> lista di eventi.

Esempiocontrollato con Leo
raggruppa_eventi(leggi_log("access.log"), "ip")

conta_valori(eventi, campo, quanti = 10)#

La classifica dei valori più frequenti di un campo.

Restituisce una lista di dizionari {"valore", "conteggio"}, dal più frequente, lunga al massimo quanti.

Esempiocontrollato con Leo
stampa(conta_valori(leggi_log("access.log"), "ip", 5))

riepilogo_log(eventi)#

Un riassunto di un log: quanti eventi, periodo, IP, stati o livelli più frequenti.

Restituisce un dizionario con "totale", "dalla"/"alla" (prima e ultima data), "ip_distinti", "top_ip" e, se ci sono, "per_stato" (web) o "per_livello" (syslog).

Esempiocontrollato con Leo
stampa(riepilogo_log(leggi_log("access.log")))

accessi_falliti(eventi)#

Raggruppa per IP i tentativi di accesso falliti di un log.

Riconosce gli errori di autenticazione del web (stato 401/403) e del syslog ("Failed password", "authentication failure", "invalid user"). Restituisce una lista {"ip", "tentativi"} dal più attivo.

Esempiocontrollato con Leo
accessi_falliti(leggi_log("auth.log", "syslog"))

ip_sospetti(eventi, soglia = 10)#

Gli IP con troppi accessi falliti (possibile forza bruta altrui).

Restituisce la lista degli IP con almeno soglia tentativi falliti, con "ip", "tentativi" e un "motivo". Strumento DIFENSIVO: serve a vedere chi bussa troppo ai propri servizi.

Esempiocontrollato con Leo
stampa(ip_sospetti(leggi_log("auth.log", "syslog"), 5))

orari_insoliti(eventi, da_ora = 0, a_ora = 6)#

Gli eventi capitati in orari insoliti (di notte).

Tiene gli eventi la cui ora è compresa tra da_ora (incluso) e a_ora (escluso). Di notte un accesso può meritare un'occhiata. Restituisce la lista di quegli eventi.

Esempiocontrollato con Leo
stampa(orari_insoliti(leggi_log("access.log")))

trova_anomalie_log(eventi, ip_noti = nulla, soglia_falliti = 5)#

Cerca stranezze in un log.

Trova: IP con molti accessi falliti, eventi notturni, IP mai visti (se dai ip_noti, una lista di IP fidati) e picchi (minuti con molti più eventi della media). Restituisce un dizionario con questi risultati e una lista "avvisi" in italiano.

Esempiocontrollato con Leo
trova_anomalie_log(leggi_log("access.log"))

segui_log(percorso, schema, quando_trova = nulla, secondi = 10, da_inizio = falso)#

Segue un log dal vivo.

Guarda il file mentre cresce (come tail -f) e, per ogni nuova riga che corrisponde a schema (un testo, un'espressione o una regola_schema), chiama la funzione quando_trova passandole la riga. Si ferma dopo secondi secondi. Con da_inizio = vero guarda anche le righe già presenti (utile per provare). Restituisce la lista delle righe che hanno fatto scattare lo schema. SOLO difensivo: serve a sorvegliare i propri registri.

Esempiocontrollato con Leo
segui_log("auth.log", "Failed password", stampa_riga, secondi = 30)

stringhe_leggibili(percorso, minimo = 4)#

Estrae le parti di testo leggibili da un file (come "strings").

Trova le sequenze di caratteri stampabili lunghe almeno minimo, sia ASCII sia UTF-16. Dentro un programma o un file binario rivelano URL, messaggi, percorsi: utile per il triage, senza eseguire niente. Restituisce una lista di testi.

Esempiocontrollato con Leo
stringhe_leggibili("programma.exe", 6)

estrai_url(dati)#

Tutti gli indirizzi web (URL) dentro un testo o dei dati binari.

Restituisce la lista degli URL trovati (http, https, ftp), senza ripetizioni. Utile per capire con chi "parla" un file sospetto, senza aprirlo.

Esempiocontrollato con Leo
estrai_url("vai su https://esempio.it e http://altro.org")

estrai_ip(dati)#

Tutti gli indirizzi IP (versione 4) dentro un testo o dei dati binari.

Restituisce la lista degli IP validi trovati, senza ripetizioni.

Esempiocontrollato con Leo
estrai_ip("connessioni da 10.0.0.1 e 8.8.8.8")

estrai_email(dati)#

Tutti gli indirizzi email dentro un testo o dei dati binari.

Restituisce la lista degli indirizzi trovati, senza ripetizioni (utile anche per la protezione dei dati personali).

Esempiocontrollato con Leo
estrai_email("scrivi a mario@esempio.it")

estrai_carte(dati)#

Possibili numeri di carta di credito in un testo (per la protezione dei dati).

Trova le sequenze di 13-19 cifre che passano il controllo di Luhn. I numeri sono sempre MASCHERATI (si vedono solo le ultime 4 cifre): servono a scoprire dati sensibili lasciati in giro, non a copiarli. Restituisce {"mascherato", "circuito"}.

Esempiocontrollato con Leo
estrai_carte(leggi_testo("note.txt"))

cerca_segreti(percorso)#

Cerca in un file segreti dimenticati (chiavi private, token, password).

Strumento DIFENSIVO: trova chiavi private lasciate in chiaro e token/segreti scritti nel codice, per toglierli. I valori trovati sono sempre MASCHERATI. Restituisce una lista {"tipo", "riga", "anteprima"}.

Esempiocontrollato con Leo
cerca_segreti("config.py")

indizi_file(percorso)#

Un triage difensivo di un file in una sola chiamata.

Mette insieme tipo vero, coerenza dell'estensione, dimensione, entropia (vicina a 8 = compresso o cifrato), impronta SHA-256, quante stringhe leggibili contiene e se dentro ci sono URL, IP o email. NON esegue niente. Restituisce un dizionario con questi indizi e una lista "avvisi".

Esempiocontrollato con Leo
indizi_file("allegato_sospetto.bin")["avvisi"]