@@ -67,54 +67,42 @@ def run
67
67
68
68
return if q . nil? || q [ :results ] . empty?
69
69
70
- wordlist = { }
70
+ @words_dict = { }
71
71
q [ :results ] . each do |result |
72
72
result . each do |field |
73
- next unless field . present?
74
- next if field =~ /^\s *$/ or field == '-' or field == '' or field . length < 3
75
-
76
- field . gsub! ( /[\( \) \" ]/ , '' ) # clear up common punctuation in descriptions
77
- field . downcase! # clear up case
78
-
79
- tmp = [ ]
80
- parts = field . split ( /\s +/ )
81
- tmp = tmp + parts + [ parts . join ] unless parts . empty?
82
- parts = field . split ( '-' )
83
- tmp = tmp + parts + [ parts . join ] unless parts . empty?
84
- parts = field . split ( ',' )
85
- tmp = tmp + parts + [ parts . join ] unless parts . empty?
86
- parts = field . split ( '+' )
87
- tmp = tmp + parts + [ parts . join ] unless parts . empty?
88
-
89
- # add the entire field if its not too long
90
- wordlist [ field ] += 1 if field . length < 24
91
-
92
- if tmp . length > 0
93
- tmp = tmp . flatten
94
- tmp . each do |r |
95
- next if r . length < 3 or r . length > 24
96
- # sub fields can still have unwanted characters due to not chained if (ie, it has dashes and commas)
97
- r . gsub! ( /[\s \, \- \+ ]/ , '' )
98
- wordlist [ r ] += 1 if r . length < 24
99
- end
100
- end
73
+ search_words ( field )
101
74
end # result.each
102
75
end # q.each
103
76
104
77
# build array of words to output sorted on frequency
105
- out = [ ]
106
- s = wordlist . sort_by &:last
107
- s . each do |k , v |
108
- if ( k . length > 3 )
109
- out . push ( k )
110
- # print_status("#{k} ==> #{v}")
111
- end
112
- end
78
+ output = [ ]
79
+ ordered_dict = @words_dict . sort_by { |k , v | v } . reverse
80
+ ordered_dict . collect! { |k , v | k }
81
+
113
82
wordlist_file = Rex ::Quickfile . new ( "wordlist" )
114
- wordlist_file . write ( out . flatten . uniq . join ( "\n " ) + "\n " )
115
- print_status ( "Seeded the password database with #{ out . length } words into #{ wordlist_file . path } ..." )
83
+ wordlist_file . write ( ordered_dict . join ( "\n " ) + "\n " )
84
+ print_status ( "Seeded the password database with #{ output . length } words into #{ wordlist_file . path } ..." )
116
85
wordlist_file . close
86
+ end
87
+
88
+ def search_words ( field )
89
+ return if field . blank?
90
+ return if field =~ /^\s *$/ || field . length < 3
117
91
92
+ field . gsub! ( /[\( \) \" ]/ , '' ) # clear up common punctuation in descriptions
93
+ field . downcase! # clear up case
94
+
95
+ words = field . split ( /\s +|=|\/ |,|\+ / )
96
+ return if words . empty?
97
+
98
+ words . each do |word |
99
+ next if word . length < 3 || word . length > 24
100
+ if @words_dict [ word ]
101
+ @words_dict [ word ] += 1
102
+ else
103
+ @words_dict [ word ] = 1
104
+ end
105
+ end
118
106
end
119
107
end
120
108
0 commit comments