Anticipare una campagna di phishing prima che entri in atto è una sfida enorme per la difesa di un’organizzazione. Grazie al monitoraggio proattivo dei nuovi domini registrati, è possibile agire preventivamente nel contrastare queste campagne.
Perché Certstream?
CertStream è un servizio che fornisce un flusso in tempo reale di certificati SSL/TLS emessi da autorità di certificazione (CA). In altre parole, monitora e raccoglie i certificati digitali che vengono rilasciati per i domini su Internet, e li rende disponibili tramite una API.
Il servizio è utile per chi si occupa di sicurezza informatica, poiché permette di scoprire rapidamente nuovi siti web e monitorare l’evoluzione del traffico HTTPS.
Vediamo come realizzare uno script python sfruttando l’api messa a disposizione da https://certstream.calidog.io/.
La struttura utilizzata sarà la seguente:
- Il principale script python, che contatta l’api e continua a ricevere il flusso di informazioni relative ai certificati
- Un file di configurazione in cui andremo a configurare delle regex per allertare i domini che ci interessa monitorare
- Un file di logging dove andremo a memorizzare i match delle regex configurate
Creazione di uno script per l’automatismo:
import certstream
import re
from configparser import ConfigParser
from datetime import datetime
#Inizializzazione delle regex
def init_regex(config):
regex = ""
config = ConfigParser()
config.read("config.ini")
for item in config["REGEX"]:
if regex != "":
regex = regex + "|" + config['REGEX'][item]
else:
regex = config['REGEX'][item]
return regex
#Verifica dei domini e logging dei match
def print_callback(message, context):
regex = init_regex()
print("REGEX CONFIGURATION LOADED")
if message['message_type'] == "heartbeat":
return
for domain in message['data']['leaf_cert']['all_domains']:
x = re.search(regex, domain)
if x:
with open('log.txt', mode='a') as f:
date_time = datetime.fromtimestamp(message['data']['leaf_cert']['not_before'])
f.write(f"{str(datetime.now())};{domain};Type:{message['data']['update_type']};Not Before:{str(date_time)}\n")
print(f"{str(datetime.now())}---{domain}---Type:{message['data']['update_type']}---Not Before:{str(date_time)}")
Il cuore dello script si trova nella funzione print_callback().
All’interno di questa, monitoriamo il flusso in real-time fornito da Certstream e scriviamo nel file “log.txt” eventuali match con le nostre regex.
Lo stesso risultato verrà mostrato in output.
I messaggi che contengono la dicitura “heartbeat” possono essere ignorati, in quanto non hanno un ruolo tecnico, ma sono utilizzati per mantenere attiva la connessione tra il client e il server e confermare che funzioni correttamente.
def on_open():
print("Connection successfully established!")
def on_error(instance, exception):
# Instance is the CertStreamClient instance that barfed
print("Exception in CertStreamClient! -> {}".format(exception))
def main():
certstream.listen_for_events(print_callback, on_open=on_open, on_error=on_error, url='wss://certstream.calidog.io/')
if __name__ == "__main__":
main()
La funzione certstream.listen_for_events() è la funzione che effettuerà in loop la lettura del flusso di dati dall’API di Certstream.
Script Python completo
import certstream
import re
from configparser import ConfigParser
from datetime import datetime
def init_regex():
regex = ""
config = ConfigParser()
config.read("config.ini")
for item in config["REGEX"]:
if regex != "":
regex = regex + "|" + config['REGEX'][item]
else:
regex = config['REGEX'][item]
return regex
def print_callback(message, context):
regex = init_regex()
print("REGEX CONFIGURATION LOADED")
if message['message_type'] == "heartbeat":
return
for domain in message['data']['leaf_cert']['all_domains']:
x = re.search(regex, domain)
if x:
with open('log.txt', mode='a') as f:
date_time = datetime.fromtimestamp(message['data']['leaf_cert']['not_before'])
f.write(f"{str(datetime.now())};{domain};Type:{message['data']['update_type']};Not Before:{str(date_time)}\n")
print(f"{str(datetime.now())}---{domain}---Type:{message['data']['update_type']}---Not Before:{str(date_time)}")
NotificationManager.send_new_notification(type="custom",domain=domain,before=date_time)
def on_open():
print("Connection successfully established!")
def on_error(instance, exception):
# Instance is the CertStreamClient instance that barfed
print("Exception in CertStreamClient! -> {}".format(exception))
def main():
certstream.listen_for_events(print_callback, on_open=on_open, on_error=on_error, url='wss://certstream.calidog.io/')
if __name__ == "__main__":
main()
File di configurazione (config.ini)
Il file di configurazione deve essere strutturato definendo l’inizio delle entry da monitorare con la keyword “[REGEX]”, seguita da una lista di coppie, definite come (dominio_target = regex).
Esempio:
[REGEX]
TIREXDEL = (t(1|i|l)rexdel.*)
8bitsecurity = (8b(1|i)tsecur(1|i)ty.*)
Conclusione
Il monitoraggio dei nuovi certificati consente di anticipare le campagne di phishing prima che vengano avviate. Adottare un approccio proattivo permette di individuare tempestivamente tentativi malevoli, per creare le opportune blacklist in anticipo e intervenire rapidamente al primo contatto con eventuali minacce.






