Einrichten eines transparenten SSL-Proxys


14

Ich habe eine Linux-Box mit 2 Netzwerkkarten eingerichtet, um den Datenverkehr über Port 80 zu überprüfen. Eine Karte wird verwendet, um ins Internet zu gelangen, die andere ist an einen Netzwerk-Switch angeschlossen. Der Punkt ist, in der Lage zu sein, den gesamten HTTP- und HTTPS-Verkehr auf Geräten, die an diesen Switch angeschlossen sind, für Debugging-Zwecke zu untersuchen.

Ich habe die folgenden Regeln für iptables geschrieben:

nat

-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.1:1337
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 1337

-A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE

Am 192.168.2.1:1337 habe ich einen transparenten http-Proxy mit Charles ( http://www.charlesproxy.com/ ) für die Aufnahme.

Für Port 80 ist alles in Ordnung, aber wenn ich ähnliche Regeln für Port 443 (SSL) hinzufüge, die auf Port 1337 verweisen, erhalte ich über Charles eine Fehlermeldung über ungültige Nachrichten.

Ich habe SSL-Proxy auf demselben Computer bereits mit Charles verwendet ( http://www.charlesproxy.com/documentation/proxying/ssl-proxying/ ), konnte dies jedoch aus irgendeinem Grund nicht transparent durchführen. Einige Ressourcen, die ich gegoogelt habe, sagen, dass dies nicht möglich ist - ich bin bereit, dies als Antwort zu akzeptieren, wenn jemand erklären kann, warum.

Als Hinweis habe ich vollen Zugriff auf das beschriebene Setup, einschließlich aller Clients, die an das Subnetz angeschlossen sind. Ich kann also selbstsignierte Zertifikate von Charles akzeptieren. Die Lösung muss nicht Charles-spezifisch sein, da theoretisch jeder transparente Proxy ausreicht.

Vielen Dank!

Edit: Nachdem ich ein wenig damit gespielt hatte, konnte ich es für einen bestimmten Host zum Laufen bringen. Wenn ich meine iptables wie folgt ändere (und 1338 in Charles für Reverse Proxy öffne):

nat

-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.1:1337
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 1337

-A PREROUTING -i eth1 -p tcp -m tcp --dport 443 -j DNAT --to-destination 192.168.2.1:1338
-A PREROUTING -i eth1 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 1338

-A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE

Ich kann eine Antwort erhalten, jedoch ohne Ziel-Host. Wenn ich im Reverse-Proxy nur festlege, dass alles von 1338 an einen bestimmten Host geht, den ich treffen wollte, wird der Handshake ordnungsgemäß ausgeführt, und ich kann die SSL-Proxy-Funktion aktivieren, um die Kommunikation zu überprüfen.

Das Setup ist alles andere als ideal, da ich nicht davon ausgehen möchte, dass alle Daten von 1338 auf diesen Host übertragen werden - eine Idee, warum der Zielhost entfernt wird?

Danke noch einmal


Welche spezifischen Probleme haben Sie? Dies ist möglich, da Sie den Zertifikaten vertrauen, die dynamisch generiert werden. Dies kann eine MITM sein, die den Klartext der Kommunikation auffängt und dafür sorgt, dass der Client der Verbindung weiterhin vertraut.
Shane Madden

Ich habe meinen Beitrag bearbeitet - ich glaube, der Ziel-Host wird entfernt
badunk

Antworten:


10

Es treten dieselben Probleme auf , die die Verwendung mehrerer Zertifikate für eine einzelne IP-Adresse / einen einzelnen Port verhindern (ohne Angabe des Servernamens) .

In einfachem HTTP kann Ihr transparenter Proxy anhand des HostHeaders feststellen, zu welchem ​​Host der Client eine Verbindung herstellen möchte .

Wenn der transparente HTTPS MITM-Proxy die Anforderung erhält, kann er nicht wissen, welchen Hostnamen der Client ursprünglich angefordert hat. (Ich bin mir nicht einmal sicher, ob die IP-Adresse mit diesen Regeln ermittelt werden kann. Dies hätte es zumindest ermöglichen können, mithilfe eines Reverse-DNS-Lookups eine Vermutung anzustellen, auch wenn es im Allgemeinen unwahrscheinlich ist, dass dies funktioniert.)

  • Um den erwarteten Hostnamen zu erhalten, muss der MITM-Proxy den HostHeader in der HTTP-Nachricht lesen , was erst nach einem erfolgreichen Handshake erfolgen kann.
  • Für einen erfolgreichen Handshake muss der MITM-Proxy ein Spoof-Zertifikat generieren, das dem erwarteten Hostnamen entspricht.

Infolgedessen kann der MITM-Proxy nicht wissen, welches Zertifikat vor dem Handshake generiert werden soll.

Dies kann mit einem nicht transparenten MITM-Proxy funktionieren, da Sie zumindest den beabsichtigten Hostnamen über die HTTP- CONNECTMethode erhalten würden.


Das hat mir sehr viel erklärt, danke! Ich habe das Gefühl, dass ich anfangen kann, die richtigen Fragen zu stellen. Wie würde man einen transparenten SSL-Proxy einrichten? Wie ist der Händedruck?
Badunk

1
@badunk, ich glaube nicht, dass Sie dies können, es sei denn, Sie deaktivieren alle Zertifikatsüberprüfungen auf der Clientseite.
Bruno

Eine andere Möglichkeit für den Proxy, den richtigen Hostnamen abzurufen, besteht darin, sich selbst an die Ziel-IP-Adresse zu wenden, um das Zertifikat abzurufen, bevor der Handshake zwischen dem Client und dem Proxy ausgeführt wird.
Bruno

mitmproxy ist ein HTTPS-Proxy. Sie müssen nicht alle Zertifikatsüberprüfungen deaktivieren, aber Sie müssen das mitmproxy-Zertifikat installieren, da es für alle https-Verbindungen verwendet wird.
Tyler

3

Nur ein paar grundlegende Informationen zu diesem Thema.

Es gibt nur wenige Geräte, von denen ich weiß, dass sie diese Aktion erfolgreich ausführen können. Sie sind jedoch nicht wirklich für die breite Öffentlichkeit zugänglich. Ich selbst verwende ein Fortinet Fortigate mit SSL-Offloading.

Was es im Grunde tut, ist; Es fängt die zum Host hergestellte SSL-Verbindung ab und entschlüsselt die Verbindung in der Hardware. Anschließend wird überprüft, wohin Sie möchten, und basierend auf diesen Informationen wird eine Firewall-Entscheidung getroffen.

Anschließend baut es eine eigene Verbindung zu diesem Host auf, um die Daten abzurufen und die ursprüngliche Anforderung an den Client mithilfe einer vom Benutzer bereitgestellten Zertifizierungsstelle erneut zu signieren. Damit dies reibungslos funktioniert, muss sich die Zertifizierungsstelle in der vertrauenswürdigen Stammzertifizierungsstelle auf dem Client befinden.

Diese Art von Setups wird in Organisationen verwendet, um Unternehmensrichtlinien in Bezug auf die Internetnutzung durchzusetzen. Da die Installation Ihrer Unternehmenszertifizierungsstelle in Clients mithilfe eines Active Directory einfach ist, ist dies für große Organisationen kein Problem.

Dies ist die EINZIGE Möglichkeit, ohne einen manuellen Proxy zu erstellen, da der SSL-Verkehr verschlüsselt ist. Grundsätzlich handelt es sich um eine MITM, daher ist es wichtig, dass alle rechtlichen Aspekte abgedeckt werden.


1

Zu dieser anderen Frage gibt es noch ein paar Vorschläge: Transparente Mythen und Fakten zu SSL-Proxys . Über diesen Link erfahren Sie, wie Sie Squid so konfigurieren, dass es zu einem transparenten SSL-Proxy wird. Es ist nicht das, wonach Sie suchen, aber es könnte Ihnen zumindest einen Einblick geben, was schief gehen könnte.

Die iptables-Regeln scheinen in Ordnung zu sein, aber ich habe keine Ahnung, ob die von Ihnen verwendete Proxy-Software in der Lage ist, das zu tun, was Sie versuchen. Die Dokumentation behauptet sicherlich, dass dies der Fall ist.


0

Um Brunos Lösung zu ergänzen, habe ich ein wenig nachgeforscht und wollte mitteilen, wie ich zu einer weiteren, nicht idealen schnellen Lösung gekommen bin.

Nachdem ich diese iptables gesetzt habe, kann ich einen Reverse-Proxy auf Port 1338 setzen und ihn an Localhost auf Port 1337 weiterleiten. Da Port 1337 ein transparenter HTTP-Proxy ist und die Daten entschlüsselt wurden, nimmt er den Host-Header und macht ihn zum Ziel Wirt.

Der Hauptnachteil ist, dass ich im Wesentlichen eine https-Verbindung zu http konvertiert habe - das funktioniert nicht immer mit jedem Server (ganz zu schweigen von der Sicherheitslücke, die ich dadurch aufspüre).

Ich habe innerhalb der Grenzen meiner Software gearbeitet. Ich glaube eine sauberere Lösung nach Bruno wäre anzunehmen, dass der gesamte Verkehr ab 1338 entschlüsselt werden sollte. Überprüfen Sie nach der Entschlüsselung den Zielhost und übertragen Sie die Anforderung per SSL.


Sind Sie sich nicht sicher, ob Sie damit https://aus Sicht des Kunden eine ordnungsgemäße Verbindung herstellen?
Bruno
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.