
Framework per il Fingerprinting di Strumenti di Sicurezza Passivi
Hai mai desiderato un modo semplice, facile e furtivo per bypassare molteplici classi di prodotti di sicurezza? pstf^2 (pronunciato pstf-quadrato) è un'implementazione di un server HTTP in grado di eseguire fingerprinting passivo del browser - e potrebbe essere proprio ciò che stai cercando. Quando gli aggressori tentano di consegnare un payload su internet, devono superare molteplici strumenti in grado di scansionare i collegamenti in arrivo. Filtri email, motori di scansione e persino l'invio a sandbox tramite URL possono essere tutti bypassati una volta che pstf2 li rileva in modo passivo. Una volta rilevati, lo strumento consente di distinguere tra servizi di sicurezza e potenziali vittime e consegnare una risposta malevola o benigna.
Questo strumento è stato rilasciato durante il BlackHat EU 2020: https://www.blackhat.com/eu-20/arsenal/schedule/#pstf2-link-scanners-evasion-made-easy-21763
I dettagli della ricerca sono disponibili in questo post del blog: https://blogs.akamai.com/sitr/2020/12/evading-link-scanning-security-services-with-passive-fingerprinting.html
La vera domanda è: come funzionano gli scanner di collegamenti? Ispezionare un link malevolo è un'azione che coinvolge un client web che invia una richiesta HTTP GET. Ogni fornitore utilizza un'implementazione interna diversa - la maggior parte cerca di imitare in qualche modo un'interazione utente reale. pstf^2 è un semplice server HTTP basato su Python che applica tecniche ben note di rilevamento bot per determinare se una richiesta in arrivo proviene da uno strumento di sicurezza automatizzato. L'operatore del server può personalizzare le risposte, ad esempio - se viene rilevato uno scanner, reindirizza a Google, altrimenti invia contenuto malevolo.
Di seguito sono riportate le principali tattiche implementate in pstf^2:
Gli strumenti di sicurezza cercano di nascondersi come client legittimi, impersonando browser reali, ma di solito non è così. È comune vedere strumenti non aggiornati correttamente che utilizzano header user-agent falsi per versioni di browser vecchie di dieci anni. pstf^2 consente di impostare una soglia minima per ciò che consideri una versione reale e non obsoleta.
Esistono molti tipi di implementazioni strane che lo strumento è in grado di rilevare. Un paio di esempi presentati nel talk BlackHat sono stati:
via: che rivelava la natura dell'host virtuale utilizzato per la sandbox.referer: che suggeriva che il link fosse stato raggiunto da Google, ad es. referer: google.com/search?q=specific.site.com.
negli scenari testati non aveva senso poiché questo prodotto scansiona le email e quando qualcuno clicca su un'email (non da un'interfaccia web) questo header è assente.Diversi parametri TCP possono implicare una versione specifica del sistema operativo o una specifica variante. Alcuni client falsificano l'header user-agent ma sono in esecuzione su un sistema operativo diverso da quello dichiarato.
I client ospitati su reti di specifici provider cloud hanno MTU diverso dal valore standard di 1500 byte.
In alcuni casi la richiesta proviene da un ASN associato esplicitamente a uno specifico fornitore di sicurezza. In altri casi l'origine della richiesta è un provider di hosting cloud, e sebbene non incrimini un fornitore specifico, è improbabile che sia un utente tipico.
In rari casi l'indirizzo IP del client ha un record PTR, che lo associa a un URL relativo a un fornitore di sicurezza.
Supponendo che Docker sia già installato, è semplice come:
docker-compose up
Se preferisci evitare Docker, segui questi passaggi.
Esegui:
pip install requirements.txt
Questo installerà tutti i moduli Python esterni necessari.
Prima di distribuire pstf^2, scarica e installa p0f. Attualmente disponibile a:
https://lcamtuf.coredump.cx/p0f3/
Ora configura correttamente lib/servers/server_config.yml per puntare al percorso corretto, ad esempio:
p0f_config:
# cambia almeno il tuo nome utente, ricordati di cambiare in entrambi i percorsi
p0f_bin_path: '/Users/$tuo_nome_utente/$altre_cartelle/web_fp/p0f-3.09b/p0f'
p0f_fp_path: '/Users/$tuo_nome_utente/$altre_cartelle/web_fp/p0f-3.09b/p0f.fp'
iface: 'lo0'
p0f_named_socket: '/tmp/p0f_socket'
Verifica anche che iface sia la stessa interfaccia su cui gira il tuo server HTTP Python. Nell'esempio sopra è l'interfaccia di loopback.
Una volta soddisfatti i requisiti, esegui:
python driver.py
Puoi utilizzare uno qualsiasi dei seguenti flag:
--p0f_bin_path P0F_BIN_PATH
--p0f_fp_path P0F_FP_PATH
--p0f_iface P0F_IFACE
Tutti vengono utilizzati per regolare i parametri relativi a p0f: il binario stesso, il file di fingerprinting e l'interfaccia che usiamo, che per impostazione predefinita è eth0.
Dovresti vedere un output simile al seguente:
2020-04-15 17:37:06,896 - pstf2_logger - INFO - Avvio di p0f...
2020-04-15 17:37:06,896 - pstf2_logger - INFO - Esecuzione comando:
/Users/gbitensk/work/web_fp/p0f-3.09b/p0f -i lo0 -s /tmp/p0f_socket -f /Users/gbitensk/work/web_fp/p0f-3.09b/p0f.fp
2020-04-15 17:37:06,898 - pstf2_logger - INFO - p0f avviato!
2020-04-15 17:37:06,898 - pstf2_logger - INFO - Avvio del server HTTP...
2020-04-15 17:37:06,898 - pstf2_logger - INFO - Server HTTP avviato!
2020-04-15 17:37:06,899 - pstf2_logger - INFO - Se desideri terminare il server premi CTRL+C
Termina il server premendo Ctrl+C, che interromperà sia l'istanza HTTP che quella di p0f. Dovresti vedere qualcosa di simile a:
2020-04-15 17:37:48,263 - pstf2_logger - INFO - Server HTTP fermato!
2020-04-15 17:37:48,263 - pstf2_logger - INFO - Uccisione di p0f...
2020-04-15 17:37:48,263 - pstf2_logger - INFO - p0f ucciso!
2020-04-15 17:37:48,263 - pstf2_logger - INFO - Uscita...
Nota che la configurazione di un record DNS che punti un URL al tuo server esula dallo scopo di pstf^2 e avviene a tua responsabilità.
pstf^2 ha payload predefiniti definiti in server_config.yml e personalizzabili facilmente.
Ci sono due modalità, commutabili modificando la variabile rickroll_mode su YES o NO.
Se abilitata, lo strumento di sicurezza verrà reindirizzato a una pagina YouTube con il famoso video del Rickroll, altrimenti verrà servita una stringa definita nello stesso file YAML.
Per impostazione predefinita, la risposta "malevola" è impostata sulla stringa di test standard EICAR.
Ho optato per la pubblicazione pubblica di questo strumento come progetto open source perché:
Durante la costruzione dello strumento è stato testato contro 15 prodotti diversi, tutti falliti. Sebbene abbia divulgato responsabilmente i dettagli dell'attacco, abbiamo ancora molta strada da fare e la mia aspettativa è che rendendo pubblico lo strumento aumenteremo la consapevolezza di queste tattiche che sono già abusate dai "malintenzionati".
@Den1al per aver fornito consigli durante la costruzione di questo strumento in particolare, e per aver scritto Python correttamente in generale, oltre ad aver assistito nella creazione come immagine Docker.