thieve 0.2.2 → 0.2.3

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.
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