
Tool zur Sammlung von Artefakten für *nix-Systeme
fennec ist ein Tool zur Sammlung von Artefakten, geschrieben in Rust, das bei der Incident Response auf *nix-basierten Systemen eingesetzt wird. fennec ermöglicht es Ihnen, eine Konfigurationsdatei zu schreiben, die festlegt, wie Artefakte gesammelt werden.
fennec 0.4.1 AbdulRhman Alfaifi [email protected] Aritfact collection tool for *nix systems
USAGE: fennec [OPTIONS]
OPTIONS: -c, --config Sets a custom config file (Embedded : true)
-o, --output <FILE>
Sets output file name [default: ABDULRHMAN-PC.zip]
-l, --log-level <LEVEL>
Sets the log level [default: info] [possible values: trace, debug, info, error]
-f, --log-file <FILE>
Sets the log file name [default: fennec.log]
-u, --upload-artifact <CONFIG>...
Upload configuration string. Supported Protocols:
* s3 : Upload artifact package to S3 bucket (ex. minio)
* Format :
s3://<ACCESS_KEY>:<SECRET_ACCESS_KEY>@(http|https)://<HOSTNAME>:<PORT>/<BUCKET_NAME>:<PATH>
* Example (minio): s3://minioadmin:minioadmin@http://192.168.100.190:9000/fennec:/
* aws3 : Upload artifact package to AWS S3 bucket
* Format : aws3://<ACCESS_KEY>:<SECRET_ACCESS_KEY>@<AWS_REGOIN>.<BUCKET_NAME>:<PATH>
* Example: aws3://AKIAXXX:[email protected]:/
* scp : Upload artifact package to a server using SCP protocol
* Format : scp://<USERNAME>:<PASSWORD>@<HOSTNAME>:<PORT>:<PATH>
* Example: scp://testusername:[email protected]:22:/dev/shm
-q, --quiet
Do not print logs to stdout
-t, --timeout <SEC>
Sets osquery queries timeout in seconds [default: 60]
-h, --help
Print help information
--non-root
Run Fennec with non root permisions. This isn't recommended, most artifacts require root
permissions
--osquery-path <PATH>
Sets osquery path, if osquery is embedded it will be writen to this path otherwise the
path will be used to spawn osquery instance (Embedded : true) [default: ./osqueryd]
--output-format <FORMAT>
Sets output format [default: jsonl] [possible values: jsonl, csv, kjson]
--show-config
Show the embedded configuration file
--show-embedded
Show the embedded files metadata
-V, --version
Print version information
* `-c`, `--config` : Verwende die angegebene Konfigurationsdatei anstelle der eingebetteten Konfiguration
* `-f`, `--log-file` : Ändere den Standardnamen der Logdatei (Standard: `fennec.log`)
* `-h`, `--help` : Hilfemeldung ausgeben
* `-l`, `--log-level` : Ändere den Standard-Loglevel (Standard: `info`)
* `-o`, `--output` : Ändere den Standard-Dateinamen der Zip-Datei (Standard: `{HOSTNAME}.zip`, wobei der Hostname der zur Laufzeit ermittelte Rechnername ist)
* `--osquery-path` : Pfad zur osquery-Ausführungsdatei. Dieser Wert wird basierend auf folgenden Bedingungen verwendet:
* Wenn die osquery-Binärdatei in `fennec` eingebettet ist, extrahiere sie und speichere sie unter `--osquery-path`
* Wenn osquery nicht in `fennec` eingebettet ist, verwende die osquery-Binärdatei unter dem Pfad `--osquery-path`
* `--output-format` : Wähle das Ausgabeformat. Unterstützte Formate:
* jsonl : JSON-Objekte, durch Zeilenumbrüche getrennt (Standard)
* csv: Kommagetrennte Werte
* kjson: Verwende dieses Format, wenn du die resultierende Datei auf die [Kuiper](https://github.com/DFIRKuiper/Kuiper) Analyseplattform hochladen möchtest.
* `-q`, `--quiet` : Logs nicht auf `stdout` ausgeben
* `--non-root`: Fennec mit Nicht-Root-Berechtigungen ausführen. Standardmäßig benötigt Fennec `root`-Berechtigungen und wird bei fehlenden Root-Rechten mit einer Fehlermeldung beendet.
* `--show-config` : Die eingebettete Konfiguration ausgeben und dann beenden
* `--show-embedded` : Eingebettete Dateien anzeigen
* `-t`, `--timeout` : Setzt das Timeout in Sekunden für jede osquery im Abfrage-Artefakt-Typ
* `-u`, `--upload-artifact` : Artefaktpaket auf einen entfernten Server hochladen. Unterstützte Protokolle:
* `s3` : Artefaktpaket in einen S3-Bucket hochladen
* `Format` : s3://<ACCESS_KEY>:<SECRET_ACCESS_KEY>@(http|https)://<HOSTNAME>:<PORT>/<BUCKET_NAME>:<PATH>
* `Beispiel`: s3://minioadmin:minioadmin@http://192.168.100.190:9000/fennec:/
* `aws3` : Artefaktpaket in einen AWS-S3-Bucket hochladen
* `Format` : aws3://<ACCESS_KEY>:<SECRET_ACCESS_KEY>@<AWS_REGOIN>.<BUCKET_NAME>:<PATH>
* `Beispiel`: aws3://AKIAXXXXXXXXXXXXXXXXX:[email protected]:/
* `scp` : Artefaktpaket mit dem SCP-Protokoll auf einen Server hochladen
* `Format` : scp://`<USERNAME>`:`<PASSWORD>`@`<HOSTNAME>`:`<PORT>`:`<PATH>`
* `Beispiel`: scp://testusername:[email protected]:22:/dev/shm
* `-V`, `--version` : `fennec`-Version ausgeben und dann beenden
## Mit Abhängigkeiten kompilieren 👨💻
fennec benötigt `osquery`, um Artefakte vom Typ `query` auszuführen. Das Verzeichnis `deps` enthält die Datei, die abhängig vom Zielbetriebssystem und der Zielarchitektur in die Binärdatei eingebettet wird. Vor dem Kompilieren befolge die folgenden Schritte:
* Ändere bei Bedarf die Konfigurationsdatei `deps/<TARGET_OS>/fennec.yaml`
* Erstelle die Binärdatei mit einem der folgenden Befehle:
* dynamisch verknüpft: ```bash
cargo build --release
Sie können auch die vorkompilierten Binärdateien im Release-Bereich verwenden.
Das Folgende ist ein Beispiel, das auf Ubuntu 20 mit den gleichen Konfigurationen in diesem Repository ausgeführt wurde:

Um Daten im von Kuiper unterstützten Format auszugeben, führen Sie Fennec mit dem folgenden Argument aus:```bash sudo ./fennec --output-format kjson
oder fügen Sie Folgendes zum Abschnitt `args` in der Konfiguration hinzu:```yaml
args:
- "--output-format"
- "kjson"
neu kompilieren und dann ausführen:```bash sudo ./fennec
laden Sie dann die resultierende ZIP-Datei in Kuiper hoch, das folgende ist ein Beispiel:

## Konfiguration🔨
Standardmäßig wird die Konfiguration im Pfad `deps/<TARGET_OS>/fennec.yaml` während der Kompilierung in die ausführbare Datei eingebettet. Die Konfiguration ist im YAML-Format und hat zwei Abschnitte:
### Args
enthält eine Liste von Argumenten, die der ausführbaren Datei als Befehlszeilenargumente übergeben werden. Das folgende ist ein Beispiel für den Abschnitt `args`, der das Ausgabeformat auf `jsonl` und den Logdateinamen auf `fennec.log` setzt:```yaml
args:
- "--output-format"
- "jsonl"
- "--log-file"
- "fennec.log"
...
Die Befehlszeilenargumente werden in der folgenden Priorität verwendet:
Enthält eine Liste der zu sammelnden Artifacts. Jedes Artifact enthält die folgenden Felder:
stdout im Fall von command-ArtifactsFührt osquery SQL-Abfragen aus. Das folgende Beispiel-Artifact ruft alle Benutzer auf dem System ab:```yaml artifacts:
#### Artifact Types: Collection
Dieser Artefakt-Typ sammelt die im Feld **paths** angegebenen Dateien/Ordner. Das Folgende ist ein Beispiel für diesen Artefakt-Typ, der Systemprotokolle sammelt:```yaml
artifacts:
- name: logs
type: collection
description: "Collect system logs"
paths:
- '/var/log/**/*'
...
Führen Sie Systembefehle mit dem Shell-Befehlsinterpreter in der folgenden Priorität aus:
Dies ist ein Beispiel für diesen Artefakttyp, der fehlgeschlagene Anmeldungen abruft:```yaml artifacts:
Dieser Artefakttyp führt die Befehle in der Liste `commands` aus und parst die `stdout`-Ausgabe mit dem im Feld `regex` angegebenen regulären Ausdruck. Beachten Sie, dass der reguläre Ausdruck nur auf dem `stdout`-Stream und nicht auf `stderr` verarbeitet wird. Das Feld `regex` ist optional. Hier ist ein Beispiel der Ergebnisse sowohl mit als auch ohne das `regex`-Feld:
##### Ohne `regex`-Feld```json
{
"line": 0,
"stdout": "root pts/1 2023-09-12T17:13:28+03:00 - 2023-09-12T17:13:28+03:00 (00:00)"
}
regex Feld```json{ "username": "root", "tty": "pts/1", "src_ip": null, "login_time": "2023-09-12 14:13:28", "logout_time": "2023-09-12T17:13:28+03:00", "duration": "00:00", "@timestamp": "2023-09-12 14:13:28" }
#### Artefakttypen: Parse
Dieser Artefakttyp bietet die Möglichkeit, Textdateien mit regulären Ausdrücken zu parsen und die Daten in strukturiertem Format zurückzugeben. Das folgende Beispiel parst Nginx-Zugriffslogs und gibt die Ergebnisse in strukturiertem Format zurück:```yaml
artifcats:
- name: nginx_access
type: parse
description: "Nginx access logs"
paths:
- /var/log/nginx/access.*
regex: '(?P<c_ip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) - (?P<remote_user>[^ ]+) \[(?P<time>[0-9]{2}/[a-zA-Z]{3}/[0-9]{4}:[0-9]{2}:[0-9]{2}:[0-9]{2} \+[0-9]{4})\] "(?P<method>[A-Z]+)?[ ]?(?P<uri>.*?)[ ]?(HTTP/(?P<http_prot>[0-9\.]+))?" (?P<status_code>[0-9]{3}) (?P<body_bytes_sent>[0-9]+) "(?P<referer>.*?)" "(?P<user_agent>.*?)"'
Diese Konfiguration liest die Dateien im Pfad /var/log/nginx/access.* zeilenweise und führt den regulären Ausdruck aus, um Felder zu extrahieren. Dieses Artefakt prüft auch, ob die Datei im gzip-Format vorliegt, das zum Komprimieren alter Logs zur Platzersparnis verwendet wird, und dekomprimiert und parst sie. Der reguläre Ausdruck sollte im benannten Gruppen-Format sein, wie in der Rust-Regex-Bibliothek dokumentiert. Im Folgenden ein Beispiel eines Nginx-Zugriffsprotokolls vor und nach dem Parsen:
* geparster Datensatz ```json
{
"c_ip": "192.168.133.70",
"remote_user": "-",
"time": "23/Jan/2022:19:14:37 +0000",
"method": "GET",
"uri": "/blog/",
"http_prot": "1.1",
"status_code": "200",
"body_bytes_sent": "2497",
"referer": "https://u0041.co/",
"user_agent": "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0",
"full_path": "/var/log/nginx/access.log.9.gz"
}
Dieses optionale Feld kann verwendet werden, um Ergebnis-Feldnamen zu ändern und eine Nachbearbeitung namens modifiers auf den Feldwert anzuwenden. Das folgende Beispiel zeigt die Ergebnisse für das Parsen eines Nginx-Zugriffsprotokolls ohne Maps:
* Originaldatensatz```verilog
192.168.133.70 - - [23/Jan/2022:19:14:37 +0000] "GET /blog/ HTTP/1.1" 200 2497 "https://u0041.co/" "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0"
Um den Feldnamen `time` in `@timestamp` zu ändern, fügen wir die folgende maps-Konfiguration zu den Artefaktkonfigurationen hinzu:```yaml
artifcats:
- name: nginx_access
type: parse
description: "Nginx access logs"
paths:
- /var/log/nginx/access.*
regex: '(?P<c_ip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) - (?P<remote_user>[^ ]+) \[(?P<time>[0-9]{2}/[a-zA-Z]{3}/[0-9]{4}:[0-9]{2}:[0-9]{2}:[0-9]{2} \+[0-9]{4})\] "(?P<method>[A-Z]+)?[ ]?(?P<uri>.*?)[ ]?(HTTP/(?P<http_prot>[0-9\.]+))?" (?P<status_code>[0-9]{3}) (?P<body_bytes_sent>[0-9]+) "(?P<referer>.*?)" "(?P<user_agent>.*?)"'
maps:
- from: time #change field name from
to: '@timestamp' # to this name
Nach dem Ausführen des Sammlungstools mit der Konfiguration auf demselben nginx-Zugriffsprotokoll erhalten wir die folgende Ausgabe:```json { "c_ip": "192.168.133.70", "remote_user": "-", "@timestamp": "23/Jan/2022:19:14:37 +0000", "method": "GET", "uri": "/blog/", "http_prot": "1.1", "status_code": "200", "body_bytes_sent": "2497", "referer": "https://u0041.co/", "user_agent": "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0", "full_path": "/var/log/nginx/access.log.9.gz" }
#### Modifikatoren
Modifikatoren bieten die Nachbearbeitung des Feldwerts der Artefaktergebnisse. Zum Beispiel die Neuformatierung von Datum und Uhrzeit. Fortführend am obigen Beispiel können wir das Datums- und Uhrzeitformat im Feld `@timestamp` in das Format `%Y-%m-%d %H:%M:%S` ändern. Wir können Folgendes zu den Artefaktkonfigurationen hinzufügen, um dies zu erreichen:```yaml
artifacts:
- name: nginx_access
type: parse
description: "Nginx access logs"
paths:
- /var/log/nginx/access.*
regex: '(?P<c_ip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) - (?P<remote_user>[^ ]+) \[(?P<time>[0-9]{2}/[a-zA-Z]{3}/[0-9]{4}:[0-9]{2}:[0-9]{2}:[0-9]{2} \+[0-9]{4})\] "(?P<method>[A-Z]+)?[ ]?(?P<uri>.*?)[ ]?(HTTP/(?P<http_prot>[0-9\.]+))?" (?P<status_code>[0-9]{3}) (?P<body_bytes_sent>[0-9]+) "(?P<referer>.*?)" "(?P<user_agent>.*?)"'
maps:
- from: time
to: "@timestamp"
modifier:
name: datetime_to_iso
parameters:
input_time_format: '%d/%b/%Y:%H:%M:%S %z'
output_time_format: '%Y-%m-%d %H:%M:%S'
Der resultierende Datensatz wird wie folgt aussehen:```json { "c_ip": "192.168.133.70", "remote_user": "-", "@timestamp": "2022-01-23 19:14:37", "method": "GET", "uri": "/blog/", "http_prot": "1.1", "status_code": "200", "body_bytes_sent": "2497", "referer": "https://u0041.co/", "user_agent": "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0", "full_path": "/var/log/nginx/access.log.9.gz" }
Die verfügbaren Modifikatoren sind:
| Name | Details | Eingabezeitformat | Ausgabezeitformat |
| ------------------------ | ------------------------------------------------------------ | -------------------------------------- | ------------------------------------------------------------ |
| epoch_to_iso | Konvertiert einen Epochen-Zeitstempel in ein benutzerdefiniertes Datums- und Zeitformat | N/A | geben Sie das Ausgabe-Datum-Uhrzeit-Format an, Standard ist `%Y-%m-%d %H:%M:%S` |
| datetime_to_iso | Formatiert Datum und Uhrzeit vom Format `input_time_format` in das Format `output_time_format` um | geben Sie das Eingabe-Datum-Uhrzeit-Format an | geben Sie das Ausgabe-Datum-Uhrzeit-Format an, Standard ist `%Y-%m-%d %H:%M:%S` |
| time_without_year_to_iso | Formatiert Datum und Uhrzeit ohne Jahresangaben vom Format `input_time_format` in das Format `output_time_format` um | geben Sie das Eingabe-Datum-Uhrzeit-Format an | geben Sie das Ausgabe-Datum-Uhrzeit-Format an, Standard ist `%Y-%m-%d %H:%M:%S` |
| to_int | Konvertiert Zeichenkettendaten (wie `command` & `parse` Artefakttypen) in Ganzzahlen (`i64` d.h. vorzeichenbehaftete 64-Bit-Ganzzahl). Dies ist nützlich für Felder wie die Dateigröße, um Prüfungen wie `size < 1024` mit der von uns gewählten Datenplattform durchzuführen | N/A | N/A |
Der Modifikator `time_without_year_to_iso` funktioniert wie folgt:
* Füge das aktuelle Jahr hinzu und prüfe dann, ob die Parserzeit < aktuelle Zeit ist; wenn ja, ist es die richtige Zeit
* ansonsten ist es das vorherige Jahr
Dieser Modifikator geht davon aus, dass die Logs für **NUR** ein Jahr sind, verwenden Sie diesen Modifikator mit Vorsicht.
| Betriebssystemdetails | Architektur | Erfolg? | Details |
|---|
| Ubuntu 20.04.3 LTS | x86_64 | ✅ | |
| Ubuntu 19.04 | x86_64 | ✅ | |
| Ubuntu 18.04.6 LTS | x86_64 | ✅ | |
| Ubuntu 17.04 | x86_64 | ✅ | |
| Ubuntu 16.04.7 LTS | x86_64 | ✅ | |
| Ubuntu 15.10 | x86_64 | ✅ | |
| Ubuntu 14.04.6 LTS | x86_64 | ✅ | |
| Ubuntu 13.04 | x86_64 | ✅ | |
| Ubuntu 12.04.5 LTS | x86_64 | ✅ | |
| CentOS 8.4.2105 | x86_64 | ✅ | |
| CentOS 7.9.2009 | x86_64 | ✅ | |
| CentOS 6.10 | x86_64 | ✅ | |
| CentOS 5.11 | x86_64 | ❌ | osquery erfordert libc >= 2.12 |
| Ubuntu 20.04 | aarch64 | ✅ | |
| MacOS Monterey v12.0.1 | x86_64 | ✅ | Konfigurationsanpassung erforderlich. Wenn Sie Erfahrung mit MacOS-Artefakten haben, können Sie gerne beitragen |
| Oracle Linux Server 7.9 | x86_64 | ✅ |