gauntlt 0.1.5 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MGRkZWZiMTQ4ZDIyMzFjZmFhODk5ZjQyOTJhZmYwY2Y5NjY0NDdmMA==
5
+ data.tar.gz: !binary |-
6
+ MzI0YjBjNTRkMTI4ODAzMWExOWI4MWUyYmFhNjY1ZDg0NzQ2OGY0Mg==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ MWU3MWJkZjI0ZWI1N2Q3M2I0NGI5MjlhM2U2MDFjMzE5ZjRlY2Y1YjFkNjc3
10
+ NGUwNjk3NzFiYmIyMTdhOTgzNGJiYTI5NGFhY2E0NWYxY2NjNGE2MjQyM2Rj
11
+ MDY0YmFmM2NiNDExYzZiYTYxMDUzMzhhODQ4NTA4OGQwNTNiZjI=
12
+ data.tar.gz: !binary |-
13
+ ODM4MzVjYTM1NGIyYTBlNGZmMjk2MGM3OGRlYWViMTg5MDUwYzhiMGY3ZGQw
14
+ NGFiY2EyYmI1MmU4YmU2MzAzNWI1NmEzYWFlZTZkMTA4OGI3ZGRkMTBhZGU0
15
+ MGM1NGUwNWJiMDFlZjM3NmI5NTE3MzBmNjM1YTAzOTUwY2RhYzU=
data/.gitignore CHANGED
@@ -32,3 +32,6 @@ Gemfile.lock
32
32
  #sqlite DB (from scapegoat)
33
33
  *.db
34
34
  *.$DB
35
+
36
+ # possible dependency installs
37
+ dirb
@@ -6,10 +6,11 @@ before_install:
6
6
  - git submodule update --init --recursive
7
7
  before_script:
8
8
  - sudo apt-get install nmap
9
+ - sudo apt-get install wget
9
10
  - export SSLYZE_PATH="/home/travis/build/gauntlt/gauntlt/vendor/sslyze/sslyze.py"
10
11
  - export SQLMAP_PATH="/home/travis/build/gauntlt/gauntlt/vendor/sqlmap/sqlmap.py"
11
12
  - 'cd vendor/Garmr && sudo python setup.py install && cd ../..'
12
- - 'cd vendor && tar xvfz dirb203.tar.gz && cd dirb && ./configure && make && sudo cp dirb /usr/local/bin/ && cd ..'
13
+ - 'cd vendor && wget http://downloads.sourceforge.net/project/dirb/dirb/2.03/dirb203.tar.gz && tar xvfz dirb203.tar.gz && cd dirb && ./configure && make && sudo cp dirb /usr/local/bin/ && cd ..'
13
14
  - export DIRB_WORDLISTS="/home/travis/build/gauntlt/gauntlt/vendor/dirb/wordlists"
14
15
 
15
16
  matrix:
data/README.md CHANGED
@@ -146,22 +146,22 @@ NOTE: We currently use `ruby 1.9.3` and `JRuby 1.7.0` for development and testin
146
146
  # on ubuntu:
147
147
  # $ sudo apt-get install libcurl4-openssl-dev
148
148
  ```
149
+ 4. Run the ready_to_rumble.sh script to make sure you have all the dependencies installed like sqlmap and sslyze. This is meant to replicate the travis setup for devs. This should be a rake task instead.
149
150
 
150
- 4. Run the cucumber features and rspec examples
151
+ 5. Run the cucumber features and rspec examples
151
152
 
152
153
  ```shell
153
154
  $ bundle exec rake
154
155
  ```
155
156
 
156
- 5. Launch attacks with bin/gauntlt
157
+ 6. Launch attacks with bin/gauntlt
157
158
 
158
159
  ```shell
159
160
  $ bin/gauntlt attack
160
161
  ```
161
162
 
162
- 5. Refer to the features directory for usage examples and please write cucumber features for any new functionality you wish to submit.
163
+ 7. Refer to the features directory for usage examples and please write cucumber features for any new functionality you wish to submit.
163
164
 
164
- 6. Run the ready_to_rumble.sh script to make sure you have all the dependencies installed like sqlmap and sslyze. This is meant to replicate the travis setup for devs. This should be a rake task instead.
165
165
 
166
166
  ## ROADMAP
167
167
 
@@ -11,7 +11,7 @@ opts = Trollop::options do
11
11
  gauntlt is a ruggedization framework that helps you be mean to your code
12
12
 
13
13
  Usage:
14
- gauntlt <path>+ [--tags TAG_EXPRESSION]
14
+ gauntlt <path>+ [--tags TAG_EXPRESSION] [--format FORMAT]
15
15
 
16
16
  Options:
17
17
  EOS
@@ -21,8 +21,13 @@ EOS
21
21
  :multi => true
22
22
 
23
23
  opt :list, "List defined attacks"
24
+
24
25
  opt :steps, "List the gauntlt step definitions that can be used inside of attack files"
26
+
25
27
  opt :allsteps, "List all available step definitions including aruba step definitions which help with file and parsing operations"
28
+
29
+ opt :format, "Available formats: html, json, junit, progress",
30
+ :type => String
26
31
  end
27
32
 
28
33
  opts[:path] = if ARGV.empty?
@@ -45,6 +50,6 @@ elsif opts[:allsteps]
45
50
  puts "\nGauntlt Attack Steps"
46
51
  puts all_step_defs[:gauntlt].sort
47
52
  else
48
- Gauntlt.attack( opts[:path], opts[:tags].join(',') )
53
+ Gauntlt.attack( opts[:path], opts[:tags].join(','), opts[:format] )
49
54
  end
50
55
 
@@ -6,17 +6,23 @@ Feature: nmap attacks for scanme.nmap.org and to use this for your tests, change
6
6
  And the following profile:
7
7
  | name | value |
8
8
  | hostname | scanme.nmap.org |
9
+ | host | scanme.nmap.org |
9
10
  | tcp_ping_ports | 22,25,80,443 |
10
11
 
12
+ Scenario: Verify server is open on expected set of ports using the nmap-fast attack step
13
+ When I launch a "nmap-fast" attack
14
+ Then the output should match /80.tcp\s+open/
15
+
11
16
  Scenario: Verify server is open on expected set of ports using the nmap fast flag
12
17
  When I launch an "nmap" attack with:
13
18
  """
14
19
  nmap -F <hostname>
15
20
  """
16
- Then the output should contain:
21
+ Then the output should match:
17
22
  """
18
- 80/tcp open http
23
+ 80/tcp\s+open
19
24
  """
25
+
20
26
  Scenario: Verify that there are no unexpected ports open
21
27
  When I launch an "nmap" attack with:
22
28
  """
@@ -12,5 +12,9 @@ Feature: simple nmap attack (sanity check)
12
12
  """
13
13
  nmap -p 80,443 <hostname>
14
14
  """
15
- Then the output should contain "80/tcp open"
16
- And the output should not contain "443/tcp open"
15
+ Then the output should match /80.tcp\s+open/
16
+ And the output should not match:
17
+ """
18
+ 443/tcp\s+open
19
+ """
20
+
@@ -8,6 +8,7 @@ Feature: nmap attack
8
8
  | simple.attack |
9
9
  | os_detection.attack |
10
10
  | tcp_ping_ports.attack |
11
+ | nmap.attack |
11
12
  | xml_output.attack |
12
13
 
13
14
  Scenario: Simple nmap attack
@@ -37,3 +38,9 @@ Feature: nmap attack
37
38
  """
38
39
  5 steps (5 passed)
39
40
  """
41
+ Scenario: The full nmap attack
42
+ When I run `gauntlt nmap.attack`
43
+ Then it should pass with:
44
+ """
45
+ 17 steps (17 passed)
46
+ """
@@ -1,5 +1,5 @@
1
1
  require 'aruba/cucumber'
2
2
 
3
3
  Before do
4
- @aruba_timeout_seconds = 5 # Add more time for sloooooowww networks
4
+ @aruba_timeout_seconds = 10 # Add more time for sloooooowww networks
5
5
  end
@@ -1,9 +1,9 @@
1
1
  Before('@slow') do
2
- @aruba_timeout_seconds = 30
2
+ @aruba_timeout_seconds = 45
3
3
  end
4
4
 
5
5
  if RUBY_PLATFORM == 'java'
6
6
  Before do
7
7
  @aruba_timeout_seconds = 30
8
8
  end
9
- end
9
+ end
@@ -17,6 +17,9 @@ module Gauntlt
17
17
  ATTACK_ADAPTERS_DIR = File.join(GAUNTLT_DIR, 'attack_adapters')
18
18
 
19
19
  ATTACK_ADAPTERS_GLOB_PATTERN = ATTACK_ADAPTERS_DIR + '/*.rb'
20
+
21
+ ATTACK_ALIASES_DIR = File.join(GAUNTLT_DIR, 'attack_aliases')
22
+ ATTACK_ALIASES_GLOB_PATTERN = ATTACK_ALIASES_DIR + '/*.json'
20
23
 
21
24
  class << self
22
25
  def attack_adapters
@@ -29,8 +32,8 @@ module Gauntlt
29
32
  end.sort
30
33
  end
31
34
 
32
- def attack(path, tags=[])
33
- Attack.new(path, tags).run
35
+ def attack(path, tags=[], format="")
36
+ Attack.new(path, tags, format).run
34
37
  end
35
38
 
36
39
  def stepdefs(path, tags=[])
@@ -4,12 +4,12 @@ module Gauntlt
4
4
  class Attack
5
5
  attr_accessor :runtime
6
6
 
7
- def initialize(path, tags=[])
8
- self.runtime = Runtime.new(path, tags)
7
+ def initialize(path, tags=[], format="")
8
+ self.runtime = Runtime.new(path, tags, format)
9
9
  end
10
10
 
11
11
  def run
12
12
  runtime.execute!
13
13
  end
14
14
  end
15
- end
15
+ end
@@ -1,9 +1,19 @@
1
1
  # TODO: figure out if there's a way to namespace these step definitions
2
-
2
+ #
3
+ #read in JSON
3
4
  When /^"nmap" is installed$/ do
4
5
  ensure_cli_installed("nmap")
5
6
  end
6
7
 
7
8
  When /^I launch an "nmap" attack with:$/ do |command|
8
9
  run_with_profile command
9
- end
10
+ end
11
+
12
+ When /^I launch a "nmap-(.*?)" attack$/ do |type|
13
+ attack_alias = 'nmap-' + type
14
+ nmap_attack = load_attack_alias(attack_alias)
15
+
16
+ Kernel.puts "Running a #{attack_alias} attack. This attack has this description:\n #{nmap_attack['description']}"
17
+
18
+ run_with_profile nmap_attack['command']
19
+ end
@@ -0,0 +1,30 @@
1
+ require "json"
2
+
3
+ module Gauntlt
4
+ module Support
5
+ module AttackAliasHelper
6
+
7
+ def gauntlt_attack_aliases
8
+ @gauntlt_attack_aliases ||= {}
9
+ end
10
+
11
+ def load_attack_alias(alias_name)
12
+ @attack_steps = import_attack_aliases
13
+ @attack_steps[alias_name] || raise("Unknown attack alias #{alias_name}, try gauntlt --list_attack_aliases")
14
+ end
15
+
16
+ def import_attack_aliases
17
+ @imported_attack_aliases = Hash.new
18
+ attack_aliases_json = Dir.glob(ATTACK_ALIASES_GLOB_PATTERN)
19
+ attack_aliases_json.each do |file|
20
+ @imported_attack_aliases.merge!(JSON.load(File.open(file)))
21
+ end
22
+ @imported_attack_aliases
23
+ end
24
+
25
+ end
26
+ end
27
+ end
28
+
29
+ World(Gauntlt::Support::AttackAliasHelper)
30
+
@@ -0,0 +1,5 @@
1
+ { "dirb-apache-vulns" : { "command" : "dirb --list apache.txt <host>",
2
+ "description" : "This looks for apache defaults which would suggest the server isnt hardened correctly.",
3
+ "requires" : [ "<host>" ]
4
+ }
5
+ }
@@ -0,0 +1,9 @@
1
+ { "nmap-fast" : { "command" : "nmap -F <host>",
2
+ "description" : "This is a fast nmap scan that should run in 10 seconds or less on most networks. It looks for the most common ports and services.",
3
+ "requires" : [ "<host>" ]
4
+ },
5
+ "nmap-single_port" : { "command" : "nmap -p<port> <host>",
6
+ "description" : "This checks a single port only",
7
+ "requires" : [ "<host>", "<port>" ]
8
+ }
9
+ }
@@ -7,19 +7,20 @@ module Gauntlt
7
7
  class NoFilesFound < StandardError; end
8
8
  class ExecutionFailed < StandardError; end
9
9
 
10
- attr_accessor :path, :attack_files, :tags
10
+ attr_accessor :path, :attack_files, :tags, :format
11
11
 
12
- def initialize(path, tags=[])
12
+ def initialize(path, tags=[], format="")
13
13
  self.path = path
14
14
  self.attack_files = self.class.attack_files_for(path)
15
15
  self.tags = tags
16
-
16
+ self.format = format
17
17
  raise NoFilesFound.new("No files found in path: #{path}") if attack_files.empty?
18
18
  end
19
19
 
20
20
  def cuke_cli
21
21
  args = attack_files + ['--strict', '--require', self.class.adapters_dir]
22
22
  args += ['--tags', tags] unless tags.empty?
23
+ args += ['--format', format] unless format.nil?
23
24
 
24
25
  Cucumber::Cli::Main.new(args)
25
26
  end
@@ -1,3 +1,3 @@
1
1
  module Gauntlt
2
- VERSION = "0.1.5"
2
+ VERSION = "1.0.5"
3
3
  end
@@ -5,41 +5,51 @@
5
5
  NMAP=`which nmap`
6
6
  GARMR=`which garmr`
7
7
  DIRB=`which dirb`
8
-
9
- if [ -z $NMAP ]
10
- then
11
- echo "nmap is not installed in your path, try installing it and adding it to your path"
12
- exit
13
- fi
8
+ ERRORS=0
14
9
 
15
10
  if [ -z $SSLYZE_PATH ]
16
11
  then
17
- echo "SSLYZE_PATH environment variable unset, try setting it to ./vendor/sslyze/sslyze.py if you havent updated the submodules we use in gauntlt, run this first: git submodule update --init --recursive"
18
- exit
12
+ MESSAGE="SSLYZE_PATH environment variable unset, try setting it to ./vendor/sslyze/sslyze.py if you havent updated the submodules we use in gauntlt, run this first: git submodule update --init --recursive"
13
+ ERRORS=$ERRORS+1
19
14
  fi
20
15
 
21
16
  if [ -z $SQLMAP_PATH ]
22
17
  then
23
- echo "SQLMAP_PATH environment variable unset, try setting it to ./vendor/sslyze/sqlmap.py if you havent updated the submodules we use in gauntlt, run this first: git submodule update --init --recursive"
24
- exit
18
+ MESSAGE="SQLMAP_PATH environment variable unset, try setting it to ./vendor/sslyze/sqlmap.py if you havent updated the submodules we use in gauntlt, run this first: git submodule update --init --recursive"
19
+ ERRORS=$ERRORS+1
25
20
  fi
26
21
 
27
22
  if [ -z $GARMR ]
28
23
  then
29
- echo "garmr is not installed in your path, try installing it 'cd vendor/Garmr && sudo python setup.py install && cd ../..'"
30
- exit
24
+ MESSAGE="garmr is not installed in your path, try installing it 'cd vendor/Garmr && sudo python setup.py install && cd ../..'"
25
+ ERRORS=$ERRORS+1
31
26
  fi
32
27
 
33
- if [ -z $DIRB ]
28
+ if [ -z $DIRB_WORDLISTS ]
34
29
  then
35
- echo "dirb is not installed in your path, try installing it 'wget http://downloads.sourceforge.net/project/dirb/dirb/2.03/dirb203.tar.gz && tar xvfz dirb203.tar.gz && cd dirb && ./configure && make && cd ..'"
36
- exit
30
+ MESSAGE="DIRB_WORDLISTS environment variable not set, please set it. Usually this is where you extracted dirb in a directory called 'wordlists'"
31
+ ERRORS=$ERRORS+1
37
32
  fi
38
33
 
39
- if [ -z $DIRB_WORDLISTS ]
34
+ if [ -z $DIRB ]
40
35
  then
41
- echo "DIRB_WORDLISTS environment variable not set, please set it. Usually this is where you extracted dirb in a directory called 'wordlists'"
42
- exit
36
+ MESSAGE="dirb is not installed in your path, try installing it 'wget http://downloads.sourceforge.net/project/dirb/dirb/2.03/dirb203.tar.gz && tar xvfz dirb203.tar.gz && cd dirb && ./configure && make && cd ..'"
37
+ ERRORS=$ERRORS+1
43
38
  fi
44
39
 
45
- echo "You are ready to rumble!"
40
+ if [ -z $NMAP ]
41
+ then
42
+ MESSAGE="nmap is not installed in your path, try installing it (brew install nmap OR apt-get install nmap) and adding it to your path"
43
+ ERRORS=$ERRORS+1
44
+ fi
45
+
46
+
47
+
48
+ if [ $ERRORS -gt 0 ]
49
+ then
50
+ echo $MESSAGE
51
+ ERRORS=$ERRORS-1
52
+ echo "$ERRORS more things to fix... keep running ./ready_to_rumble.sh until you ARE."
53
+ else
54
+ echo "You ARE ready to rumble!"
55
+ fi
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gauntlt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
5
- prerelease:
4
+ version: 1.0.5
6
5
  platform: ruby
7
6
  authors:
8
7
  - James Wickett
@@ -10,12 +9,11 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2013-07-25 00:00:00.000000000 Z
12
+ date: 2013-08-07 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: cucumber
17
16
  requirement: !ruby/object:Gem::Requirement
18
- none: false
19
17
  requirements:
20
18
  - - ~>
21
19
  - !ruby/object:Gem::Version
@@ -23,7 +21,6 @@ dependencies:
23
21
  type: :development
24
22
  prerelease: false
25
23
  version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
24
  requirements:
28
25
  - - ~>
29
26
  - !ruby/object:Gem::Version
@@ -31,7 +28,6 @@ dependencies:
31
28
  - !ruby/object:Gem::Dependency
32
29
  name: aruba
33
30
  requirement: !ruby/object:Gem::Requirement
34
- none: false
35
31
  requirements:
36
32
  - - ! '>='
37
33
  - !ruby/object:Gem::Version
@@ -39,7 +35,6 @@ dependencies:
39
35
  type: :development
40
36
  prerelease: false
41
37
  version_requirements: !ruby/object:Gem::Requirement
42
- none: false
43
38
  requirements:
44
39
  - - ! '>='
45
40
  - !ruby/object:Gem::Version
@@ -47,7 +42,6 @@ dependencies:
47
42
  - !ruby/object:Gem::Dependency
48
43
  name: rake
49
44
  requirement: !ruby/object:Gem::Requirement
50
- none: false
51
45
  requirements:
52
46
  - - ! '>='
53
47
  - !ruby/object:Gem::Version
@@ -55,7 +49,6 @@ dependencies:
55
49
  type: :development
56
50
  prerelease: false
57
51
  version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
52
  requirements:
60
53
  - - ! '>='
61
54
  - !ruby/object:Gem::Version
@@ -63,7 +56,6 @@ dependencies:
63
56
  - !ruby/object:Gem::Dependency
64
57
  name: sinatra
65
58
  requirement: !ruby/object:Gem::Requirement
66
- none: false
67
59
  requirements:
68
60
  - - ! '>='
69
61
  - !ruby/object:Gem::Version
@@ -71,7 +63,6 @@ dependencies:
71
63
  type: :development
72
64
  prerelease: false
73
65
  version_requirements: !ruby/object:Gem::Requirement
74
- none: false
75
66
  requirements:
76
67
  - - ! '>='
77
68
  - !ruby/object:Gem::Version
@@ -79,7 +70,6 @@ dependencies:
79
70
  - !ruby/object:Gem::Dependency
80
71
  name: cucumber
81
72
  requirement: !ruby/object:Gem::Requirement
82
- none: false
83
73
  requirements:
84
74
  - - ! '>='
85
75
  - !ruby/object:Gem::Version
@@ -87,7 +77,6 @@ dependencies:
87
77
  type: :runtime
88
78
  prerelease: false
89
79
  version_requirements: !ruby/object:Gem::Requirement
90
- none: false
91
80
  requirements:
92
81
  - - ! '>='
93
82
  - !ruby/object:Gem::Version
@@ -95,7 +84,6 @@ dependencies:
95
84
  - !ruby/object:Gem::Dependency
96
85
  name: aruba
97
86
  requirement: !ruby/object:Gem::Requirement
98
- none: false
99
87
  requirements:
100
88
  - - ! '>='
101
89
  - !ruby/object:Gem::Version
@@ -103,7 +91,6 @@ dependencies:
103
91
  type: :runtime
104
92
  prerelease: false
105
93
  version_requirements: !ruby/object:Gem::Requirement
106
- none: false
107
94
  requirements:
108
95
  - - ! '>='
109
96
  - !ruby/object:Gem::Version
@@ -111,7 +98,6 @@ dependencies:
111
98
  - !ruby/object:Gem::Dependency
112
99
  name: nokogiri
113
100
  requirement: !ruby/object:Gem::Requirement
114
- none: false
115
101
  requirements:
116
102
  - - ~>
117
103
  - !ruby/object:Gem::Version
@@ -119,7 +105,6 @@ dependencies:
119
105
  type: :runtime
120
106
  prerelease: false
121
107
  version_requirements: !ruby/object:Gem::Requirement
122
- none: false
123
108
  requirements:
124
109
  - - ~>
125
110
  - !ruby/object:Gem::Version
@@ -127,7 +112,6 @@ dependencies:
127
112
  - !ruby/object:Gem::Dependency
128
113
  name: trollop
129
114
  requirement: !ruby/object:Gem::Requirement
130
- none: false
131
115
  requirements:
132
116
  - - ! '>='
133
117
  - !ruby/object:Gem::Version
@@ -135,7 +119,6 @@ dependencies:
135
119
  type: :runtime
136
120
  prerelease: false
137
121
  version_requirements: !ruby/object:Gem::Requirement
138
- none: false
139
122
  requirements:
140
123
  - - ! '>='
141
124
  - !ruby/object:Gem::Version
@@ -205,12 +188,15 @@ files:
205
188
  - lib/gauntlt/attack_adapters/nmap.rb
206
189
  - lib/gauntlt/attack_adapters/sqlmap.rb
207
190
  - lib/gauntlt/attack_adapters/sslyze.rb
191
+ - lib/gauntlt/attack_adapters/support/attack_step_helper.rb
208
192
  - lib/gauntlt/attack_adapters/support/cli_helper.rb
209
193
  - lib/gauntlt/attack_adapters/support/cookie_helper.rb
210
194
  - lib/gauntlt/attack_adapters/support/nmap_helper.rb
211
195
  - lib/gauntlt/attack_adapters/support/profile_helper.rb
212
196
  - lib/gauntlt/attack_adapters/support/python_script_helper.rb
213
197
  - lib/gauntlt/attack_adapters/support/xml_helper.rb
198
+ - lib/gauntlt/attack_aliases/dirb.json
199
+ - lib/gauntlt/attack_aliases/nmap.json
214
200
  - lib/gauntlt/runtime.rb
215
201
  - lib/gauntlt/stepdef.rb
216
202
  - lib/gauntlt/version.rb
@@ -221,31 +207,29 @@ files:
221
207
  - test/gauntlt_test.rb
222
208
  - test/test_helper.rb
223
209
  - test/tmf.rb
224
- - vendor/dirb203.tar.gz
225
210
  - vendor/sslyze_output.README
226
211
  homepage: https://github.com/gauntlt/gauntlt
227
212
  licenses: []
213
+ metadata: {}
228
214
  post_install_message:
229
215
  rdoc_options: []
230
216
  require_paths:
231
217
  - lib
232
218
  required_ruby_version: !ruby/object:Gem::Requirement
233
- none: false
234
219
  requirements:
235
220
  - - ! '>='
236
221
  - !ruby/object:Gem::Version
237
222
  version: '0'
238
223
  required_rubygems_version: !ruby/object:Gem::Requirement
239
- none: false
240
224
  requirements:
241
225
  - - ! '>='
242
226
  - !ruby/object:Gem::Version
243
227
  version: '0'
244
228
  requirements: []
245
229
  rubyforge_project:
246
- rubygems_version: 1.8.25
230
+ rubygems_version: 2.0.5
247
231
  signing_key:
248
- specification_version: 3
232
+ specification_version: 4
249
233
  summary: behaviour-driven security using cucumber
250
234
  test_files:
251
235
  - features/attack.feature
Binary file