
Ruby In The Middle (proxy de interceptación HTTP/HTTPS)
Ruby in the middle (RITM) es un proxy de intercepción HTTP/HTTPS con generación y firma de certificados sobre la marcha, que deja al usuario con todo el poder del lenguaje Ruby para interceptar e incluso modificar peticiones y respuestas a su antojo.
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 cualquier cliente HTTP del cual quieras interceptar tráfico, para que se conecte al proxy en localhost:8080
Para los ejemplos anteriores, busca cualquier cosa en google y también visita tu sitio web de noticias favorito.
Con el ejemplo anterior, tu cliente podría haber encontrado problemas al intentar acceder a recursos HTTPS. En algunos casos puedes agregar una excepción en tu navegador (o indicar a tu cliente HTTP que no verifique certificados) pero en otros casos no podrás agregar excepciones. La razón de esto es que para descifrar y poder modificar el tráfico SSL, RITM tendrá que ser quien realice la negociación SSL con el cliente (usando su propio conjunto de certificados) y luego establecerá una sesión SSL separada hacia el servidor. Es decir:
Client <--- SSL session ---> RITM <--- SSL session ---> Server
Para cada nombre de host de servidor diferente con el que tu cliente intente comunicarse, RITM generará un certificado sobre la marcha y lo firmará con una Autoridad de Certificación (CA) preconfigurada. Por lo tanto, para poder establecer una conexión segura, necesitarás configurar tu cliente (por ejemplo, el navegador) para que confíe en la CA de RITM.
Por razones de seguridad, cada vez que inicies el proxy de RITM con la configuración predeterminada, generará una nueva Autoridad de Certificación interna. Para usar tu propia CA en su lugar (de modo que pueda ser cargada y confiada por tu navegador), realiza los siguientes pasos:
Puedes usar OpenSSL o RITM para generar estos dos archivos. Con OpenSSL:
openssl req -new -nodes -x509 -days 365 -extensions v3_ca -keyout insecure_ca.key -out insecure_ca.crt
O 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
Te dejo a ti averiguar cómo se hace esto en tu navegador o cliente. 4. ¡Navega por la web!
O cuida muy bien la clave privada de la CA, ya que cualquiera que posea esa clave será capaz de descifrar todo tu tráfico. Ten en cuenta también que al usar el proxy, todos los servidores serán automáticamente confiables incluso si el certificado del servidor final no es válido.
En los ejemplos anteriores hemos estado usando la sesión global predeterminada. Si no te gusta usar una sesión global configurada estáticamente, o quieres tener múltiples sesiones coexistiendo (por ejemplo, múltiples proxies escuchando en diferentes puertos y usando diferentes manejadores de intercepción), puedes crear diferentes instancias de sesión de esta manera:
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
Licenciado bajo la Licencia Apache, Versión 2.0 (la "Licencia"); no puedes usar este archivo excepto en cumplimiento con la Licencia. Puedes obtener una copia de la Licencia en
http://www.apache.org/licenses/LICENSE-2.0
A menos que lo exija la ley aplicable o se acuerde por escrito, el software distribuido bajo la Licencia se distribuye "TAL CUAL", SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ya sean expresas o implícitas. Consulte la Licencia para conocer los permisos y limitaciones específicos que rigen el uso del software.