
Ruby In The Middle (Proxy de interceptação HTTP/HTTPS)
Ruby in the middle (RITM) é um proxy de interceptação HTTP/HTTPS com geração e assinatura de certificados em tempo real, que oferece ao usuário todo o poder da linguagem Ruby para interceptar e até modificar requisições e respostas como desejar.
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 qualquer cliente HTTP do qual você queira interceptar o tráfego, para conectar ao proxy em localhost:8080
Para os exemplos acima, pesquise algo no google e também visite seu site de jornal favorito.
Com o exemplo anterior, seu cliente pode ter encontrado problemas ao tentar acessar recursos HTTPS. Em alguns casos, você pode adicionar uma exceção ao seu navegador (ou instruir seu cliente HTTP a não verificar certificados), mas em outros casos você não conseguirá adicionar exceções. A razão para isso é que, para descriptografar e poder modificar o tráfego SSL, o RITM terá que fazer a negociação SSL com o cliente (usando seu próprio conjunto de certificados) e então estabelecerá uma sessão SSL separada em direção ao servidor. Isto é:
Cliente <--- Sessão SSL ---> RITM <--- Sessão SSL ---> Servidor
Para cada nome de host diferente de servidor com o qual seu cliente tenta se comunicar, o RITM gerará um certificado em tempo real e o assinará com uma Autoridade Certificadora (CA) pré-configurada. Portanto, para poder estabelecer uma conexão segura, você precisará configurar seu cliente (por exemplo, navegador) para confiar na CA do RITM.
Por razões de segurança, toda vez que você inicia o proxy do RITM com as configurações padrão, ele gera uma nova Autoridade Certificadora interna. Para usar sua própria CA (para que ela possa ser carregada e confiada pelo seu navegador), execute os seguintes passos:
Você pode usar o OpenSSL ou o RITM para gerar esses dois arquivos. Com o OpenSSL:
openssl req -new -nodes -x509 -days 365 -extensions v3_ca -keyout insecure_ca.key -out insecure_ca.crt
Ou com o 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
Deixarei para você descobrir como isso é feito no seu navegador ou cliente. 4. Surfe na web!
Ou tome muito cuidado com a chave privada da CA, pois qualquer pessoa de posse dessa chave será capaz de descriptografar todo o seu tráfego! Observe também que, ao usar o proxy, todo servidor será automaticamente confiável, mesmo que o certificado do servidor final não seja válido.
Nos exemplos acima, estivemos usando a sessão global padrão. Se você não gosta de usar uma sessão global configurada estaticamente, ou deseja ter múltiplas sessões coexistindo (por exemplo, vários proxies ouvindo em portas diferentes e usando manipuladores de interceptação diferentes), você pode criar diferentes instâncias de sessão desta forma:
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 sob a Licença Apache, Versão 2.0 (a "Licença"); você não pode usar este arquivo exceto em conformidade com a Licença. Você pode obter uma cópia da Licença em
http://www.apache.org/licenses/LICENSE-2.0
A menos que exigido por lei ou acordado por escrito, o software distribuído sob a Licença é distribuído "COMO ESTÁ", SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, expressas ou implícitas. Consulte a Licença para obter as permissões e limitações específicas que regem o uso do software.