# Custom Scripts

Sie können die von uns eingepflegten Checks durch eigene Skripte erweitern, um den Funktionsumfang des Penetrationstests nochmals zu erweitern. Die Skripte hinterlegen Sie direkt auf dem Linux-Server, auf dem der Hacktor installiert ist.

{% hint style="info" %}
Um Custom Scripts hinzuzufügen brauchen Sie Administrationsrechte auf dem Server/der VM, auf dem die Softwarekomponente Hacktor installiert ist.
{% endhint %}

## Custom Script hinzufügen

Gehen Sie folgendermaßen vor, um ein eigenes Skript hinzuzufügen:

1\. Navigieren Sie in den Ordner `scripts`.

```
cd /opt/enginsight/hacktor/scripts
```

2\. Legen Sie eine Datei für das Custom Script an. Der Dateiname muss dem folgendem Schema entsprechen: `<runtime>_<severity>_name.extension,` z.B. `python2_critical_CVE1234.py` oder `ruby_ok_my custom script.rb`.

Unterstützte Runtimes:

* `bash`
* `python2`
* `python3`
* `ruby`

Unterstützte Severities (Dringlichkeit):

* `ok`
* `low`
* `medium`
* `high`
* `critical`

```
nano <runtime>_<severity>_name.extension
```

3\. Fügen Sie Ihr Skript, das Sie gemäß der [Richtlinien](https://docs.enginsight.com/docs/bedienung/plattform/penetrationstests/..#richtlinien-fuer-custom-scripts) erstellt haben, ein.

4\. Speichern und schließen Sie die Datei.

5\. Machen Sie Ihre angelegte Datei für Hacktor ausführbar.

```
chmod 755 <filename>
```

6\. Starten Sie Hacktor neu.

```
systemctl restart ngs-hacktor
```

## Richtlinien für Custom Scripts

Damit Hacktor das Ergebnis des Custom Scripts auslesen kann, muss die folgende Konvention für den Exit Code eingehalten werden.

| Status  | Exit Code     | Beschreibung                                 |
| ------- | ------------- | -------------------------------------------- |
| passed  | `exit code 0` | Der Check ist bestanden.                     |
| error   | `exit code 1` | Der Check hat nicht funktioniert.            |
| skipped | `exit code 5` | Der Check ist für das Zielsystem irrelevant. |
| failed  | `exit code 9` | Das Zielsystem ist verwundbar.               |

Jeder andere exit code wird wie `error` behandelt.

Unabhängig vom Check Status werden `stdout` und `stderr` im Audit ausgegeben. Ab 1024 Zeichen wird der Output abgeschnitten.

![](https://3532046264-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LTMe1v0eboWCAUTQHbT%2F-MdpkqJukKtV2uDBsbOa%2F-MdplgYxmJRyMo6fdpcf%2Fcoustom_script_stout.png?alt=media\&token=5429511c-b98d-4b1f-b911-0ecb22cc8406)

Das erste Argument ist immer der `hostname`, das zweite bis n (2-n) sind immer die offenen Ports.

### Muster

#### python2, python3

```
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'
```

#### ruby

```
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"
```

#### bash

```
#!/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
```

## Eigenen Titel und Empfehlungstext hinzufügen

Optional können Sie einen eigenen Titel hinterlegen, der im Audit Ihren im Dateinamen hinterlegten Titel ersetzt. Außerdem können Sie eine Empfehlung hinterlegen, wie mit der Schwachstelle umzugehen ist.

1\. Öffnen Sie die Datei `descriptions.json`.

```
nano /opt/enginsight/hacktor/scripts/descriptions.json
```

Fügen Sie die Informationen nach folgendem Schema ein:

```
{
    <filenameA>":{
        "title":"<check title>",
        "recommendation":"<recommendation on how to fix>"
    },
    "<filenameB>":{
        "title":"<check title>",
        "recommendation":"<recommendation on how to fix>"
    }
}
```

2\. Speichern und schließen Sie die Datei.

3\. Starten Sie Hacktor neu.

```
systemctl restart ngs-hacktor
```

## Custom Script ausführen

Um ein Custom Script für einen Penetrationstest zu nutzen, fügen Sie das Skript einfach gemäß der Anleitung zum entsprechenden Hacktor hinzu. Achten Sie außerdem darauf, in den erweiterten Einstellungen der [Audit Defintionen](https://docs.enginsight.com/docs/bedienung/plattform/penetrationstests/vorlagen) die Ausführung von Custom Scripts zu erlauben.

<figure><img src="https://3532046264-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LTMe1v0eboWCAUTQHbT-3758922206%2Fuploads%2F8C6PhWUF85KLViUrwDqg%2FCustom%20Script%20ausf%C3%BChren.png?alt=media&#x26;token=d9923fe5-566c-4638-9ad7-643866a17d97" alt=""><figcaption></figcaption></figure>
