Test für offenen Port 4711 in Greenbone/OpenVAS: Unterschied zwischen den Versionen
| Zeile 1: | Zeile 1: | ||
| − | = | + | = Open Port 4711 Detection (korrigierte NASL-VT) = |
| − | Diese | + | 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 == |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | = | + | {| 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 | ||
| + | |} | ||
| − | == | + | == Das korrigierte Skript == |
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | ;Skript anlegen | |
| − | + | *vi check_port_4711.nasl | |
| − | < | + | <pre> |
| − | # | + | # check_port_4711.nasl |
| − | # | + | # Erkennt, ob TCP-Port 4711 offen ist (korrigierte Fassung) |
if(description) | if(description) | ||
{ | { | ||
| − | script_oid("1.3.6.1.4.1.25623.1. | + | # Eigene Arc - NICHT .1.0. (gehört Greenbone). Nur lokal eindeutig. |
| − | script_version(" | + | script_oid("1.3.6.1.4.1.25623.1.7.4711001"); |
| − | script_tag(name:" | + | script_version("2026-06-24T00:00:00+0000"); |
| − | script_tag(name:" | + | 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_name("Open Port 4711 Detection"); | ||
| − | |||
script_category(ACT_GATHER_INFO); | script_category(ACT_GATHER_INFO); | ||
| − | |||
script_family("Service detection"); | script_family("Service detection"); | ||
| − | + | script_copyright("Copyright (C) 2026 Thomas / Xinux"); | |
| − | |||
| − | script_tag(name:" | + | # Ein offener Port allein ist kein kritischer Befund -> Info-Level. |
| − | script_tag(name:" | + | script_tag(name:"cvss_base", value:"0.0"); |
| − | script_tag(name:"solution", value:" | + | 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); | ||
} | } | ||
| − | + | port = 4711; | |
| − | + | ||
| + | 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. | ||
| − | + | == 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 <code>log_message</code> 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. <code>levels=hmlg</code>). |
| − | |||
| − | |||
| − | </ | ||
| − | === | + | == Wenn der Port laut Vorgabe verboten ist == |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | Soll 4711 per Policy '''nicht''' offen sein, wird aus der Info ein Finding. Dann | |
| − | + | <code>log_message</code> durch <code>security_message</code> ersetzen und eine '''ehrliche''' | |
| − | + | Severity setzen, die zum tatsächlichen Risiko des dahinterliegenden Dienstes passt – | |
| − | + | nicht pauschal 7.5 wie im kaputten Original: | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | <pre> | |
| − | + | # statt log_message: | |
| − | + | security_message(port:port, | |
| − | + | data:"TCP-Port 4711 ist offen, entgegen der Vorgabe. Bitte schließen.", | |
| − | + | proto:"tcp"); | |
| − | + | </pre> | |
| − | |||
| − | |||
| − | + | und im Description-Block z.B. <code>cvss_base</code> 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 | ||
| + | *<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
- Configuration → Port Lists → sicherstellen, dass 4711 im Portbereich liegt
- (eigene Portliste mit
T:4711oder einen Bereich, der 4711 enthält).
- (eigene Portliste mit
- 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 → 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.