Add sorting functionality to cmd_notes

- Added sorting to cmd_notes
- Added make_sortable function so that sorts work happily even
  when the disparate notes don't have content of the same types
  in the fields the sort is requested over.
unstable
John Sherwood 2013-05-17 23:02:38 -04:00
parent 063ef487e2
commit b22c5a0120
1 changed files with 65 additions and 8 deletions

View File

@ -847,17 +847,19 @@ class Db
def cmd_notes_help
print_line "Usage: notes [-h] [-t <type1,type2>] [-n <data string>] [-a] [addr range]"
print_line
print_line " -a,--add Add a note to the list of addresses, instead of listing"
print_line " -d,--delete Delete the hosts instead of searching"
print_line " -n,--note <data> Set the data for a new note (only with -a)"
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 " -a,--add Add a note to the list of addresses, instead of listing"
print_line " -d,--delete Delete the hosts instead of searching"
print_line " -n,--note <data> Set the data for a new note (only with -a)"
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 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
@ -892,10 +894,12 @@ class Db
return
end
types = typelist.strip().split(",")
when '-R','--rhosts'
when '-R', '--rhosts'
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>]"