Class: Arachni::HTTP::ProxyServer
- Inherits:
-
WEBrick::HTTPProxyServer
- Object
- WEBrick::HTTPProxyServer
- Arachni::HTTP::ProxyServer
- Defined in:
- lib/arachni/http/proxy_server.rb
Overview
We add our own type of WEBrick::HTTPProxyServer class that does not restrict header exchange and supports SSL interception.
SSL interception is achieved by redirecting traffic via a 2nd (SSL enabled) instance of this server by hijacking the browser’s CONNECT request.
Constant Summary collapse
- INTERCEPTOR_CERTIFICATE =
File.dirname( __FILE__ ) + '/proxy_server/ssl-interceptor-cert.pem'
- INTERCEPTOR_PRIVATE_KEY =
File.dirname( __FILE__ ) + '/proxy_server/ssl-interceptor-pkey.pem'
Class Method Summary collapse
Instance Method Summary collapse
-
#active_connections ⇒ Integer
Amount of active connections.
-
#address ⇒ String
Proxy server URL.
-
#has_connections? ⇒ Bool
trueif the proxy has active connections,falseotherwise. -
#initialize(options = {}) ⇒ ProxyServer
constructor
A new instance of ProxyServer.
-
#running? ⇒ Bool
trueif the server is running,falseotherwise. -
#start_async ⇒ Object
Starts the server without blocking, it’ll only block until the server is up and running and ready to accept connections.
Constructor Details
#initialize(options = {}) ⇒ ProxyServer
Returns a new instance of ProxyServer.
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/arachni/http/proxy_server.rb', line 49 def initialize( = {} ) @options = { address: '0.0.0.0', port: Utilities.available_port, ssl_certificate_name: [ [ 'CN', 'Arachni' ] ] }.merge( ) @logger = WEBrick::Log.new( Arachni.null_device, 7 ) # Will force the proxy to stfu. @logger.close super( BindAddress: @options[:address], Port: @options[:port], MaxClients: @options[:concurrency] || Options.http.request_concurrency, ProxyVia: false, DoNotReverseLookup: true, AccessLog: [], Logger: @logger, Timeout: @options[:timeout], SSLEnable: @options.include?( :ssl_certificate ) && @options.include?( :ssl_private_key ), SSLCertName: @options[:ssl_certificate_name], SSLCertificate: @options[:ssl_certificate], SSLPrivateKey: @options[:ssl_private_key] ) end |
Class Method Details
.service(request, response) ⇒ Object
213 214 215 |
# File 'lib/arachni/http/proxy_server.rb', line 213 def @interceptor.service( request, response ) @options[:service_handler].call( request, response ) end |
Instance Method Details
#active_connections ⇒ Integer
Returns Amount of active connections.
104 105 106 |
# File 'lib/arachni/http/proxy_server.rb', line 104 def active_connections @tokens.max - @tokens.size end |
#address ⇒ String
Returns Proxy server URL.
92 93 94 |
# File 'lib/arachni/http/proxy_server.rb', line 92 def address "#{@options[:address]}:#{@options[:port]}" end |
#has_connections? ⇒ Bool
Returns true if the proxy has active connections, false otherwise.
98 99 100 |
# File 'lib/arachni/http/proxy_server.rb', line 98 def has_connections? active_connections != 0 end |
#running? ⇒ Bool
Returns true if the server is running, false otherwise.
87 88 89 |
# File 'lib/arachni/http/proxy_server.rb', line 87 def running? @status == :Running end |
#start_async ⇒ Object
Starts the server without blocking, it’ll only block until the server is up and running and ready to accept connections.
79 80 81 82 83 |
# File 'lib/arachni/http/proxy_server.rb', line 79 def start_async Thread.new { start } sleep 0.1 while !running? nil end |