Class: Arachni::HTTP::ProxyServer
- Inherits:
-
WEBrick::HTTPProxyServer
- Object
- WEBrick::HTTPProxyServer
- Arachni::HTTP::ProxyServer
- Includes:
- UI::Output
- 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
- CACHE =
{ format_field_name: Support::Cache::LeastRecentlyPushed.new( 100 ) }
- SKIP_HEADERS =
Set.new( HopByHop | ['content-encoding'] )
- INTERCEPTOR_CA_CERTIFICATE =
File.dirname( __FILE__ ) + '/proxy_server/ssl-interceptor-cacert.pem'
- INTERCEPTOR_CA_KEY =
File.dirname( __FILE__ ) + '/proxy_server/ssl-interceptor-cakey.pem'
Instance Method Summary collapse
-
#active_connections ⇒ Integer
Amount of active connections.
-
#address ⇒ String
Proxy server URL.
-
#has_connections? ⇒ Bool
‘true` if the proxy has active connections, `false` otherwise.
-
#initialize(options = {}) ⇒ ProxyServer
constructor
A new instance of ProxyServer.
-
#running? ⇒ Bool
‘true` if the server is running, `false` otherwise.
- #shutdown ⇒ Object
-
#start_async ⇒ Object
Starts the server without blocking, it’ll only block until the server is up and running and ready to accept connections.
Methods included from UI::Output
#debug?, #debug_off, #debug_on, #disable_only_positives, #included, #mute, #muted?, #only_positives, #only_positives?, #print_bad, #print_debug, #print_debug_backtrace, #print_debug_level_1, #print_debug_level_2, #print_debug_level_3, #print_error, #print_error_backtrace, #print_exception, #print_info, #print_line, #print_ok, #print_status, #print_verbose, #reroute_to_file, #reroute_to_file?, reset_output_options, #unmute, #verbose?, #verbose_on
Constructor Details
#initialize(options = {}) ⇒ ProxyServer
Returns a new instance of ProxyServer.
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/arachni/http/proxy_server.rb', line 57 def initialize( = {} ) @options = { address: '0.0.0.0', port: Utilities.available_port, ssl_certificate_name: [ [ 'CN', 'Arachni' ] ] }.merge( ) @logger = WEBrick::Log.new( $stderr, 5 ) # Will force the proxy to stfu. @logger.close if !Arachni::UI::Output.debug?( 3 ) @interceptor_ports = {} @interceptors = {} 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 |
Instance Method Details
#active_connections ⇒ Integer
Returns Amount of active connections.
119 120 121 |
# File 'lib/arachni/http/proxy_server.rb', line 119 def active_connections @tokens.max - @tokens.size end |
#address ⇒ String
Returns Proxy server URL.
107 108 109 |
# File 'lib/arachni/http/proxy_server.rb', line 107 def address "#{@options[:address]}:#{@options[:port]}" end |
#has_connections? ⇒ Bool
Returns ‘true` if the proxy has active connections, `false` otherwise.
113 114 115 |
# File 'lib/arachni/http/proxy_server.rb', line 113 def has_connections? active_connections != 0 end |
#running? ⇒ Bool
Returns ‘true` if the server is running, `false` otherwise.
102 103 104 |
# File 'lib/arachni/http/proxy_server.rb', line 102 def running? @status == :Running end |
#shutdown ⇒ Object
123 124 125 126 127 128 129 130 131 132 133 134 135 |
# File 'lib/arachni/http/proxy_server.rb', line 123 def shutdown print_debug_level_2 'Shutting down..' print_debug_level_2 "-- Interceptors: #{@interceptors.size}" @interceptors.each do |_, interceptor| print_debug_level_2 "---- Interceptor: #{interceptor}" interceptor.shutdown end super print_debug_level_2 'Shutdown.' 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.
90 91 92 93 94 95 96 97 98 |
# File 'lib/arachni/http/proxy_server.rb', line 90 def start_async print_debug_level_2 'Starting' Thread.new { start } sleep 0.1 while !running? print_debug_level_2 'Started' nil end |