
Ruby In The Middle (Proxy d'interception HTTP/HTTPS)
Ruby in the middle (RITM) est un proxy d'interception HTTP/HTTPS avec génération et signature de certificats à la volée, qui laisse à l'utilisateur toute la puissance du langage Ruby pour intercepter et même modifier les requêtes et réponses comme bon lui semble.
gem install ritm
require 'ritm'
# A single answer for all your google searches
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')
# Replaces every picture on the web with my pretty face
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
Ou tout client HTTP dont vous souhaitez intercepter le trafic, pour vous connecter au proxy sur localhost:8080
Pour les exemples ci-dessus, cherchez n'importe quoi sur Google et visitez également votre site de journal préféré.
Avec l'exemple précédent, votre client a peut-être rencontré des problèmes en essayant d'accéder à des ressources HTTPS. Dans certains cas, vous pouvez ajouter une exception dans votre navigateur (ou demander à votre client HTTP de ne pas vérifier les certificats), mais dans d'autres cas vous ne pourrez pas ajouter d'exceptions. La raison en est que pour déchiffrer et pouvoir modifier le trafic SSL, RITM doit être celui qui effectue la négociation SSL avec le client (en utilisant son propre ensemble de certificats), puis il établira une session SSL distincte vers le serveur. C'est-à-dire :
Client <--- SSL session ---> RITM <--- SSL session ---> Server
Pour chaque nom d'hôte de serveur avec lequel votre client tente de communiquer, RITM générera un certificat à la volée et le signera avec une autorité de certification (CA) pré-configurée. Ainsi, pour pouvoir établir une connexion sécurisée, vous devrez configurer votre client (par exemple votre navigateur) pour faire confiance à la CA de RITM.
Pour des raisons de sécurité, chaque fois que vous démarrez le proxy RITM avec les paramètres par défaut, il génère une nouvelle autorité de certification interne. Pour utiliser votre propre CA à la place (afin qu'elle puisse être chargée et approuvée par votre navigateur), suivez les étapes suivantes :
Vous pouvez utiliser OpenSSL ou RITM pour générer ces deux fichiers. Avec OpenSSL :
openssl req -new -nodes -x509 -days 365 -extensions v3_ca -keyout insecure_ca.key -out insecure_ca.crt
Ou avec 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
Je vous laisse découvrir comment cela se fait dans votre navigateur ou client.
Naviguez sur le Web !
Une fois terminé, supprimez la CA de vos autorités de confiance !
Ou prenez grand soin de la clé privée de la CA, car toute personne en possession de cette clé pourra déchiffrer tout votre trafic ! Notez également que lors de l'utilisation du proxy, chaque serveur sera automatiquement considéré comme digne de confiance, même si le certificat du serveur final n'est pas valide.
Dans les exemples ci-dessus, nous avons utilisé la session globale par défaut. Si vous n'aimez pas utiliser une session globale configurée statiquement, ou si vous souhaitez avoir plusieurs sessions coexistantes (par exemple, plusieurs proxys écoutant sur des ports différents et utilisant des gestionnaires d'interception différents), vous pouvez créer différentes instances de session de cette manière :
session = Ritm::Session.new
# Now you can use the same methods but on the session instance
session.configure { proxy[:bind_port] = 7777 }
session.on_request { |req| ...do something here ... }
another_session = Ritm::Session.new
another_session.configure { proxy[:bind_port] = 8888 }
another_session.on_request { |req| ...do something else ... }
session.start
another_session.start
puts 'Hit enter to finish'
gets
session.shutdown
another_session.shutdown
Sous licence Apache, version 2.0 (la « Licence ») ; vous ne pouvez pas utiliser ce fichier sauf en conformité avec la Licence. Vous pouvez obtenir une copie de la Licence à l'adresse
http://www.apache.org/licenses/LICENSE-2.0
Sauf si la loi applicable l'exige ou si un accord écrit a été conclu, le logiciel distribué sous la Licence est distribué sur une base « AS IS », SANS GARANTIES OU CONDITIONS D'AUCUNE SORTE, expresses ou implicites. Consultez la Licence pour connaître les autorisations et les limitations spécifiques applicables.