From da261da0159bfd008ca3db0f2f194c65d35d7e04 Mon Sep 17 00:00:00 2001 From: bcoles Date: Thu, 15 May 2025 20:38:04 +1000 Subject: [PATCH] modules/auxiliary/sniffer: Resolve RuboCop violations --- modules/auxiliary/sniffer/psnuffle.rb | 94 ++++++++++++++------------- 1 file changed, 50 insertions(+), 44 deletions(-) diff --git a/modules/auxiliary/sniffer/psnuffle.rb b/modules/auxiliary/sniffer/psnuffle.rb index bf627a7b92..6dd3274c32 100644 --- a/modules/auxiliary/sniffer/psnuffle.rb +++ b/modules/auxiliary/sniffer/psnuffle.rb @@ -17,38 +17,43 @@ class MetasploitModule < Msf::Auxiliary def initialize super( - 'Name' => 'pSnuffle Packet Sniffer', - 'Description' => 'This module sniffs passwords like dsniff did in the past', - 'Author' => 'Max Moser ', - 'License' => MSF_LICENSE, - 'Actions' => - [ - [ 'Sniffer', 'Description' => 'Run sniffer' ], - [ 'List', 'Description' => 'List protocols' ] - ], + 'Name' => 'pSnuffle Packet Sniffer', + 'Description' => 'This module sniffs passwords like dsniff did in the past.', + 'Author' => 'Max Moser ', + 'License' => MSF_LICENSE, + 'Actions' => [ + [ 'Sniffer', { 'Description' => 'Run sniffer' } ], + [ 'List', { 'Description' => 'List protocols' } ] + ], 'PassiveActions' => [ 'Sniffer' ], - 'DefaultAction' => 'Sniffer' + 'DefaultAction' => 'Sniffer', + 'Notes' => { + 'Stability' => [CRASH_SAFE], + 'SideEffects' => [], + 'Reliability' => [] + } ) + register_options [ OptString.new('PROTOCOLS', [true, 'A comma-delimited list of protocols to sniff or "all".', 'all']), ] register_advanced_options [ - OptPath.new('ProtocolBase', [true, 'The base directory containing the protocol decoders', + OptPath.new('ProtocolBase', [ + true, 'The base directory containing the protocol decoders', File.join(Msf::Config.data_directory, 'exploits', 'psnuffle') ]), ] deregister_options('RHOSTS') end - def load_protocols base = datastore['ProtocolBase'] unless File.directory? base - raise RuntimeError, 'The ProtocolBase parameter is set to an invalid directory' + raise 'The ProtocolBase parameter is set to an invalid directory' end - allowed = datastore['PROTOCOLS'].split(',').map{|x| x.strip.downcase} + allowed = datastore['PROTOCOLS'].split(',').map { |x| x.strip.downcase } @protos = {} decoders = Dir.new(base).entries.grep(/\.rb$/).sort decoders.each do |n| @@ -57,7 +62,7 @@ class MetasploitModule < Msf::Auxiliary begin m.module_eval(File.read(f, File.size(f))) m.constants.grep(/^Sniffer(.*)/) do - proto = $1 + proto = ::Regexp.last_match(1) next unless allowed.include?(proto.downcase) || datastore['PROTOCOLS'] == 'all' klass = m.const_get("Sniffer#{proto}") @@ -65,7 +70,7 @@ class MetasploitModule < Msf::Auxiliary print_status("Loaded protocol #{proto} from #{f}...") end - rescue => e + rescue StandardError => e print_error("Decoder #{n} failed to load: #{e.class} #{e} #{e.backtrace}") end end @@ -88,6 +93,7 @@ class MetasploitModule < Msf::Auxiliary p = PacketFu::Packet.parse(pkt) next unless p.is_tcp? next if p.payload.empty? + @protos.each_key do |k| @protos[k].parse(p) end @@ -107,13 +113,13 @@ class BaseProtocolParser def initialize(framework, mod) self.framework = framework - self.module = mod - self.sessions = {} - self.dport = 0 + self.module = mod + self.sessions = {} + self.dport = 0 register_sigs end - def parse(pkt) + def parse(_pkt) nil end @@ -166,12 +172,12 @@ class BaseProtocolParser self.module.create_credential_login(login_data) end - def report_note(*s) - self.module.report_note(*s) + def report_note(*opts) + self.module.report_note(*opts) end - def report_service(*s) - self.module.report_service(*s) + def report_service(*opts) + self.module.report_service(*opts) end def find_session(sessionid) @@ -184,39 +190,39 @@ class BaseProtocolParser purge_keys << ses end end - purge_keys.each {|ses| sessions.delete(ses) } + purge_keys.each { |ses| sessions.delete(ses) } # Does this session already exist? - if (sessions[sessionid]) + if sessions[sessionid] # Refresh the timestamp sessions[sessionid][:mtime] = Time.now - else + elsif (sessionid =~ /^([^:]+):([^-]+)-([^:]+):(\d+)$/s) # Create a new session entry along with the host/port from the id - if (sessionid =~ /^([^:]+):([^-]+)-([^:]+):(\d+)$/s) - sessions[sessionid] = { - :client_host => $1, - :client_port => $2, - :host => $3, - :port => $4, - :session => sessionid, - :ctime => Time.now, - :mtime => Time.now - } - end + sessions[sessionid] = { + client_host: ::Regexp.last_match(1), + client_port: ::Regexp.last_match(2), + host: ::Regexp.last_match(3), + port: ::Regexp.last_match(4), + session: sessionid, + ctime: Time.now, + mtime: Time.now + } end sessions[sessionid] end def get_session_src(pkt) - return "%s:%d-%s:%d" % [pkt.ip_daddr,pkt.tcp_dport,pkt.ip_saddr,pkt.tcp_sport] if pkt.is_tcp? - return "%s:%d-%s:%d" % [pkt.ip_daddr,pkt.udp_dport,pkt.ip_saddr,pkt.udp_sport] if pkt.is_udp? - return "%s:%d-%s:%d" % [pkt.ip_daddr,0,pkt.ip_saddr,0] + return "#{pkt.ip_daddr}:#{pkt.tcp_dport}-#{pkt.ip_saddr}-#{pkt.tcp_sport}" if pkt.is_tcp? + return "#{pkt.ip_daddr}:#{pkt.udp_dport}-#{pkt.ip_saddr}-#{pkt.udp_sport}" if pkt.is_udp? + + "#{pkt.ip_daddr}:0-#{pkt.ip_saddr}:0" end def get_session_dst(pkt) - return "%s:%d-%s:%d" % [pkt.ip_saddr,pkt.tcp_sport,pkt.ip_daddr,pkt.tcp_dport] if pkt.is_tcp? - return "%s:%d-%s:%d" % [pkt.ip_saddr,pkt.udp_sport,pkt.ip_daddr,pkt.udp_dport] if pkt.is_udp? - return "%s:%d-%s:%d" % [pkt.ip_saddr,0,pkt.ip_daddr,0] + return "#{pkt.ip_saddr}:#{pkt.tcp_sport}-#{pkt.ip_daddr}:#{pkt.tcp_dport}" if pkt.is_tcp? + return "#{pkt.ip_saddr}:#{pkt.udp_sport}-#{pkt.ip_daddr}:#{pkt.udp_dport}" if pkt.is_udp? + + "#{pkt.ip_saddr}:0-#{pkt.ip_daddr}:0" end end