
Passives Sicherheitstools-Fingerprinting-Framework
Haben Sie jemals einen einfachen, unauffälligen Umgehungsweg für mehrere Klassen von Sicherheitsprodukten gesucht? pstf^2 (ausgesprochen pstf-Quadrat) ist eine Implementierung eines HTTP-Servers, die passives Browser-Fingerprinting ermöglicht – und könnte genau das sein, wonach Sie suchen. Wenn Angreifer versuchen, eine Nutzlast über das Internet auszuliefern, müssen sie mehrere Werkzeuge überwinden, die eingehende Links scannen können. E-Mail-Filter, Scan-Engines und sogar die Übermittlung an eine Sandbox per URL – all das kann umgangen werden, sobald pstf^2 sie auf passive Weise erkennt. Einmal erkannt, erlaubt das Werkzeug, zwischen Sicherheitsdiensten und potenziellen Opfern zu unterscheiden und entweder eine bösartige oder eine harmlose Antwort auszuliefern.
Dieses Werkzeug wurde während der BlackHat EU 2020 veröffentlicht: https://www.blackhat.com/eu-20/arsenal/schedule/#pstf2-link-scanners-evasion-made-easy-21763
Details zur Forschung sind in diesem Blogbeitrag verfügbar: https://blogs.akamai.com/sitr/2020/12/evading-link-scanning-security-services-with-passive-fingerprinting.html
Die eigentliche Frage ist: Wie funktionieren Link-Scanner? Das Überprüfen eines bösartigen Links ist eine Aktion, bei der ein Web-Client eine HTTP-GET-Anfrage sendet. Jeder Anbieter verwendet eine andere hausinterne Implementierung – die meisten versuchen, in gewissem Maße eine echte Benutzerinteraktion nachzuahmen. pstf^2 ist ein einfacher, Python-basierter HTTP-Server, der bekannte Bot-Erkennungstaktiken anwendet, um zu bestimmen, ob eine eingehende Anfrage von einem automatisierten Sicherheitswerkzeug stammt. Der Betreiber des Servers kann die Antworten anpassen, z. B. – wenn ein Scanner erkannt wird, leite zu Google weiter, andernfalls sende bösartigen Inhalt.
Im Folgenden sind die wichtigsten Taktiken aufgeführt, die als Teil von pstf^2 implementiert wurden:
Sicherheitswerkzeuge versuchen, sich als legitime Clients zu tarnen und echte Browser vorzutäuschen, dennoch – meistens ist dies nicht der Fall. Es ist üblich, Werkzeuge zu sehen, die nicht ordnungsgemäß gewartet werden und gefälschte User-Agent-Header für Browser-Versionen verwenden, die ein Jahrzehnt alt sind. pstf^2 ermöglicht es Ihnen, einen Mindestschwellwert für das festzulegen, was Sie als eine echte, nicht veraltete Version betrachten.
Es gibt viele Arten seltsamer Implementierungen, die das Werkzeug erkennen kann. Ein paar Beispiele, die im BlackHat-Vortrag vorgestellt wurden, waren:
via:-Header, der die Art des für die Sandbox verwendeten virtuellen Hosts preisgab.referer:-Header, der nahelegte, dass der Link von Google erreicht wurde, z. B. referer: google.com/search?q=specific.site.com.
In den von uns getesteten Szenarien ergab dies keinen Sinn, da dieses Produkt E-Mails scannt und dieser Header fehlt, wenn jemand auf eine E-Mail klickt (nicht über eine Weboberfläche).Mehrere TCP-Parameter können entweder auf eine bestimmte Betriebssystemversion oder eine bestimmte Variante hindeuten. Einige Clients fälschen den User-Agent-Header, laufen aber auf einem Betriebssystem, das sich von dem angegebenen unterscheidet.
Clients, die in spezifischen Cloud-Provider-Netzwerken gehostet werden, haben eine MTU, die vom Standardwert von 1500 Bytes abweicht.
In einigen Fällen wird die Anfrage von einer ASN gesendet, die explizit mit einem bestimmten Sicherheitsanbieter verbunden ist. In anderen Fällen stammt die Anfrage von einem Cloud-Hosting-Anbieter – das macht sie zwar nicht zu einem bestimmten Anbieter, ist aber unwahrscheinlich für einen typischen Benutzer.
In seltenen Fällen hat die IP-Adresse des Clients einen PTR-Eintrag, der ihn mit einer URL eines Sicherheitsanbieters in Verbindung bringt.
Angenommen, Docker ist bereits installiert, ist es so einfach:
docker-compose up
Falls Sie Docker vermeiden möchten, befolgen Sie diese Schritte.
Führen Sie aus:
pip install requirements.txt
Dadurch werden alle erforderlichen externen Python-Module installiert.
Bevor Sie pstf^2 bereitstellen, laden Sie p0f herunter und installieren Sie es. Es ist derzeit verfügbar unter:
https://lcamtuf.coredump.cx/p0f3/
Konfigurieren Sie nun lib/servers/server_config.yml so, dass es auf den korrekten Pfad zeigt, z. B.:
p0f_config:
# ändern Sie mindestens Ihren Benutzernamen, denken Sie daran, in beiden Pfaden zu ändern
p0f_bin_path: '/Users/$your_user_name/$more_folders/web_fp/p0f-3.09b/p0f'
p0f_fp_path: '/Users/$your_user_name/$more_folders/web_fp/p0f-3.09b/p0f.fp'
iface: 'lo0'
p0f_named_socket: '/tmp/p0f_socket'
Stellen Sie außerdem sicher, dass iface dasselbe Interface ist, auf dem Ihr Python-HTTP-Server läuft. Im obigen Beispiel ist es das Loopback-Interface.
Sobald die Anforderungen erfüllt sind, führen Sie aus:
python driver.py
Sie können beliebige der folgenden Flags verwenden:
--p0f_bin_path P0F_BIN_PATH
--p0f_fp_path P0F_FP_PATH
--p0f_iface P0F_IFACE
Alle dienen der Anpassung von Parametern zu p0f: der Binärdatei selbst, der Fingerabdruckdatei und dem Interface, das wir verwenden (standardmäßig eth0).
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
2020-04-15 17:37:06,896 - pstf2_logger - INFO - Starting p0f...
2020-04-15 17:37:06,896 - pstf2_logger - INFO - Running command:
/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 started!
2020-04-15 17:37:06,898 - pstf2_logger - INFO - Starting HTTP server...
2020-04-15 17:37:06,898 - pstf2_logger - INFO - HTTP server started!
2020-04-15 17:37:06,899 - pstf2_logger - INFO - If you wish to terminate the server press CTRL+C
Beenden Sie den Server durch Drücken von Ctrl+C; es werden sowohl die HTTP- als auch die p0f-Instanz beendet. Sie sollten etwas Ähnliches sehen:
2020-04-15 17:37:48,263 - pstf2_logger - INFO - HTTP server stopped!
2020-04-15 17:37:48,263 - pstf2_logger - INFO - Killing p0f...
2020-04-15 17:37:48,263 - pstf2_logger - INFO - p0f killed!
2020-04-15 17:37:48,263 - pstf2_logger - INFO - exiting...
Beachten Sie, dass das Setzen eines DNS-Eintrags, der eine URL auf Ihren Server verweist, außerhalb des Anwendungsbereichs von pstf^2 liegt und in Ihrer eigenen Verantwortung erfolgt.
pstf^2 hat Standard-Payloads, die in server_config.yml definiert sind und leicht angepasst werden können.
Es gibt zwei Modi, die durch Änderung der Variable rickroll_mode auf YES oder NO umgeschaltet werden.
Wenn aktiviert, wird das Sicherheitswerkzeug auf eine YouTube-Seite mit dem berühmten Rickrolling-Video umgeleitet; andernfalls wird ein im selben YAML definierter String ausgeliefert.
Standardmäßig wurde die "bösartige" Antwort auf den EICAR-Standardteststring gesetzt.
Ich habe mich dafür entschieden, dieses Werkzeug als Open-Source-Projekt öffentlich zu machen, da:
Im Rahmen der Erstellung des Werkzeugs wurde es gegen 15 verschiedene Produkte getestet, alle scheiterten. Während ich die Details des Angriffs verantwortungsvoll offenlegte, haben wir noch einen langen Weg vor mir, und meine Erwartung ist, dass wir durch die öffentliche Bereitstellung des Werkzeugs das Bewusstsein für diese Taktiken schärfen, die bereits von "Bösewichten" missbraucht werden.
@Den1al für die Bereitstellung von Ratschlägen beim Bau dieses speziellen Werkzeugs, für das ordnungsgemäße Schreiben von Python im Allgemeinen sowie für die Unterstützung bei der Erstellung als Docker-Image.