diff --git a/core/main/crypto.rb b/core/main/crypto.rb index eda268f48..3700fe84e 100644 --- a/core/main/crypto.rb +++ b/core/main/crypto.rb @@ -39,6 +39,23 @@ module Core config.set('beef.api_token', token) token end + + # Generates a unique identifier for DNS rules. + # + # @return [String] 8-character hex identifier + def self.dns_rule_id + id = nil + length = 4 + + begin + id = OpenSSL::Random.random_bytes(length).unpack('H*')[0] + BeEF::Core::Models::Dns::Rule.each { |rule| throw StandardError if id == rule.id } + rescue StandardError + retry + end + + id.to_s + end end end diff --git a/extensions/dns/model.rb b/extensions/dns/model.rb index 062699bdf..f4b9aef98 100644 --- a/extensions/dns/model.rb +++ b/extensions/dns/model.rb @@ -23,7 +23,7 @@ module BeEF # Hooks the model's "save" event. Generates a rule identifier and callback. before :save do |rule| rule.callback = validate_response(rule.resource, rule.response) - rule.id = generate_id + rule.id = BeEF::Core::Crypto.dns_rule_id end private @@ -37,13 +37,6 @@ module BeEF "t.respond!('1.1.1.1')" end - # Generates a unique identifier for use as a primary key. - # - # @return [String] 8-character hex identifier - def generate_id - '42' - end - end end