
Crawlector è un framework di threat hunting progettato per scansionare siti web alla ricerca di oggetti dannosi.
Crawlector (il nome Crawlector è una combinazione di Crawler & Detector) è un framework di threat-hunting progettato per scansionare siti web alla ricerca di oggetti malevoli.
Nota-1: Il framework è stato presentato per la prima volta alla conferenza No Hat a Bergamo, Italia, il 22 ottobre 2022 (Slides, Registrazione YouTube). Inoltre, è stato presentato per la seconda volta alla conferenza AVAR, a Singapore, il 2 dicembre 2022.
Nota-2: Lo strumento complementare EKFiddle2Yara (è uno strumento che prende le regole EKFiddle e le converte in regole Yara) menzionato nel talk è stato anch'esso rilasciato in entrambe le conferenze.
Nota-3: La versione 2.0 (Photoid Build:180923), una release milestone, è stata rilasciata il 18 settembre 2023.
Nota-4: La versione 2.1 (Universe-647 Build:031023) è stata rilasciata il 3 ottobre 2023. Una grande aggiunta è la funzionalità di notifica Slack Alert.
Nota-5: La versione 2.2 (Hallstatt Build:051123) è stata rilasciata il 5 novembre 2023. Una grande aggiunta è la funzionalità di controllo remoto Slack.
Nota-6: La versione 2.3 (Munich Build:241123) è stata rilasciata il 24 novembre 2023. Una grande aggiunta è la funzionalità DNS Nameservers.
Nota-6: La versione 2.3.1 {Nero Build:131225} è stata rilasciata il 13 dicembre 2025. Questa è una release di manutenzione.
Serve per verificare la presenza di URL malevoli in ogni pagina scansionata. Il framework può interrogare l'elenco di URL malevoli dal server URLHaus (configurazione: url_list_web) o da un file su disco (configurazione: url_list_file); se quest'ultimo è specificato, ha la precedenza sul primo.
Funziona cercando il contenuto di ogni pagina in tutte le voci URL presenti in url_list_web o url_list_file, verificando tutte le occorrenze. Inoltre, in caso di corrispondenza e se l'opzione di configurazione check_url_api è impostata su true, Crawlector invierà una richiesta POST all'URL dell'API impostato nell'opzione di configurazione url_api, che restituisce un oggetto JSON con informazioni extra sull'URL corrispondente. Tali informazioni includono urlh_status (es., online, offline, unknown), urlh_threat (es., malware_download), urlh_tags (es., elf, Mozi) e urlh_reference (es., https://urlhaus.abuse.ch/url/1116455/). Queste informazioni saranno incluse nel file di log cl_mlog_<data_corrente><ora_corrente><(am|pm)>.csv (vedi sotto), solo se check_url_api è impostato su true. Altrimenti, il file di log includerà le colonne urlh_url (elenco di URL malevoli corrispondenti) e urlh_hit (numero di occorrenze per ogni URL malevolo corrispondente), a condizione che check_url sia impostato su true.
La funzionalità URLHaus può essere completamente disabilitata impostando l'opzione di configurazione check_url su false.
È importante notare che questa funzione potrebbe rallentare la scansione, considerando l'enorme numero di URL malevoli (~ 130 milioni di voci al momento della stesura) che devono essere controllati e il tempo necessario per ottenere informazioni extra dal server URLHaus (se l'opzione check_url_api è impostata su true).
È necessario familiarizzare con il file di configurazione cl_config.ini prima di eseguire qualsiasi sessione. Tutte le sezioni e i parametri sono documentati nel file di configurazione stesso.
La funzionalità di scansione offline Yara è un'opzione autonoma; ciò significa che, se abilitata, Crawlector eseguirà solo questa funzionalità, indipendentemente dalle altre funzionalità abilitate. Lo stesso vale per la funzionalità di crawling per i certificati digitali di domini/siti. In ogni caso, si consiglia di disabilitare tutte le funzionalità inutilizzate nel file di configurazione.
log_to_file o log_to_cons), se una regola Yara fa riferimento solo agli attributi di un modulo (es., PE, ELF, Hash, ecc.), allora Crawlector mostrerà solo il nome della regola in caso di corrispondenza, escludendo i dati di offset e lunghezza.Nota: per qualsiasi opzione che accetta un percorso, fornire sempre il percorso assoluto.
Per visitare/scansionare un sito web, l'elenco degli URL deve essere memorizzato in file di testo, nella directory "cl_sites".
Crawlector accetta tre tipi di URL:
[a-zA-Z0-9_-]{1,128} = <url><id>[depth:<0|1>-><\d+>,total:<\d+>,sleep:<\d+>] = <url>
Ad esempio,
mfmokbel[depth:1->3,total:10,sleep:0] = https://www.mfmokbel.com
che equivale a:
mfmokbel[d:1->3,t:10,s:0] = https://www.mfmokbel.com
dove, <id> := [a-zA-Z0-9_-]{1,128}
depth, total e sleep possono anche essere sostituiti con le loro versioni abbreviate d, t e s, rispettivamente.
40 (10 + (10*3)) URL.Nota 1: un URL di Tipo 3 può essere trasformato in un URL di Tipo 1 impostando il parametro di configurazione live_crawler su false nel file di configurazione, nella sezione spider.
Nota 2: le righe vuote e le righe che iniziano con ";", "#" o "//" vengono ignorate.
La funzionalità spider è ciò che dà a Crawlector la capacità di trovare link aggiuntivi nella pagina di destinazione. Lo Spider supporta le seguenti caratteristiche:
Tipo 3 affinché la funzionalità Spider funzioniexclude_url. Ad esempio, *.zip|*.exe|*.rar|*.zip|*.7z|*.pdf|.*bat|*.dbinclude_url. Ad esempio, */checkout/*|*/products/*exclude_httpsadd_ext_links. Questa funzione rispetta le opzioni di configurazione exclude_url e include_url.ext_links_only. Questa funzione rispetta le opzioni di configurazione e .Nella release 2.0, i tipi di ID sono assegnati esplicitamente aggiungendo uno dei seguenti tipi all'ID stesso:
Il fatto che ogni id porti con sé il suo tipo rende più facile navigare e filtrare i risultati. Inoltre, questo viene utilizzato internamente per vari motivi.
site_ranking nel file di configurazione fornisce alcune opzioni per modificare il modo in cui il file CSV deve essere lettosite fornisce la capacità di espandere un determinato sito tentando di trovare tutti i top-level domain (TLD) e/o sottodomini disponibili per lo stesso dominio. Se trovati, i nuovi TLD/sottodomini verranno controllati come qualsiasi altro dominiorapid_api_key nel file di configurazionefind_tlds abilitato, oltre ai risultati dei tld dell'API Omnisint Labs, il framework tenta di trovare altri domini attivi/registrati esaminando ogni voce tld, sia nel file tlds_file che nell'URL tlds_urltlds_url è impostato, deve puntare a un URL che ospita i tld, ciascuno su una nuova riga (le righe che iniziano con uno dei caratteri ';', '#' o '//' vengono ignorate)tlds_file, contiene il nome del file con l'elenco dei tld (come per tlds_url; è presente solo il tld, escluso il '.', ad es., "com", "org")tlds_file è impostato, ha la precedenza su La funzionalità di reindirizzamento degli URL nelle release precedenti era difettosa. Questa release fornisce una riscrittura completa della funzionalità di reindirizzamento, con un alto grado di parametrizzazione per controllarne il funzionamento. Nella versione 2.0, il reindirizzamento ha una sezione dedicata nel file di configurazione, denominata [redirect]. L'intera funzionalità di reindirizzamento può essere attivata/disattivata tramite l'opzione follow_redir, nella sezione [default].
La funzione di reindirizzamento controlla i codici di stato della risposta HTTP: 301, 302, 303, 307 e 308. In caso di corrispondenza, Crawlector analizzerà l'intestazione Location per l'URL di reindirizzamento, considerando sia gli URL assoluti che quelli relativi. La funzionalità di reindirizzamento in Crawlector è stata progettata per prestazioni e agilità. La sezione [redirect] fornisce il seguente elenco di opzioni:
L'opzione depth accetta uno dei valori, last o all. Controlla quali URL di reindirizzamento trovati visitare, a seconda che l'opzione visit sia abilitata o meno. all serve per visitare tutti gli URL di reindirizzamento trovati. last serve per visitare l'ultimo URL di reindirizzamento. La visita di questi URL avviene nella stessa sessione corrente. Tieni presente che, indipendentemente dal valore di depth, Crawlector registrerà l'elenco di tutti i reindirizzamenti trovati agli URL, insieme al numero totale, in forma assoluta. Verranno scritti nel file CSV cl_mlog, nelle colonne redirect_urls e redirect_total.
L'opzione max_redirect imposta un limite massimo al numero totale di reindirizzamenti di URL da scoprire.
L'opzione skip_similar è meglio spiegata con il seguente esempio:
Supponiamo che l'URL originale fornito a Crawlector da analizzare sia "https://www.mfa.gov.law" e uno degli url di reindirizzamento trovati sia "https://mfa.gov.law/". Come puoi notare, l'unica differenza è la barra finale nell'URL. Questi due URL sono identici e il server risponderà con la stessa pagina. Se l'opzione visit è impostata su true, Crawlector analizzerà entrambi gli URL, sprecando risorse ed eseguendo la stessa attività due volte. Questo potrebbe non essere un problema per 1 o 2 URL, ma se hai migliaia di URL da analizzare e l'opzione visit è abilitata, le probabilità che più della metà di essi abbiano un URL scoperto di questo tipo sono molto alte, nel qual caso diventa un problema urgente da considerare. Pertanto, impostare l'opzione skip_similar su true aiuterà a risolvere questo problema saltando la visita di URL simili. Oltre allo scenario della barra finale, l'opzione skip_similar tiene conto anche dei seguenti due scenari: se l'URL di reindirizzamento differisce solo per uno o entrambi i prefissi "https://" e "www.".
Una delle principali aggiunte alla release 2.0 è la capacità di estrarre diversi tipi di oggetti dalla pagina, salvarli su disco, scansionarli con Yara e URLHaus e salvare i risultati nel file CSV. Per abilitare questa funzionalità, impostare l'opzione extract_obj su true, nella sezione [page].L'implementazione della funzionalità di estrazione profonda degli oggetti funziona creando un file di archivio web MHT dalla pagina web, includendo script esterni, immagini e file CSS. Tutti i file incorporati verranno estratti nel percorso specificato dall'opzione obj_dir (percorso: obj_dir/objects/), dove ogni file verrà scansionato. L'implementazione non va confusa con la funzionalità del browser headless. DOE è diverso e non comporta il caricamento della pagina per recuperare tutti gli URL richiesti dinamicamente. Pertanto, ha i suoi limiti.
Tutti gli oggetti estratti avranno alcuni dei loro metadati scritti nel file CSV. Cose da tenere a mente durante la lettura del file CSV: l'ID del dominio con l'oggetto estratto ha un formato unico, come segue, <domain_id>_<type>_p_obj_<counter> (ad esempio, _mfa_gov_cef40bc5-ba6a-41_t1_p_obj_0_). E l'url avrà il seguente formato, <url>__<object_filename> (ad esempio, https://www.mfa.gov.law\_\_bilmur.min.js).
Se l'opzione delete_obj è impostata su true, tutti gli oggetti estratti che non vengono rilevati da Yara vengono eliminati dal disco. Se l'opzione log_all_objs è impostata su true, registra tutti i metadati degli oggetti estratti nello stesso file CSV cl_mlog. Se l'opzione check_urlhaus nella sezione [page] è impostata su true, ogni oggetto estratto verrà scansionato da URLHaus. Nota che le opzioni di questa opzione sono ereditate dalla sezione [urlhaus].
Nota: se il dominio sottoposto a crawling reindirizza a un altro dominio, l'ultimo reindirizzamento all'URL deve essere passato a DOE per funzionare. Inoltre, il dominio deve iniziare con "HTTP(S)://" affinché DOE funzioni.
A volte, potresti voler eseguire sessioni di Crawlector che potrebbero richiedere giorni per essere completate, ad esempio eseguendo il crawling dei primi 1 milione di siti web Alexa, e per uno scenario del genere, hai bisogno di un modo per monitorare il funzionamento e l'avanzamento del framework da remoto. Pertanto, nella versione 2.1, ho aggiunto la funzionalità di notifica di avviso Slack per fornire un meccanismo per monitorare l'esecuzione di Crawlector in tempo reale, inviando gli avvisi di Yara, gli eventi std::exit() e gli avvisi e gli errori di processo, a un canale Slack di tua scelta. In aggiunta a ciò, Crawlector installa un handler della console nel tentativo di monitorare determinati tipi di eventi, inclusi ctrl_c, ctrl_close, ctrl_break, ctrl_logoff e ctrl_shutdown. È importante tenere a mente che Crawlector non modifica/altera il comportamento dell'handler predefinito; si limita a segnalare al canale Slack la ricezione di uno qualsiasi degli eventi elencati. Questo potrebbe essere esteso in futuro per includere altri tipi di eventi.
Questa funzionalità utilizza l'API REST di Slack e per l'autenticazione con il server utilizza OAuth 2.0. Avrai bisogno di un token API Slack per usarlo e di un canale configurato con le autorizzazioni corrette. Questa funzionalità invia solo messaggi al canale Slack e non riceve né elabora alcun messaggio in arrivo.
La sezione [slack_alert] fornisce il seguente elenco di opzioni:
Per disabilitare o abilitare questa funzionalità, basta impostare l'opzione alert su true o false. Inoltre, devi specificare api_token con un nome channel.
Nota-1: nella fase di inizializzazione di Crawlector, verifica se il token di autenticazione fornito è valido o meno, o se il canale è impostato e in caso di fallimento, questa funzionalità viene disabilitata automaticamente.
Tutti gli avvisi segnalati al canale Slack vengono segnalati con il nome utente Crawlector v<numero_versione>, ad esempio, Crawlector v2.1. L'utente ha l'icona di una ragnatela. Inoltre, tutti gli avvisi sono raggruppati in thread, il che significa che tutti gli avvisi successivi al primo messaggio di avvio vengono pubblicati come risposte. Questa è stata una decisione progettuale e aiuta nel caso in cui tu stia eseguendo più sessioni contemporaneamente, tutte che segnalano allo stesso canale. Alcuni avvisi utilizzano il linguaggio di markup markdown per la formattazione.
Quando il processo termina con successo e sta per uscire, pubblica il seguente messaggio:
Crawlector ha terminato e si sta arrestando correttamente
Nota-2: il limite di velocità di Slack sull'API di pubblicazione dei messaggi è di un messaggio al secondo, con un margine per alcuni picchi. Crawlector non mette in coda i messaggi per gestire più pubblicazioni al secondo. Questo potrebbe cambiare in futuro se necessario; tuttavia, l'opzione sleep consente al processo di attendere per un periodo di tempo specificato dopo ogni messaggio pubblicato con successo.
Con la versione 2.2 (nome in codice Hallstatt), introduco la possibilità di controllare da remoto Crawlector tramite un insieme selezionato di comandi di controllo appositamente progettati. Il motivo per cui introduco questa funzionalità è monitorare e controllare determinati comportamenti di sessioni che dovrebbero durare ore o giorni. Ad esempio, potresti voler attivare/disattivare la funzionalità di avviso Slack, terminare Crawlector e caricare un file di configurazione, tra gli altri.
Questa funzionalità utilizza l'API REST di Slack e per l'autenticazione con il server utilizza OAuth 2.0. Avrai bisogno di un token API Slack per usarlo e di un canale configurato con le autorizzazioni corrette. Il token API è lo stesso utilizzato nella sezione [slack_alert], opzione api_token.
La sezione [slack_alert] fornisce il seguente elenco aggiuntivo di opzioni per la funzionalità di controllo remoto:
Per disabilitare o abilitare questa funzionalità, basta impostare l'opzione control su true o false. Il nome ctrl_channel deve essere l'ID del canale e non il nome del canale. Puoi ottenerlo facendo clic con il pulsante destro del mouse sul nome del canale -> Visualizza dettagli canale -> Scorri verso il basso fino alla fine della finestra e vedrai il campo ID canale: <channel_id>.
L'opzione ctrl_sleep determina la frequenza con cui chiamare il canale di controllo specificato nell'opzione ctrl_channel per recuperare i comandi di controllo. Puoi anche aggiornare questa opzione tramite il comando di controllo cl_update_delay <tempo_in_ms>.
L'elenco dei comandi di controllo supportati è il seguente:
Nota-1: nella fase di inizializzazione di Crawlector, verifica se il token di autenticazione fornito è valido o meno, o se il canale è impostato e in caso di fallimento, questa funzionalità viene disabilitata automaticamente.
Se questa funzionalità è abilitata e una volta superata la convalida del token API, Crawlector invia il messaggio "Crawlector è pronto per ricevere comandi di controllo. Digita il comando cl_help per un elenco dei comandi di controllo supportati." al ctrl_channel designato.
Tutte le risposte a un dato comando di controllo sono raggruppate in thread. Inoltre, i comandi di controllo vengono letti su base sessione per sessione, dal momento in cui una sessione viene avviata.
Nota-2: il limite di velocità di Slack sull'API di recupero (cronologia della conversazione) dei messaggi è di una richiesta al secondo, con un margine per alcuni picchi. Quindi, se l'opzione ctrl_sleep è impostata su un valore inferiore a un secondo o superiore a un secondo, Crawlector mette in coda i messaggi per gestire più comandi di controllo al secondo e li esegue nell'ordine ricevuto.
Con la versione 2.3 (nome in codice Monaco), viene introdotta la possibilità di specificare un elenco di server DNS per tutte le query DNS e le risoluzioni DNS-in-IP tentate da Crawlector con un alto livello di controllo. Questo è importante nel caso in cui stai eseguendo il crawling di siti web bloccati o dannosi. Questa funzionalità si applica a ogni funzione in Crawlector in cui viene effettuata una query DNS o una richiesta DNS-in-IP. Ancora più importante, fornisce la possibilità di eseguire DNS su TLS per ogni server di nomi che lo supporta.
La sezione [dns_ns] fornisce il seguente elenco di opzioni per amministrare questa funzionalità:
L'opzione name_servers accetta un elenco parametrizzato di server DNS da utilizzare, separati da virgole. Il valore di questa opzione ha il formato: <indirizzo_IPv4>(<opzione_tls>) dove <opzione_tls> assume uno dei valori "d_tls" o "e_tls". Le opzioni "d_tls" o "e_tls" indicano rispettivamente se il server di nomi in questione supporta o meno DNS su TLS. Questa opzione verrà applicata in base al valore impostato per l'opzione dns_tls. Ad esempio, la voce 8.8.8.8(e_tls) indica di utilizzare il server DNS Google 8.8.8.8 con supporto TLS, mentre la voce 12.13.14.15(d_tls) indica di utilizzare il server DNS 12.13.14.15 senza supporto TLS.
L'opzione dns_tls specifica il livello richiesto di applicazione di TLS. Questa opzione assume uno dei valori "yes" "no" o "force".
L'opzione keep_default serve per aggiungere o meno i server di nomi predefiniti all'elenco dei server di nomi. Si presuppone che un server di nomi predefinito non supporti TLS.
L'opzione conn_time_out specifica il tempo in millisecondi da attendere per una risposta a una query DNS.
L'opzione enable attiva o disattiva questa funzionalità.
cl_sites sono consentiti.Aperto a pull request e segnalazioni di problemi. Commenti e suggerimenti sono molto apprezzati.
Mohamad Mokbel (@MFMokbel)
exclude_urlinclude_url| id_postfix (tipo) | descrizione |
|---|
| _t1_p | tipo 1 semplice senza id |
| _sd | sottotipo per sottodomini |
| _tld | sottotipo per tld |
| _t2_p | tipo 2 semplice con un id |
| _t3_s | tipo 3 domini spiderati |
| _t3_sc | tipo 3 domini spiderati con un nodo figlio |
| _t3_ss | tipo 3 quando un url tipo 3 (_t3_s) viene convertito in url tipo 1 |
| _t3_s_e | tipo 3 link esterni di domini spiderati |
| _obj_ | per scansione approfondita ed estrazione di oggetti |
| _t4_ru | per url di reindirizzamento (per tutti i tipi) |
tlds_urltld_dl_time_out, serve per impostare il timeout massimo per la funzione dnslookup quando si tenta di verificare se il dominio in questione risolve o menotld_use_connect, questa opzione abilita la funzionalità di connessione al dominio in questione su un elenco di porte, definite nell'opzione tlds_connect_portstlds_connect_ports accetta un elenco di porte, separate da virgola, o un elenco di intervalli, come 25-40,90-100,80,443,8443 (l'inizio e la fine dell'intervallo sono inclusi)
tld_con_time_out, serve per impostare il timeout massimo per la funzione connecttld_con_use_ssl, abilita/disabilita l'uso di SSL quando si tenta di connettersi al dominiosave_to_file_subd è impostato su true, i sottodomini scoperti verranno salvati in "\expanded\exp_subdomain_<am|pm>.txt"save_to_file_tld è impostato su true, i domini scoperti verranno salvati in "\expanded\exp_tld_<am|pm>.txt"exit_here è impostato su true, Crawlector termina dopo aver eseguito questa funzione [site], indipendentemente dalle altre opzioni abilitate. Ciò significa che i siti trovati non verranno analizzati/spiderati| Comando di controllo | Descrizione |
|---|
| cl_get_date | Recupera la data e l'ora in cui Crawlector è stato avviato e la data e l'ora correnti. |
| cl_ping | Invia indietro il messaggio "Pong...". Questo serve per verificare che il canale C&C funzioni. |
| cl_get_config | Carica il file di configurazione attualmente in uso (ad es. cl_config.ini) come file di testo. |
| cl_update_delay <intero_in_millisecondi> | Aggiorna il tempo di check-in tra ogni richiesta di pull per i comandi di controllo. - Modifica il valore (ctrl_sleep) solo per la sessione corrente. |
| cl_turn_off_slack_alert | Disattiva la funzionalità di avviso Slack per la sessione attualmente attiva. |
| cl_turn_on_slack_alert | Attiva la funzionalità di avviso Slack per la sessione attualmente attiva. |
| cl_help | Elenca questo messaggio di aiuto. |
| cl_exit | Termina Crawlector forzatamente. |