arachni 0.4 → 0.4.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,10 @@
1
-
2
1
  # ChangeLog
3
2
 
3
+ ## Version 0.4.0.1 _(January 9, 2012)_
4
+ - Reports
5
+ - XML -- added missing Issue attributes
6
+ - Added draconian run-time exception handling to all components.
7
+
4
8
  ## Version 0.4 _(January 7, 2012)_
5
9
  - RPC Infrastructure (**New**)
6
10
  - Dispatcher
data/README.md CHANGED
@@ -2,11 +2,11 @@
2
2
  <table>
3
3
  <tr>
4
4
  <th>Version</th>
5
- <td>0.4</td>
5
+ <td>0.4.0.1</td>
6
6
  </tr>
7
7
  <tr>
8
8
  <th>Homepage</th>
9
- <td><a href="http://arachni.segfault.gr">http://arachni.segfault.gr</a></td>
9
+ <td><a href="http://arachni-scanner.com">http://arachni-scanner.com</a></td>
10
10
  </tr>
11
11
  <tr>
12
12
  <th>Blog</th>
@@ -100,12 +100,12 @@ From a user's or a component developer's point of view everything appears simple
100
100
  - Pause/resume functionality.
101
101
  - High performance asynchronous HTTP requests.
102
102
  - Open [RPC](https://github.com/Zapotek/arachni/wiki/RPC-API) Client/Dispatcher Infrastructure
103
- - Distributed deployment
103
+ - [Distributed deployment](https://github.com/Zapotek/arachni/wiki/Distributed-components)
104
104
  - Multiple clients
105
105
  - Parallel scans
106
106
  - SSL encryption (with peer authentication)
107
107
  - Remote monitoring
108
- - Support for [High Performance Grid](https://github.com/Zapotek/arachni/wiki/RPC-server#wiki-grid) configuration, combining the resources of multiple nodes to perform fast scans.
108
+ - Support for [High Performance Grid](https://github.com/Zapotek/arachni/wiki/HPG) configuration, combining the resources of multiple nodes to perform fast scans.
109
109
 
110
110
  ### Website Crawler
111
111
 
@@ -245,6 +245,12 @@ CDE packages are self contained and thus alleviate the need for Ruby and other d
245
245
  You can download the latest CDE package from the [download](https://github.com/Zapotek/arachni/downloads) page and escape the dependency hell.<br/>
246
246
  If you decide to go the CDE route you can skip the rest, you're done.
247
247
 
248
+ ### Cygwin packages for Windows
249
+
250
+ Arachni does not yet run natively on Windows systems, however until that day comes you can download a pre-configured Cygwin environment containing Arachni and its dependencies.
251
+ All you need to do is download the [latest self-extracting archive](http://downloads.segfault.gr/arachni/), select a directory for it, open it up and then execute the Cygwin batch file.
252
+ You will then be presented with a Bash shell, after that you'll be able to use Arachni as if you were on a Linux system.
253
+
248
254
  ### Gem
249
255
 
250
256
  To install the Gem or work with the source code you'll also need the following system libraries:
@@ -268,9 +274,6 @@ If you want to clone the repository and work with the source code then you'll ne
268
274
  rake install
269
275
 
270
276
 
271
- ### [Windows -- under Cygwin](https://github.com/Zapotek/arachni/wiki/Installation)
272
-
273
-
274
277
  ## Usage
275
278
 
276
279
  ### [Command line interface](https://github.com/Zapotek/arachni/wiki/Command-line-user-interface)
@@ -292,7 +295,7 @@ Should you want to use these extra components simply move them from the <em>extr
292
295
 
293
296
  Arachni should work on all *nix and POSIX compliant platforms with Ruby and the aforementioned requirements.
294
297
 
295
- Windows users can run Arachni in Cygwin by following these [instructions](https://github.com/Zapotek/arachni/wiki/Installation).
298
+ Windows users can download the pre-configured Cygwin package, see the [installation instructions](https://github.com/Zapotek/arachni/wiki/Installation).
296
299
 
297
300
  ## Bug reports/Feature requests
298
301
  Please send your feedback using Github's issue system at
@@ -32,6 +32,7 @@ module Module
32
32
  class Manager < Arachni::ComponentManager
33
33
 
34
34
  include Arachni::UI::Output
35
+ include Arachni::Module::Utilities
35
36
 
36
37
  @@results ||= []
37
38
  @@on_register_results ||= []
@@ -54,7 +55,7 @@ class Manager < Arachni::ComponentManager
54
55
  # @param [::Arachni::Framework] framework to be assigned to modules
55
56
  #
56
57
  def run( page, framework = nil )
57
- keys.each { |mod| run_one( mod, page, framework ) }
58
+ keys.each { |mod| exception_jail( false ){ run_one( mod, page, framework ) } }
58
59
  end
59
60
 
60
61
  #
@@ -43,7 +43,7 @@ require opts.dir['lib'] + 'component_manager'
43
43
  # @author: Tasos "Zapotek" Laskos
44
44
  # <tasos.laskos@gmail.com>
45
45
  # <zapotek@segfault.gr>
46
- # @version: 0.2.1
46
+ # @version: 0.2.2
47
47
  #
48
48
  class Parser
49
49
  include Arachni::UI::Output
@@ -244,7 +244,7 @@ class Parser
244
244
  #
245
245
  # @return [Hash] HTTP header fields
246
246
  #
247
- def headers( )
247
+ def headers
248
248
  headers_arr = []
249
249
  {
250
250
  'accept' => 'text/html,application/xhtml+xml,application' +
@@ -642,7 +642,7 @@ class Parser
642
642
 
643
643
  return @@manager.available.map {
644
644
  |name|
645
- @@manager[name].new.run( doc )
645
+ exception_jail( false ){ @@manager[name].new.run( doc ) }
646
646
  }.flatten.uniq.compact.
647
647
  map { |path| to_absolute( url_sanitize( path ) ) }.
648
648
  reject { |path| skip?( path ) }
@@ -24,7 +24,7 @@ module Plugin
24
24
  # @author: Tasos "Zapotek" Laskos
25
25
  # <tasos.laskos@gmail.com>
26
26
  # <zapotek@segfault.gr>
27
- # @version: 0.1
27
+ # @version: 0.1.1
28
28
  #
29
29
  class Manager < Arachni::ComponentManager
30
30
 
@@ -73,7 +73,7 @@ class Manager < Arachni::ComponentManager
73
73
 
74
74
  @jobs << Thread.new {
75
75
 
76
- exception_jail {
76
+ exception_jail( false ) {
77
77
  Thread.current[:name] = name
78
78
 
79
79
  plugin_new = create( name )
@@ -60,13 +60,14 @@ end
60
60
  # @author: Tasos "Zapotek" Laskos
61
61
  # <tasos.laskos@gmail.com>
62
62
  # <zapotek@segfault.gr>
63
- # @version: 0.1
63
+ # @version: 0.1.1
64
64
  # @abstract
65
65
  #
66
66
  class Base
67
67
 
68
68
  # get the output interface
69
69
  include Arachni::UI::Output
70
+ include Arachni::Module::Utilities
70
71
 
71
72
  # where to report false positives <br/>
72
73
  # info about this should be included in all templates
@@ -88,7 +89,7 @@ class Base
88
89
  #
89
90
  # REQUIRED
90
91
  #
91
- def run( )
92
+ def run
92
93
 
93
94
  end
94
95
 
@@ -129,7 +130,9 @@ class Base
129
130
  plugin_results = plugins[name]
130
131
  next if !plugin_results || plugin_results[:results].empty?
131
132
 
132
- formatted[name] = formatter.new( plugin_results.deep_clone ).run
133
+ exception_jail( false ) {
134
+ formatted[name] = formatter.new( plugin_results.deep_clone ).run
135
+ }
133
136
  }
134
137
 
135
138
  return formatted
@@ -150,7 +153,7 @@ class Base
150
153
  ],
151
154
  :description => %q{This class should be extended by all reports.},
152
155
  :author => 'zapotek',
153
- :version => '0.1',
156
+ :version => '0.1.1',
154
157
  }
155
158
  end
156
159
 
@@ -26,10 +26,12 @@ module Report
26
26
  # @author: Tasos "Zapotek" Laskos
27
27
  # <tasos.laskos@gmail.com>
28
28
  # <zapotek@segfault.gr> <br/>
29
- # @version: 0.1
29
+ # @version: 0.1.1
30
30
  #
31
31
  class Manager < Arachni::ComponentManager
32
32
 
33
+ include Arachni::Module::Utilities
34
+
33
35
  # the extension of the Arachni Framework Report files
34
36
  EXTENSION = '.afr'
35
37
 
@@ -54,7 +56,9 @@ class Manager < Arachni::ComponentManager
54
56
 
55
57
  self.each {
56
58
  |name, report|
57
- run_one( name, audit_store.deep_clone )
59
+ exception_jail( false ){
60
+ run_one( name, audit_store.deep_clone )
61
+ }
58
62
  }
59
63
  end
60
64
 
@@ -191,7 +191,7 @@ class ReportManager
191
191
  def get( type, id )
192
192
  return if !valid_class?( type )
193
193
 
194
- begin
194
+ # begin
195
195
  location = savedir + Report.get( id ).filename + EXTENSION
196
196
 
197
197
  # if it's the default report type don't waste time converting
@@ -200,11 +200,11 @@ class ReportManager
200
200
  else
201
201
  return convert( type, ::Arachni::AuditStore.load( location ) )
202
202
  end
203
- rescue Exception => e
204
- ap e
205
- ap e.backtrace
206
- return nil
207
- end
203
+ # rescue Exception => e
204
+ # ap e
205
+ # ap e.backtrace
206
+ # return nil
207
+ # end
208
208
  end
209
209
 
210
210
  #
@@ -11,6 +11,6 @@
11
11
  module Arachni
12
12
 
13
13
  # the universal system version
14
- VERSION = '0.4'
14
+ VERSION = '0.4.0.1'
15
15
 
16
16
  end
@@ -55,9 +55,11 @@ class Discovery < Arachni::Plugin::Base
55
55
  # URL path => size of responses
56
56
  response_size_per_path = {}
57
57
 
58
- on_relevant_issues {
58
+ @framework.audit_store.issues.each_with_index {
59
59
  |issue, idx|
60
60
 
61
+ next if !includes_tags?( issue.tags )
62
+
61
63
  # discovery issues only have 1 variation
62
64
  variation = issue.variations.first
63
65
 
@@ -66,7 +68,14 @@ class Discovery < Arachni::Plugin::Base
66
68
  # will control the behavior under that path
67
69
  #
68
70
  # did that make any sense?
69
- path = File.dirname( URI( normalize_url( variation['url'] ) ).path )
71
+ path = ''
72
+ begin
73
+ exception_jail {
74
+ path = File.dirname( URI( normalize_url( variation['url'] ) ).path )
75
+ }
76
+ rescue
77
+ next
78
+ end
70
79
 
71
80
  # gathering total response sizes for issues per path
72
81
  response_size_per_path[path] ||= 0
@@ -113,21 +122,6 @@ class Discovery < Arachni::Plugin::Base
113
122
  register_results( issues ) if !issues.empty?
114
123
  end
115
124
 
116
- #
117
- # Passes each issue that was logged by a discovery module to the block.
118
- #
119
- # @param [Proc] &block
120
- #
121
- def on_relevant_issues( &block )
122
- @framework.audit_store.issues.each_with_index {
123
- |issue, idx|
124
-
125
- if includes_tags?( issue.tags )
126
- block.call( issue, idx )
127
- end
128
- }
129
- end
130
-
131
125
  #
132
126
  # Checks if 'tags' contain any item in {TAGS}
133
127
  #
@@ -18,7 +18,7 @@ module Plugins
18
18
  # @author: Tasos "Zapotek" Laskos
19
19
  # <tasos.laskos@gmail.com>
20
20
  # <zapotek@segfault.gr>
21
- # @version: 0.1.3
21
+ # @version: 0.1.4
22
22
  #
23
23
  class TimingAttacks < Arachni::Plugin::Base
24
24
 
@@ -42,15 +42,27 @@ class TimingAttacks < Arachni::Plugin::Base
42
42
  # we don't care about non OK responses
43
43
  next if res.code != 200
44
44
 
45
- path = URI( normalize_url( res.effective_url ) ).path
46
- path = '/' if path.empty?
47
- @counter[path] ||= @times[path] ||= 0
48
-
49
- # add up all request times for a specific path
50
- @times[path] += res.start_transfer_time
51
-
52
- # add up all requests for each path
53
- @counter[path] += 1
45
+ begin
46
+ path = nil
47
+ # let's hope for a proper and clean parse but be prepared for
48
+ # all hell to break loose too...
49
+ begin
50
+ path = URI( normalize_url( res.effective_url ) ).path
51
+ rescue
52
+ url = res.effective_url.split( '?' ).first
53
+ path = URI( normalize_url( res.effective_url ) ).path
54
+ end
55
+
56
+ path = '/' if path.empty?
57
+ @counter[path] ||= @times[path] ||= 0
58
+
59
+ # add up all request times for a specific path
60
+ @times[path] += res.start_transfer_time
61
+
62
+ # add up all requests for each path
63
+ @counter[path] += 1
64
+ rescue
65
+ end
54
66
  }
55
67
 
56
68
  wait_while_framework_running
@@ -111,7 +123,7 @@ class TimingAttacks < Arachni::Plugin::Base
111
123
  Pages with high response times usually include heavy-duty processing
112
124
  which makes them prime targets for Denial-of-Service attacks.},
113
125
  :author => 'Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>',
114
- :version => '0.1.3',
126
+ :version => '0.1.4',
115
127
  :tags => [ 'anomaly' , 'timing', 'attacks', 'meta' ]
116
128
  }
117
129
  end
@@ -17,22 +17,12 @@ module Reports
17
17
  # @author: Tasos "Zapotek" Laskos
18
18
  # <tasos.laskos@gmail.com>
19
19
  # <zapotek@segfault.gr>
20
- # @version: 0.1
20
+ # @version: 0.1.1
21
21
  #
22
22
  class AFR < Arachni::Report::Base
23
23
 
24
- #
25
- # @param [AuditStore] audit_store
26
- # @param [Hash] options options passed to the report
27
- #
28
- def initialize( audit_store, options )
29
- @audit_store = audit_store
30
- @options = options
31
- end
32
-
33
- def run( )
34
-
35
- print_line( )
24
+ def run
25
+ print_line
36
26
  print_status( 'Dumping audit results in \'' + @options['outfile'] + '\'.' )
37
27
 
38
28
  @audit_store.save( @options['outfile'] )
@@ -18,7 +18,7 @@
18
18
  <%end%>
19
19
 
20
20
  <%if item['element']['action']%>
21
- pointing to <a href="<%=CGI.escapeHTML( item['element']['action'] )%>"> <%=item['element']['action']%> </a>
21
+ pointing to <a href="<%=CGI.escapeHTML( item['element']['action'] ) %>"> <%=item['element']['action']%> </a>
22
22
  <%end%>
23
23
 
24
24
  <%if item['element']['method']%>
@@ -71,7 +71,7 @@
71
71
  <% if item['request']['params'] %>
72
72
  <form style="display:inline" action="<%=item['request']['url']%>" target="_blank" method="<%=item['request']['method']%>">
73
73
  <% item['request']['params'].each_pair do |name, value|%>
74
- <input type="hidden" name="<%=CGI.escapeHTML(name)%>" value="<%=CGI.escapeHTML( value )%>" />
74
+ <input type="hidden" name="<%=CGI.escapeHTML( name || '' )%>" value="<%=CGI.escapeHTML( value || '' )%>" />
75
75
  <%end%>
76
76
  <input type="submit" value="Replay" />
77
77
  </form>
@@ -22,7 +22,7 @@ module Reports
22
22
  # @author: Tasos "Zapotek" Laskos
23
23
  # <tasos.laskos@gmail.com>
24
24
  # <zapotek@segfault.gr>
25
- # @version: 0.2
25
+ # @version: 0.2.1
26
26
  #
27
27
  class XML < Arachni::Report::Base
28
28
 
@@ -122,16 +122,14 @@ class XML < Arachni::Report::Base
122
122
  |issue|
123
123
 
124
124
  start_tag( 'issue' )
125
- simple_tag( 'name', issue.name )
126
125
 
127
- simple_tag( 'url', issue.url )
128
- simple_tag( 'element', issue.elem )
129
- simple_tag( 'method', issue.method ) if issue.method
130
- add_tags( issue.tags ) if issue.tags.is_a?( Array )
131
- simple_tag( 'variable', issue.var ) if issue.var
132
- simple_tag( 'description', issue.description )
133
- simple_tag( 'manual_verification', issue.verification.to_s )
126
+ issue.each_pair {
127
+ |k, v|
128
+ next if !v.is_a?( String )
129
+ simple_tag( k, v )
130
+ }
134
131
 
132
+ add_tags( [issue.tags].flatten.compact )
135
133
 
136
134
  start_tag( 'references' )
137
135
  issue.references.each{
@@ -173,7 +171,7 @@ class XML < Arachni::Report::Base
173
171
  :name => 'XML report',
174
172
  :description => %q{Exports a report as an XML file.},
175
173
  :author => 'Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>',
176
- :version => '0.2',
174
+ :version => '0.2.1',
177
175
  :options => [ Arachni::Report::Options.outfile( '.xml' ) ]
178
176
  }
179
177
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arachni
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.4'
4
+ version: 0.4.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-07 00:00:00.000000000 Z
12
+ date: 2012-01-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: typhoeus
16
- requirement: &7947780 !ruby/object:Gem::Requirement
16
+ requirement: &5666540 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.3.3
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *7947780
24
+ version_requirements: *5666540
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: awesome_print
27
- requirement: &7947180 !ruby/object:Gem::Requirement
27
+ requirement: &5665540 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *7947180
35
+ version_requirements: *5665540
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: json
38
- requirement: &7944620 !ruby/object:Gem::Requirement
38
+ requirement: &5664340 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *7944620
46
+ version_requirements: *5664340
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: nokogiri
49
- requirement: &7930700 !ruby/object:Gem::Requirement
49
+ requirement: &5663600 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.5.0
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *7930700
57
+ version_requirements: *5663600
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: sys-proctable
60
- requirement: &7929640 !ruby/object:Gem::Requirement
60
+ requirement: &5662940 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 0.9.1
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *7929640
68
+ version_requirements: *5662940
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: terminal-table
71
- requirement: &7928680 !ruby/object:Gem::Requirement
71
+ requirement: &5662460 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 1.4.2
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *7928680
79
+ version_requirements: *5662460
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: sinatra
82
- requirement: &7927880 !ruby/object:Gem::Requirement
82
+ requirement: &5661740 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: 1.3.1
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *7927880
90
+ version_requirements: *5661740
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: sinatra-flash
93
- requirement: &7927080 !ruby/object:Gem::Requirement
93
+ requirement: &5661040 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: 0.3.0
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *7927080
101
+ version_requirements: *5661040
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: async_sinatra
104
- requirement: &7926520 !ruby/object:Gem::Requirement
104
+ requirement: &5660460 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: 0.5.0
110
110
  type: :runtime
111
111
  prerelease: false
112
- version_requirements: *7926520
112
+ version_requirements: *5660460
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: thin
115
- requirement: &7926040 !ruby/object:Gem::Requirement
115
+ requirement: &5659960 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: 1.2.11
121
121
  type: :runtime
122
122
  prerelease: false
123
- version_requirements: *7926040
123
+ version_requirements: *5659960
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: data_objects
126
- requirement: &7925500 !ruby/object:Gem::Requirement
126
+ requirement: &5238300 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - =
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: 0.10.7
132
132
  type: :runtime
133
133
  prerelease: false
134
- version_requirements: *7925500
134
+ version_requirements: *5238300
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: datamapper
137
- requirement: &7925040 !ruby/object:Gem::Requirement
137
+ requirement: &5236360 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - =
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: 1.1.0
143
143
  type: :runtime
144
144
  prerelease: false
145
- version_requirements: *7925040
145
+ version_requirements: *5236360
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: dm-sqlite-adapter
148
- requirement: &7924540 !ruby/object:Gem::Requirement
148
+ requirement: &5235080 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - =
@@ -153,10 +153,10 @@ dependencies:
153
153
  version: 1.1.0
154
154
  type: :runtime
155
155
  prerelease: false
156
- version_requirements: *7924540
156
+ version_requirements: *5235080
157
157
  - !ruby/object:Gem::Dependency
158
158
  name: net-ssh
159
- requirement: &7923820 !ruby/object:Gem::Requirement
159
+ requirement: &5233980 !ruby/object:Gem::Requirement
160
160
  none: false
161
161
  requirements:
162
162
  - - ! '>='
@@ -164,10 +164,10 @@ dependencies:
164
164
  version: 2.2.1
165
165
  type: :runtime
166
166
  prerelease: false
167
- version_requirements: *7923820
167
+ version_requirements: *5233980
168
168
  - !ruby/object:Gem::Dependency
169
169
  name: net-scp
170
- requirement: &7912240 !ruby/object:Gem::Requirement
170
+ requirement: &5232740 !ruby/object:Gem::Requirement
171
171
  none: false
172
172
  requirements:
173
173
  - - ! '>='
@@ -175,10 +175,10 @@ dependencies:
175
175
  version: 1.0.4
176
176
  type: :runtime
177
177
  prerelease: false
178
- version_requirements: *7912240
178
+ version_requirements: *5232740
179
179
  - !ruby/object:Gem::Dependency
180
180
  name: eventmachine
181
- requirement: &7911200 !ruby/object:Gem::Requirement
181
+ requirement: &5231640 !ruby/object:Gem::Requirement
182
182
  none: false
183
183
  requirements:
184
184
  - - ! '>='
@@ -186,10 +186,10 @@ dependencies:
186
186
  version: 1.0.0.beta.4
187
187
  type: :runtime
188
188
  prerelease: false
189
- version_requirements: *7911200
189
+ version_requirements: *5231640
190
190
  - !ruby/object:Gem::Dependency
191
191
  name: em-synchrony
192
- requirement: &7910580 !ruby/object:Gem::Requirement
192
+ requirement: &4927740 !ruby/object:Gem::Requirement
193
193
  none: false
194
194
  requirements:
195
195
  - - ! '>='
@@ -197,10 +197,10 @@ dependencies:
197
197
  version: 1.0.0
198
198
  type: :runtime
199
199
  prerelease: false
200
- version_requirements: *7910580
200
+ version_requirements: *4927740
201
201
  - !ruby/object:Gem::Dependency
202
202
  name: arachni-rpc-em
203
- requirement: &7909560 !ruby/object:Gem::Requirement
203
+ requirement: &4926240 !ruby/object:Gem::Requirement
204
204
  none: false
205
205
  requirements:
206
206
  - - ! '>='
@@ -208,7 +208,7 @@ dependencies:
208
208
  version: 0.1.1
209
209
  type: :runtime
210
210
  prerelease: false
211
- version_requirements: *7909560
211
+ version_requirements: *4926240
212
212
  description: ! " Arachni is a feature-full, modular, high-performance Ruby
213
213
  framework aimed towards\n helping penetration testers and administrators
214
214
  evaluate the security of web applications.\n\n Arachni is smart, it trains