Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
ubuntils — Python-CLI/TUI für die forensische Triage von Ubuntu-Systemen — erkennt und behebt Persistenzmechanismen mit Artefakterfassung, Zeitachsenkorrelation und Wazuh-Integration. | Kitploit
Tools/GitHubGitHub/asmitdesai/ubuntils
DefensivwerkzeugeManagement von Indicators of Compromise (IOC)PersistenzmechanismenSchwachstellenanalyseScripting & AutomatisierungKonfigurationsprüfungForensikDigitale ForensikIncident ResponseLog-Analyse
GitHub
113vor 1 TagNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
asmitdesai/ubuntils

ubuntils

Python-CLI/TUI für die forensische Triage von Ubuntu-Systemen — erkennt und behebt Persistenzmechanismen mit Artefakterfassung, Zeitachsenkorrelation und Wazuh-Integration.

Repository anzeigen
Teilen

ubuntils

Forensische Triage für laufende Ubuntu-Systeme — automatisierte Artefakterfassung, Persistenzerkennung und geführte Behebung in unter 5 Sekunden.

CI Python Tests Coverage License Arch Ubuntu Offline analysis Detection rules SIEM


Das Problem

Wenn Sie vermuten, dass ein Linux-System kompromittiert wurde, werden die ersten 30-40 Minuten üblicherweise damit verbracht, dieselben zehn Befehle nacheinander auszuführen: laufende Prozesse prüfen, nach seltsamen Cron-Jobs suchen, nach LD_PRELOAD greppen, authorized_keys auf neue Einträge scannen, sudoers auditieren. Jeder Schritt ist manuell, erfordert Kontextwechsel und ist unter Druck fehleranfällig. Verpassen Sie eine Quelle — etwa /etc/sudoers.d/ statt nur /etc/sudoers, oder Benutzer-Crontabs zusätzlich zu /etc/cron.d/ — und Sie haben ein unvollständiges Bild.

Bestehende Optionen lösen dies nicht sauber. lynis ist ein Härtungs-Auditor, kein Triage-Tool — es meldet Konfigurationsschwächen auf einem sauberen System und erzeugt Rauschen auf einem kompromittierten. chkrootkit und rkhunter prüfen auf bekannte Rootkit-Signaturen, sind aber blind für neuartige Persistenztechniken wie missbrauchte systemd-Timer oder legitim aussehende Cron-Einträge. Generische SIEM-Abfragen erfordern eine Log-Infrastruktur, die auf dem betrachteten System möglicherweise nicht existiert. Und Forensik-Suiten wie Volatility zielen auf Speicherabbilder ab, nicht auf eine Live-Shell auf einem laufenden Host.

Die Lücke ist ein Tool, das jetzt gerade auf dem laufenden System läuft, die gängigsten Persistenzvektoren abdeckt, Aktivitäten über Log-Quellen hinweg zu einer Timeline korreliert und Ihnen genau sagt, was Sie sich ansehen müssen — ohne einen externen Agenten, eine Datenbank oder eine Internetverbindung zu benötigen.


Was ubuntils tut

ubuntils läuft in vier aufeinanderfolgenden Phasen:

  1. Erfassung — Elf Collector sammeln forensische Artefakte gleichzeitig aus /proc, Cron-Tabellen, systemd-Units, SSH-Schlüsseln, sudoers-Dateien, Umgebungsdefinitionen, Paketintegrität (dpkg --verify), PAM/NSS-Konfiguration und geladenen Kernelmodulen. Dauert auf einem typischen System etwa 2,5 Sekunden.
  2. Erkennung — Eine Erkennungs-Engine führt alle sechzehn integrierten Regeln — plus alle mit --rules geladenen benutzerdefinierten Regeln — über die gesammelten Artefakte aus und erzeugt in etwa einer Sekunde eine priorisierte, mit Konfidenzwerten versehene Befundliste.
  3. Timeline — Ein Timeline-Builder liest syslog, journald und auditd parallel und korreliert Ereignisse chronologisch, was etwa 0,3 Sekunden hinzufügt. Jeder Befund wird dann automatisch gegen die Timeline korreliert, sodass er die nahegelegenen Ereignisse trägt, die mit ihm zusammenhängen.
  4. Ausgabe — Ergebnisse erscheinen entweder in einer interaktiven TUI mit vier Tabs (Standard) oder als strukturiertes JSON auf stdout (--json).

ubuntils selbst führt keine Netzwerkaufrufe durch, und jede Funktion — benutzerdefinierte Regeln und Korrelation eingeschlossen — läuft gegen lokal gesammelte Artefakte. Die einzige Möglichkeit, wie Befunde den Host verlassen können, ist die Wazuh-Integration: Wenn ein Wazuh-Agent installiert ist, schreibt ein Live-scan seine Befunde in eine lokale Datei, die der Agent dann an seinen Manager übermittelt. Übergeben Sie --no-wazuh, um das für einen Lauf abzuschalten.

ubuntils scan ist durch alles Folgende unverändert — es ist weiterhin 100 % live, Single-Host, und jeder bestehende Flag funktioniert identisch. Zwei zusätzliche Befehle, collect und analyze, teilen dieselbe Erkennungs-/Timeline-Pipeline in einen offline-freundlichen Acquire-then-Analyze-Workflow für Fälle auf, in denen Sie die Erkennung nicht direkt auf dem untersuchten Host ausführen können (oder wollen) — siehe Offline-Analyse: collect und analyze unten, einschließlich der Einschränkungen zur Erkennungsabdeckung.


Installation

Ubuntu 22.04+ und jedes System mit PEP 668 (empfohlen):

Ubuntu 22.04+ blockiert systemweites pip install. Verwenden Sie pipx — es handhabt die Umgebung transparent, sodass Sie nie darüber nachdenken müssen:```bash sudo apt install pipx -y cd ubuntils pipx install -e . ubuntils scan

root@kitploit:~
**Ältere Systeme / manuelle Installation:**```bash
git clone https://github.com/asmitdesai/ubuntils.git
cd ubuntils
pip install -r requirements.txt -e .
ubuntils scan

ubuntils benötigt Root-Rechte für den vollständigen Zugriff auf Artefakte. Wenn du ubuntils scan als Nicht-Root-Benutzer ausführst, ruft es sich automatisch selbst mit sudo unter Verwendung desselben Python-Interpreters (über absoluten Pfad) erneut auf, sodass die korrekte Umgebung verwendet wird, ohne deinen PATH an den Root-Prozess weiterzugeben. Jeder externe Befehl (ss, dpkg, systemctl, …) wird über einen festen, root-eigenen Suchpfad aufgelöst, niemals über deinen PATH. Wenn du ohne Root ausgeführt wirst, werden /etc/shadow, einige /proc-Einträge und geschützte Cron-Dateien übersprungen, und für jede wird eine Warnung protokolliert.


Schnellstart

Nur Erkennung — interaktive TUI:```bash sudo ubuntils scan

root@kitploit:~
**Erkennung mit JSON-Ausgabe in Datei gespeichert:**```bash
sudo ubuntils scan --json > /tmp/triage-$(hostname)-$(date +%Y%m%d).json

Erkennung mit CLI-Behebungsvorschau (Probelauf — keine Änderungen vorgenommen):```bash sudo ubuntils scan --remediate

root@kitploit:~
**Erkennung mit CLI-Behebung angewendet:**```bash
sudo ubuntils scan --remediate --confirm

Druckversion:```bash ubuntils version

root@kitploit:~
**Ein manipulationssicheres Bundle für spätere oder Offline-Analysen erfassen:**```bash
sudo ubuntils collect --output /path/to/bundle.tar.gz

Analysiere ein zuvor gesammeltes Bundle (keine Root-Rechte erforderlich):```bash ubuntils analyze /path/to/bundle.tar.gz --json

root@kitploit:~
**Analysieren Sie ein gemountetes forensisches Image oder einen extrahierten Dateisystembaum anstelle eines Bundles:**```bash
ubuntils analyze --root /mnt/forensic-image --json

Siehe Offline-Analyse: Sammeln und Analysieren für das Bundle-Format und – wichtig – was die Offline-Analyse im Vergleich zu einem Live-scan nicht erkennen kann.


Flags und Konfiguration```

ubuntils scan [OPTIONS] --json Output JSON to stdout instead of launching the TUI --output FILE Write the JSON report to FILE (implies --json) --remediate Run the remediation engine after detection --confirm Required with --remediate to actually apply changes (else dry-run) --min-confidence N Only auto-remediate findings with confidence >= N (default 40) --no-wazuh Never forward findings to a local Wazuh agent --config FILE YAML allowlist of findings to suppress (see below) --baseline FILE YAML baseline of environment-specific known-good fingerprints to suppress (see below) --since TIME Limit the timeline to events since TIME (e.g. '24h', '7d', '2026-05-20') --rules FILE YAML file of custom detection rules to add (see below) --verbose Verbose structlog output

ubuntils collect [OPTIONS] --output FILE Bundle path to write (default ./ubuntils-bundle-.tar.gz) --verbose Verbose structlog output

ubuntils analyze (BUNDLE | --root PATH) [OPTIONS] --root PATH Analyze a mounted image / artifact tree instead of a bundle --json Output JSON instead of launching the TUI --output FILE Write the JSON report to FILE (implies --json) --config FILE YAML allowlist of findings to suppress (same format as scan) --baseline FILE YAML baseline of environment-specific known-good fingerprints to suppress (same format as scan) --rules FILE YAML file of custom detection rules to add (same format as scan) --since TIME Limit the timeline to events since TIME (e.g. '24h', '7d', '2026-05-20') --verbose Verbose structlog output

ubuntils version Print version string and exit

root@kitploit:~
### False-Positive-Allowlisting (`--config`)

Ein frisch bereitgestellter oder CI-verwalteter Host erzeugt erwartetes Rauschen — Deploy-Keys, Provisioning-Crontabs, eingebaute Shell-Init. Anstatt den Respondern beizubringen, es mental herauszufiltern, unterdrücken Sie es explizit mit einer YAML-Allowlist:```yaml
# allowlist.yaml
allowlist:
  rules:
    - SHELL_RC_MODIFICATION          # suppress this rule entirely
  paths:
    - /home/ci/.ssh/authorized_keys  # suppress any finding on this exact path

| --no-color | Deaktiviert farbige Ausgabe | | --debug | Aktiviert Debug-Ausgabe | | --verbose | Aktiviert ausführliche Ausgabe | | --version | Zeigt die Version an und beendet das Programm | | --help | Zeigt die Hilfe an und beendet das Programm |```bash sudo ubuntils scan --json --config allowlist.yaml

root@kitploit:~
Suppression ist immer explizit — über Regel-ID und/oder exakten Artefaktpfad. Es gibt keinen pauschalen „alles ignorieren"-Schalter. Ein Beispiel liegt unter [`examples/allowlist.yaml`](https://github.com/asmitdesai/ubuntils/blob/main/examples/allowlist.yaml).

### Known-good-Baselining (`--baseline`)

`--config` unterdrückt eine Regel oder einen Pfad *überall, für jeden, der ubuntils gegen diese Codebasis ausführt*. `--baseline` ist enger gefasst und umgebungsspezifisch: Es besagt „in *dieser* Umgebung ist genau dieses Artefakt — dieser SSH-Schlüssel, diese RC-Datei — als bekannt gut eingestuft", ohne die Regel oder den Pfad für jeden anderen Host stummzuschalten, den du mit demselben Tool scannst. Aus demselben Grund, aus dem `--rules` separat gehalten wird, wird es als separate Datei von `--config` geführt: Unterdrückung und regelweites Allowlisting sind unterschiedliche Anliegen, die nicht in einer Datei leben sollten.```yaml
# baseline.yaml
baseline:
  - rule_id: SSH_UNAUTHORIZED_KEY
    fingerprint: ci@ci-runner          # substring match against the finding's raw_value
  - rule_id: SHELL_RC_MODIFICATION
    fingerprint: /home/deploy/.bashrc  # exact match against the finding's artifact_path

| -s | --server | Server URL to connect to (default: http://localhost:3000) | | -t | --token | Authentication token for the server | | -v | --verbose | Enable verbose logging | | -q | --quiet | Suppress non-essential output | | -o | --output | Output file path for results | | -f | --format | Output format: json, yaml, table (default: table) | | -c | --config | Path to configuration file | | -n | --no-color | Disable colored output | | -h | --help | Show help message and exit | | -V | --version | Show version information and exit |

Examples

root@kitploit:~
# Basic usage
mytool scan --target example.com

# With authentication
mytool scan --target example.com --token YOUR_TOKEN

# Output as JSON
mytool scan --target example.com --format json --output results.json

# Verbose mode with custom server
mytool scan --target example.com --server https://api.example.com --verbose

Configuration File

The tool supports a configuration file in YAML format. By default, it looks for ~/.mytool/config.yaml.

root@kitploit:~
server: http://localhost:3000
token: your-token-here
format: json
verbose: false
timeout: 30

Environment Variables

VariableDescription
MYTOOL_SERVERServer URL (overrides config file)
MYTOOL_TOKENAuthentication token
MYTOOL_FORMATDefault output format
MYTOOL_TIMEOUTRequest timeout in seconds
MYTOOL_DEBUGEnable debug mode (true/false)

Exit Codes

CodeMeaning
0Success
1General error
2Invalid arguments
3Authentication failure
4Network error
5Target not found

Troubleshooting

Connection refused

If you see a "connection refused" error, ensure the server is running and accessible:

root@kitploit:~
curl -I http://localhost:3000/health

Authentication failed

Verify your token is correct and has not expired. You can regenerate a token from the web interface under Settings → API Tokens.

Timeout errors

Increase the timeout value using the --timeout flag or the MYTOOL_TIMEOUT environment variable:

root@kitploit:~
mytool scan --target example.com --timeout 60

Contributing

We welcome contributions from the community. Please read our Contributing Guide before submitting a pull request.

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

  • Thanks to all contributors who have helped shape this project
  • Inspired by similar tools in the open-source community
  • Built with Go and Cobra```bash sudo ubuntils scan --json --baseline baseline.yaml
root@kitploit:~
Ein Baseline-Eintrag stimmt überein, wenn `rule_id` plus ein `fingerprint` als Teilstring des `raw_value` des Findings oder als exakte Übereinstimmung mit seinem `artifact_path` getestet wird. Eine Übereinstimmung entfernt das Finding vollständig aus dem Bericht — die Unterdrückung ist jedoch nie stillschweigend: Die Anzahl der Findings, die eine Baseline entfernt hat, ist immer in `scan_metadata.suppressed_by_baseline` sichtbar. Die Unterdrückung durch die Allowlist (`--config`) gilt weiterhin zusätzlich zur Baseline-Unterdrückung. Funktioniert identisch bei `scan` und `analyze`. Ein Beispiel befindet sich unter [`examples/baseline.yaml`](https://github.com/asmitdesai/ubuntils/blob/main/examples/baseline.yaml).

### Benutzerdefinierte Erkennungsregeln (`--rules`)

`--config` *unterdrückt* Findings; `--rules` *fügt* sie hinzu. Sie sind bewusst separate Dateien, da es sich um gegensätzliche Anliegen handelt.

Eine Regeldatei ist ausschließlich musterbasiert — keine Ausdrücke, keine Bedingungen und keine Codeausführung, sodass das Laden einer Datei niemals vom Angreifer bereitgestellte Logik ausführen kann. Jede Regel benennt eine Artefakt-`source`, einen `match`-Modus und ein `pattern`:```yaml
# custom_rules.yaml
rules:
  - id: CUSTOM_KNOWN_MINER
    severity: HIGH                     # HIGH | MEDIUM | LOW
    title: Known cryptominer in process cmdline
    description: A running process command line matches a known miner.
    source: process                    # cron | environment | ssh | process | network
    match: substring                   # regex | substring | glob
    pattern: xmrig

Ihre Frage bezieht sich auf die Übersetzung von Kitploit-Tool-Inhalten. Bitte senden Sie den tatsächlichen Markdown-Text, den Sie übersetzen möchten (Chunk 33 von 90), und ich werde ihn gemäß den angegebenen Regeln ins Deutsche übersetzen.```bash sudo ubuntils scan --json --rules custom_rules.yaml

root@kitploit:~
| `source` | Abgeglichen mit |
|---|---|
| `cron` | Dem cron-Befehl (Pfad: die crontab-Datei) |
| `environment` | Der rohen Umgebungs-/Shell-Init-Zeile (Pfad: die definierende Datei) |
| `ssh` | Schlüsseltyp, Schlüsseldaten und Kommentar (Pfad: die `authorized_keys`-Datei) |
| `process` | Der Prozess-Cmdline (Pfad: der exe-Pfad) |
| `network` | Der Verbindungsbeschreibung (Pfad: `remote_addr:remote_port`) |

`regex` und `substring` gleichen die Textspalte ab; `glob` gleicht die Pfadspalte ab — ein `network`-Glob wie `203.0.113.*:*` zielt also auf den Remote-Endpunkt. Befunde aus benutzerdefinierten Regeln sind nur Flags (werden nie automatisch behoben) und unterliegen weiterhin der Unterdrückung durch `--config`. Ein Beispiel befindet sich unter [`examples/custom_rules.yaml`](https://github.com/asmitdesai/ubuntils/blob/main/examples/custom_rules.yaml).

### Berichtsintegrität

Jeder `--json`-Bericht enthält ein Feld `report_sha256` — einen SHA-256 über den kanonischen Berichtsinhalt. Dadurch wird ein gesammeltes Triage-Artefakt manipulationssicher, und Sie können einen bestimmten Scan in einer Falldatei per Digest referenzieren. Der Bericht zeichnet außerdem `tool_version`, `hostname` und einen UTC-Zeitstempel `generated_at` unter `scan_metadata` auf. Bei `scan` beschreiben `hostname`/`ubuntu_version` den Rechner, auf dem `ubuntils` läuft; bei `analyze --root` werden sie aus den eigenen `/etc/hostname` und `/etc/os-release` des Images gelesen. Bei `analyze BUNDLE` stammen sie stattdessen aus dem eigenen Manifest des Bundles — dem Host, der *gesammelt* wurde, nicht dem Host, der `analyze` ausführt — zusammen mit `collection_run_id` und den `collected_at_utc_start`/`collected_at_utc_end` der Sammlung, sodass die Chain-of-Custody-Aufzeichnung des Berichts den Beweisen folgt und nicht der Workstation des Analysten.

**Verifizieren eines Berichts.** Der Bericht wird in kanonischer Form ausgegeben (Schlüssel sortiert, 2-Leerzeichen-Einrückung), und der Digest umfasst alles außer `report_sha256` selbst:```python
import hashlib, json
doc = json.load(open("report.json"))
claimed = doc.pop("report_sha256")
assert hashlib.sha256(json.dumps(doc, indent=2, sort_keys=True).encode()).hexdigest() == claimed

Offline-Analyse: Sammeln und Analysieren

ubuntils scan führt Sammlung, Erkennung und Timeline gemeinsam gegen den laufenden Host aus. collect und analyze teilen diese Pipeline in zwei Schritte auf: collect erfasst ein manipulationssicheres Bundle von einem Host (es werden keine Erkennungsläufe durchgeführt), und analyze führt dieselbe Erkennungs-/Timeline-Pipeline, die von scan verwendet wird, gegen ein Bundle oder gegen ein gemountetes Image über --root aus, ohne Root-Rechte zu benötigen und ohne den ursprünglichen Host erneut zu berühren. Dies ist für Fälle gedacht, in denen Sie Artefakte einmal erfassen und später, an einem anderen Ort oder wiederholt analysieren möchten – oder in denen Sie ein Datenträgerabbild statt eines laufenden Systems untersuchen.

`ubuntils collect````bash

sudo ubuntils collect --output /path/to/bundle.tar.gz

root@kitploit:~
Erfordert Root-Rechte, wie `scan`. Liest eine feste Liste von Dateien (`/etc/passwd`, `/etc/group`, `/etc/shadow`, `/etc/sudoers`, `/etc/ld.so.preload`, `/etc/environment`, `/etc/crontab`, `/etc/profile`, `/var/log/syslog`, `/var/log/messages`, `/var/log/audit/audit.log`) und führt eine feste Liste von Befehlen aus (`ss -tunap`, `netstat -tunap`, `systemctl list-timers` sowohl in JSON- als auch in Textform sowie `journalctl -o json` für die letzten 7 Tage), hasht jedes erfasste Element und schreibt alles zusammen mit einer `manifest.json` in ein `.tar.gz`-Bundle. Die erfassten Protokolldateien und die journalctl-Ausgabe ermöglichen es `analyze BUNDLE`, offline eine echte Zeitachse zu erstellen. Wenn `--output` weggelassen wird, wird das Bundle in `./ubuntils-bundle-<UTC timestamp>.tar.gz` im aktuellen Verzeichnis geschrieben.

### `ubuntils analyze````bash
ubuntils analyze BUNDLE.tar.gz [--json] [--output FILE] [--config FILE] [--baseline FILE] [--rules FILE] [--since TIME]
ubuntils analyze --root /mnt/forensic-image [--json] [--output FILE] [--config FILE] [--baseline FILE] [--rules FILE] [--since TIME]

Nimmt entweder einen Bundle-Pfad als positionales Argument oder --root PATH, das auf ein gemountetes Image / einen extrahierten Dateisystembaum zeigt — nicht beides. Führt dieselbe Erkennungs-Engine, benutzerdefinierten Regeln, Allowlist und Baseline-Logik aus, die von scan verwendet werden. Erfordert keine Root-Rechte. Das Bundle wird in ein privates temporäres Verzeichnis extrahiert, das gelöscht wird, sobald die Analyse abgeschlossen ist (es kann /etc/shadow enthalten).

Die Abdeckung unterscheidet sich zwischen den beiden Offline-Modi, da ein Bundle einen wiedergegebenen erfassten Zustand vom collect-Zeitpunkt trägt, während --root nur das hat, was sich auf dem gemounteten Dateisystem befindet:

  • analyze BUNDLE gibt die echte ss/systemctl list-timers/journalctl-Befehlsausgabe wieder, die zum collect-Zeitpunkt erfasst wurde, sodass NetworkCollector und SystemdCollector echte Befunde aus diesem Snapshot liefern — sie werden nicht übersprungen. Die Timeline wird aus dem syslog/messages/audit.log/journalctl aufgebaut, das das Bundle erfasst hat, sodass sie vollständig befüllt ist und Befunde echte related_events-Korrelation erhalten.
  • analyze --root PATH zeigt auf ein totes, gemountetes Image ohne Live-Prozess- oder Kernel-Zustand zum Abfragen, sodass die Befehlsausführung vollständig deaktiviert ist: NetworkCollector und SystemdCollector werden übersprungen und in scan_metadata.command_collectors_skipped vermerkt. Die Timeline wird weiterhin aufgebaut, aber aus den statischen Logdateien, die auf dem Image vorhanden sind (/var/log/syslog, /var/log/messages, /var/log/audit/audit.log) — journald-Replay ist hier nicht verfügbar, da kein Live-journalctl vorhanden ist, um ein totes Image abzufragen.

Siehe Offline-Analyse: collect und analyze für die vollständige Liste der Lücken in der Offline-Erkennungsabdeckung.

Bundle-Format

Ein Bundle ist ein gzipped Tarball mit allem unter einem bundle/-Präfix:``` bundle/ ├── manifest.json ├── files/ │ ├── etc/passwd │ ├── etc/shadow │ ├── var/log/syslog │ └── ... # every captured file, path-flattened under files/ └── commands/ ├── ss.txt ├── netstat.txt ├── systemctl_list_timers_json.txt ├── systemctl_list_timers_text.txt └── journalctl.txt

root@kitploit:~
`manifest.json`-Schema:

| Feld | Typ | Beschreibung |
|---|---|---|
| `run_id` | string | UUID, die für jeden `collect`-Lauf neu generiert wird |
| `host_id` | string | Reserviert für zukünftige Multi-Host-Korrelation; derzeit leer |
| `hostname` | string | `socket.gethostname()` zum Zeitpunkt der Erfassung |
| `ubuntu_version` | string | Erkannter Ubuntu-Release-String |
| `collected_at_utc_start` / `collected_at_utc_end` | string (ISO 8601) | Wall-Clock-Grenzen des Erfassungslaufs |
| `tool_version` | string | ubuntils-Version, die das Bundle erzeugt hat |
| `files[]` | array | Ein Eintrag pro erfasster Datei: `source_path`, `bundle_path`, `sha256`, `size`, `mtime`, `ctime` (eine auf dem Quellhost fehlende/nicht lesbare Datei wird mit `sha256: ""`, `size: -1` erfasst, statt die Erfassung abzubrechen) |
| `commands[]` | array | Ein Eintrag pro erfasstem Befehl: `name`, `argv`, `bundle_path`, `sha256`, `exit_code` |
| `bundle_sha256` | string | SHA-256 über den Rest des Manifests (alles oben Genannte, kanonisch serialisiert) — der Manipulationsnachweis-Anker für das gesamte Bundle |

### Bundle-Integrität in der JSON-Ausgabe

`scan_metadata.bundle_integrity` von `analyze` meldet einen von drei Werten:

- `"live"` — `scan` und `analyze --root` melden dies; es gibt kein Bundle zu verifizieren.
- `"ok"` — `analyze BUNDLE` hat `bundle_sha256` gegen das Manifest und den SHA-256 jeder erfassten Datei gegen deren Bundle-Inhalt verifiziert; seit `collect` es geschrieben hat, wurde nichts verändert.
- `"mismatch"` — der Manifest-Digest, der Hash einer erfassten Datei oder der Hash einer erfassten Befehlsausgabe stimmte nicht überein. Etwas im Bundle wurde nach der Erfassung verändert, abgeschnitten oder beschädigt, und nichts daraus Abgeleitetes sollte als chain-of-custody-sauber vertraut werden. `analyze` erstellt weiterhin seinen Bericht, gibt aber eine rote Warnung auf stderr aus, zeigt ein Integritätsbanner oben im TUI-Summary-Tab an und **beendet sich mit Status 3**, damit Skripte die Ergebnisse eines manipulierten Bundles nicht für autoritativ halten können.

### ⚠️ Offline-Analyse hat echte Erkennungslücken — lesen Sie dies, bevor Sie sich darauf verlassen

**Ein Bundle- oder `--root`-basierter `analyze`-Lauf hat keine Erkennungsparität mit einem Live-`scan`.** Dies sind keine Randfälle; es sind strukturelle Einschränkungen der statischen Offline-Erfassung, und sie erzeugen für die betroffenen Regeln weniger (oder gar keine) Findings statt eines Fehlers. Wo ein Collector *weiß*, dass er nicht nachsehen konnte (ein fehlgeschlagener Befehl, eine nicht lesbare Datei), wird dies in `scan_metadata.collectors_degraded` erfasst und im TUI-Summary-Tab gekennzeichnet — aber eine Datei, die einfach nicht erfasst wurde, sieht genauso aus wie eine Datei, die nicht existiert. (Die Timeline selbst ist *keine* dieser Lücken mehr: `analyze BUNDLE` spielt das erfasste syslog/messages/audit.log/journalctl vom `collect`-Zeitpunkt erneut ab, und `analyze --root` liest die statischen Logdateien, die auf dem gemounteten Image vorhanden sind, sodass beide eine echte Timeline und echte `related_events`-Korrelation erzeugen — siehe [`ubuntils analyze`](#ubuntils-analyze) oben.)

- **`PROCESS_MASQUERADE` und `PROCESS_SUSPICIOUS_CONNECTION` melden im Offline-Modus immer null Findings.** Beide Regeln stützen sich auf das `exe`-Feld eines Prozesses, das durch Lesen des Symlink-Ziels `/proc/<pid>/exe` über die Artefaktquelle befüllt wird (niemals über das eigene `/proc` des Analysten). Ein Bundle hat kein Live-`/proc` zum Lesen, und `--root` zeigt auf einen gemounteten Dateisystembaum ohne `/proc` — es gibt derzeit keinen Mechanismus, um ein aufgelöstes exe-Symlink-Ziel offline zu erfassen oder zu rekonstruieren, sodass `exe` immer leer ist und beide Regeln nie auslösen, unabhängig davon, was tatsächlich auf dem Host läuft.
- **Prozess-Enumeration findet offline überhaupt nicht statt.** `collect` hat keinen Per-PID-Erfassungsschritt (`/proc/*/status`, `/proc/*/cmdline`), sodass im Bundle von vornherein keine Prozesse zur Analyse existieren — dies ist dieselbe Grundursache wie im obigen Punkt, von der Erfassungsseite aus betrachtet.
- **`CRON_TMP_PATH`, `SUDOERS_NOPASSWD` und `SSH_UNAUTHORIZED_KEY` sind bei Bundle-basierter Analyse eingeschränkt oder fehlen.** Die Dateiliste von `collect` ist statisch und kann `/etc/cron.d/*`, `/etc/sudoers.d/*`, `/etc/profile.d/*` oder benutzerspezifische `~/.ssh/authorized_keys` nicht per Glob expandieren — nur `/etc/crontab`, `/etc/sudoers` und `/etc/environment`/`/etc/profile` werden erfasst. (`--root` gegen einen vollständigen gemounteten Dateisystembaum hat diese Lücke nicht, da die echten Verzeichnisse auf der Festplatte vorhanden sind.) Wenn `SSH_UNAUTHORIZED_KEY` oder `SHELL_RC_MODIFICATION` *doch* auslösen (Live-Scan oder `--root` mit den echten benutzerspezifischen Verzeichnissen), bewerten sie jetzt außerdem die Konfidenz anhand von ctime und Dateiinhalt, nicht nur anhand von mtime — siehe [Konfidenzbewertung](#json-output) unten. Das verbessert, wie sehr Sie einem Finding vertrauen sollten, das auslöst; es ändert nicht daran, ob die Regel offline überhaupt auslöst.
- **Die Erkennung von `SUSPICIOUS_SYSTEMD_TIMER` ist bei Bundles abgeschwächt.** Service-Units werden direkt aus den Unit-Verzeichnissen gelesen (`/etc/systemd/system`, `/usr/lib/systemd/system`, benutzerspezifisch `~/.config/systemd/user`, …), sodass `--root` vollständige Service-Abdeckung erhält. Ein Bundle erfasst diese Verzeichnisse jedoch nicht: Timer erscheinen aus der erfassten `systemctl list-timers`-Ausgabe, aber das `ExecStart` jedes Timers stammt aus einem Per-Unit-`systemctl show`-Aufruf, den `collect` nicht durchführt, sodass die Regel nicht bewerten kann, was ein gebündelter Timer ausführt.

**Wann es wichtig ist:** Wenn Sie einen Live-, erreichbaren Host triagieren, verwenden Sie `sudo ubuntils scan` — es hat vollständige Erkennungsabdeckung. Verwenden Sie `collect`/`analyze`, wenn Sie einmal erfassen und anderswo analysieren müssen, ohne Root analysieren müssen oder mit einem Disk-Image arbeiten, bei dem `scan` überhaupt keine Option ist — und behandeln Sie ein sauberes `analyze`-Ergebnis für die oben genannten Regeln als „nicht geprüft“, nicht als „geprüft und sauber“.

---

## Die TUI

Das Ausführen von `sudo ubuntils scan` (ohne `--json`) startet eine interaktive Vollterminal-TUI.

### Scan-Bildschirm

Während die Collectors laufen, zeigt ubuntils eine Live-Checkliste — eine Zeile pro Collector. Jede Zeile aktualisiert sich in Echtzeit, sobald der Collector fertig ist:```
Scanning system…

  ✓  Process
  ✓  Network
  ✓  Users
  ⠹  Cron
     Systemd
     SSH
     Sudoers
     Environment

✓ markiert Erfolg, ✗ markiert Fehler, der Spinner markiert den aktiven Collector und leere Zeilen sind ausstehend. Sobald alle Collectors abgeschlossen sind und Erkennung + Timeline fertig sind, wechselt die TUI automatisch zum Ergebnisbildschirm.

Ergebnisbildschirm

Der Ergebnisbildschirm hat vier Tabs, die mit den Zifferntasten navigiert werden:

TasteTabInhalt
1ZusammenfassungScan-Statistiken + Top-Befunde auf einen Blick
2BefundeVollständige Befundliste mit Inline-Details und Behebung
3TimelineChronologische korrelierte Log-Ereignisse
4StatistikenUbuntu-Version, Architektur, Dauer, Collector-Anzahlen

Drücken Sie q oder Ctrl+C zum Beenden.

Tab „Zusammenfassung" (Taste 1)

Zeigt Scan-Metadaten und die Top-Befunde auf einem einzigen Bildschirm:``` Collectors: 8 run · 0 failed Findings: 2 HIGH · 1 MEDIUM · 0 LOW Timeline: 47 events Duration: 2.8s

● HIGH CRON_TMP_PATH /etc/cron.d/cleanup ● HIGH LD_PRELOAD_INJECT /home/alice/.bashrc ○ MED SSH_UNAUTHORIZED_KEY /home/bob/.ssh/authorized_keys

root@kitploit:~
Auf einem sauberen System zeigt dieser Tab `System appears clean.` an.

### Tab „Findings" (Taste `2`)

Eine scrollbare Liste aller Findings, sortiert von HIGH → MEDIUM → LOW. Wenn Sie ein Finding auswählen (Enter oder Pfeiltasten), wird unten ein Detailbereich eingeblendet, der die vollständige Beschreibung, den Artefaktpfad, den rohen auslösenden Wert und Informationen zur Behebung anzeigt.```
HIGH  CRON_TMP_PATH           /etc/cron.d/cleanup
HIGH  LD_PRELOAD_INJECT       /home/alice/.bashrc
MED   SSH_UNAUTHORIZED_KEY    /home/bob/.ssh/authorized_keys
───────────────────────────────────────────────────────
A cron job was found referencing /tmp, /var/tmp, or /dev/shm.
These directories are world-writable and commonly used as
attacker staging grounds.

Artifact:  /etc/cron.d/cleanup
Raw:       0 * * * * root /tmp/.update
Fix:       Will remove the offending cron entry from
           /etc/cron.d/cleanup after creating a timestamped backup.

R: remediate

In-TUI-Behebung

Für Befunde, für die eine automatisierte Behebung verfügbar ist, drücken Sie R, während der Befund ausgewählt ist. Ein Bestätigungsdialog erscheint:``` ┌─────────────────────────────────────────────────┐ │ Remediate CRON_TMP_PATH? │ │ │ │ Will remove the offending cron entry from │ │ /etc/cron.d/cleanup after creating a backup. │ │ Backup will be created at /var/backups/ubuntils/…│ │ │ │ Y: confirm Esc: cancel │ └─────────────────────────────────────────────────┘

root@kitploit:~
`Y` drücken zum Bestätigen. Der Remediator läuft in einem Hintergrund-Thread. Wenn er abgeschlossen ist, wird die Finding-Zeile in der Liste auf `[fixed]` aktualisiert und der Detailbereich zeigt das Ergebnis an:```
✓ Remediated
Backup:    /var/backups/ubuntils/20260115_142201/etc_cron.d_cleanup
Rollback:  cp /var/backups/ubuntils/20260115_142201/etc_cron.d_cleanup /etc/cron.d/cleanup

Bei einem Fehler zeigt der Detailbereich den Fehler an. Die Sicherung wird immer erstellt, bevor eine Änderung versucht wird.

Drücken Sie Esc, um den Detailbereich einzuklappen.

Zeitleisten-Tab (Taste 3)

Eine scrollbare chronologische Liste korrelierter Protokollereignisse. Jede Zeile zeigt Zeitstempel, Quelle und Beschreibung. Ereignisse werden aus syslog, journald und auditd abgerufen und dedupliziert.

Statistik-Tab (Taste 4)

Eine Übersichtsansicht des Scans: erkannte Ubuntu-Version, Architektur, Scan-Dauer, Anzahl der Collector und Fehler sowie Anzahl der Befunde pro Schweregrad zusammen mit der Gesamtzahl der Zeitleisten-Ereignisse.


Was er erkennt

Regel-IDSchweregradBehebbarWas geprüft wird
CRON_ROOT_EXECHIGHJaCrontabs von Nicht-root-Benutzern, die Befehle in root-eigenen Pfaden ausführen oder sudo inline verwenden
CRON_TMP_PATHHIGHJa*Jeder Cron-Job (einschließlich @reboot/@daily-Einträgen und Skripten in /etc/cron.{hourly,daily,weekly,monthly}), der auf /tmp, /var/tmp oder /dev/shm verweist. *Skriptzeilen werden nur gemeldet
LD_PRELOAD_INJECTHIGHJaJeder Eintrag in /etc/ld.so.preload (bei Standard-Ubuntu leer) oder LD_PRELOAD in einer Shell-Init-Datei mit einer aufgeführten Bibliothek außerhalb von /lib, /usr/lib, /lib64, /usr/lib64
SUSPICIOUS_SYSTEMD_TIMERHIGHNeinSystemd-Timer und Service-Units, deren ExecStart auf ein weltweit beschreibbares Verzeichnis verweist oder eine Binärdatei ausführt, die nicht root gehört
SSH_UNAUTHORIZED_KEYMEDIUMJaauthorized_keys-Dateien, die innerhalb der letzten 7 Tage geändert wurden
USER_UID_ZEROHIGHNeinJedes Konto außer root mit UID 0 (ein versteckter zweiter Superuser)
USER_EMPTY_PASSWORDHIGHNeinEin Konto mit Login-Shell, dessen Passwortfeld in /etc/shadow leer ist (Ubuntus Standard-PAM nullok ermöglicht die Anmeldung ohne Passwort)
SUDOERS_NOPASSWDMEDIUMJa*NOPASSWD-sudoers-Gewährungen für Benutzer mit UID ≥ 1000 und einer Login-Shell, direkt oder über eine %group-Regel; eingebundene Dateien werden verfolgt. *Gruppenregeln werden nur gemeldet (das Entfernen von %sudo könnte den gesamten sudo-Zugriff entfernen)
PROCESS_MASQUERADEMEDIUMNeinProzesse, deren Name mit einer bekannten System-Binärdatei übereinstimmt, deren ausführbare Datei sich jedoch außerhalb der Standard-Systemverzeichnisse befindet (/usr/bin, /usr/sbin, /bin, /sbin, /usr/local/{bin,sbin}, /usr/lib, /usr/libexec, /lib, /snap)
PROCESS_SUSPICIOUS_CONNECTIONHIGH / MEDIUMNeinProzesse mit einer ausgehenden Verbindung, deren ausführbare Datei sich in einem weltweit beschreibbaren temporären Verzeichnis befindet oder von der Festplatte gelöscht wurde (HIGH), oder sich außerhalb der Standard-Systemverzeichnisse befindet oder mit einem nicht standardmäßigen Remote-Port kommuniziert (MEDIUM)

Warum jede Regel existiert

CRON_ROOT_EXEC — Benutzer-Crontabs laufen als Eigentümer des Crontabs. Ein Eintrag, der sudo oder einen root-eigenen Interpreter aufruft, bedeutet, dass der Benutzer dafür gesorgt hat, dass Code planmäßig mit root-Privilegien ausgeführt wird, ohne dauerhaften sudo-Zugriff zu benötigen. Dies übersteht Passwortänderungen.

Beispielfund:``` [HIGH] CRON_ROOT_EXEC Title: User crontab executing with sudo Artifact: /var/spool/cron/crontabs/alice Raw value: */5 * * * * sudo /usr/bin/python3 /tmp/beacon.py Remediation: available

root@kitploit:~
**CRON_TMP_PATH** — Weltweit beschreibbare Verzeichnisse wie /tmp und /dev/shm sind übliche Ablageorte für Angreifer. Ein Cron-Job, der dorthin zeigt, bedeutet, dass eine Payload zwischen den Aufrufen ausgetauscht werden kann, ohne einen persistenten Pfad zu berühren. Dies deckt Einträge im Stil von `@reboot`/`@daily` sowie die Skripte in `/etc/cron.{hourly,daily,weekly,monthly}` ab; Befunde zu diesen Skripten sind nur Hinweise, da das Löschen einer Zeile aus einem Shell-Skript keine sichere automatische Korrektur ist.

*Beispielbefund:*```
[HIGH] CRON_TMP_PATH
Title:         Cron job references writable temp directory
Artifact:      /etc/cron.d/cleanup
Raw value:     0 * * * * root /tmp/.update
Remediation:   available

LD_PRELOAD_INJECT — LD_PRELOAD veranlasst den dynamischen Linker, eine angegebene Shared Library vor allen anderen zu laden, was die beliebige Funktionsinterzeption in jeder dynamisch gelinkten Binärdatei ermöglicht. Ein Wert, der außerhalb der Standard-Bibliothekspfade zeigt, ist ein nahezu sicherer Indikator für einen Userspace-Rootkit; jede Bibliothek in einer durch Leerzeichen oder Doppelpunkte getrennten Liste wird überprüft. /etc/ld.so.preload injiziert in jeden Prozess und ist auf einem Standard-Ubuntu leer, daher wird jeder Eintrag dort gemeldet — selbst einer, der innerhalb von /lib platziert wurde, ein häufiger Rootkit-Trick. Die Behebung entfernt /etc/ld.so.preload-Einträge, anstatt sie auszukommentieren, da der Loader in dieser Datei keine Kommentarsyntax kennt.

Beispielfund:``` [HIGH] LD_PRELOAD_INJECT Title: LD_PRELOAD set to non-standard library path Artifact: /home/alice/.bashrc Raw value: export LD_PRELOAD=/tmp/.libssl.so Remediation: available

root@kitploit:~
**SUSPICIOUS_SYSTEMD_TIMER** — Systemd-Timer sind für die meisten Responder persistenter und weniger sichtbar als Cron-Jobs. Ein Timer — oder eine einfache `.service`-Unit, die die häufigere Persistenzform darstellt und überhaupt keinen Timer benötigt —, dessen ExecStart auf ein temporäres Verzeichnis verweist oder eine Binärdatei ausführt, die nicht root gehört, ist ein Anzeichen für vom Angreifer erstellte Persistenz. Service-Units werden direkt aus den Unit-Verzeichnissen gelesen, einschließlich der benutzerspezifischen `~/.config/systemd/user`. Nur-Flag — das Entfernen von systemd-Units erfordert menschliches Urteilsvermögen.

*Beispielbefund:*```
[HIGH] SUSPICIOUS_SYSTEMD_TIMER
Title:         Systemd timer ExecStart points to suspicious path
Artifact:      /etc/systemd/system/update-check.timer
Raw value:     ExecStart=/tmp/.sys/update
Remediation:   not available

SSH_UNAUTHORIZED_KEY — Ein neu hinzugefügter SSH-Schlüssel gewährt persistenten Fernzugriff unabhängig von Passwörtern. Das 7-Tage-Fenster erfasst kürzlich erfolgte Hinzufügungen und vermeidet gleichzeitig Rauschen durch die Ersteinrichtung auf älteren Systemen. Hinweis: Die Regel verwendet die Datei-mtime, die den letzten Schreibzugriff auf die authorized_keys-Datei widerspiegelt, nicht den Einfügezeitpunkt jedes einzelnen Schlüssels.

Beispielbefund:``` [MEDIUM] SSH_UNAUTHORIZED_KEY Title: SSH authorized key added in last 7 days Artifact: /home/bob/.ssh/authorized_keys Raw value: ssh-rsa AAAAB3NzaC1... attacker@evil Remediation: available

root@kitploit:~
**SUDOERS_NOPASSWD** — Passwortfreies sudo für ein menschliches Benutzerkonto (UID ≥ 1000 mit einer Login-Shell) ist ein Privilegieneskalationsvektor, der die Entfernung anderer Persistenzmechanismen übersteht. Legitime NOPASSWD-Gewährungen gelten fast immer für Dienstkonten ohne Login-Shell. Gruppenregeln (`%sudo ALL=(ALL) NOPASSWD:ALL`) werden auf ihre Mitglieder aufgelöst, und `#include`/`@includedir`-Dateien werden befolgt. Gruppenbefunde sind nur Kennzeichnungen: Das Löschen einer Regel wie `%sudo` könnte jede sudo-Gewährung auf dem System entfernen.

*Beispielfund:*```
[MEDIUM] SUDOERS_NOPASSWD
Title:         NOPASSWD sudo grant for regular user
Artifact:      /etc/sudoers.d/alice
Raw value:     alice ALL=(ALL) NOPASSWD: ALL
Remediation:   available

PROCESS_MASQUERADE — Das Benennen einer bösartigen Binärdatei nach einem bekannten Systemprozess (sshd, python3, bash) ist eine grundlegende Technik, um die Erkennung in der ps-Ausgabe zu vermeiden. Diese Regel gleicht den Prozessnamen aus /proc/<pid>/status mit dem aufgelösten exe-Pfad aus /proc/<pid>/exe ab. Zu den Standardpfaden gehören /usr/local/{bin,sbin}, /usr/lib, /usr/libexec und /snap, sodass systemd (/usr/lib/systemd/systemd) und Snap-Pakete nicht anschlagen. Nur Kennzeichnung — das Beenden eines Prozesses erfordert menschliches Urteilsvermögen.

Beispielfund:``` [MEDIUM] PROCESS_MASQUERADE Title: Process masquerading as system binary Artifact: /proc/1337/exe Raw value: name=sshd, exe=/tmp/.sshd Remediation: not available

root@kitploit:~
**USER_UID_ZERO** — Nur `root` sollte UID 0 besitzen. Ein zweites Konto, das UID 0 zugeordnet ist (CIS Ubuntu Benchmark 6.2.x), ist eine Backdoor mit hoher Konfidenz: Es gewährt vollständige Superuser-Rechte, ohne die eigenen Anmeldedaten von root zu ändern, und übersteht einen Root-Passwort-Reset. Nahezu keine Falsch-Positiv-Rate. Nur melden — das Entfernen eines UID-0-Kontos erfordert menschliches Urteilsvermögen.

*Beispielfund:*```
[HIGH] USER_UID_ZERO
Title:         Non-root account with UID 0
Artifact:      /etc/passwd
Raw value:     toor:x:0:0:...:/bin/bash
Remediation:   not available

USER_EMPTY_PASSWORD — Ein Konto, dessen Passwortfeld in /etc/shadow leer ist, hat überhaupt kein Passwort, und Ubuntus Standard-PAM-Stack (pam_unix ... nullok) lässt es ohne eines anmelden. Bei einem Konto mit einer Login-Shell ist das eine offene Tür. Nur Flag — sperren Sie es mit passwd -l, während Sie untersuchen.

Beispielfund:``` [HIGH] USER_EMPTY_PASSWORD Title: Login account with no password Artifact: /etc/shadow Raw value: eve:: Remediation: not available

root@kitploit:~
**PROCESS_SUSPICIOUS_CONNECTION** — Persistenz ist nur die halbe Geschichte; ein Fußhalt, der nie mit irgendetwas kommuniziert, ist selten der, der dich interessiert. Diese Regel verbindet die Prozess- und Netzwerk-Collectors über die PID, sodass ein markierter Prozess mit seinen aktuellen Verbindungen ankommt. Eine ausführbare Datei, die in `/tmp` abgelegt wurde und einen etablierten ausgehenden Socket hält, ist HIGH; eine legitime Binärdatei, die einen nicht standardmäßigen Remote-Port erreicht, ist MEDIUM und einen Blick wert. Dies ist eine Momentaufnahme des aktuellen Zustands, keine kontinuierliche Überwachung — ein Beacon, der schläft, während du scannst, wird nicht erscheinen. Nur-Flag.

*Beispielfund:*```
[HIGH] PROCESS_SUSPICIOUS_CONNECTION
Title:         Process with suspicious outbound connection
Artifact:      /proc/1337/exe
Raw value:     203.0.113.9:4444
Remediation:   not available

SHELL_RC_MODIFICATION — Shell-Init-Dateien sind ein zuverlässiger Persistenzvektor, da sie bei jeder Benutzeranmeldung ausgeführt werden. Diese Regel zeigt kürzliche Änderungen zur manuellen Überprüfung an. Nur-Flag — der Inhalt von Shell-RC-Dateien muss gelesen werden, bevor darauf reagiert wird.

Beispielbefund:``` [LOW] SHELL_RC_MODIFICATION Title: Shell init file recently modified Artifact: /root/.bashrc Raw value: mtime=2024-01-15 14:22:01 (6 hours ago) Remediation: not available

root@kitploit:~
**PACKAGE_TAMPERED** — Systemeigene Binärdateien und Konfigurationsdateien sind die Grundlage des Vertrauens. Diese Regel erkennt, wenn paketeigene Dateien geändert oder gelöscht wurden oder Inhalts-/Modus-/Größenabweichungen aufweisen, mithilfe von `dpkg --verify`. Nur-Conffile-Änderungen (erwartete lokale Konfigurationsänderungen) werden von der Meldung ausgeschlossen, um Rauschen zu vermeiden. Nur-Flag — Manipulation kann legitim (benutzerdefinierte lokale Änderungen) oder bösartig (Dateiersetzung) sein; die Entscheidung erfordert menschliches Urteilsvermögen.

*Beispielfund:*```
[HIGH] PACKAGE_TAMPERED
Title:         Package-owned file modified since installation
Artifact:      /usr/bin/sshd
Raw value:     ....5..T. (content and mtime differ)
Remediation:   not available

IMMUTABLE_FLAG_SET — Angreifer setzen häufig das Immutable-Flag (i) oder das Append-Only-Flag (a) auf Dateien, um Änderungen oder Löschungen zu verhindern, selbst durch root, unter anderem um Manipulationen vor weiteren Bearbeitungen/Log-Rotation zu verbergen. Das Setzen dieser Flags auf sensible Systemdateien wie /etc/passwd, /etc/sudoers, /etc/pam.d/* oder die auth/syslog/wtmp/btmp-Logdateien ist ein starker Hinweis auf eine Angreifer-Härtung. Diese Regel erkennt Immutable- und Append-Only-Flags über lsattr gegen diese feste Liste sensibler Pfade. Nur-Flag — Flag-Änderungen erfordern eine menschliche Überprüfung.

Beispielfund:``` [MEDIUM] IMMUTABLE_FLAG_SET Title: Sensitive file has an unexpected chattr flag Artifact: /etc/ld.so.preload Raw value: ----i--------e--- Remediation: not available

root@kitploit:~
**PAM_BACKDOOR** — PAM (Pluggable Authentication Modules) und NSS (Name Service Switch) sind die zentralen Authentifizierungs- und Identitätssysteme unter Linux. Diese Regel führt KEINE mtime-basierte Erkennung durch („wurde diese Datei geändert“) — sie gleicht den Datei-*Inhalt* per Musterabgleich ab: (1) eine wörtliche `pam_permit.so`-Zeile in einer beliebigen /etc/pam.d/*-Datei (dieses Modul ist immer erfolgreich und stellt eine klassische Auth-Bypass-Backdoor dar), oder (2) ein in /etc/nsswitch.conf aufgeführtes NSS-Modul, das nicht in der integrierten Allowlist von ubuntils enthalten ist. **Hinweis:** Die NSS-Prüfung erzeugt False Positives auf domänen-gebundenen/SSSD-/LDAP-/Winbind-Hosts, die ein Modul außerhalb der integrierten Allowlist verwenden — aus diesem Grund wird sie absichtlich mit geringerer Konfidenz bewertet als der pam_permit.so-Abgleich; verwenden Sie `--config`, um nicht erkannte Modulnamen für Ihre Umgebung auf die Allowlist zu setzen. Nur-Flag — Änderungen an der Authentifizierungskonfiguration erfordern eine sorgfältige Überprüfung.

*Beispielbefunde:*```
[HIGH] PAM_BACKDOOR
Title:         PAM config unconditionally permits authentication
Artifact:      /etc/pam.d/sshd
Raw value:     auth required pam_permit.so
Remediation:   not available
root@kitploit:~
[HIGH] PAM_BACKDOOR
Title:         Unexpected NSS module in nsswitch.conf
Artifact:      /etc/nsswitch.conf
Raw value:     passwd: files evilmod
Remediation:   not available

KERNEL_MODULE_SUSPICIOUS — Kernel-Module laufen im Ring 0 mit uneingeschränktem Zugriff. Angreifer laden häufig benutzerdefinierte Kernel-Module für Rootkits, Packet Sniffing oder Prozessverbergung. Diese Regel vergleicht aktuell geladene Module mit einer kleinen Allowlist erwarteter integrierter Module (die auf den meisten Systemen üblich sind). Sie hat den Schweregrad LOW, weil diese Allowlist bewusst eng gefasst ist. Hinweis: Hardware-lastige Hosts mit GPU-Treibern, WLAN-Karten oder proprietären Treibern erzeugen False Positives. Responder sollten die erwarteten Module ihres Hosts über --config hinzufügen und dabei nach Modulnamen allowlisten (der als artifact_path verwendet wird). Nur-Flag — die Untersuchung von Kernel-Modulen erfordert Forensik-Tools und menschliche Expertise.

Beispielfund:``` [LOW] KERNEL_MODULE_SUSPICIOUS Title: Loaded kernel module not in the expected set Artifact: implant_rootkit Raw value: {'name': 'implant_rootkit', 'size': '12288', 'used_by': []} Remediation: not available

root@kitploit:~
**SETUID_INVENTORY** — Setuid- und Setgid-Binaries eskalieren automatisch Privilegien, wenn sie ausgeführt werden. Angreifer erstellen benutzerdefinierte Setuid-/Setgid-Binaries, um die Privilegieneskalation aufrechtzuerhalten, meist außerhalb der Standard-Systembinary-Verzeichnisse (ein gängiger Installationspfad wie /opt, das eigene /home eines Benutzers, /srv oder ein weltweit beschreibbares temporäres Verzeichnis). Diese Regel inventarisiert Setuid-/Setgid-Binaries über `find -perm -4000 -o -perm -2000` in `/usr /bin /sbin /opt /home /srv /tmp /var/tmp /dev/shm` und markiert alle außerhalb eines bekannten Basisbestands legitimer Systemdienstprogramme. Nur-Markierung — unerwartete Setuid-/Setgid-Binaries erfordern eine Untersuchung, können aber legitime, von Anwendungen installierte Binaries sein.

*Beispielfund:*```
[LOW] SETUID_INVENTORY
Title:         Unexpected setuid binary
Artifact:      /tmp/.hidden/backdoor
Raw value:     setuid
Remediation:   not available

JSON-Ausgabe

--json schreibt ein einzelnes JSON-Objekt nach stdout. Sonst wird nichts ausgegeben.```json { "scan_metadata": { "tool_version": "2.1.0", "hostname": "web-01", "generated_at": "2026-06-10T08:22:03.114523+00:00", "ubuntu_version": "Ubuntu 22.04.3 LTS", "architecture": "x86_64", "duration_s": 2.84, "collector_failures": 0, "bundle_integrity": "live", "command_collectors_skipped": [], "collectors_degraded": {}, "rules_failed": [], "timeline_error": null, "suppressed_by_baseline": 1 }, "artifact_counts": { "ProcessCollector": 142, "NetworkCollector": 23, "UserCollector": 4, "CronCollector": 7, "SystemdCollector": 12, "SSHCollector": 3, "SudoersCollector": 5, "EnvironmentCollector": 18 }, "findings": [ { "rule_id": "CRON_TMP_PATH", "severity": "HIGH", "title": "Cron job references writable temp directory", "description": "A cron job was found referencing /tmp, /var/tmp, or /dev/shm. These directories are world-writable and commonly used as attacker staging grounds.", "artifact_path": "/etc/cron.d/cleanup", "raw_value": "0 * * * * root /tmp/.update", "remediation_available": true, "remediation_description": "Will remove the offending cron entry from /etc/cron.d/cleanup after creating a timestamped backup.", "related_events": [ { "timestamp": "2024-01-15T08:20:00+00:00", "source": "syslog", "description": "CRON[2841]: (root) CMD (/tmp/.update)" } ], "confidence": 75, "confidence_band": "HIGH", "signals": [ {"name": "timeline_corroboration", "weight": 25, "detail": "1 nearby timeline event(s)"} ] }, { "rule_id": "PROCESS_MASQUERADE", "severity": "MEDIUM", "title": "Process masquerading as system binary", "description": "Process 'sshd' (pid=1337) has exe path outside standard binary directories: /tmp/.sshd", "artifact_path": "/proc/1337/exe", "raw_value": "/tmp/.sshd", "remediation_available": false, "guided_remediation": "Confirm pid 1337 is malicious (ls -l /proc/1337/exe, cat /proc/1337/cmdline), then terminate it: kill -9 1337.", "confidence": 50, "confidence_band": "MEDIUM", "signals": [] } ], "timeline": [ { "timestamp": "2024-01-15T08:22:01+00:00", "source": "syslog", "description": "sshd: Accepted publickey for alice from 10.0.0.42 port 52341" } ], "report_sha256": "a3f1c9…(64 hex chars)" }

root@kitploit:~
`remediation_results` erscheint nur dann als zusätzlicher Schlüssel auf oberster Ebene, wenn `--remediate` übergeben wird. `report_sha256` ist immer vorhanden und wird über den Rest des Dokuments berechnet. `scan_metadata.bundle_integrity` ist `"live"` für `scan` und `analyze --root`, `"ok"` für ein verifiziertes Bundle, das an `analyze` übergeben wurde, und `"mismatch"`, wenn der Inhalt eines Bundles nicht mit seinem Manifest übereinstimmt — siehe [Bundle-Integrität in der JSON-Ausgabe](#bundle-integrity-in-json-output). `scan_metadata.command_collectors_skipped` benennt alle befehlsbasierten Collectors (`NetworkCollector`, `SystemdCollector`, `PackageCollector`, `KernelCollector`), die für einen `--root`-Lauf übersprungen wurden — immer leer für `scan` und `analyze BUNDLE`. `scan_metadata.suppressed_by_baseline` ist die Anzahl der Findings, die eine `--baseline`-Datei aus diesem Bericht entfernt hat — siehe [Known-good-Baselining](#known-good-baselining---baseline). `scan_metadata.collectors_degraded` ordnet einem Collector-Namen die Gründe für seine unvollständigen Daten zu (ein fehlgeschlagener oder abgelaufener Befehl, eine unlesbare Datei, eine übersprungene fehlerhafte Zeile), `rules_failed` listet jede abgestürzte Erkennungsregel auf, und `timeline_error` wird gesetzt, wenn die Timeline nicht erstellt werden konnte. Alle drei sind bei einem gesunden Lauf leer. Prüfe sie, bevor du eine leere Findings-Liste als „sauber" liest.

`related_events` und `guided_remediation` erscheinen bei einem Finding nur, wenn sie Inhalt haben. `related_events` enthält bis zu fünf Timeline-Ereignisse, die dem Finding über Artefaktpfad und Regel-Schlüsselwörter zugeordnet wurden, neueste zuerst — eine Aufdeckungshilfe, keine Kausalitätsaussage. `guided_remediation` ist eine geprüfte Befehlssequenz, die du manuell ausführen kannst; ubuntils führt sie niemals aus.

### Confidence-Bewertung

Jedes Finding trägt einen `confidence`-Wert (0–100, Standard 50) und ein `confidence_band` (`HIGH` ≥ 75, `MEDIUM` ≥ 40, `LOW` darunter), plus eine `signals`-Liste, die genau zeigt, wie dieser Wert zustande kam — jeder Eintrag ist `{"name", "weight", "detail"}`, sodass der Wert immer erklärbar ist, niemals eine Blackbox. Signale sind additiv auf einer Basis-Confidence von 50 und werden von der jeweiligen Regel oder Pipeline-Stufe angewendet, die sie erzeugt hat:

- Erkennungsregeln wenden ihre eigenen Signale zum Zeitpunkt des Findings an — z. B. fügen `SSH_UNAUTHORIZED_KEY` und `SHELL_RC_MODIFICATION` `content_match` (+30) hinzu, wenn der Inhalt des Artefakts einem bekannten gefährlichen Muster entspricht (eine gefährliche SSH-Key-Option; eine curl/wget-to-shell- oder base64-decode-Zeile in einer Shell-RC-Datei), `ctime_corroborates_mtime` (+20), wenn die ctime der Datei ebenfalls innerhalb des Erkennungsfensters liegt (schwerer zu fälschen als mtime allein), oder `mtime_only` (−20), wenn die Aktualität das *einzige* Signal ist und ctime sie nicht bestätigt — ein Hinweis darauf, dass die mtime möglicherweise zurückdatiert wurde.
- Die Pipeline wendet `timeline_corroboration` (+25) nach der Finding↔Timeline-Korrelation an, wenn ein Finding ein oder mehrere `related_events` hat.

Ein Finding im `LOW`-Band wird nicht verworfen oder versteckt — es erscheint weiterhin in der Findings-Liste und der JSON-Ausgabe genau wie jedes andere — aber das Band sagt dir, wie viel Gewicht du ihm beimessen solltest, bevor du weiter untersuchst. Dies ersetzt die alte mtime-only-Heuristik für `SSH_UNAUTHORIZED_KEY`/`SHELL_RC_MODIFICATION`, bei der eine veraltete, aber legitim berührte Datei (z. B. ein Konfigurationsmanagement-Tool, das `.bashrc` bei jedem Lauf neu schreibt) identisch mit einer echten neuen Backdoor aussah.

**Bekannte Einschränkung:** Nur Content-Pattern- und ctime-Signale sind derzeit aktiv. Eigentums-/Fingerprint-basierte Signale — ein unbekannter SSH-Key-Fingerprint, die `from=`-Einschränkungsoption eines Keys oder ein RC-Datei-Eigentümer-/Modus-Mismatch (ein `ownership_anomaly`-Signal) — sind noch nicht implementiert. Dies ist eine zurückgestellte Abdeckungslücke, die für eine zukünftige Version vorgemerkt ist, und nichts, was der aktuelle Confidence-Wert berücksichtigt.

---

## Remediation

Fünf der sechzehn Erkennungsregeln haben automatisierte Remediation: `CRON_ROOT_EXEC`, `CRON_TMP_PATH`, `LD_PRELOAD_INJECT`, `SSH_UNAUTHORIZED_KEY` und `SUDOERS_NOPASSWD`. Die übrigen sind nur zur Kennzeichnung und werden niemals automatisch behoben, weil ein sicheres Handeln bei ihnen zuerst einen menschlichen Blick erfordert.

### Guided Remediation

`SUSPICIOUS_SYSTEMD_TIMER`, `PROCESS_MASQUERADE` und `SHELL_RC_MODIFICATION` tragen einen `guided_remediation`-String: die exakten Befehle, die auszuführen sind, sobald du das Finding bestätigt hast — `systemctl disable --now <unit>`, `kill -9 <pid>` oder die RC-Datei-Überprüfung und -Rückgängigmachung. Er erscheint im TUI-Detailbereich und in JSON. ubuntils führt ihn niemals für dich aus; diese Regeln bleiben per Design aus dem `--remediate --confirm`-Durchlauf heraus.

### In der TUI

Wähle ein beliebiges Finding mit einer Remediation im Findings-Tab aus und drücke dann `R`. Ein Bestätigungsmodal zeigt die geplante Aktion als Vorschau. Drücke `Y`, um sie anzuwenden — der Remediator läuft in einem Hintergrund-Thread, damit die TUI reaktionsfähig bleibt. Die Finding-Zeile aktualisiert sich zu `[fixed]`, sobald dies erledigt ist, mit dem Backup-Pfad und dem exakten Rollback-Befehl inline angezeigt.

### Von der CLI

`--remediate` ohne `--confirm` ist ein sicherer Dry Run: Backups werden erstellt und die Validierung läuft, aber es werden keine Änderungen angewendet. Übergib beide Flags, um tatsächlich Änderungen vorzunehmen. Die Pipeline läuft in diesem Modus vor dem Start der TUI, und der Summary-Tab listet jedes Remediation-Ergebnis mit seinem Backup-Pfad und Rollback-Befehl auf.

`--remediate --confirm` wirkt nur auf Findings mit einem Confidence-Wert von mindestens 40 (das MEDIUM-Band) — ein `SSH_UNAUTHORIZED_KEY` mit niedriger Confidence und nur mtime-Signal wird als `SKIPPED` gemeldet, anstatt seinen Key zu löschen. Passe die Schwelle mit `--min-confidence N` an.```bash
sudo ubuntils scan --remediate          # dry run
sudo ubuntils scan --remediate --confirm # apply changes, then open TUI
sudo ubuntils scan --remediate --confirm --min-confidence 75  # only HIGH-confidence findings

Schutzmaßnahmen

Jede Behebung folgt demselben Muster, unabhängig davon, wie sie ausgelöst wird:

  1. Prüfen, ob der Artefaktpfad ein Symlink ist — falls ja, ablehnen (verhindert, dass root durch angreiferkontrollierte Symlinks schreibt)
  2. Ein zeitgestempeltes Backup unter /var/backups/ubuntils/YYYYMMDD_HHMMSS/ mit Modus 0700 erstellen
  3. Aktuellen Zustand validieren (die exakte Zeile muss noch vorhanden sein)
  4. Die minimal mögliche Änderung anwenden — Cron-Einträge und Schlüssel Zeile für Zeile entfernt; LD_PRELOAD-Zeilen in Shell-Init-Dateien auskommentiert; Einträge in /etc/ld.so.preload entfernt (der Loader hat dort keine Kommentarsyntax, ein auskommentierter Eintrag würde also trotzdem geladen). Bei sudoers wird der bearbeitete Inhalt mit visudo -cf an einer temporären Kopie geprüft, bevor die echte Datei angefasst wird
  5. Atomar schreiben — neuer Inhalt geht in eine temporäre Datei neben dem Original (gleicher Modus und Eigentümer), wird fsync'd, dann über die Originaldatei umbenannt, sodass ein Absturz mitten im Schreiben keine abgeschnittene /etc/sudoers hinterlassen kann
  6. Verifizieren, dass die exakte Zeile verschwunden ist

Wenn ein Schritt fehlschlägt, stoppt die Behebung sofort, das System bleibt unverändert, und der vollständige Fehler wird mit Backup-Pfad und Rollback-Befehl gemeldet. Sudo-Zugriff ist auf zwei Arten geschützt: %group-NOPASSWD-Regeln (wie %sudo) sind nur Flag-basiert und werden nie automatisch entfernt, und der sudoers-Remediator weigert sich, die letzte Regel aus der Haupt-sudoers-Datei zu entfernen.


Wazuh-Integration

ubuntils ist für eine Single-Host-Triage zu einem bestimmten Zeitpunkt gebaut — du führst es aus, wenn du bereits vermutest, dass etwas nicht stimmt, und es telefoniert nie nach Hause oder beobachtet weiter, nachdem der Scan beendet ist. Das ist Absicht, bedeutet aber auch, dass ein Befund von ubuntils nur in diesem einen Bericht lebt, es sei denn, etwas trägt ihn weiter. Die meisten Teams, die Ubuntu in irgendeinem Maßstab betreiben, haben bereits ein SIEM, das die kontinuierliche Seite der Erkennung übernimmt. Statt ubuntils zu einem eigenen langlaufenden Monitoring-Agenten zu machen, übergibt es seine Befunde an das, was du wahrscheinlich bereits betreibst: Wazuh.

Wenn ein Wazuh-Agent auf dem Host vorhanden ist (/var/ossec/bin/wazuh-agentd oder /var/ossec/etc/ossec.conf existiert), hängt ubuntils scan (sofern nicht mit --no-wazuh ausgeführt) jeden Befund als eine JSON-Zeile an /var/log/ubuntils/wazuh-alerts.json an, damit der Agent ihn aufnimmt — dies ist ein reiner Forwarder, kein Wazuh-Modul: kein Netzwerkaufruf, kein API-Schlüssel, nichts außer denselben lokalen Artefakt-Schreibvorgängen, die ubuntils ohnehin macht — wobei der Agent diese Zeilen natürlich außerhalb des Hosts an seinen Manager liefert; das ist der Sinn. Es wird automatisch erkannt, ohne dass ein Flag erforderlich ist (verwende --no-wazuh, um einen Lauf abzumelden), sodass ein skriptgesteuerter oder geplanter ubuntils scan auf einer Flotte von agentenregistrierten Hosts sofort das SIEM speist, ohne zusätzliche Verkabelung. Dies geschieht nie während des Offline-ubuntils analyze (Bundle oder --root), da diese Befunde einen anderen Host beschreiben als den, der den lokalen Wazuh-Agenten ausführt — das Weiterleiten der Befunde eines Bundles an den eigenen Agenten des Analysten würde sie der falschen Maschine zuordnen.

Die Absicht ist, ubuntils in eine bestehende Alerting-/Eskalations-Pipeline einzufügen, statt einen Responder zu bitten, ein zweites Tool zu hüten: Sobald die untenstehenden Beispielregeln geladen sind, erscheint ein ubuntils-Befund mit hohem Schweregrad (ein neues UID-0-Konto, ein LD_PRELOAD-Rootkit, eine PAM-Backdoor) als normaler Wazuh-Alert, erbt das gesamte Benachrichtigungs-Routing, das der Manager bereits konfiguriert hat, und steht neben jedem anderen Signal in derselben Timeline statt in einer eigenständigen JSON-Datei, an deren Überprüfung sich jemand erinnern muss.

Damit Wazuh diese Befunde parst und alarmiert, kopiere die Beispielregeln aus examples/wazuh/ auf deinen Wazuh-Manager und füge den <localfile>-Block aus examples/wazuh/ossec_localfile_snippet.xml zur /var/ossec/etc/ossec.conf des Agenten hinzu. Es ist keine Installation eines benutzerdefinierten Decoders nötig: Die localfile ist mit log_format json konfiguriert, sodass Wazuhs eingebauter JSON-Decoder jede Zeile parst und jeden Top-Level-JSON-Schlüssel k auf data.k abbildet, worauf local_rules.xml direkt matcht.

  1. examples/wazuh/local_rules.xml → /var/ossec/etc/rules/ des Managers
  2. <localfile>-Block aus examples/wazuh/ossec_localfile_snippet.xml → /var/ossec/etc/ossec.conf des Agenten
  3. Beide neu starten: systemctl restart wazuh-manager (Manager), systemctl restart wazuh-agent (Agent-Host)

Dies sind nur Beispielvorlagen, die als Ausgangspunkt dienen — sie wurden nicht gegen einen Live-Wazuh-Manager getestet und sollten in einer Nicht-Produktionsumgebung verifiziert werden, bevor man sich auf sie verlässt.

JSON-Schema pro Zeile:

FeldTypBeschreibung
timestampstring (ISO 8601)Wann der Befund weitergeleitet wurde
hostnamestringDer gescannte Host
rule_idstringEntspricht der Erkennungsregel-ID von ubuntils (siehe Tabelle „Detection Rules" oben)
severitystringHIGH | MEDIUM | LOW
titlestringKurzer, menschenlesbarer Titel
descriptionstringVollständige Befundbeschreibung
artifact_pathstringDatei-/Ressourcenpfad, an dem das Problem gefunden wurde
raw_valuestringDie rohe Zeile/der rohe Wert, die/der die Regel ausgelöst hat
remediation_availableboolOb ubuntils einen Remediator für diese Regel hat
related_eventsarray (optional)Korrelierte Timeline-Ereignisse, falls vorhanden

Collectors

CollectorGesammelte Artefakte
ProcessCollectorLaufende Prozesse aus /proc und ps-Ausgabe
NetworkCollectorOffene Verbindungen und Listener aus ss/netstat
UserCollector/etc/passwd, /etc/shadow, /etc/group
CronCollector/etc/cron*-Verzeichnisse und /var/spool/cron/crontabs/*
SystemdCollectorsystemctl list-timers- und list-units-Ausgabe
SSHCollector~/.ssh/authorized_keys für alle Benutzer
SudoersCollector/etc/sudoers und alle Dateien unter /etc/sudoers.d/
EnvironmentCollector/etc/environment, /etc/profile.d/*, Benutzer-Shell-Init-Dateien
PackageCollectorSystempaket-Integrität via dpkg --verify, Immutable-Flag-Attribute via lsattr und setuid/setgid-Binaries via find
PamCollector/etc/pam.d/*-Dateien und /etc/nsswitch.conf
KernelCollectorGeladene Kernelmodule via lsmod

Collector-Abhängigkeiten

PackageCollector benötigt drei Standard-Ubuntu-Tools auf dem Live-Host (dpkg, lsattr, find — alle auf Standard-Ubuntu-Installationen vorhanden). Wenn ein Befehl nicht verfügbar ist, erzeugt PackageCollector für diesen Teil auf saubere Weise leere Daten, statt abzustürzen. Die Offline-Analyse (analyze BUNDLE) spielt die aufgezeichnete Befehlsausgabe vom collect-Zeitpunkt erneut ab, sodass die Befehlsverfügbarkeit auf dem Host des Analysators nicht erforderlich ist.

Der setuid/setgid-find-Scan übergibt -xdev, um begrenzt zu bleiben — er steigt nicht in separat gemountete Dateisysteme hinab (ein eigenständiger Mount unter /opt, ein NFS-gemountetes /home usw.). Dies ist ein bewusster Kompromiss zwischen Laufzeit und Abdeckung: Ohne -xdev könnte der Scan beim Scannen von Netzwerk-Mounts oder virtuellen Dateisystemen hängen bleiben. Wenn deine Umgebung diese Pfade auf separaten Dateisystemen mountet, sei dir bewusst, dass sie nicht gescannt werden.

dpkg --verify und der setuid/setgid-find-Scan verwenden großzügige, nicht standardmäßige Timeouts (10 Minuten bzw. 5 Minuten, siehe ubuntils/collectors/packages.py), da beide auf einem echten Host mit großer Paketdatenbank oder großem Dateisystembaum legitim weit über den Bibliotheksstandard von 30 Sekunden hinaus laufen können; ubuntils collect verwendet dieselben Timeouts, wenn diese Befehle in ein Bundle aufgenommen werden.


Kompatibilität

Unterstützt
Ubuntu20.04, 22.04, 24.04
Architekturamd64, arm64
Python3.9+
PrivilegienRoot erforderlich für vollständigen Artefaktzugriff

Die Ausführung ohne Root erzeugt einen Teilscan mit Warnungen. Kritische Pfade wie /etc/shadow, geschützte Crontab-Verzeichnisse und einige /proc-Einträge werden übersprungen.


Roadmap

v1.0.0

  • Alle 8 Collectors
  • Alle 8 Erkennungsregeln
  • Timeline-Builder (syslog, journald, auditd)
  • Live-Scan-Fortschrittsbildschirm mit ✓/✗ pro Collector
  • Interaktive Vier-Tab-TUI (Summary / Findings / Timeline / Stats)
  • In-TUI-Behebung mit Bestätigungsmodal und Hintergrund-Worker
  • JSON-Ausgabemodus
  • CLI-Behebung für 5 Regeln mit Backup, Rollback und Symlink-Schutz
  • Ubuntu 20.04/22.04/24.04-Unterstützung
  • 240 Tests bei 90 % Abdeckung

v1.1.0

  • False-Positive-Allowlisting nach Regel-ID oder Pfad (--config)
  • --output FILE zum direkten Schreiben von Berichten
  • --since-Timeline-Fensterung
  • Manipulationssichere Berichte (report_sha256, Hostname, Zeitstempel)
  • USER_UID_ZERO-Erkennungsregel

v1.5.0

  • Benutzerdefinierte Pattern-Match-Erkennungsregeln via YAML (--rules)
  • PROCESS_SUSPICIOUS_CONNECTION — Prozess↔Netzwerk-Korrelation per PID
  • Automatische Befund↔Timeline-Korrelation (related_events)
  • Geführte Behebung für die drei Regeln, die Urteilsvermögen erfordern
  • 282 Tests bei 92 % Abdeckung

VirusTotal-Hash-Abfragen und MISP-IOC-Export wurden aus diesem Release gestrichen. VirusTotal antwortet nur für bekannte Hashes — der Fall, den rkhunter bereits abdeckt, und das Gegenteil der Lücke bei neuartigen Techniken, auf die ubuntils abzielt — und beide Funktionen hätten einen Netzwerkaufruf in ein Tool eingebaut, dessen Wert darauf beruht, keinen zu machen. ubuntils selbst macht weiterhin keine Netzwerkaufrufe (siehe die Wazuh-Integration für den einen abmeldbaren Weg, wie Befunde den Host über einen lokalen Agenten verlassen können).

v2.0.0 — Offline-Collect/Analyze-Split

  • ubuntils collect — erfasst ein manipulationssicheres Bundle (manifest.json + gehashte Dateien/Befehle) von einem Live-Host, ohne Erkennung
  • ubuntils analyze (BUNDLE | --root PATH) — führt dieselbe Erkennungs-/Timeline-Pipeline wie scan gegen ein Bundle oder ein gemountetes Image aus, ohne Root erforderlich
  • bundle_integrity (live/ok/mismatch) in scan_metadata sichtbar gemacht
  • Dokumentierte Lücken in der Erkennungsabdeckung im Offline-Modus (PROCESS_MASQUERADE, PROCESS_SUSPICIOUS_CONNECTION und reduzierte Abdeckung für cron/sudoers/SSH-Glob-Pfade und systemd-Timer-ExecStart)
  • Vertrauenswürdige Erkennung: Confidence-Scoring (confidence/confidence_band/signals), --baseline-Unterdrückung, Ersetzung reiner mtime-Heuristiken in SSH_UNAUTHORIZED_KEY/SHELL_RC_MODIFICATION durch ctime- und Inhalts-Signale sowie eine echte Offline-Timeline für sowohl analyze BUNDLE als auch analyze --root
  • Coverage-Pack: PACKAGE_TAMPERED, IMMUTABLE_FLAG_SET, PAM_BACKDOOR, KERNEL_MODULE_SUSPICIOUS, SETUID_INVENTORY (via PackageCollector, PamCollector, KernelCollector; alle konstruktionsbedingt nur Flag-basiert)
  • 400 Tests bei 93,79 % Abdeckung

v2.1.0 — SIEM-Forwarding

  • Live-ubuntils scan-Befunde werden als JSONL an einen lokalen Wazuh-Agenten weitergeleitet, automatisch erkannt (kein Flag erforderlich)
  • Beispiel-Wazuh-Decoder/-Regeln und ossec.conf-<localfile>-Snippet (examples/wazuh/)
  • Forwarding absichtlich nur auf Live-scan beschränkt — wird nie während Offline-analyze ausgelöst, da ein Bundle oder Image einen anderen Host beschreibt als den, der den Agenten ausführt
  • --no-wazuh, um einen Scan vom Forwarding abzumelden

v2.1.0 — Härtung (Audit der gesamten Codebasis)

  • Sicherheit: sudo-Re-Exec leitet den PATH des Aufrufers nicht mehr weiter, und Befehle werden auf einem festen sicheren Pfad aufgelöst; sudoers-Bearbeitungen werden mit visudo geprüft, bevor die Datei angefasst wird; atomare Behebungsschreibvorgänge; symlink-sichere Berichts-/Bundle-Ausgabe; extrahierte Bundles werden nach analyze gelöscht
  • Erkennungsabdeckung: /etc/ld.so.preload geparst, @reboot/@daily-Cron-Einträge und /etc/cron.{hourly,daily,weekly,monthly}-Skripte, systemd-.service-Units und nicht root-eigene ExecStart-Binaries, %group-sudoers-Regeln und #include/@includedir, jedes Element einer LD_PRELOAD-Liste
  • Neue USER_EMPTY_PASSWORD-Regel (Login-Konto ohne Passwort)
  • Weniger False Positives: separator-begrenzte Pfadprüfungen, setuid vs. setgid unterschieden, snap-//usr/lib-Daemons als Standard behandelt, KERNEL_MODULE_SUSPICIOUS auf LOW herabgestuft, ein NSS-Befund pro Modul
  • Ehrliche Berichte: fehlgeschlagene Regeln und degradierte Collectors in scan_metadata und der TUI erfasst; ein Timeline-Fehler verwirft keine Befunde mehr; manipulierte Bundles warnen und beenden mit Exit-Code 3; syslog-Jahr/Zeitzone korrekt behandelt
  • Sicherere Behebung: --min-confidence-Gate (Standard 40), Ergebnisse nach scan --remediate in der TUI angezeigt
  • 444 Tests bei 94,29 % Abdeckung

v3.0.0 / v4.0.0 (explorativ)

  • Web-Dashboard für Multi-Host-Triage
  • macOS-Unterstützung

Mitwirken

Die derzeit nützlichsten Beiträge sind neue Erkennungsregeln (hinzugefügt als eigenständige Funktionen in detectors/rules.py mit einem passenden Test), zusätzliche Collectors für noch nicht abgedeckte Artefakttypen, Behebungsmodule für SUSPICIOUS_SYSTEMD_TIMER und SHELL_RC_MODIFICATION (beide derzeit konstruktionsbedingt nur Flag-basiert, aber sichere automatische Behebungspfade könnten existieren), Testfälle für Randfälle bei bestimmten Ubuntu-Konfigurationen und Dokumentationsverbesserungen.

Öffne ein Issue, bevor du einen großen Beitrag beginnst, um doppelte Arbeit zu vermeiden.


Lizenz

MIT


Autor

Erstellt von Asmit — BTech Computer Science, PES University, Bengaluru. Das Tool entstand aus der Frustration darüber, wie lange manuelle Ubuntu-Triage dauert im Vergleich zu dem, was ein gut abgegrenztes Skript automatisieren kann.

Tool herunterladen
SHELL_RC_MODIFICATIONLOWNeinShell-Init-Dateien (bashrc, profile, zshrc usw.), die innerhalb der letzten 48 Stunden für einen Benutzer mit Login-Shell geändert wurden
PACKAGE_TAMPEREDHIGHNeinSystemeigene Paketdateien, die geändert wurden, fehlen oder deren Inhalt/Modus/Größe nicht mit dem Paketmanifest übereinstimmt (über dpkg --verify)
IMMUTABLE_FLAG_SETMEDIUMNeinUnveränderlichkeits- (i) oder Nur-Anhängen- (a) Flags, die auf sensible Dateien wie /etc/passwd, /etc/sudoers oder /etc/pam.d/* gesetzt sind (erkannt über lsattr)
PAM_BACKDOORHIGHNeinEine wörtliche pam_permit.so-Zeile in einer /etc/pam.d/*-Datei oder ein NSS-Modul in /etc/nsswitch.conf außerhalb einer Allowlist (files/sss/ldap/winbind/...)
KERNEL_MODULE_SUSPICIOUSLOWNeinGeladene Kernelmodule außerhalb einer Allowlist gängiger integrierter Module — Hinweis: hardwarelastige Hosts (GPUs, WLAN-Karten, proprietäre Treiber) werden Fehlalarme sehen; fügen Sie erwartete Module über --config hinzu
SETUID_INVENTORYLOWNeinUnerwartete setuid- oder setgid-Binärdateien außerhalb eines bekannten Basisbestands (die beiden Bits werden getrennt geprüft und gemeldet)