49 lines
1.2 KiB
Ruby
49 lines
1.2 KiB
Ruby
# Psnuffle password sniffer add-on class for HTTP GET URL's
|
|
# part of psnuffle sniffer auxiliary module
|
|
#
|
|
# Very simple example how to write sniffer extensions
|
|
#
|
|
|
|
# Sniffer class for GET URL's
|
|
class SnifferURL < BaseProtocolParser
|
|
def register_sigs
|
|
self.sigs = {
|
|
:get => /^GET\s+([^\n]+)\s+HTTP\/\d\.\d/i,
|
|
:webhost => /^HOST\:\s+([^\n\r]+)/i,
|
|
}
|
|
end
|
|
|
|
def parse(pkt)
|
|
# We want to return immediantly if we do not have a packet which is handled by us
|
|
return if not pkt[:tcp]
|
|
return if (pkt[:tcp].dst_port != 80)
|
|
s = find_session((pkt[:tcp].dst_port == 80) ? get_session_dst(pkt) : get_session_src(pkt))
|
|
|
|
self.sigs.each_key do |k|
|
|
|
|
# There is only one pattern per run to test
|
|
matched = nil
|
|
matches = nil
|
|
|
|
if(pkt[:tcp].payload_data =~ self.sigs[k])
|
|
matched = k
|
|
matches = $1
|
|
sessions[s[:session]].merge!({k => matches})
|
|
end
|
|
|
|
case matched
|
|
when :webhost
|
|
sessions[s[:session]].merge!({k => matches})
|
|
if(s[:get])
|
|
print_status("HTTP GET: #{s[:session]} http://#{s[:webhost]}#{s[:get]}")
|
|
sessions.delete(s[:session])
|
|
return
|
|
end
|
|
when nil
|
|
# No matches, no saved state
|
|
end # end case matched
|
|
end # end of each_key
|
|
end # end of parse
|
|
end # end of URL sniffer
|
|
|