
Ruby In The Middle (HTTP/HTTPS-Abfangproxy)
Ruby in the middle (RITM) ist ein HTTP/HTTPS-Abfangproxy mit dynamischer Zertifikatserstellung und -signierung, der dem Anwender die volle Leistungsfähigkeit der Ruby-Sprache bietet, um Anfragen und Antworten nach Belieben abzufangen und sogar zu modifizieren.
gem install ritm
require 'ritm'
# Eine einzige Antwort für alle Ihre Google-Suchen
Ritm.on_request do |req|
if req.request_uri.host.start_with? 'www.google.'
new_query_string = req.request_uri.query.gsub(/(?<=^q=|&q=)(((?!&|$).)*)(?=&|$)/, 'RubyInTheMiddle')
req.request_uri.query = new_query_string
end
end
my_picture = File.read('i_am_famous.jpg')
# Ersetzt jedes Bild im Web durch mein hübsches Gesicht
Ritm.on_response do |_req, res|
if res.header['content-type'] && res.header['content-type'].start_with?('image/')
res.header['content-type'] = 'image/jpeg'
res.body = my_picture
end
end
Ritm.start
puts 'Hit enter to finish'
gets
Ritm.shutdown
Oder jeden anderen HTTP-Client, dessen Datenverkehr Sie abfangen möchten, um eine Verbindung zum Proxy unter localhost:8080 herzustellen
Für die obigen Beispiele suchen Sie etwas bei Google und besuchen Sie auch Ihre Lieblingsnachrichten-Website.
Im vorherigen Beispiel könnte Ihr Client Probleme beim Zugriff auf HTTPS-Ressourcen haben. In einigen Fällen können Sie eine Ausnahme in Ihrem Browser hinzufügen (oder Ihren HTTP-Client anweisen, Zertifikate nicht zu überprüfen), aber in einigen anderen Fällen werden Sie keine Ausnahmen hinzufügen können. Der Grund dafür ist, dass RITM, um SSL-Verkehr entschlüsseln und modifizieren zu können, die SSL-Verhandlung mit dem Client selbst durchführen muss (unter Verwendung seines eigenen Zertifikatssatzes) und dann eine separate SSL-Sitzung zum Server aufbaut. D.h.:
Client <--- SSL-Sitzung ---> RITM <--- SSL-Sitzung ---> Server
Für jeden unterschiedlichen Server-Hostnamen, mit dem Ihr Client kommunizieren möchte, generiert RITM ein Zertifikat dynamisch und signiert es mit einer vorkonfigurierten Zertifizierungsstelle (CA). Daher müssen Sie Ihren Client (z.B. Browser) so konfigurieren, dass er der CA von RITM vertraut, um eine sichere Verbindung herstellen zu können.
Aus Sicherheitsgründen generiert RITM bei jedem Start des Proxys mit den Standardeinstellungen eine neue interne Zertifizierungsstelle. Um stattdessen Ihre eigene CA zu verwenden (damit sie von Ihrem Browser geladen und vertraut werden kann), führen Sie die folgenden Schritte aus:
Sie können OpenSSL oder RITM verwenden, um diese beiden Dateien zu generieren. Mit OpenSSL:
openssl req -new -nodes -x509 -days 365 -extensions v3_ca -keyout insecure_ca.key -out insecure_ca.crt
Oder mit RITM:
require 'ritm/certs/ca'
ca = Ritm::CA.create common_name: 'InsecureCA'
File.write('insecure_ca.crt', ca.pem)
File.write('insecure_ca.key', ca.private_key.to_s)
Ritm.configure do
ssl_reverse_proxy.ca[:pem] = 'path/to/insecure_ca.crt'
ssl_reverse_proxy.ca[:key] = 'path/to/insecure_ca.key'
end
Ritm.start
puts 'Hit enter to finish'
gets
Ritm.shutdown
Es bleibt Ihnen überlassen, herauszufinden, wie dies in Ihrem Browser oder Client funktioniert. 4. Surfen Sie im Internet!
Oder bewahren Sie den privaten Schlüssel der CA sehr gut auf, denn jeder, der diesen Schlüssel besitzt, kann Ihren gesamten Verkehr entschlüsseln! Beachten Sie auch, dass bei Verwendung des Proxys jeder Server automatisch als vertrauenswürdig eingestuft wird, selbst wenn das Endserver-Zertifikat ungültig ist.
In den obigen Beispielen haben wir die standardmäßige globale Sitzung verwendet. Wenn Sie keine statisch konfigurierte globale Sitzung verwenden möchten, oder wenn Sie mehrere gleichzeitig bestehende Sitzungen wünschen (z.B. mehrere Proxys, die auf verschiedenen Ports lauschen und unterschiedliche Abfanghandler verwenden), können Sie verschiedene Sitzungsinstanzen auf diese Weise erstellen:
session = Ritm::Session.new
# Jetzt können Sie die gleichen Methoden, aber auf der Sitzungsinstanz verwenden
session.configure { proxy[:bind_port] = 7777 }
session.on_request { |req| ...hier etwas tun ... }
another_session = Ritm::Session.new
another_session.configure { proxy[:bind_port] = 8888 }
another_session.on_request { |req| ...etwas anderes tun ... }
session.start
another_session.start
puts 'Hit enter to finish'
gets
session.shutdown
another_session.shutdown
Lizenziert unter der Apache License, Version 2.0 (der "Lizenz"); Sie dürfen diese Datei nur in Übereinstimmung mit der Lizenz verwenden. Eine Kopie der Lizenz erhalten Sie unter
http://www.apache.org/licenses/LICENSE-2.0
Sofern nicht durch anwendbares Recht vorgeschrieben oder schriftlich vereinbart, wird die unter der Lizenz verbreitete Software ohne jegliche Garantie, weder ausdrücklich noch stillschweigend, einschließlich, aber nicht beschränkt auf die stillschweigenden Garantien der Marktgängigkeit und der Eignung für einen bestimmten Zweck, bereitgestellt. Weitere Einzelheiten entnehmen Sie bitte der Lizenz.