thieve 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: '094636f7b335bf92cec3926a8e5f6bf21d8a4543'
4
- data.tar.gz: 0b5cb2263bdabc7684dffc68d7d85cc7022ca1d6
3
+ metadata.gz: c3ce17721ffd5395450d38f1aaa0bdf0859c0a23
4
+ data.tar.gz: 77079a0a8f8dad30201d31016b4eb9f0e3a1f35d
5
5
  SHA512:
6
- metadata.gz: f4606fa31e50eae55fa8dac6dfaff58541529a7b03f4e41491e199515f770bfb2d07a7affcc44083d96ba95c455285db1394406b658af68ca6d4030133a542f2
7
- data.tar.gz: 3f89f76ffe014825ab1b59ee19343833fd7512092592fa22fa46912986ce0f0e7100b234e1b0305eb71e640432de3b32723a9e2e5df4e7bd9aebaab81a1a83eb
6
+ metadata.gz: d6e6f0ff52ff6b598d951448492f66e9570ff3d9e412c6c6d5bf6fe88250f6c77a23a074c2c0ac51da640c26d546c2dce35f48bc0155454b440908bf84f4c5ac
7
+ data.tar.gz: 977c35f9138c99eb9bf8704dfef8f9f0f695549f4e327423f0dac5efb1520d2546b603056c734ba792c9311eb2d68c69ee27b2107b91f2ae373e3acb88e93018
data/bin/thieve CHANGED
@@ -19,6 +19,7 @@ def parse(args)
19
19
  options = Hash.new
20
20
  options["export"] = nil
21
21
  options["ignore"] = Array.new
22
+ options["private"] = false
22
23
  options["verbose"] = false
23
24
 
24
25
  info = "Searches through provided directories, looking for " \
@@ -53,16 +54,31 @@ def parse(args)
53
54
 
54
55
  opts.on(
55
56
  "-i",
56
- "--ignore=PATTERN",
57
- "Ignore dirs/files matching PATTERN"
58
- ) do |pattern|
59
- options["ignore"].push(pattern)
57
+ "--ignore=REGEX",
58
+ "Ignore dirs/files matching REGEX"
59
+ ) do |regex|
60
+ options["ignore"].push(regex)
60
61
  end
61
62
 
62
63
  opts.on("--nocolor", "Disable colorized output") do
63
64
  Hilighter.disable
64
65
  end
65
66
 
67
+ opts.on(
68
+ "-p",
69
+ "--private-only",
70
+ "Only export/show private keys and matching certificates"
71
+ ) do
72
+ options["private"] = true
73
+ end
74
+
75
+ opts.on("--version", "Show version") do
76
+ __FILE__.match(/thieve-(\d+\.\d+\.\d+)/) do |m|
77
+ puts m[1]
78
+ end
79
+ exit ThieveExit::GOOD
80
+ end
81
+
66
82
  opts.on(
67
83
  "-v",
68
84
  "--verbose",
@@ -111,6 +127,8 @@ begin
111
127
  end
112
128
  thieve.find_matches
113
129
 
130
+ thieve.only_private(options["private"])
131
+
114
132
  export_thread = nil
115
133
  if (options["export"])
116
134
  export_thread = Thread.new do
@@ -89,7 +89,9 @@ class Thieve::KeyInfo
89
89
  when "PKCS12"
90
90
  @openssl = OpenSSL::PKCS12.new(@key)
91
91
  when "PRIVATE KEY", "PUBLIC KEY", "RSA PRIVATE KEY"
92
- @openssl = OpenSSL::PKey::RSA.new(@key)
92
+ if (!@key.match(/ENCRYPTED/))
93
+ @openssl = OpenSSL::PKey::RSA.new(@key)
94
+ end
93
95
  when "X509 CRL"
94
96
  @openssl = OpenSSL::X509::CRL.new(@key)
95
97
  else
data/lib/thieve.rb CHANGED
@@ -25,13 +25,19 @@ class Thieve
25
25
  end
26
26
  private :display_exception
27
27
 
28
- def export_loot(dir)
28
+ def export_loot(dir, priv_only = @private)
29
29
  exported = Hash.new
30
30
  @loot.each do |type, keys|
31
+ next if (priv_only && !type.match(/CERTIFICATE|PRIVATE/))
32
+
31
33
  keys.each do |key|
34
+ if (priv_only && type.match(/CERTIFICATE/))
35
+ next if (key.match.nil?)
36
+ end
37
+
32
38
  key.export(dir)
33
- exported[key.type] ||= Hash.new
34
- exported[key.type]["#{key.fingerprint}.#{key.ext}"] =
39
+ exported[type] ||= Hash.new
40
+ exported[type]["#{key.fingerprint}.#{key.ext}"] =
35
41
  key.to_json
36
42
  end
37
43
  end
@@ -43,17 +49,32 @@ class Thieve
43
49
  end
44
50
 
45
51
  def extract_from(file)
46
- start = false
52
+ footer = ""
53
+ headers = Array.new
47
54
  key = ""
55
+ start = false
48
56
 
49
57
  File.open(file).each do |line|
50
58
  if (line.include?("-----BEGIN"))
51
- start = true
59
+ footer = ""
60
+ headers.clear
52
61
  key = ""
62
+ start = true
53
63
  end
54
64
 
55
- # Don't include newlines for now
56
- key += line.unpack("C*").pack("U*").strip if (start)
65
+ if (start)
66
+ # Don't include newlines for now
67
+ line = line.unpack("C*").pack("U*").strip
68
+
69
+ case line
70
+ when /^=[^=]+$/
71
+ footer = line
72
+ when /^.+:.+$/
73
+ headers.push(line)
74
+ else
75
+ key += line
76
+ end
77
+ end
57
78
 
58
79
  if (line.include?("-----END"))
59
80
  # Remove " + " or ' + '
@@ -84,7 +105,20 @@ class Thieve
84
105
  keydata = k.scan(/.{,64}/).keep_if do |l|
85
106
  !l.empty?
86
107
  end
108
+
109
+ # Prepend headers
110
+ if (headers.any?)
111
+ keydata.insert(0, "")
112
+ keydata.insert(0, headers.join("\n"))
113
+ end
114
+
115
+ # Append footer
116
+ keydata.push(footer) if (!footer.empty?)
117
+
118
+ # Prepend BEGIN
87
119
  keydata.insert(0, "-----BEGIN #{type}-----")
120
+
121
+ # Append END
88
122
  keydata.push("-----END #{type}-----")
89
123
 
90
124
  begin
@@ -149,6 +183,11 @@ class Thieve
149
183
 
150
184
  @@hilight = hilight
151
185
  @loot = Hash.new
186
+ @private = false
187
+ end
188
+
189
+ def only_private(priv)
190
+ @private = priv
152
191
  end
153
192
 
154
193
  def steal_from(filename, ignores = Array.new)
@@ -179,11 +218,17 @@ class Thieve
179
218
  return @loot
180
219
  end
181
220
 
182
- def summarize_loot
221
+ def summarize_loot(priv_only = @private)
183
222
  ret = Array.new
184
223
  @loot.each do |type, keys|
224
+ next if (priv_only && !type.match(/CERTIFICATE|PRIVATE/))
225
+
185
226
  ret.push(hilight_type(type))
186
227
  keys.each do |key|
228
+ if (priv_only && type.match(/CERTIFICATE/))
229
+ next if (key.match.nil?)
230
+ end
231
+
187
232
  ret.push("#{key.to_s}\n")
188
233
  end
189
234
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thieve
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miles Whittaker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-14 00:00:00.000000000 Z
11
+ date: 2017-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -103,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
103
103
  version: '0'
104
104
  requirements: []
105
105
  rubyforge_project:
106
- rubygems_version: 2.6.8
106
+ rubygems_version: 2.6.11
107
107
  signing_key:
108
108
  specification_version: 4
109
109
  summary: Steal keys/certs