metasploit-framework/lib/rex/proto/drda/packet.rb.ut.rb

111 lines
3.6 KiB
Ruby

#!/usr/bin/env ruby
# -*- coding: binary -*-
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
require 'rex/test'
require 'rex/proto/drda/packet'
class Rex::Proto::DRDA::UnitTest < Test::Unit::TestCase
Klass = Rex::Proto::DRDA
Konst = Rex::Proto::DRDA::Constants
# Test a sample param
def test_mgrlvlls_param
p = Klass::MGRLVLLS_PARAM.new
assert_kind_of(Struct, p)
assert_equal(Konst::MGRLVLLS, p.codepoint)
end
# Test a sample ddm
def test_secchk_ddm
d = Klass::SECCHK_DDM.new
assert_kind_of Struct, d
assert_equal Konst::SECCHK, d.codepoint
end
# All parameter names should have a corresponding codepoint,
# except "DDM_PARAM" (a generic parameter).
def test_all_param_codepoints
params = Klass.constants.map {|x| x if x =~ /PARAM$/}.compact
assert_operator params.size, :>=, 6 # Allow for more later.
params.each do |p|
cp = p.split(/_PARAM/).first
next if cp == "DDM"
assert Konst.const_defined? cp
assert_kind_of Numeric, Konst.const_get(cp)
end
end
# Similarly, so should DDM Structs.
def test_all_ddm_codepoints
ddms = Klass.constants.map {|x| x if x =~ /DDM$/}.compact
assert_operator ddms.size, :>=, 4 # Allow for more later.
ddms.each do |p|
cp = p.split(/_DDM/).first
next if cp == "BASIC"
assert_kind_of Numeric, Konst.const_get(cp)
end
end
# Ensure that all params have the same struct.
def test_param_struct
params = Klass.constants.map {|x| x if x =~ /PARAM$/}.compact
params.each do |p|
obj = Klass.const_get(p).new
assert_equal 3, obj.size
assert_respond_to obj, :codepoint
assert_respond_to obj, :length
assert_respond_to obj, :payload
end
end
# Make some similiar assertions about DDMs, though specific DDMs
# will have particular elements after the codepoint, usually more
# than one.
def test_ddm_struct
ddms = Klass.constants.map {|x| x if x =~ /DDM$/}.compact
ddms.each do |d|
obj = Klass.const_get(d).new
assert_operator obj.size, :>=, 7
assert_respond_to obj, :length
assert_respond_to obj, :magic
assert_respond_to obj, :format
assert_respond_to obj, :correlid
assert_respond_to obj, :length2
assert_respond_to obj, :codepoint
end
end
# The server packet is special since it's an Array of BASIC_DDM's,
# and doesn't have a particular, fixed struct. (It would be nice
# to build those up on the fly, but we're not really interested in
# validating most server responses right now.
def test_server_packet_structure
s = Klass::SERVER_PACKET.new
assert_kind_of Array, s
assert_respond_to s, :to_s
assert_respond_to s, :sz
assert_respond_to s, :read
end
# Exercise the SERVER_PACKET#read function with a sample packet.
def test_server_packet_read
pkt = "0015d0420001000f1219000611490000000511a4000050d0520002004a2201000611490000000c112ee2d8d3f0f8f0f2f4000d002fd8e3c4e2d8d3e7f8f6000a00350006119c033300062103022e00172135c3f0c1f8f6c1f0f14bc5c6f1f2070402195612008cd0030002008624080000000000303030303053514c303830323400ffffffff0200000000000000030000000000000000000000202020202020202020202000124d59444232444220202020202020202020200000003331ff383139ff4d59555345522020ff4d594442324442ff514442322f4c494e5558ff353538ff353538ff30ff31323038ff30ffff".scan(/../).map {|x| x.to_i(16).chr}.join
s = Klass::SERVER_PACKET.new
assert_equal 0, s.size
s.read(pkt)
assert_equal 3, s.size
assert_equal Konst::SECCHKRM, s[0].codepoint
assert_equal Konst::ACCRDBRM, s[1].codepoint
assert_equal Konst::SQLCARD, s[2].codepoint
assert_equal 0xd0, s[0].magic
assert_equal 0x52, s[1].format
assert_equal 134, s[2].length2
assert_equal 21+80+140, s.sz
end
end