thieve 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/thieve/key_info.rb +20 -58
- data/lib/thieve.rb +26 -14
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 511125d4e5f3e0e7c7eba6d5c230bcccb56ff5ee
|
4
|
+
data.tar.gz: 187842c83f24c7028a58879a695d008b736c8f89
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5236f38898f9a7ae1485c369f58bd7f55896e840383b9f3dfcc434e17057d43d7918f06ae7d861f6b4564869396fd823b48eb112d64423bdd56f958c6dbd38d1
|
7
|
+
data.tar.gz: c501c33a33a591b172909e217f5de7e0f0fcbe2c8f765aeab967930652eb885b3d48373ffebf788a2c54b159b6da9d9410891fd308bd5956f49ceda5ba1b0d02
|
data/lib/thieve/key_info.rb
CHANGED
@@ -57,87 +57,49 @@ class Thieve::KeyInfo
|
|
57
57
|
@file = file
|
58
58
|
@key = key
|
59
59
|
@match = nil
|
60
|
+
@openssl = nil
|
60
61
|
@type = type
|
61
62
|
|
62
63
|
case @type
|
63
64
|
when "CERTIFICATE"
|
64
65
|
@openssl = OpenSSL::X509::Certificate.new(@key)
|
65
|
-
|
66
|
-
@openssl.to_der
|
67
|
-
).to_s
|
68
|
-
when "CERTIFICATE REQUEST"
|
66
|
+
when /^(NEW )?CERTIFICATE REQUEST$/
|
69
67
|
@openssl = OpenSSL::X509::Request.new(@key)
|
70
|
-
|
71
|
-
@openssl.to_der
|
72
|
-
).to_s
|
73
|
-
when "DH PARAMETERS"
|
68
|
+
when "DH PARAMETERS", "DH PRIVATE KEY"
|
74
69
|
@openssl = OpenSSL::PKey::DH.new(@key)
|
75
|
-
@fingerprint = OpenSSL::Digest::SHA1.hexdigest(
|
76
|
-
@openssl.public_key.to_der
|
77
|
-
).to_s
|
78
|
-
when "DH PRIVATE KEY"
|
79
|
-
@openssl = OpenSSL::PKey::DH.new(@key)
|
80
|
-
@fingerprint = OpenSSL::Digest::SHA1.hexdigest(
|
81
|
-
@openssl.public_key.to_der
|
82
|
-
).to_s
|
83
70
|
when "DSA PRIVATE KEY"
|
84
71
|
@openssl = OpenSSL::PKey::DSA.new(@key)
|
85
|
-
|
86
|
-
@openssl.public_key.to_der
|
87
|
-
).to_s
|
88
|
-
when "EC PARAMETERS"
|
72
|
+
when "EC PARAMETERS", "EC PRIVATE KEY"
|
89
73
|
@openssl = OpenSSL::PKey::EC.new(@key)
|
90
|
-
|
91
|
-
@openssl.public_key.to_der
|
92
|
-
).to_s
|
93
|
-
when "EC PRIVATE KEY"
|
94
|
-
@openssl = OpenSSL::PKey::EC.new(@key)
|
95
|
-
@fingerprint = OpenSSL::Digest::SHA1.hexdigest(
|
96
|
-
@openssl.public_key.to_der
|
97
|
-
).to_s
|
98
|
-
when "PGP PRIVATE KEY BLOCK"
|
74
|
+
when /^PGP (PRIVATE|PUBLIC) KEY BLOCK$/
|
99
75
|
command = "gpg --with-fingerprint << EOF\n#{@key}\nEOF"
|
100
76
|
%x(#{command}).each_line do |line|
|
101
77
|
line.match(/Key fingerprint = (.*)/) do |m|
|
102
78
|
@fingerprint = m[1].gsub(" ", "").downcase
|
103
79
|
end
|
104
80
|
end
|
105
|
-
|
106
|
-
when "PGP PUBLIC KEY BLOCK"
|
107
|
-
command = "gpg --with-fingerprint << EOF\n#{@key}\nEOF"
|
108
|
-
%x(#{command}).each_line do |line|
|
109
|
-
line.match(/Key fingerprint = (.*)/) do |m|
|
110
|
-
@fingerprint = m[1].gsub(" ", "").downcase
|
111
|
-
end
|
112
|
-
end
|
113
|
-
@openssl = nil
|
114
|
-
when "PGP SIGNATURE"
|
81
|
+
#when "PGP SIGNATURE"
|
115
82
|
# Not really sure what to do with this
|
116
|
-
|
117
|
-
|
118
|
-
when "
|
119
|
-
@openssl = OpenSSL::
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
@fingerprint = OpenSSL::Digest::SHA1.hexdigest(
|
126
|
-
@openssl.public_key.to_der
|
127
|
-
).to_s
|
128
|
-
when "RSA PRIVATE KEY"
|
83
|
+
# TODO
|
84
|
+
#@fingerprint = Digest::SHA256.hexdigest(@file.to_s + @key)
|
85
|
+
when "PKCS5"
|
86
|
+
@openssl = OpenSSL::PKCS5.new(@key)
|
87
|
+
when "PKCS7"
|
88
|
+
@openssl = OpenSSL::PKCS7.new(@key)
|
89
|
+
when "PKCS12"
|
90
|
+
@openssl = OpenSSL::PKCS12.new(@key)
|
91
|
+
when "PRIVATE KEY", "PUBLIC KEY", "RSA PRIVATE KEY"
|
129
92
|
@openssl = OpenSSL::PKey::RSA.new(@key)
|
130
|
-
@fingerprint = OpenSSL::Digest::SHA1.hexdigest(
|
131
|
-
@openssl.public_key.to_der
|
132
|
-
).to_s
|
133
93
|
when "X509 CRL"
|
134
94
|
@openssl = OpenSSL::X509::CRL.new(@key)
|
95
|
+
else
|
96
|
+
@fingerprint = Digest::SHA256.hexdigest(@file.to_s + @key)
|
97
|
+
end
|
98
|
+
|
99
|
+
if (@openssl)
|
135
100
|
@fingerprint = OpenSSL::Digest::SHA1.new(
|
136
101
|
@openssl.to_der
|
137
102
|
).to_s
|
138
|
-
else
|
139
|
-
@fingerprint = Digest::SHA256.hexdigest(@file.to_s + @key)
|
140
|
-
@openssl = nil
|
141
103
|
end
|
142
104
|
end
|
143
105
|
|
data/lib/thieve.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require "base64"
|
1
2
|
require "fileutils"
|
2
3
|
require "hilighter"
|
3
4
|
require "io/wait"
|
@@ -8,6 +9,22 @@ require "scoobydoo"
|
|
8
9
|
class Thieve
|
9
10
|
attr_accessor :loot
|
10
11
|
|
12
|
+
def display_exception(e, file, keydata)
|
13
|
+
if (@@hilight)
|
14
|
+
$stderr.puts file.to_s.light_blue
|
15
|
+
keydata.each do |l|
|
16
|
+
$stderr.puts l.light_yellow
|
17
|
+
end
|
18
|
+
$stderr.puts e.message.white.on_red
|
19
|
+
else
|
20
|
+
$stderr.puts file
|
21
|
+
$stderr.puts keydata.join("\n")
|
22
|
+
$stderr.puts e.message
|
23
|
+
end
|
24
|
+
$stderr.puts
|
25
|
+
end
|
26
|
+
private :display_exception
|
27
|
+
|
11
28
|
def export_loot(dir)
|
12
29
|
exported = Hash.new
|
13
30
|
@loot.each do |type, keys|
|
@@ -37,7 +54,7 @@ class Thieve
|
|
37
54
|
|
38
55
|
if (line.include?("END"))
|
39
56
|
# Remove " + " or ' + '
|
40
|
-
key.gsub!(%r{["'] *\+ *["']}, "")
|
57
|
+
key.gsub!(%r{["'] *\+ *["']?|["']? *\+ *["']}, "")
|
41
58
|
|
42
59
|
# Remove bad characters
|
43
60
|
key.gsub!(%r{[^-A-Za-z0-9+/= ]+}, "")
|
@@ -54,6 +71,9 @@ class Thieve
|
|
54
71
|
|
55
72
|
# Scan for valid key
|
56
73
|
key.scan(%r{#{key_regex}}) do |m, type, k|
|
74
|
+
# Ignore breakpad microdumps
|
75
|
+
next if (type.match(/BREAKPAD MICRODUMP/))
|
76
|
+
|
57
77
|
# Remove spaces from key
|
58
78
|
k.gsub!(/ +/, "")
|
59
79
|
|
@@ -64,8 +84,11 @@ class Thieve
|
|
64
84
|
keydata.insert(0, "-----BEGIN #{type}-----")
|
65
85
|
keydata.push("-----END #{type}-----")
|
66
86
|
|
67
|
-
@loot[type] ||= Array.new
|
68
87
|
begin
|
88
|
+
# Ensure key is base64 data
|
89
|
+
Base64.strict_decode64(k)
|
90
|
+
|
91
|
+
@loot[type] ||= Array.new
|
69
92
|
@loot[type].push(
|
70
93
|
Thieve::KeyInfo.new(
|
71
94
|
file,
|
@@ -74,18 +97,7 @@ class Thieve
|
|
74
97
|
)
|
75
98
|
)
|
76
99
|
rescue Exception => e
|
77
|
-
|
78
|
-
$stderr.puts file.to_s.light_blue
|
79
|
-
keydata.each do |l|
|
80
|
-
$stderr.puts l.light_yellow
|
81
|
-
end
|
82
|
-
$stderr.puts e.message.white.on_red
|
83
|
-
else
|
84
|
-
$stderr.puts file
|
85
|
-
$stderr.puts keydata.join("\n")
|
86
|
-
$stderr.puts e.message
|
87
|
-
end
|
88
|
-
$stderr.puts
|
100
|
+
display_exception(e, file, keydata)
|
89
101
|
end
|
90
102
|
end
|
91
103
|
|
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.
|
4
|
+
version: 0.2.1
|
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-
|
11
|
+
date: 2017-04-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|