Lucene search
+L

Meinberg LANTIME Detection Consolidation

🗓️ 28 Feb 2023 00:00:00Reported by Copyright (C) 2023 Greenbone AGType 
openvas
 openvas
🔗 plugins.openvas.org👁 11 Views

Consolidation of Meinberg LANTIME NTP Timeserver device detections

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

include("plugin_feed_info.inc");

if (description)
{
  script_oid("1.3.6.1.4.1.25623.1.0.104585");
  script_version("2024-07-03T06:48:05+0000");
  script_tag(name:"last_modification", value:"2024-07-03 06:48:05 +0000 (Wed, 03 Jul 2024)");
  script_tag(name:"creation_date", value:"2023-02-28 15:10:50 +0000 (Tue, 28 Feb 2023)");
  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("Meinberg LANTIME Detection Consolidation");

  script_tag(name:"summary", value:"Consolidation of Meinberg LANTIME NTP Timeserver device
  detections.");

  script_category(ACT_GATHER_INFO);

  script_copyright("Copyright (C) 2023 Greenbone AG");
  script_family("Product detection");
  script_dependencies("gb_meinberg_lantime_snmp_detect.nasl");
  if(FEED_NAME == "GSF" || FEED_NAME == "GEF" || FEED_NAME == "SCM")
    script_dependencies("gsf/gb_meinberg_lantime_http_detect.nasl",
                        "gsf/gb_meinberg_lantime_mdns_detect.nasl",
                        "gsf/gb_meinberg_lantime_ssh_login_detect.nasl",
                        "gsf/gb_meinberg_lantime_ntp_detect.nasl");
  script_mandatory_keys("meinberg/lantime/detected");

  script_xref(name:"URL", value:"https://www.meinbergglobal.com/english/products/ntp-time-server.htm");

  exit(0);
}

include("cpe.inc");
include("host_details.inc");
include("os_func.inc");

if (!get_kb_item("meinberg/lantime/detected"))
  exit(0);

detected_model = "unknown";
detected_fw    = "unknown";

# nb: http is kept as the last entry as it only exposed a major version
foreach source (make_list("ssh-login", "snmp", "mdns", "ntp", "http")) {
  model_list = get_kb_list("meinberg/lantime/" + source + "/*/model");
  foreach model (model_list) {
    if (model != "unknown" && detected_model == "unknown") {
      detected_model = model;
      set_kb_item(name: "meinberg/lantime/model", value: detected_model);
      break;
    }
  }

  fw_list = get_kb_list("meinberg/lantime/" + source + "/*/fw_version");
  foreach fw (fw_list) {
    if (fw != "unknown" && detected_fw == "unknown") {
      detected_fw = fw;
      set_kb_item(name: "meinberg/lantime/firmware_version", value: detected_fw);
      break;
    }
  }
}

cpe_model = "unknown_model";
os_name = "Meinberg LANTIME Firmware";
hw_name = "Meinberg LANTIME Unknown Model";

# nb: NVD is currently using different ones (see 2016 and 2017 CVEs). The "1" are the newer ones.
hw_cpe1 = "cpe:/h:meinbergglobal:lantime_";
base_os_cpe1 = "cpe:/o:meinbergglobal:lantime_firmware";

hw_cpe2 = "cpe:/h:meinberg:lantime_";
base_os_cpe2 = "cpe:/o:meinberg:ntp_server_firmware";

if (detected_model != "unknown") {

  hw_name = "Meinberg LANTIME " + detected_model;

  # nb:
  # - This is done because the model might include /PZF but we don't want to include this in the CPE
  # - At least one unknown M3x model has been seen and we want to include the "x" here
  cpe_mod = eregmatch(pattern: "([A-Z0-9x]+)", string: detected_model, icase: FALSE);
  if (cpe_mod[1])
    cpe_model = tolower(cpe_mod[1]);
}

hw_cpe1 += cpe_model;
hw_cpe2 += cpe_model;

# nb:
# - The "nc" in V5.35nc is currently not included here because it's not clear if that is part of the
#   version
# - On older 5.x we have also seen V5.34p6 which seems to be "ok" to add it
os_cpe1 = build_cpe(value: detected_fw, exp: "^([0-9p.]+)", base: base_os_cpe1 + ":");
os_cpe2 = build_cpe(value: detected_fw, exp: "^([0-9p.]+)", base: base_os_cpe2 + ":");
if (!os_cpe1) {
  os_cpe1 = base_os_cpe1;
  os_cpe2 = base_os_cpe2;
}

# nb:
# - We're only registering a single OS CPE here on purpose, the other CPE is covered in the
#   register_product call below...
# - From https://www.meinbergglobal.com/english/products/ntp-time-server.htm#prgchar:
#   > Operating System of the SBC: Linux with nano kernel (incl. PPSkit)
os_register_and_report(os: os_name, cpe: os_cpe1, version: detected_fw, full_cpe: TRUE, port: 0,
                       desc: "Meinberg LANTIME Detection Consolidation", runs_key: "unixoide");

install = "/";

if (http_ports = get_kb_list("meinberg/lantime/http/port")) {
  foreach port (http_ports) {
    extra += 'HTTP(s) on port ' + port + '/tcp\n';

    concluded = get_kb_item("meinberg/lantime/http/" + port + "/concluded");
    if (concluded)
      extra += '  Concluded from version/product identification result:' + concluded + '\n';

    concUrl = get_kb_item("meinberg/lantime/http/" + port + "/concludedUrl");
    if (concUrl)
      extra += '  Concluded from version/product identification location:\n' + concUrl + '\n';

    register_product(cpe: os_cpe1, location: install, port: port, service: "www");
    register_product(cpe: os_cpe2, location: install, port: port, service: "www");
    register_product(cpe: hw_cpe1, location: install, port: port, service: "www");
    register_product(cpe: hw_cpe2, location: install, port: port, service: "www");
  }
}

if (snmp_ports = get_kb_list("meinberg/lantime/snmp/port")) {
  foreach port (snmp_ports) {
    extra += 'SNMP on port ' + port + '/udp\n';
    concluded = get_kb_item("meinberg/lantime/snmp/" + port + "/concluded");
    if (concluded)
      extra += '  SNMP sysDescr OID: ' + concluded + '\n';

    register_product(cpe: os_cpe1, location: install, port: port, proto: "udp", service: "snmp");
    register_product(cpe: os_cpe2, location: install, port: port, proto: "udp", service: "snmp");
    register_product(cpe: hw_cpe1, location: install, port: port, proto: "udp", service: "snmp");
    register_product(cpe: hw_cpe2, location: install, port: port, proto: "udp", service: "snmp");
  }
}

if (mdns_ports_and_protos = get_kb_list("meinberg/lantime/mdns/port_and_proto")) {
  foreach mdns_port_and_proto (mdns_ports_and_protos) {
    concluded = get_kb_item("meinberg/lantime/mdns/" + mdns_port_and_proto + "/concluded");
    if (concluded)
      extra += concluded + '\n';
    else
      extra += 'mDNS on port ' + mdns_port_and_proto + '\n';

    if (!exposed_port = get_kb_item("meinberg/lantime/mdns/" + mdns_port_and_proto + "/exposed_port"))
      exposed_port = 0;

    # nb:
    # - Although the service was discovered via mDNS, it actually resides on the TCP port exposed by mDNS
    # - Only seen "Remote Display Port" for the TCP port so this is used here
    register_product(cpe: os_cpe1, location: install, port: port, service: "remote_display_port");
    register_product(cpe: os_cpe2, location: install, port: port, service: "remote_display_port");
    register_product(cpe: hw_cpe1, location: install, port: port, service: "remote_display_port");
    register_product(cpe: hw_cpe2, location: install, port: port, service: "remote_display_port");
  }
}

if (ntp_ports = get_kb_list("meinberg/lantime/ntp/port")) {
  foreach port (ntp_ports) {
    extra += 'NTP on port ' + port + '/udp\n';
    concluded = get_kb_item("meinberg/lantime/ntp/" + port + "/concluded");
    if (concluded)
      extra += '  NTP banner: ' + concluded + '\n';

    register_product(cpe: os_cpe1, location: install, port: port, proto: "udp", service: "ntp");
    register_product(cpe: os_cpe2, location: install, port: port, proto: "udp", service: "ntp");
    register_product(cpe: hw_cpe1, location: install, port: port, proto: "udp", service: "ntp");
    register_product(cpe: hw_cpe2, location: install, port: port, proto: "udp", service: "ntp");
  }
}

if (ssh_login_ports = get_kb_list("meinberg/lantime/ssh-login/port")) {
  foreach port (ssh_login_ports) {
    extra += 'SSH login via port ' + port + '/tcp\n';

    concluded = get_kb_item("meinberg/lantime/ssh-login/" + port + "/concluded");
    if (concluded)
      extra += '  Concluded from version/product identification result:\n' + concluded + '\n';

    register_product(cpe: os_cpe1, location: install, port: port, service: "ssh-login");
    register_product(cpe: os_cpe2, location: install, port: port, service: "ssh-login");
    register_product(cpe: hw_cpe1, location: install, port: port, service: "ssh-login");
    register_product(cpe: hw_cpe2, location: install, port: port, service: "ssh-login");
  }
}

report  = build_detection_report(app: os_name, version: detected_fw, install: install, cpe: os_cpe1);
report += '\n\n';
report += build_detection_report(app: hw_name, skip_version: TRUE, install: install, cpe: hw_cpe1);

if (extra) {
  report += '\n\nDetection methods:\n';
  report += '\n' + extra;
}

log_message(port: 0, data: chomp(report));

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

03 Jul 2024 00:00Current
7.3High risk
Vulners AI Score7.3
11