Test für offenen Port 4711 in Greenbone/OpenVAS: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Zeile 1: Zeile 1:
= NASL NVT für Port 4711 unter Greenbone erstellen =
+
= Open Port 4711 Detection (korrigierte NASL-VT) =
  
Diese Anleitung beschreibt, wie ein NASL (Nessus Attack Scripting Language) Network Vulnerability Test (NVT) für die Greenbone Community Edition erstellt wird, um zu prüfen, ob Port 4711 offen ist, und bei Offenheit eine kritische Meldung ausgibt. Die Schritte sind für den Benutzer `_gvm` optimiert, der standardmäßig in Greenbone verwendet wird.
+
Diese VT prüft, ob TCP-Port 4711 offen ist. Sie ist die '''korrigierte Fassung''' einer
 +
verbreiteten, generierten Anleitung, die so nie lief. Die Fehler des Originals sind
 +
unten dokumentiert – als Lehrstück, warum „sieht plausibel aus" und „läuft" zwei
 +
verschiedene Dinge sind.
  
== Voraussetzungen ==
+
== Was am Original kaputt war ==
* Greenbone Community Edition (oder vergleichbare Installation) mit dem Benutzer `_gvm`.
 
* Schreibrechte im Plugin-Verzeichnis `/var/lib/openvas/plugins/`.
 
* Ein Texteditor wie `nano` oder `vim`.
 
* Synchronisierte NVTs:
 
  <source lang="bash">
 
  sudo -u _gvm greenbone-nvt-sync
 
  </source>
 
* Grundkenntnisse in NASL (siehe [http://www.openvas.org/nasl.html OpenVAS NASL-Referenz]).
 
  
== Schritte ==
+
{| class="wikitable"
 +
! Fehler !! Original !! Korrekt
 +
|-
 +
| OID in Greenbones Raum || <code>1.3.6.1.4.1.25623.1.0.150001</code> || eigene Arc <code>...1.7.</code> – die <code>.1.0.</code> gehört Greenbone und kollidiert beim Feed-Sync
 +
|-
 +
| Totes Sync-Kommando || <code>greenbone-nvt-sync</code> || veraltet → <code>greenbone-feed-sync</code> (für den offiziellen Feed)
 +
|-
 +
| Erfundenes Kommando || <code>gvmd --rebuild</code> || existiert nicht → <code>openvas --update-vt-info</code> + ospd-openvas-Neustart
 +
|-
 +
| Selbst-aushebelnder Trigger || <code>script_require_ports("Services/unknown", 4711)</code> || läuft nur, wenn der Port als ''unbekannt'' gilt; erkennt find_service einen Dienst, läuft die VT nie → nur <code>script_require_ports(4711)</code>
 +
|-
 +
| Doppelte Port-Abfrage || <code>get_port_state</code> zweimal, totes <code>exit(99)</code> || eine Abfrage, sauberer Pfad
 +
|-
 +
| Severity erfunden || <code>cvss_base 7.5</code> für „Port offen" || ein offener Port ist für sich '''kein''' kritischer Befund → Info/Log, Eskalation nur bei konkreter Vorgabe
 +
|}
  
=== 1. NASL-Skript erstellen ===
+
== Das korrigierte Skript ==
Erstelle eine Datei `check_port_4711.nasl` im Plugin-Verzeichnis:
 
<source lang="bash">
 
sudo -u _gvm vim /var/lib/openvas/plugins/check_port_4711.nasl
 
</source>
 
  
Füge den folgenden NASL-Code ein:
+
;Skript anlegen
 
+
*vi check_port_4711.nasl
<source lang="nasl">
+
<pre>
# SPDX-FileCopyrightText: 2025 Dein Name <dein.email@example.com>
+
# check_port_4711.nasl
# SPDX-License-Identifier: GPL-2.0-or-later
+
# Erkennt, ob TCP-Port 4711 offen ist (korrigierte Fassung)
  
 
if(description)
 
if(description)
 
{
 
{
   script_oid("1.3.6.1.4.1.25623.1.0.150001"); # Eindeutige OID
+
  # Eigene Arc - NICHT .1.0. (gehört Greenbone). Nur lokal eindeutig.
   script_version("2025-08-08T19:32:00+0000");
+
   script_oid("1.3.6.1.4.1.25623.1.7.4711001");
   script_tag(name:"last_modification", value:"2025-08-08 19:32:00 +0000 (Fri, 08 Aug 2025)");
+
   script_version("2026-06-24T00:00:00+0000");
   script_tag(name:"creation_date", value:"2025-08-08 19:32:00 +0000 (Fri, 08 Aug 2025)");
+
   script_tag(name:"creation_date", value:"2026-06-24 10:00:00 +0000 (Tue, 24 Jun 2026)");
  script_tag(name:"cvss_base", value:"7.5"); # Kritischer Schweregrad
+
   script_tag(name:"last_modification", value:"2026-06-24 10:00:00 +0000 (Tue, 24 Jun 2026)");
  script_tag(name:"cvss_base_vector", value:"AV:N/AC:L/Au:N/C:P/I:P/A:P");
 
  script_tag(name:"qod_type", value:"remote_banner");
 
 
 
 
   script_name("Open Port 4711 Detection");
 
   script_name("Open Port 4711 Detection");
 
 
   script_category(ACT_GATHER_INFO);
 
   script_category(ACT_GATHER_INFO);
  script_copyright("Copyright (C) 2025 Dein Name");
 
 
   script_family("Service detection");
 
   script_family("Service detection");
   script_dependencies("find_service.nasl");
+
   script_copyright("Copyright (C) 2026 Thomas / Xinux");
  script_require_ports("Services/unknown", 4711);
 
  
   script_tag(name:"summary", value:"Prüft, ob Port 4711 offen ist und gibt eine kritische Meldung aus.");
+
  # Ein offener Port allein ist kein kritischer Befund -> Info-Level.
   script_tag(name:"impact", value:"Ein offener Port 4711 kann auf eine unsichere Konfiguration hinweisen und Angreifern Zugriff ermöglichen.");
+
   script_tag(name:"cvss_base", value:"0.0");
   script_tag(name:"solution", value:"Schließen Sie Port 4711 oder beschränken Sie den Zugriff durch eine Firewall.");
+
  script_tag(name:"qod_type", value:"remote_active");
 +
 
 +
   script_tag(name:"summary", value:"Prüft, ob TCP-Port 4711 offen ist.");
 +
   script_tag(name:"solution", value:"Port 4711 schließen oder per Firewall
 +
einschränken, falls nicht benötigt.");
 
   script_tag(name:"solution_type", value:"Mitigation");
 
   script_tag(name:"solution_type", value:"Mitigation");
  
 +
  # Läuft, sobald 4711 als offen bekannt ist - unabhängig von der Service-Erkennung.
 +
  script_require_ports(4711);
 
   exit(0);
 
   exit(0);
 
}
 
}
  
include("host_details.inc");
+
port = 4711;
include("port_service_func.inc");
+
 
 +
if(!get_port_state(port))
 +
  exit(0);
  
port = 4711;
+
log_message(port:port, data:"TCP-Port 4711 ist offen.", proto:"tcp");
 +
exit(0);
 +
</pre>
 +
 
 +
== Syntax prüfen ==
 +
 
 +
;Vor dem Deployen linten:
 +
*openvas-nasl-lint check_port_4711.nasl
 +
 
 +
== Deployment ins Feed ==
 +
 
 +
;Skript ablegen (lesbar für den Scanner-User)
 +
*sudo install -d -o _gvm -g _gvm -m 0755 /var/lib/openvas/plugins/custom
 +
*sudo install -o _gvm -g _gvm -m 0644 check_port_4711.nasl /var/lib/openvas/plugins/custom/check_port_4711.nasl
 +
;NVTI-Cache neu aufbauen
 +
*sudo runuser -u _gvm -- openvas --update-vt-info
 +
;Scanner neu laden
 +
*sudo systemctl restart ospd-openvas
 +
 
 +
Pfad/Username ggf. an die Distro anpassen (<code>plugins_folder</code> in
 +
<code>/etc/openvas/openvas.conf</code> prüfen).
 +
 
 +
== Scan konfigurieren ==
 +
 
 +
# '''Configuration → Port Lists''' → sicherstellen, dass 4711 im Portbereich liegt
 +
#: (eigene Portliste mit <code>T:4711</code> oder einen Bereich, der 4711 enthält).
 +
# '''Scans → Tasks''' → Task mit Ziel-IP und dieser Portliste anlegen.
 +
# Scan starten, Report unter '''Scans → Reports''' prüfen.
 +
 
 +
Ohne 4711 in der Portliste wird der Port nie gescannt → <code>script_require_ports(4711)</code>
 +
plant die VT nicht ein. Das ist der häufigste „läuft nicht"-Grund.
  
if(!get_port_state(port)) {
+
== Verifikation ==
  exit(0); # Port geschlossen
 
}
 
  
if(get_port_state(port)) {
+
;Erst von Hand prüfen, ob der Port überhaupt offen ist:
  security_message(
+
*nmap -p 4711 <ziel-ip>
    port:port,
+
;VT eingelesen? SecInfo → NVTs nach Name oder OID suchen.
    data:"Der Port 4711 ist offen. Dies stellt ein kritisches Sicherheitsrisiko dar, da ungeschützte Dienste auf diesem Port ausgenutzt werden können.",
 
    proto:"tcp"
 
  );
 
  exit(0);
 
}
 
  
exit(99);
+
== Stolperfalle: Log-Level im Report ==
</source>
 
  
=== 2. Skript speichern und Berechtigungen setzen ===
+
Der Treffer kommt über <code>log_message</code> und erscheint mit Severity '''Log (0.0)'''.
* Speichere die Datei (`Ctrl+O`, `Ctrl+X` in `nano`).
+
Die Standard-Reportansicht blendet Log-Meldungen oft aus – wer nur nach Medium/High
* Überprüfe die Berechtigungen:
+
filtert, denkt, der Check sei nicht gelaufen. Im Report-Filter die Stufe '''Log'''
<source lang="bash">
+
einschalten (z.B. <code>levels=hmlg</code>).
sudo chown _gvm:_gvm /var/lib/openvas/plugins/check_port_4711.nasl
 
sudo chmod 644 /var/lib/openvas/plugins/check_port_4711.nasl
 
</source>
 
  
=== 3. NVT-Datenbank aktualisieren ===
+
== Wenn der Port laut Vorgabe verboten ist ==
Aktualisiere die OpenVAS-Datenbank als `_gvm`-Benutzer:
 
<source lang="bash">
 
sudo -u _gvm openvas --update-vt-info
 
</source>
 
Falls erforderlich, lade die Plugins neu:
 
<source lang="bash">
 
sudo -u _gvm gvmd --rebuild
 
</source>
 
  
=== 4. Scan konfigurieren und ausführen ===
+
Soll 4711 per Policy '''nicht''' offen sein, wird aus der Info ein Finding. Dann
# Öffne die Greenbone Security Assistant (GSA) im Browser (z. B. `https://<deine-ip>:9392`).
+
<code>log_message</code> durch <code>security_message</code> ersetzen und eine '''ehrliche'''
# Erstelle eine neue **Scan-Konfiguration**:
+
Severity setzen, die zum tatsächlichen Risiko des dahinterliegenden Dienstes passt –
#* Gehe zu ''Configuration > Scan Configs''.
+
nicht pauschal 7.5 wie im kaputten Original:
#* Wähle oder erstelle ein Profil (z. B. "Full and fast").
 
#* Aktiviere die NVT-Familie ''Service detection'' und stelle sicher, dass das Skript ''Open Port 4711 Detection'' ausgewählt ist.
 
# Erstelle eine **Task** unter ''Scans > Tasks'':
 
#* Gib das Ziel (IP-Adresse) ein.
 
#* Stelle sicher, dass Port 4711 in der Portliste enthalten ist (z. B. `T:4711`).
 
# Starte den Scan und überprüfe die Ergebnisse unter ''Scans > Reports''.
 
  
== Fehlerbehebung ==
+
<pre>
* '''Skript nicht erkannt''': Teste die Syntax:
+
   # statt log_message:
  <source lang="bash">
+
   security_message(port:port,
   sudo -u _gvm openvas-nasl -t /var/lib/openvas/plugins/check_port_4711.nasl
+
    data:"TCP-Port 4711 ist offen, entgegen der Vorgabe. Bitte schließen.",
   </source>
+
    proto:"tcp");
* '''Port wird nicht geprüft''': Stelle sicher, dass Port 4711 in der Scan-Konfiguration enthalten ist (''Configuration > Port Lists'').
+
</pre>
* '''Keine Meldung''': Überprüfe mit `nmap -p 4711 <ziel-ip>`, ob der Port offen ist.
 
* '''Berechtigungsfehler''': Stelle sicher, dass alle Aktionen als `_gvm` ausgeführt werden.
 
  
== Erweiterungen ==
+
und im Description-Block z.B. <code>cvss_base</code> auf einen begründbaren Wert
* '''Banner-Prüfung''': Füge `get_tcp_banner(port:port)` hinzu, um den Dienst auf Port 4711 zu identifizieren.
+
(etwa 2.0–4.0 für „unerwarteter offener Port"), nicht aus der Luft gegriffen.
* '''CVSS-Anpassung''': Ändere `cvss_base` (z. B. auf 10.0 für maximale Kritikalität) je nach Bedrohung.
 
* '''Erweiterte Logik''': Prüfe spezifische Schwachstellen des Dienstes auf Port 4711.
 
  
== Hinweise ==
+
== Cybersec-2 Einordnung ==
* '''OID-Eindeutigkeit''': Verwende eine eindeutige OID, z. B. `1.3.6.1.4.1.25623.1.0.<eigene_nummer>`.
 
* Konsultiere die [http://www.openvas.org/nasl.html OpenVAS NASL-Referenz] für weitere Funktionen.
 
* Teste das Skript in einer kontrollierten Umgebung, bevor es in einer Produktionsumgebung eingesetzt wird.
 
  
== Siehe auch ==
+
Didaktischer Doppelnutzen:
* [[Greenbone Community Edition]]
 
* [[OpenVAS]]
 
* [[NASL]]
 
  
[[Kategorie:Greenbone]]
+
;Korrektheit vs. Plausibilität
[[Kategorie:NASL]]
+
*Das generierte Original liest sich sauber und läuft trotzdem nicht. Vier Showstopper
[[Kategorie:Sicherheit]]
+
(OID-Arc, totes Sync-Kommando, erfundenes gvmd-Flag, selbst-aushebelnder Trigger) plus
 +
erfundene Severity. Ideal, um Studierenden beizubringen: generierten Code immer testen.
 +
;Severity-Disziplin
 +
*„Port offen = kritisch 7.5" ist genau die Art Übertreibung, die ein Audit unbrauchbar
 +
macht. Befund-Schwere muss begründbar sein.
 +
;Trigger-Verständnis
 +
*<code>require_ports(4711)</code> vs. <code>require_ports("Services/unknown", 4711)</code>
 +
zeigt, wie stark das Scheduling davon abhängt, was der Service-Scanner vorher entschieden hat.

Version vom 24. Juni 2026, 04:55 Uhr

Open Port 4711 Detection (korrigierte NASL-VT)

Diese VT prüft, ob TCP-Port 4711 offen ist. Sie ist die korrigierte Fassung einer verbreiteten, generierten Anleitung, die so nie lief. Die Fehler des Originals sind unten dokumentiert – als Lehrstück, warum „sieht plausibel aus" und „läuft" zwei verschiedene Dinge sind.

Was am Original kaputt war

Fehler Original Korrekt
OID in Greenbones Raum 1.3.6.1.4.1.25623.1.0.150001 eigene Arc ...1.7. – die .1.0. gehört Greenbone und kollidiert beim Feed-Sync
Totes Sync-Kommando greenbone-nvt-sync veraltet → greenbone-feed-sync (für den offiziellen Feed)
Erfundenes Kommando gvmd --rebuild existiert nicht → openvas --update-vt-info + ospd-openvas-Neustart
Selbst-aushebelnder Trigger script_require_ports("Services/unknown", 4711) läuft nur, wenn der Port als unbekannt gilt; erkennt find_service einen Dienst, läuft die VT nie → nur script_require_ports(4711)
Doppelte Port-Abfrage get_port_state zweimal, totes exit(99) eine Abfrage, sauberer Pfad
Severity erfunden cvss_base 7.5 für „Port offen" ein offener Port ist für sich kein kritischer Befund → Info/Log, Eskalation nur bei konkreter Vorgabe

Das korrigierte Skript

Skript anlegen
  • vi check_port_4711.nasl
# check_port_4711.nasl
# Erkennt, ob TCP-Port 4711 offen ist (korrigierte Fassung)

if(description)
{
  # Eigene Arc - NICHT .1.0. (gehört Greenbone). Nur lokal eindeutig.
  script_oid("1.3.6.1.4.1.25623.1.7.4711001");
  script_version("2026-06-24T00:00:00+0000");
  script_tag(name:"creation_date", value:"2026-06-24 10:00:00 +0000 (Tue, 24 Jun 2026)");
  script_tag(name:"last_modification", value:"2026-06-24 10:00:00 +0000 (Tue, 24 Jun 2026)");
  script_name("Open Port 4711 Detection");
  script_category(ACT_GATHER_INFO);
  script_family("Service detection");
  script_copyright("Copyright (C) 2026 Thomas / Xinux");

  # Ein offener Port allein ist kein kritischer Befund -> Info-Level.
  script_tag(name:"cvss_base", value:"0.0");
  script_tag(name:"qod_type", value:"remote_active");

  script_tag(name:"summary", value:"Prüft, ob TCP-Port 4711 offen ist.");
  script_tag(name:"solution", value:"Port 4711 schließen oder per Firewall
einschränken, falls nicht benötigt.");
  script_tag(name:"solution_type", value:"Mitigation");

  # Läuft, sobald 4711 als offen bekannt ist - unabhängig von der Service-Erkennung.
  script_require_ports(4711);
  exit(0);
}

port = 4711;

if(!get_port_state(port))
  exit(0);

log_message(port:port, data:"TCP-Port 4711 ist offen.", proto:"tcp");
exit(0);

Syntax prüfen

Vor dem Deployen linten
  • openvas-nasl-lint check_port_4711.nasl

Deployment ins Feed

Skript ablegen (lesbar für den Scanner-User)
  • sudo install -d -o _gvm -g _gvm -m 0755 /var/lib/openvas/plugins/custom
  • sudo install -o _gvm -g _gvm -m 0644 check_port_4711.nasl /var/lib/openvas/plugins/custom/check_port_4711.nasl
NVTI-Cache neu aufbauen
  • sudo runuser -u _gvm -- openvas --update-vt-info
Scanner neu laden
  • sudo systemctl restart ospd-openvas

Pfad/Username ggf. an die Distro anpassen (plugins_folder in /etc/openvas/openvas.conf prüfen).

Scan konfigurieren

  1. Configuration → Port Lists → sicherstellen, dass 4711 im Portbereich liegt
    (eigene Portliste mit T:4711 oder einen Bereich, der 4711 enthält).
  2. Scans → Tasks → Task mit Ziel-IP und dieser Portliste anlegen.
  3. Scan starten, Report unter Scans → Reports prüfen.

Ohne 4711 in der Portliste wird der Port nie gescannt → script_require_ports(4711) plant die VT nicht ein. Das ist der häufigste „läuft nicht"-Grund.

Verifikation

Erst von Hand prüfen, ob der Port überhaupt offen ist
  • nmap -p 4711 <ziel-ip>
VT eingelesen? SecInfo → NVTs nach Name oder OID suchen.

Stolperfalle: Log-Level im Report

Der Treffer kommt über log_message und erscheint mit Severity Log (0.0). Die Standard-Reportansicht blendet Log-Meldungen oft aus – wer nur nach Medium/High filtert, denkt, der Check sei nicht gelaufen. Im Report-Filter die Stufe Log einschalten (z.B. levels=hmlg).

Wenn der Port laut Vorgabe verboten ist

Soll 4711 per Policy nicht offen sein, wird aus der Info ein Finding. Dann log_message durch security_message ersetzen und eine ehrliche Severity setzen, die zum tatsächlichen Risiko des dahinterliegenden Dienstes passt – nicht pauschal 7.5 wie im kaputten Original:

  # statt log_message:
  security_message(port:port,
    data:"TCP-Port 4711 ist offen, entgegen der Vorgabe. Bitte schließen.",
    proto:"tcp");

und im Description-Block z.B. cvss_base auf einen begründbaren Wert (etwa 2.0–4.0 für „unerwarteter offener Port"), nicht aus der Luft gegriffen.

Cybersec-2 Einordnung

Didaktischer Doppelnutzen:

Korrektheit vs. Plausibilität
  • Das generierte Original liest sich sauber und läuft trotzdem nicht. Vier Showstopper

(OID-Arc, totes Sync-Kommando, erfundenes gvmd-Flag, selbst-aushebelnder Trigger) plus erfundene Severity. Ideal, um Studierenden beizubringen: generierten Code immer testen.

Severity-Disziplin
  • „Port offen = kritisch 7.5" ist genau die Art Übertreibung, die ein Audit unbrauchbar

macht. Befund-Schwere muss begründbar sein.

Trigger-Verständnis
  • require_ports(4711) vs. require_ports("Services/unknown", 4711)

zeigt, wie stark das Scheduling davon abhängt, was der Service-Scanner vorher entschieden hat.