For the complete documentation index, see llms.txt. This page is also available as Markdown.
Wie kann ich bei Penetrationstests mit Enginsight benutzerdefinierte Skripte einsetzen?
Ein Penetrationstest ist ein geplanter und kontrolliert durchgeführter automatisierter Angriff auf die eigenen Systeme, um Schwachstellen gezielt aufzudecken. Penetrationstests werden mit der Enginsight Komponente Hacktor durchgeführt.
Enginsight stellt dafür eine umfangreiche Bibliothek an Checks zur Verfügung, die du zusätzlich durch benutzerdefinierte Skripte erweitern kannst. Diese Skripte werden direkt auf dem Linux-Server hinterlegt, auf dem der Hacktor installiert ist.
Im Folgenden zeigen wir dir, wie du benutzerdefinierte Skripte für Penetrationstests erstellst und für die Enginsight Plattform verfügbar machst.
Custom Script hinzufügen
Bitte beachte: Um benutzerdefinierte Skripte zu erstellen und auf der Enginsight Plattform nutzen zu können, benötigst du Administrator-Rechte für den Server, auf dem der Hacktor installiert ist.
Gehe folgendermaßen vor, um ein eigenes Skript für Penetrationstests hinzuzufügen:
1
Zum Skript-Ordner navigieren
Logge dich auf dem Linux-Server ein, auf dem der Hacktor, der das benutzerdefinierte Skript ausführen soll, installiert ist.
Navigiere mit folgendem Befehl in den Ordner scripts:
cd /opt/enginsight/hacktor/scripts
2
Skript-Datei anlegen
Lege mit folgendem Befehl eine Datei für das benutzerdefinierte Skript an:
Der Dateiname muss dabei dem folgendem Schema entsprechen: <Laufzeitumgebung>_<Schweregrad>_<Skriptname>.<Dateiendung>
Ersetze die Platzhalter in <> wie folgt:
Parameter
Beschreibung
<Laufzeitumgebung>
Lege die Laufzeitumgebung (Runtime Environment) fest, die du für dein Skript verwenden möchtest.
Folgende Laufzeitumgebungen werden unterstützt:
bash
python2
python3
ruby
<Schweregrad>
Lege den Schweregrad bzw. die Kritikalität fest, die angezeigt wird, wenn der im Skript definierte Check nicht bestanden wird.
Folgende Schweregrade werden unterstützt:
ok
low
medium
high
critical
<Skriptname>
Lege einen benutzerdefinierten Skriptnamen für dein Skript fest.
<Dateiendung>
Gib die Dateiendung an, die der festgelegten Laufzeitumgebung entspricht, also .sh für Bash-Skripte, .py für Python-Skripte und .rb für Ruby-Skripte.
Beispiel: python2_critical_meineigenesskript.py
3
Skript einfügen und speichern
Füge nun dein eigenes Skript ein. Dies muss den Richtlinien für Custom Scripts gemäß erstellt sein. Skript-Muster für die verschiedenen Laufzeitumgebungen findest du weiter unten.
Speichere die Datei (Strg + o) und bestätige den Speicherprozess. Schließe die Datei (Strg + x).
4
Skript-Datei für den Hacktor verfügbar machen
Sorge nun mit folgendem Befehl dafür, dass der Hacktor auf die neu angelegte Skript-Datei zugreifen und sie ausführen kann:
chmod 755 <Dateiname>
Der <Dateiname> entspricht dabei dem Namen, den du in Schritt 2 erstellt hast.
5
Den Hacktor neu starten
Starte den Hacktor mit folgendem Befehl neu, um die vorgenommenen Konfigurationen wirksam zu machen:
sudo systemctl restart ngs-hacktor
6
Erweiterte Einstellungen prüfen
Logge dich auf der Enginsight Plattform ein und navigiere zu Penetrationstests → Audit-Definition.
Klicke auf Audit-Definition hinzufügen in der rechten oberen Ecke der Audit-Übersicht, um eine neue Audit-Definition zu erstellen, oder bearbeite eine existierende Audit-Definition.
Klicke auf Erweiterte Einstellungen und stelle sicher, dass die Checkbox neben der Option Custom Scripts ausführen aktiviert ist.
Richtlinien für Custom Scripts
Für die Erstellung benutzerdefinierter Skripte gelten unabhängig von der Skriptsprache folgende Richtlinien:
Argumente
Argument 1 muss immer der Hostname sein. Die Argumente 2-n müssen die offenen Ports sein, die für das Ausführen des Skripts benötigt werden.
Exit-Code
Damit der Hacktor das Ergebnis des Checks auslesen kann, der mithilfe des Skripts durchgeführt wird, musst du die folgenden Konventionen für den Exit-Status-Code einhalten:
Status
Exit Code
Beschreibung
Passed
0
Der Check wurde bestanden.
Error
1
Der Check hat nicht funktioniert.
Skipped
5
Der Check ist für das Zielsystem irrelevant.
Failed
9
Der Check wurde nicht bestanden. Das Zielsystem ist verwundbar.
Bitte beachte: Jeder andere Exit-Code wird wie der Status Error behandelt.
Unabhängig vom Ergebnis des Checks werden die Standardausgabe stdout und die Fehlerausgabe stderr im Audit angezeigt. Ab 1024 Zeichen wird der Output abgeschnitten.
Muster für verschiedene Skriptsprachen
Python2 und Python3
Beispiel-Python-Skript für einen benutzerdefinierten Check
Ruby
Bash
Optional: Eigener Titel und Empfehlungstext für den Check
Optional kannst du für den Check, den du über das benutzerdefinierte Skript definiert hast, einen eigenen Titel hinterlegen. Dieser ersetzt im Audit den Titel, den du weiter oben in Schritt 2 im Dateinamen hinterlegt hast. Zudem kannst du eine Empfehlung hinterlegen, wie mit einer erkannten Schwachstelle umzugehen ist.
Gehe dazu folgendermaßen vor:
1
Die Description-Datei öffnen
Logge dich auf dem Linux-Server ein, auf dem du das oder die benutzerdefinierten Skripte hinterlegt hast.
Öffne mit folgendem Befehl die Datei description.json:
2
Titel und Empfehlung hinzufügen
Füge nun Titel und Empfehlung nach folgendem Schema ein:
Ersetze die Platzhalter in <> wie folgt:
Parameter
Beschreibung
<DateinameA>
Gib den Dateinamen an, den du weiter oben in Schritt 2 definiert hast.
<EigenerTitelCheck>
Lege einen benutzerdefinierten Titel für den Check fest, der in der Plattform angezeigt werden soll.
<EmpfehlungBehebung>
Gib eine Empfehlung an, wie die durch den Check überprüfte Schwachstelle behoben werden kann.
Speichere die Datei (Strg + o) und bestätige den Speicherprozess. Schließe die Datei (Strg + x).
3
Hacktor neu starten
Starte mit folgendem Befehl den Hacktor neu, um die Änderungen zu übernehmen:
import sys
print("Host:",sys.argv[1])
print("Ports:",sys.argv[2:])
print("Use 'sys.exit(1)' with error codes (1=error, 5=skipped, 9=failed) to determine check status")
sys.exit(9)
import socket
import sys
# This is an example script
# It checks if a host uses an OpenSSH implementation
host = sys.argv[1]
ports = sys.argv[2:]
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
if '22' in ports:
addr = (host, 22)
try:
sock.connect(addr)
except:
print >>sys.stderr, 'failed to connect'
sys.exit(1) # check has 'error' status
try:
message = 'SSH-2.0-Hacktor'
sock.sendall(message)
data = sock.recv(256)
print >>sys.stdout, "Banner: %s" % data
if 'OpenSSH' in data:
print >>sys.stdout, "Host uses OpenSSH implementation"
sock.close()
sys.exit(0)
else:
print >>sys.stdout, "Host does not use OpenSSH implementation."
sock.close()
sys.exit(9) # check is 'failed'
finally:
sock.close()
else:
print >>sys.stdout, 'host %s does not use port 22' % host
sys.exit(5) # check is 'skipped'
puts "Host: "+ARGV[0]
puts "Ports: "+ARGV.inspect[0..-1]
puts "Use 'exit(1)' with error codes (1=error, 5=skipped, 9=failed) to determine check status"
#!/bin/bash
echo "Host: $1"
shift # remove the first argument
echo "Shift. Then Ports:" "$@"
exit 5 # Use 'exit 1' with error codes (1=error, 5=skipped, 9=failed) to determine check status