
Ruby In The Middle (proxy d'intercettazione HTTP/HTTPS)
Ruby in the middle (RITM) è un proxy di intercettazione HTTP/HTTPS con generazione e firma di certificati al volo, che lascia all'utente la piena potenza del linguaggio Ruby per intercettare e persino modificare richieste e risposte a suo piacimento.
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
O qualunque client HTTP di cui vuoi intercettare il traffico, per connettersi
al proxy su localhost:8080
Per gli esempi precedenti, cerca qualcosa su Google e visita anche il tuo sito di notizie preferito.
Con l'esempio precedente, il tuo client potrebbe aver incontrato problemi nel tentativo di accedere a risorse HTTPS. In alcuni casi puoi aggiungere un'eccezione al tuo browser (o istruire il tuo client HTTP a non verificare i certificati) ma in alcuni altri casi non sarai in grado di aggiungere eccezioni. Il motivo è che per decifrare e poter modificare il traffico SSL, RITM dovrà eseguire la negoziazione SSL con il client (usando il proprio set di certificati) e poi stabilirà una sessione SSL separata verso il server. Cioè:
Client <--- SSL session ---> RITM <--- SSL session ---> Server
Per ogni hostname di server diverso con cui il tuo client cerca di comunicare, RITM genererà un certificato al volo e lo firmerà con una Certificate Authority (CA) preconfigurata. Quindi, per poter stabilire una connessione sicura dovrai configurare il tuo client (ad es. il browser) per fidarsi della CA di RITM.
Per motivi di sicurezza, ogni volta che avvii il proxy di RITM con le impostazioni predefinite verrà generata una nuova Certificate Authority interna. Per utilizzare invece la tua CA (in modo che possa essere caricata e considerata affidabile dal tuo browser) esegui i seguenti passaggi:
Puoi usare OpenSSL o RITM per generare questi due file. Con OpenSSL:
openssl req -new -nodes -x509 -days 365 -extensions v3_ca -keyout insecure_ca.key -out insecure_ca.crt
Oppure con 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
Lascio a te scoprire come si fa nel tuo browser o client. 4. Naviga sul web!
Oppure prenditi molta cura della chiave privata della CA, poiché chiunque ne sia in possesso sarà in grado di decifrare tutto il tuo traffico! Nota anche che quando si utilizza il proxy, ogni server sarà automaticamente considerato affidabile anche se il certificato del server finale non è valido.
Negli esempi precedenti abbiamo utilizzato la sessione globale predefinita. Se non ti piace usare una sessione globale configurata staticamente, o vuoi avere più sessioni che coesistono (ad es. più proxy in ascolto su porte diverse e che utilizzano gestori di intercettazione diversi) puoi creare diverse istanze di sessione in questo modo:
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
Concesso in licenza secondo l'Apache License, Versione 2.0 (la "Licenza"); non puoi utilizzare questo file se non in conformità con la Licenza. Puoi ottenere una copia della Licenza all'indirizzo
http://www.apache.org/licenses/LICENSE-2.0
Salvo quanto diversamente richiesto dalla legge applicabile o concordato per iscritto, il software distribuito secondo la Licenza è distribuito su una base "AS IS", SENZA GARANZIE O CONDIZIONI DI ALCUN TIPO, esplicite o implicite. Consulta la Licenza per le autorizzazioni e le limitazioni specifiche che regolano la Licenza.