Path: blob/master/lib/rex/proto/kerberos/kerberos_readable_text_presenter.rb
74553 views
# -*- coding: binary -*-12module Rex3module Proto4module Kerberos5# Presenter for formatting Kerberos data structures as human-readable text6class KerberosReadableTextPresenter7READABLE_TEXT_LABELS = {8'pvno' => 'Protocol Version',9'msg_type' => 'Message Type',10'pa_data' => 'Pre-Authentication Data',11'req_body' => 'Request Body',12'crealm' => 'Client Realm',13'cname' => 'Client Name',14'realm' => 'Realm',15'sname' => 'Server Name',16'enc_part' => 'Encrypted Part',17'etype' => 'Encryption Type',18'name_type' => 'Name Type',19'name_string' => 'Name String',20'error_code' => 'Error Code',21'e_data' => 'Error Data',22'etext' => 'Error Text',23'stime' => 'Server Time',24'ctime' => 'Client Time',25'susec' => 'Server Microseconds',26'cusec' => 'Client Microseconds',27'ap_options' => 'AP Options',28'kdc_options' => 'KDC Options',29'ticket' => 'Ticket',30'tkt_vno' => 'Ticket Version Number',31'kvno' => 'Key Version Number',32'flags' => 'Flags'33}.freeze3435def present(serialized_message)36lines = []37case serialized_message38when Hash39append_hash(lines, serialized_message, indent: 0)40when Array41append_array(lines, serialized_message, indent: 0)42else43lines << serialized_message.to_s44end45lines.join("\n")46end4748private4950def append_hash(lines, value, indent:)51value.each do |key, entry|52append_field(lines, key, entry, indent: indent)53end54end5556def append_field(lines, key, value, indent:)57label = readable_text_label(key)58spacing = ' ' * indent59case value60when Hash61lines << "#{spacing}#{label}:"62append_hash(lines, value, indent: indent + 2)63when Array64if value.empty?65lines << "#{spacing}#{label}: []"66else67lines << "#{spacing}#{label}:"68append_array(lines, value, indent: indent + 2)69end70else71lines << "#{spacing}#{label}: #{value}"72end73end7475def append_array(lines, value, indent:)76spacing = ' ' * indent77value.each_with_index do |entry, index|78case entry79when Hash80lines << "#{spacing}Entry[#{index}]:"81append_hash(lines, entry, indent: indent + 2)82when Array83lines << "#{spacing}Entry[#{index}]:"84append_array(lines, entry, indent: indent + 2)85else86lines << "#{spacing}- #{entry}"87end88end89end9091def readable_text_label(key)92READABLE_TEXT_LABELS[key.to_s] || key.to_s.split('_').map(&:capitalize).join(' ')93end94end95end96end97end9899100