Vulnerabilities > CVE-1999-0168 - Unspecified vulnerability in SUN Sunos 4.1.3/4.1.3C

047910
CVSS 7.5 - HIGH
Attack vector
NETWORK
Attack complexity
LOW
Privileges required
NONE
Confidentiality impact
PARTIAL
Integrity impact
PARTIAL
Availability impact
PARTIAL
network
low complexity
sun
nessus

Summary

The portmapper may act as a proxy and redirect service requests from an attacker, making the request appear to come from the local host, possibly bypassing authentication that would otherwise have taken place. For example, NFS file systems could be mounted through the portmapper despite export restrictions.

Vulnerable Configurations

Part Description Count
OS
Sun
2

Nessus

NASL familyRPC
NASL idNFS_PORTMAP.NASL
descriptionThe remote RPC portmapper forwards NFS requests made to it. An attacker may use this flaw to make NFS mount requests which will appear to come from localhost and therefore override the ACLs set up for NFS.
last seen2020-06-01
modified2020-06-02
plugin id11358
published2003-03-12
reporterThis script is Copyright (C) 2003-2018 Tenable Network Security, Inc.
sourcehttps://www.tenable.com/plugins/nessus/11358
titleNFS portmapper localhost Mount Request Restricted Host Access
code
#
# (C) Tenable Network Security, Inc.
#

include( 'compat.inc' );

if (description)
{
  script_id(11358);
  script_version("1.19");
  script_cvs_date("Date: 2018/08/13 14:32:37");
  script_cve_id("CVE-1999-0168");

  script_name(english:"NFS portmapper localhost Mount Request Restricted Host Access");
  script_summary(english:"Checks for the portmapper proxying NFS");

  script_set_attribute(
    attribute:'synopsis',
    value:'The remote service is vulnerable to an access control breach.'
  );

  script_set_attribute(
    attribute:'description',
    value:"The remote RPC portmapper forwards NFS requests made to it.

An attacker may use this flaw to make NFS mount requests which will
appear to come from localhost and therefore override the ACLs set up
for NFS."
  );

  script_set_attribute(
    attribute:'solution',
    value: "Contact your vendor for the appropriate patches."
  );
  script_set_cvss_base_vector("CVSS2#AV:N/AC:L/Au:N/C:P/I:P/A:P");


 script_set_attribute(attribute:"vuln_publication_date", value:"1991/12/06");
 script_set_attribute(attribute:"plugin_publication_date", value:"2003/03/12");

  script_set_attribute(attribute:"plugin_type", value:"remote");
  script_set_attribute(attribute:"cpe", value:"cpe:/o:sun:sunos");
  script_end_attributes();

  script_category(ACT_GATHER_INFO);
  script_copyright(english:"This script is Copyright (C) 2003-2018 Tenable Network Security, Inc.");
  script_family(english:"RPC");
  script_dependencies("rpc_portmap.nasl", "showmount.nasl", "nfs_user_mount.nasl");
  script_require_keys("rpc/portmap");
  exit(0);
}

include("misc_func.inc");
include("nfs_func.inc");
include("byte_func.inc");
include("sunrpc_func.inc");

list = get_kb_list("nfs/exportlist");
if(isnull(list))exit(0);
shares = make_list(list);

port = get_rpc_port2(program:100005, protocol:IPPROTO_UDP);
if ( ! port ) exit(0);
if (! get_udp_port_state(port)) exit(0, "UDP port "+port+" is not open.");
soc = open_priv_sock_udp(dport:port);

if(!soc)exit(0);

foreach share (shares)
{
 fid = nfs_mount(soc:soc, share:share);
 if(fid)
 {
  nfs_umount(soc:soc, share:share);
 }
 else {
  close(soc);
  port = get_kb_item("rpc/portmap");
  if(!port)port = 111;

  soc = open_priv_sock_udp(dport:port);
  req = rpclong(val:rand()) +		# XID
  	rpclong(val:0) +		# Msg type: Call
	rpclong(val:2) +		# RPC version : 2
	rpclong(val:100000) +		# Program : Portmap
	rpclong(val:2) +		# Program version : 2
	rpclong(val:5) +		# Procedure : CALLIT
	rpclong(val:0) +		# Credentials
	rpclong(val:0) +		#
	rpclong(val:0) +		# Verifier
	rpclong(val:0) +		#----------------
	rpclong(val:100005) +		# Program: mount
	rpclong(val:1) +		# Version: 1
	rpclong(val:1) +		# Procedure : 1 (MNT)
	rpclong(val:strlen(share) + padsz(len:strlen(share)) + 4 ) + # Arg length
	rpclong(val:strlen(share)) +	# Argument
	share +
	rpcpad(pad:padsz(len:strlen(share)));

  send(socket:soc, data:req);
  r = recv(socket:soc, length:4096);
  if(!r)exit(0);
  if(strlen(r) >= 24 && getdword(blob:r, pos:4) == RPC_MSG_TYPE_REPLY && # Reply
		       getdword(blob:r, pos:8) == RPC_REPLY_STAT_ACCEPTED &&         # Reply state should be 0 (message accepted)
		       getdword(blob:r, pos:20) == RPC_ACCEPT_STAT_SUCCESS)          # Accept state of RPC call should also be 0 (accepted)

  {
   security_hole(port:port, proto:"udp");
   exit(0);
  }
 }
}