Lucene search
+L

Axis Devices Detection (HTTP)

🗓️ 29 Aug 2018 00:00:00Reported by Copyright (C) 2018 Greenbone AGType 
openvas
 openvas
🔗 plugins.openvas.org👁 39 Views

Axis Devices Detection (HTTP) for product detection via HTTP for Axis devices

Code
# SPDX-FileCopyrightText: 2018 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

if(description)
{
  script_oid("1.3.6.1.4.1.25623.1.0.114027");
  script_version("2024-11-29T15:40:53+0000");
  script_tag(name:"last_modification", value:"2024-11-29 15:40:53 +0000 (Fri, 29 Nov 2024)");
  script_tag(name:"creation_date", value:"2018-08-29 10:46:20 +0200 (Wed, 29 Aug 2018)");
  script_tag(name:"cvss_base", value:"0.0");
  script_tag(name:"cvss_base_vector", value:"AV:N/AC:L/Au:N/C:N/I:N/A:N");

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

  script_name("Axis Devices Detection (HTTP)");

  script_tag(name:"summary", value:"HTTP based detection of Axis devices.");

  script_category(ACT_GATHER_INFO);

  script_copyright("Copyright (C) 2018 Greenbone AG");
  script_family("Product detection");
  script_dependencies("find_service.nasl", "httpver.nasl", "global_settings.nasl");
  script_require_ports("Services/www", 80);
  script_exclude_keys("Settings/disable_cgi_scanning");

  exit(0);
}

include("host_details.inc");
include("http_func.inc");
include("http_keepalive.inc");
include("port_service_func.inc");
include("misc_func.inc");

port = http_get_port( default:80 );

is_axis_os = FALSE;
version = "unknown";
model = "unknown";
full_name = "unknown";
install = "/";
concluded = "";
conclUrl = "";

url = "/";
res = http_get_cache( port:port, item:url );

# AXIS M2036-LE Bullet Camera Device:
# <html><head><meta http-equiv="refresh" content="0; URL=/camera/index.html" /></head></html>
#
# AXIS Q6135-LE PTZ Network Camera:
# <meta http-equiv="refresh" content="0; URL=/aca/index.html" />
#
if ( res =~ '<meta http-equiv="refresh" content="0; URL=' ) {
  url_reg = eregmatch( pattern:'URL=([^"]+)"', string:res );

  if ( ! isnull( url_reg[1] ) ) {
    url = url_reg[1];
    res = http_get_cache( port:port, item:url );
  }
}
# AXIS A8207-VE Mk II Network Video Door Station:
# window.location.pathname='intercom/index.html'
if ( res =~ "intercom/index\.html" ) {
  # nb: Following redirect first to make sure it is an AXIS device
  url = "/intercom/index.html";
  res = http_get_cache( port:port, item:url );
}

# AXIS Q1700-LE License Plate Camera
# window.location.pathname='camera/index.html'
if ( res =~ "camera/index\.html" ) {
  # nb: Following redirect first to make sure it is an AXIS device
  url = "/camera/index.html";
  res = http_get_cache( port:port, item:url );
}
# Companion Eye mini L:
# <title>AXIS</title>
#
# AXIS Q6128-E PTZ Dome Network Camera:
# <title>Index page</title>
# var refreshUrl = "/view/view.shtml?id=13";
#
if ( res =~ "^HTTP/(1\.[01]|2) 200" && ( res =~ "<title>.*AXIS.*</title>" ||
    ( res =~ "<title>Index page</title>" && res =~ "/view/view\.shtml" ) ) ) {

  # nb: This are older versions of AXIS OS, 6.50.x and will not be detected by the other methods,
  # but this can also lead to false positives so we need to double check the version
  # eg. AXIS Q8414-LVS Fixed Network Camera
  if ( res =~ "<title>Index page</title>" )
    check_vers = TRUE;

  # nb: For some reason P1364 cameras does not reply to any of the AXIS OS tests but this rule can be safely applied
  # Other devices have the same issue
  if ( res =~ "Axis Communications AB" && res =~ "<title>AXIS</title>" )
    is_axis_os = TRUE;

  # <TITLE>Live view / - AXIS 205 version 4.03</TITLE>
  mod = eregmatch( pattern:"AXIS ([-0-9A-Za-z. ]+) version ([0-9.]+)(</title>|</TITLE>)", string:res );
  if ( ! isnull( mod[1] ) ) {
    found = TRUE;
    model = mod[1];
    full_name = "AXIS " + model;
    concluded = "    " + mod[0];
    conclUrl = "    " + http_report_vuln_url( port:port, url:url, url_only:TRUE );
    if ( ! isnull( mod[2] ) ) {
      version = mod[2];
    }
  } else {
    conclUrl = "    " + http_report_vuln_url( port:port, url:url, url_only:TRUE );
    url = "/axis-cgi/basicdeviceinfo.cgi";
    data = '{"apiVersion":"1.2","method":"getAllUnrestrictedProperties"}';

    req = http_post_put_req( port:port, url:url, data:data, add_headers:make_array( "Accept-Encoding", "gzip, deflate" ) );

    # {"apiVersion": "1.3", "data": {"propertyList": {"ProdNbr": "Q6315-LE", "HardwareID": "7C9.2", "ProdFullName": "AXIS Q6315-LE PTZ Network Camera",
    # "Version": "10.11.87", "ProdType": "PTZ Network Camera", "Brand": "AXIS", "WebURL": "http://www.axis.com", "ProdVariant": "",
    # "SerialNumber": "B8A44F5B6CEF", "ProdShortName": "AXIS Q6315-LE", "BuildDate": "Jun 16 2022 20:01"}}}
    res = http_keepalive_send_recv( port:port, data:req );

    # nb: The presence of the API is for the time being the best indicator that this is AXIS OS.
    if ( res =~ "^HTTP/(1\.[01]|2) 200" || res =~ "Unauthorized" )
      is_axis_os = TRUE;

    if ( ! res || res !~ "^HTTP/(1\.[01]|2) 200" ) {
      url = "/axis-cgi/prod_brand_info/getbrand.cgi";
      # {
      #   "Brand": {
      #    "Brand": "AXIS",
      #    "ProdType": "Network Camera",
      #    "ProdNbr": "M1125",
      #    "ProdShortName": "AXIS M1125",
      #    "ProdFullName": "AXIS M1125 Network Camera"
      #  }
      # }
      res = http_get_cache( port:port, item:url );
    }

    if ( res && res =~ "^HTTP/(1\.[01]|2) 200" && res =~ '"Brand":( )*"AXIS"' && '"ProdFullName":' >< res && '"ProdNbr":' >< res ) {
      found = TRUE;

      # nb: It seems that the CPEs used by NIST follow the pattern provided by this field. Nevertheless, it is not always present, thus the fallback.
      # "ProdShortName": "AXIS Companion Eye mini L"
      mod = eregmatch( pattern:'"ProdShortName":\\s*"([-A-Za-z0-9 ]+)"', string:res );
      if ( ! mod ) {
        # "ProdNbr": "Q6315-LE",
        # "ProdNbr": "C Eye mini L",
        mod = eregmatch( pattern:'"ProdNbr":\\s*"([-A-Za-z0-9 ]+)"', string:res );
      }

      if ( ! isnull( mod[1] ) ) {
        model = mod[1];
        concluded = "    " + mod[0];
        conclUrl += '\n    ' + http_report_vuln_url( port:port, url:url, url_only:TRUE );

        # "ProdFullName": "AXIS Q6315-LE PTZ Network Camera"
        # "ProdFullName": "AXIS Companion Eye mini L Network Camera"
        full_mod = eregmatch( pattern:'"ProdFullName":\\s*"([-A-Za-z0-9 ]+)"', string:res );

        if ( ! isnull( full_mod[1] ) ) {
          full_name = full_mod[1];
          concluded += '\n    ' + full_mod[0];
        }
      }

      # nb: Last tentative to differentiate between AXIS OS and dedicated firmware
      if ( ! is_axis_os ) {
        url = "/axis-cgi/apidiscovery.cgi";
        data = '{"apiVersion":"1.0","method":"getApiList"}';

        req = http_post_put_req( port:port, url:url, data:data, add_headers:make_array( "Accept-Encoding", "gzip, deflate" ) );
        res = http_keepalive_send_recv( port:port, data:req );

        # nb: The presence of the API is for the time being the best indicator that this is AXIS OS.
        # But this is not present for all AXIS OS versions
        if ( res =~ "^HTTP/(1\.[01]|2) 200" || res =~ "Unauthorized" )
          is_axis_os = TRUE;
      }
    }
  }
}

if ( ! found ) {
  # nb: Video Server devices have both index2.shtml and view.shtml but only have the model in the index2.shtml title
  url = "/view/index2.shtml";

  res = http_get_cache( port:port, item:url );

  if ( ! res || res !~ "^HTTP/(1\.[01]|2) 200" ) {
    url = "/view/view.shtml";
    res = http_get_cache( port:port, item:url );
  }
  # <TITLE>AXIS 2400 Video Server</TITLE>
  # <title>AXIS A8004-VE Network Video Door Station</title>
  # <title>Live view  - AXIS 233D Network Dome Camera</title>
  # <title>Live view / - AXIS 205 Network Camera version 4.05</title>
  if ( res && res =~ "^HTTP/(1\.[01]|2) 200" && ( res =~ "<title>Live view.*AXIS" || res =~ "<title>AXIS" ) ) {
    mod = eregmatch( pattern:"(AXIS [-0-9A-Za-z. ]+)(</title>|</TITLE>)", string:res );
    if ( mod[1] ) {
      found = TRUE;
      model_full = mod[1];
      # <title>Live view / - AXIS 205 Network Camera version 4.05</title>
      # AXIS Q7404 Video Encoder</title>
      if ( " version " >< model_full ) {
        split_mod = split( model_full, sep:" version ", keep:FALSE );
        model = split_mod[0];
        model_full = model;
        if ( split_mod[1] )
          version = split_mod[1];
      } else
        model = model_full;

      full_name = model_full;
      # nb: NVD uses CPE like cpe:/h:axis:2400_video_server or cpe:/o:axis:2100_network_camera_firmware
      if ( "Network Camera" >!< model && "Video Server" >!< model ) {
        split_mod = split( model, sep:" ", keep:FALSE );
        if ( "AXIS" >< split_mod[0] )
          model = split_mod[1];
        else
          model = split_mod[0];
      }
      conclUrl = "    " + http_report_vuln_url( port:port, url:url, url_only:TRUE );
      concluded += "    " + mod[0];
    }
  }
}

if ( found ) {
  if ( ! version || version == "unknown" ) {
    url2 = "/axis-release/releaseinfo";

    req = http_get_req( port:port, url:url2, add_headers:make_array( "Accept-Encoding", "gzip, deflate" ) );
    res2 = http_keepalive_send_recv( port:port, data:req );
    #version:"1.27.24.15"
    vers = eregmatch( pattern:"version:\s*([0-9.]+)", string:res2 );
    if ( vers[1] ) {
      version = vers[1];
      conclUrl += '\n    ' + http_report_vuln_url( port:port, url:url2, url_only:TRUE );
      concluded += '\n    ' + vers[0];
      # nb: This is a hack to make a distinction between first AXIS OS versions and non AXIS OS firmware
      if ( check_vers && version =~ "^6\.5" )
        is_axis_os = TRUE;
    }
  }

  if ( model =~ "^AXIS " )
    model = substr( model, 5 );

  set_kb_item( name:"axis/device/detected", value:TRUE );
  set_kb_item( name:"axis/device/axisos", value:is_axis_os );
  set_kb_item( name:"axis/device/http/detected", value:TRUE );
  set_kb_item( name:"axis/device/http/port", value:port );

  set_kb_item( name:"axis/device/http/" + port + "/model", value:model );
  set_kb_item( name:"axis/device/http/" + port + "/modelName", value:full_name );
  set_kb_item( name:"axis/device/http/" + port + "/version", value:version );

  if ( concluded )
    set_kb_item( name:"axis/device/http/" + port + "/concluded", value:chomp( concluded ) );

  if ( conclUrl )
    set_kb_item( name:"axis/device/http/" + port + "/concludedUrl", value:conclUrl );

}

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

29 Nov 2024 00:00Current
7.4High risk
Vulners AI Score7.4
39