Land #1847 - Add sorting functionality to notes command

unstable
sinn3r 2013-06-05 12:17:54 -05:00
commit 9466022194
1 changed files with 65 additions and 8 deletions

View File

@ -853,11 +853,13 @@ class Db
print_line " -t <type1,type2> Search for a list of types"
print_line " -h,--help Show this help information"
print_line " -R,--rhosts Set RHOSTS from the results of the search"
print_line " -S,--search Search string to filter by"
print_line " -S,--search Regular expression to match for search"
print_line " --sort <field1,field2> Fields to sort by (case sensitive)"
print_line
print_line "Examples:"
print_line " notes --add -t apps -n 'winzip' 10.1.1.34 10.1.20.41"
print_line " notes -t smb.fingerprint 10.1.1.34 10.1.20.41"
print_line " notes -S 'nmap.nse.(http|rtsp)' --sort type,output"
print_line
end
@ -896,6 +898,8 @@ class Db
set_rhosts = true
when '-S', '--search'
search_term = /#{args.shift}/nmi
when '--sort'
sort_term = args.shift
when '-h','--help'
cmd_notes_help
return
@ -942,6 +946,43 @@ class Db
!n.attribute_names.any? { |a| n[a.intern].to_s.match(search_term) }
end
end
# Sort the notes based on the sort_term provided
if sort_term != nil
sort_terms = sort_term.split(",")
note_list.sort_by! do |note|
orderlist = []
sort_terms.each do |term|
term = "ntype" if term == "type"
term = "created_at" if term == "Time"
if term == nil
orderlist << ""
elsif term == "service"
if note.service != nil
orderlist << make_sortable(note.service.name)
end
elsif term == "port"
if note.service != nil
orderlist << make_sortable(note.service.port)
end
elsif term == "output"
orderlist << make_sortable(note.data["output"])
elsif note.respond_to?(term)
orderlist << make_sortable(note.send(term))
elsif note.respond_to?(term.to_sym)
orderlist << make_sortable(note.send(term.to_sym))
elsif note.respond_to?("data") && note.send("data").respond_to?(term)
orderlist << make_sortable(note.send("data").send(term))
elsif note.respond_to?("data") && note.send("data").respond_to?(term.to_sym)
orderlist << make_sortable(note.send("data").send(term.to_sym))
else
orderlist << ""
end
end
orderlist
end
end
# Now display them
note_list.each do |note|
next if(types and types.index(note.ntype).nil?)
@ -974,6 +1015,22 @@ class Db
}
end
def make_sortable(input)
case input.class
when String
input = input.downcase
when Fixnum
input = "%016" % input
when Time
input = input.strftime("%Y%m%d%H%M%S%L")
when NilClass
input = ""
else
input = input.inspect.downcase
end
input
end
def cmd_loot_help
print_line "Usage: loot <options>"
print_line " Info: loot [-h] [addr1 addr2 ...] [-t <type1,type2>]"