Class: Rex::Post::Meterpreter::GroupTlv
- Defined in:
- lib/rex/post/meterpreter/packet.rb
Overview
Group TLVs contain zero or more TLVs
Direct Known Subclasses
Constant Summary
Constants inherited from Tlv
Instance Attribute Summary collapse
-
#tlvs ⇒ Object
Returns the value of attribute tlvs.
Attributes inherited from Tlv
Instance Method Summary collapse
-
#add_tlv(type, value = nil, replace = false, compress = false) ⇒ Object
Adds a TLV of a given type and value.
-
#add_tlvs(tlvs) ⇒ Object
Adds zero or more TLVs to the packet.
-
#each(type = TLV_TYPE_ANY, &block) ⇒ Object
Enumerates TLVs of the supplied type.
-
#each_tlv(type = TLV_TYPE_ANY, &block) ⇒ Object
Synonym for each.
-
#each_tlv_with_index(type = TLV_TYPE_ANY, &block) ⇒ Object
Synonym for each_with_index.
-
#each_with_index(type = TLV_TYPE_ANY, &block) ⇒ Object
Enumerates TLVs of a supplied type with indexes.
-
#from_r(raw) ⇒ Object
Converts the TLV group container from raw to all of the individual TLVs.
-
#get_tlv(type, index = 0) ⇒ Object
Gets the first TLV of a given type.
-
#get_tlv_value(type, index = 0) ⇒ Object
Returns the value of a TLV if it exists, otherwise nil.
-
#get_tlv_values(type) ⇒ Object
Returns an array of values for all tlvs of type type.
-
#get_tlvs(type) ⇒ Object
Returns an array of TLVs for the given type.
-
#has_tlv?(type) ⇒ Boolean
Checks to see if the container has a TLV of a given type.
-
#initialize(type) ⇒ GroupTlv
constructor
Initializes the group TLV container to the supplied type and creates an empty TLV array.
-
#reset ⇒ Object
Zeros out the array of TLVs.
-
#to_r ⇒ Object
Converts all of the TLVs in the TLV array to raw and prefixes them with a container TLV of this instance’s TLV type.
Methods inherited from Tlv
#_tlv_type_string, #htonq, #inspect, #meta_type?, #ntohq, #type?, #value?
Constructor Details
#initialize(type) ⇒ GroupTlv
Initializes the group TLV container to the supplied type and creates an empty TLV array.
559 560 561 562 563 |
# File 'lib/rex/post/meterpreter/packet.rb', line 559 def initialize(type) super(type) self.tlvs = [] end |
Instance Attribute Details
#tlvs ⇒ Object
Returns the value of attribute tlvs.
547 548 549 |
# File 'lib/rex/post/meterpreter/packet.rb', line 547 def tlvs @tlvs end |
Instance Method Details
#add_tlv(type, value = nil, replace = false, compress = false) ⇒ Object
Adds a TLV of a given type and value.
627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 |
# File 'lib/rex/post/meterpreter/packet.rb', line 627 def add_tlv(type, value = nil, replace = false, compress=false) # If we should replace any TLVs with the same type...remove them first if replace each(type) { |tlv| if (tlv.type == type) self.tlvs.delete(tlv) end } end if (type & TLV_META_TYPE_GROUP == TLV_META_TYPE_GROUP) tlv = GroupTlv.new(type) else tlv = Tlv.new(type, value, compress) end self.tlvs << tlv tlv end |
#add_tlvs(tlvs) ⇒ Object
Adds zero or more TLVs to the packet.
652 653 654 655 656 657 658 |
# File 'lib/rex/post/meterpreter/packet.rb', line 652 def add_tlvs(tlvs) if tlvs tlvs.each { |tlv| add_tlv(tlv['type'], tlv['value']) } end end |
#each(type = TLV_TYPE_ANY, &block) ⇒ Object
Enumerates TLVs of the supplied type.
574 575 576 |
# File 'lib/rex/post/meterpreter/packet.rb', line 574 def each(type = TLV_TYPE_ANY, &block) get_tlvs(type).each(&block) end |
#each_tlv(type = TLV_TYPE_ANY, &block) ⇒ Object
Synonym for each.
581 582 583 |
# File 'lib/rex/post/meterpreter/packet.rb', line 581 def each_tlv(type = TLV_TYPE_ANY, &block) each(type, &block) end |
#each_tlv_with_index(type = TLV_TYPE_ANY, &block) ⇒ Object
Synonym for each_with_index.
595 596 597 |
# File 'lib/rex/post/meterpreter/packet.rb', line 595 def each_tlv_with_index(type = TLV_TYPE_ANY, &block) each_with_index(type, block) end |
#each_with_index(type = TLV_TYPE_ANY, &block) ⇒ Object
Enumerates TLVs of a supplied type with indexes.
588 589 590 |
# File 'lib/rex/post/meterpreter/packet.rb', line 588 def each_with_index(type = TLV_TYPE_ANY, &block) get_tlvs(type).each_with_index(&block) end |
#from_r(raw) ⇒ Object
Converts the TLV group container from raw to all of the individual TLVs.
728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 |
# File 'lib/rex/post/meterpreter/packet.rb', line 728 def from_r(raw) offset = HEADER_SIZE # Reset the TLVs array self.tlvs = [] self.type = raw.unpack("NN")[1] # Enumerate all of the TLVs while offset < raw.length-1 tlv = nil # Get the length and type length, type = raw[offset..offset+HEADER_SIZE].unpack("NN") if (type & TLV_META_TYPE_GROUP == TLV_META_TYPE_GROUP) tlv = GroupTlv.new(type) else tlv = Tlv.new(type) end tlv.from_r(raw[offset..offset+length]) # Insert it into the list of TLVs tlvs << tlv # Move up offset += length end end |
#get_tlv(type, index = 0) ⇒ Object
Gets the first TLV of a given type.
663 664 665 666 667 668 669 670 671 672 |
# File 'lib/rex/post/meterpreter/packet.rb', line 663 def get_tlv(type, index = 0) type_tlvs = get_tlvs(type) if type_tlvs.length > index type_tlvs[index] else nil end end |
#get_tlv_value(type, index = 0) ⇒ Object
Returns the value of a TLV if it exists, otherwise nil.
677 678 679 680 681 |
# File 'lib/rex/post/meterpreter/packet.rb', line 677 def get_tlv_value(type, index = 0) tlv = get_tlv(type, index) (tlv != nil) ? tlv.value : nil end |
#get_tlv_values(type) ⇒ Object
Returns an array of values for all tlvs of type type.
686 687 688 |
# File 'lib/rex/post/meterpreter/packet.rb', line 686 def get_tlv_values(type) get_tlvs(type).collect { |a| a.value } end |
#get_tlvs(type) ⇒ Object
Returns an array of TLVs for the given type.
602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 |
# File 'lib/rex/post/meterpreter/packet.rb', line 602 def get_tlvs(type) if type == TLV_TYPE_ANY self.tlvs else type_tlvs = [] self.tlvs.each() { |tlv| if (tlv.type?(type)) type_tlvs << tlv end } type_tlvs end end |
#has_tlv?(type) ⇒ Boolean
Checks to see if the container has a TLV of a given type.
693 694 695 |
# File 'lib/rex/post/meterpreter/packet.rb', line 693 def has_tlv?(type) get_tlv(type) != nil end |
#reset ⇒ Object
Zeros out the array of TLVs.
700 701 702 |
# File 'lib/rex/post/meterpreter/packet.rb', line 700 def reset self.tlvs = [] end |
#to_r ⇒ Object
Converts all of the TLVs in the TLV array to raw and prefixes them with a container TLV of this instance’s TLV type.
714 715 716 717 718 719 720 721 722 |
# File 'lib/rex/post/meterpreter/packet.rb', line 714 def to_r raw = '' self.each() { |tlv| raw << tlv.to_r } [raw.length + HEADER_SIZE, self.type].pack("NN") + raw end |