violent_ruby 1.0.4 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b1dafdff77f5875eee8bd1629af9b805a0a8c24d
4
- data.tar.gz: c04e039813841ff1856a7cdc8d83db41794bfe6f
3
+ metadata.gz: 33a58cf1850ba7c2fe34a78184003df715f38d6e
4
+ data.tar.gz: '09cdc0184b90dd093962ce68fe70ee7dd25fdb11'
5
5
  SHA512:
6
- metadata.gz: cd49eeea77a3493608bf8ee9ad61d87c39f4c81406e411d5403f1506776d3c6474490df36731913c32b00adba9aa1f3b70ecd2d3e723c5b57391a7ef9029e0fd
7
- data.tar.gz: c170107b1ba0be86d23dedad1e16086711610d0382bdd59f6c020252479ddfc63032c7ad1ffd6dc7917e15872f7a3869958c1b60b198cfb1563a1dd63cd81a1b
6
+ metadata.gz: 96e247c8c71dab2d7db255fd1c33c4f3e15c1e8059c1ea5d18d6b40a55d2667d2cf37aa3e489d0774af4c3f01742f8dc948b223cea650c42b65dff6b86d8464c
7
+ data.tar.gz: df39fec11d77efe459c475cfb85552c2808c6055933a64ce448cdc67f187896067e7c23d102c7ecf8b4fc7f56336465c4fa933c4cd76278d95657e4a356f9e0e
@@ -3,55 +3,77 @@ module ViolentRuby
3
3
  # crack unix passwords. Because all hackers totes do this.
4
4
  # @author Kent 'picat' Gruber
5
5
  #
6
- # == Create a new Unix Password Cracker
7
- # In order for the password cracker to work, we're going to need a +dictionary+,
8
- # and an /etc/passwd +file+ we want to crack.
9
- #
10
6
  # @example Basic Usage
11
- # config = { file: "/etc/passwd", dictionry: "dictionary.txt" }
7
+ # config = { file: "/etc/passwd", dictionary: "dictionary.txt" }
8
+ #
12
9
  # upc = ViolentRuby::UnixPasswordCracker.new(config)
13
- # upc.crack!
10
+ #
11
+ # upc.crack do |result|
12
+ # next unless result[:cracked]
13
+ # puts "Cracked #{result[:username]}'s password: #{result[:plaintext_password]}"
14
+ # end
15
+ #
14
16
  class UnixPasswordCracker
15
- # @attr [String] file Path to /etc/passwd file.
17
+ # @!attribute file
18
+ # @return [String] Path to the /etc/passwd file.
16
19
  attr_accessor :file
17
- # @attr [String] dictionary Path to dictionary file.
20
+
21
+ # @!attribute dictionary
22
+ # @return [String] Path to dictionary file.
18
23
  attr_accessor :dictionary
19
24
 
25
+ alias etc file
26
+
20
27
  # Create a new Unix Password Cracker.
28
+ #
29
+ # @param args [Hash] The options to create a new Unix Password Cracker.
30
+ # @option args [String] :file The path to an /etc/passwd file.
31
+ # @option args [String] :dictionary The path to a dictionry of passwords.
21
32
  #
22
- # @param [Hash] args The options to create a new Unix Password Cracker.
23
- # @param args [String] :file The path to an /etc/passwd file.
24
- # @param args [String] :dictionary The path to a dictionry of passwords.
33
+ # @return [UnixPasswordCracker]
25
34
  def initialize(args = {})
26
- @file = false
27
- @dictionary = false
28
- if args[:file] && File.readable?(args[:file])
29
- @file = args[:file]
30
- @credentials = parse_etc_file(file: args[:file])
31
- end
32
- return unless args[:dictionary]
33
- return unless File.readable?(args[:dictionary])
34
- @dictionary = args[:dictionary]
35
+ @file = args[:file] if args[:file]
36
+ @dictionary = args[:dictionary] if args[:dictionary]
35
37
  end
36
38
 
37
39
  # Parse a unix /etc/passwd file into a more mangeable form.
38
40
  #
39
- # @param [Hash] args The options when parsing the file.
40
- # @param args [String] :file The path to an /etc/passwd file.
41
- # @param args [Boolean] :users Specify that only users should be returned ( default: +false+ ).
42
- # @param args [Boolean] :passwords Specify that only passwords should be returned ( default: +false+ ).
41
+ # @example Basic Usage
42
+ # upc = ViolentRuby::UnixPasswordCracker.new
43
+ # upc.parse_etc_file(file: 'passwords.txt')
44
+ # # {"victim" => "HX9LLTdc/jiDE", "root" => "DFNFxgW7C05fo"}
45
+ #
46
+ # @example Super Advanced Usage
47
+ # ViolentRuby::UnixPasswordCracker.new.parse_etc_file(file: 'passwords.txt') do |user, pass|
48
+ # puts user + ' ' + pass
49
+ # end
50
+ # # victim HX9LLTdc/jiDE
51
+ # # root DFNFxgW7C05fo
52
+ #
53
+ # @param args [Hash] The options when parsing the file.
54
+ # @option args [String] :file The path to an /etc/passwd file.
55
+ # @option args [Boolean] :users Specify that only users should be returned ( default: +false+ ).
56
+ # @option args [Boolean] :passwords Specify that only passwords should be returned ( default: +false+ ).
57
+ #
43
58
  # @return [Hash]
44
59
  def parse_etc_file(args = {})
45
- raise 'No /etc/passwd file given.' unless args[:file]
46
- raise "File #{args[:file]} not readable!" unless File.readable?(args[:file])
60
+ # Readlines from /etc/passwd file.
47
61
  lines = File.readlines(args[:file]).collect do |line|
48
62
  line unless line.split(':').first.chars.first.include?('#')
49
63
  end
50
- users = lines.collect { |x| x.split(':')[0] }.map(&:strip)
51
- return users if args[:users]
64
+
65
+ # Collect the users and passwords from the lines.
66
+ users = lines.collect { |x| x.split(':')[0] }.map(&:strip)
52
67
  passwords = lines.collect { |x| x.split(':')[1] }.map(&:strip)
68
+
69
+ # Friendly behavior to return just users or passwords.
70
+ return users if args[:users]
53
71
  return passwords if args[:passwords]
72
+
73
+ # Zip'm together into a hash.
54
74
  users_passwords = Hash[users.zip(passwords)]
75
+
76
+ # Yield each pair when a block is given, or return all at once.
55
77
  if block_given?
56
78
  users_passwords.each do |user, password|
57
79
  yield user, password
@@ -62,22 +84,35 @@ module ViolentRuby
62
84
  end
63
85
 
64
86
  # Crack unix passwords.
87
+ #
88
+ # @example Basic Usage
89
+ # ViolentRuby::UnixPasswordCracker.new(file: "passwords.txt", dictionary: "dictionary.txt").crack_passwords do |result|
90
+ # next unless result[:cracked]
91
+ # puts "Cracked #{result[:username]}'s password: #{result[:plaintext_password]}"
92
+ # end
65
93
  #
66
- # @param [Hash] args The options when crack'n some passwords.
67
- # @param args [String] :file The path to an /etc/passwd file.
68
- # @param args [String] :dictionary The path to a dictionry of passwords.
69
- # @return [Array<Hash>]
94
+ # @param args [Hash] The options when crack'n some passwords.
95
+ # @option args [String] :file The path to an /etc/passwd file.
96
+ # @option args [String] :dictionary The path to a dictionry of passwords.
97
+ #
98
+ # @yield [Hash]
70
99
  def crack_passwords(args = {})
100
+ # Use the file and dictionry instance variables or the arguments.
71
101
  file = args[:file] || @file
72
102
  dict = args[:dictionary] || @dictionary
73
- results = []
103
+ # Parse the given /etc/passwd file and compare with the dictionary.
74
104
  parse_etc_file(file: file) do |user, password|
75
105
  File.readlines(dict).map(&:strip).each do |word|
76
- results << format_result(user, password, word) if cracked?(password, word)
106
+ if cracked?(password, word)
107
+ yield format_result(user, password, word)
108
+ else
109
+ yield format_result(user, password)
110
+ end
77
111
  end
78
112
  end
79
- results
80
113
  end
114
+
115
+ alias crack crack_passwords
81
116
 
82
117
  alias crack! crack_passwords
83
118
 
@@ -88,11 +123,25 @@ module ViolentRuby
88
123
  # Check if a given encrypted password matches a given plaintext
89
124
  # word when the same crytographic operation is performed on it.
90
125
  #
91
- # @param [String] encrypted_password The encrypted password to check against.
92
- # @param [String] word The plaintext password to check against.
126
+ # @example Basic Usage
127
+ # ViolentRuby::UnixPasswordCracker.new.check_password('HX9LLTdc/jiDE', 'egg')
128
+ # # true
129
+ #
130
+ # @example Advanced Usage
131
+ # ViolentRuby::UnixPasswordCracker.new.check_password('HXA82SzTqypHA', 'egg ')
132
+ # # false
133
+ #
134
+ # ViolentRuby::UnixPasswordCracker.new.check_password('HXA82SzTqypHA', 'egg ', false)
135
+ # # true
136
+ #
137
+ # @param encrypted_password [String] The encrypted password to check against.
138
+ # @param plaintext_password [String] The plaintext password to check against.
139
+ # @param strip [Boolean] Strip trailing spaces and newlines from word ( default: +true+ )
140
+ #
93
141
  # @return [Boolean]
94
- def check_password(encrypted_password, word)
95
- if word.strip.crypt(encrypted_password[0, 2]) == encrypted_password
142
+ def check_password(encrypted_password, plaintext_password, strip = true)
143
+ plaintext_password.strip! if strip # sometimes passwords have trailing spaces
144
+ if plaintext_password.crypt(encrypted_password[0, 2]) == encrypted_password
96
145
  true
97
146
  else
98
147
  false
@@ -106,12 +155,22 @@ module ViolentRuby
106
155
  # @api private
107
156
  # Format the results for the password crack'n.
108
157
  #
109
- # @param [String] user
110
- # @param [String] encrypted_pass
111
- # @param [String] plaintext_pass
158
+ # @param user [String]
159
+ # @param encrypted_pass [String]
160
+ # @param plaintext_pass [String]
161
+ #
112
162
  # @return [Hash]
113
- def format_result(user, encrypted_pass, plaintext_pass)
114
- { username: user, encrypted_password: encrypted_pass, plaintext_password: plaintext_pass }
163
+ def format_result(user, encrypted_pass, plaintext_pass = false)
164
+ result = {}
165
+ if plaintext_pass
166
+ result[:cracked] = true
167
+ else
168
+ result[:cracked] = false
169
+ end
170
+ result[:username] = user
171
+ result[:encrypted_password] = encrypted_pass
172
+ result[:plaintext_password] = plaintext_pass if plaintext_pass
173
+ result
115
174
  end
116
175
  end
117
176
  end
@@ -1,3 +1,3 @@
1
1
  module ViolentRuby
2
- VERSION = "1.0.4"
2
+ VERSION = "1.0.5"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: violent_ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kent Gruber
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-14 00:00:00.000000000 Z
11
+ date: 2017-04-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: net-ssh