Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
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
mofos — Framework zur Manipulation virtueller Maschinen | Kitploit
Tools/GitHubGitHub/synacktiv/mofos
Scripting & AutomatisierungSicherheitsvirtualisierungNetzwerksicherheitPenetrationstestsDienstprogramme & FrameworksRed Teaming
GitHubsynacktiv/mofos

mofos

Framework zur Manipulation virtueller Maschinen

Repository anzeigen
1086vor 5 MonatenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
  • mofos
    • Konzept
    • Installation
    • Host konfigurieren
      • QEMU/KVM-Systemsitzung
      • Sicherheitshinweise
    • Mofos-Konfiguration
    • Vorlage installieren
      • Firewall konfigurieren
      • Installieren
      • Importieren
    • Leere Festplatte für die obere Ebene erstellen
    • Eine virtuelle Maschine erstellen
    • Anpassung
      • Vorlage – Hook install
      • Virtuelle Maschine – Hook new
      • Virtuelle Maschine – Hook start
    • Funktionen
      • Benachrichtigung beim Starten oder Stoppen der VM einrichten
      • Zwischenablage
      • Routing zwischen Maschinen einrichten
      • Tunneling durch Pentest-Boxen einrichten
      • USB-Verwaltung
      • Verwaltung von PCI-Geräten
      • Gemeinsame Ordner
    • Windows-Maschinen
    • Autovervollständigung
    • Überlappung von IP-Adressen

mofos

Mofos ist ein Werkzeug zum Erstellen, Ausführen und Verwalten von virtuellen Maschinen. Es nutzt Libvirt/QEMU/KVM und Python und ist dadurch mit jeder Linux-Distribution kompatibel. Stark inspiriert von Qubes OS (https://www.qubes-os.org/) zielt Mofos darauf ab, viele seiner Funktionen nachzubilden.

Das Werkzeug wurde ausgiebig auf Debian mit Debian-basierten virtuellen Maschinen getestet. Obwohl andere Linux-Distributionen voraussichtlich funktionieren, können zusätzliche Konfigurationen erforderlich sein. Weitere Details werden noch ergänzt.

Mofos bietet eine Reihe von Funktionen, die sich auf die sichere Verwaltung virtueller Maschinen konzentrieren, darunter:

  • Nahtlose Fensterintegration mithilfe von Xpra.
  • Ein Zwischenablagesystem, das das Senden und Empfangen von Inhalten der Zwischenablage zwischen Host und virtuellen Maschinen ermöglicht.
  • SSH-Kommunikation mit virtuellen Maschinen.
  • Standardmäßige Netzwerkbeschränkungen mit flexiblen Optionen, um Datenverkehr von einer virtuellen Maschine über andere oder entfernte Server zu leiten oder zu tunneln.

Konzept

Eine Mofos-Maschine besteht aus zwei Festplatten, die mithilfe von overlayfs kombiniert werden. Die erste Festplatte, die als untere Ebene bezeichnet wird, ist eine schreibgeschützte Vorlagenfestplatte, während die zweite Festplatte alle Änderungen speichert, die von der virtuellen Maschine vorgenommen werden. Diese Vorlagenfestplatte wird von mehreren virtuellen Maschinen gemeinsam genutzt. Dadurch erfordert das Erstellen einer neuen virtuellen Maschine lediglich das Klonen einer leeren Festplatte, die bereits partitioniert ist, um die geänderten Daten aufzunehmen. Dieser Ansatz stellt sicher, dass neue virtuelle Maschinen schnell erstellt werden können, während die Vorlage unabhängig aktualisiert werden kann. Aktualisierungen der Vorlage werden bei den abhängigen virtuellen Maschinen beim nächsten Neustart wirksam.

Installation

Je nach Linux-Distribution kann das Makefile verwendet werden, um entweder ein deb-Paket zu erzeugen oder die Dateien direkt zu installieren.``` make deb apt install ./mofos-VERSION.deb

root@kitploit:~
Während der `apt`-Installation werden verschiedene Einstellungen abgefragt. Die Standardoptionen können im Allgemeinen akzeptiert werden. Die einzige Einstellung, die Beachtung erfordert, ist die Subnetz-Adresse, die vom mofos-libvirt-Netzwerk verwendet wird (Standard: `192.168.90.0/24`).

ODER 

Installieren Sie die folgenden Abhängigkeiten:
- guestfs-tools
- libnotify-bin
- libvirt
- libvirt-clients
- libvirt-daemon
- make
- python3-click
- python3-click-completion
- python3-colorama
- python3-cryptography
- python3-dbus
- python3-jinja2
- python3-lxml
- python3-prettytable
- python3-pyroute2
- python3-tqdm
- qemu-system-common 
- qemu-system-modules-spice
- socat
- spice-client-gtk
- sudo
- virtinst
- virt-install
- virtiofsd
- virt-manager
- virt-viewer```
make install_files

Je nach Distribution werden die nach /usr/lib/python3/dist-packages kopierten Python-Dateien vom Python-Interpreter möglicherweise nicht erkannt und sollten an einem anderen Ort abgelegt werden. Unter Fedora müssen die Python-Dateien beispielsweise nach /usr/lib/python3.11/site-packages kopiert werden.

[!WARNING] Achtung, seit Debian trixie wird xpra nicht mehr als Paket bereitgestellt, du musst es manuell aus seinen eigenen Repositories installieren. Siehe https://github.com/Xpra-org/xpra/wiki/Download#-for-debian-based-distributions für detaillierte Anweisungen.

Host konfigurieren

QEMU/KVM-Systemsitzung

Mofos verwendet die QEMU/KVM-Systemsitzung. Damit der Befehl virsh auf virtuelle Maschinen und zugehörige Ressourcen zugreifen kann, setze die Umgebungsvariable LIBVIRT_DEFAULT_URI auf qemu:///system:```console export LIBVIRT_DEFAULT_URI=qemu:///system

root@kitploit:~
### Sicherheitsaspekte

Die Verwendung von QEMU/KVM-Systemsitzungen verbessert die Isolation zwischen Host- und Gast-VMs, indem qemu-Instanzen unter einem dedizierten Benutzer (`libvirt-qemu`) ausgeführt werden und für jede Instanz spezifische Sicherheitsprofile angewendet werden.

Standardmäßig können normale Benutzer jedoch nicht über den System-Socket von `libvirtd` auf die Verwaltung von Maschinen, Netzwerken und anderen Ressourcen zugreifen. Um Zugriff zu erhalten, müssen Benutzer entweder Mitglied der libvirt-Unix-Gruppe sein oder sudo verwenden. In der Vergangenheit wurden lokale Privilege-Escalation-Schwachstellen ausgenutzt, um über die Mitgliedschaft in der libvirt-Gruppe Root-Rechte zu erlangen.

Um diese Risiken zu mindern, stellt dieses Repository ein verstärktes AppArmor-Profil für den `libvirtd`-Prozess auf Systemen mit AppArmor bereit. Dieses Profil schränkt erheblich ein, wohin `libvirtd` Dateien schreiben kann und welche Programme es ausführen darf.

Darüber hinaus sind `polkit`-Regeln enthalten, um die für Mitglieder der `libvirt`-Gruppe zulässigen Aktionen weiter zu kontrollieren.

Beachten Sie, dass die AppArmor-Profile im `deb`-Paket enthalten sind, aber nicht vom `install_files`-Ziel des Makefiles installiert werden und daher separat installiert werden müssen.

## Mofos-Konfiguration

Mofos benötigt eine Konfigurationsdatei unter `$HOME/.config/mofos/config.toml` mit minimalen Einstellungen, um korrekt zu funktionieren. Eine minimale Beispielkonfiguration finden Sie unter `/usr/share/mofos/config.minimal.toml`, während eine umfassendere Konfiguration unter `/usr/share/mofos/config.sample.toml` dokumentiert ist.

Der folgende Fehler zeigt an, dass die Konfigurationsdatei nicht gefunden wurde:```
[-] Copy the sample configuration file from /usr/share/mofos/config.minimal.toml to ~/.config/mofos/config.toml

Der folgende Fehler zeigt an, dass der aktuelle Benutzer nicht Mitglied der libvirt-Gruppe ist:``` [-] libvirtError("authentication unavailable: no polkit agent available to authenticate action 'org.libvirt.unix.manage'")

root@kitploit:~
Die wichtigsten Konfigurationseinstellungen, die in den Konfigurationsdateien angepasst werden müssen, sind wie folgt:
- key (Pfad): Die SSH-Private-Key-Datei, die für den Zugriff auf die virtuellen Maschinen verwendet wird. Es wird empfohlen, dafür einen eigenen Schlüssel zu erstellen.
- user (String): Der Benutzername für den SSH-Zugriff auf die virtuellen Maschinen.
- root_password (gehashter Wert): Das gehashte Root-Passwort, das während der Installation einer neuen Vorlage festgelegt werden soll.
- root_ssh_pubkey (String): Der öffentliche SSH-Schlüssel, der während der Vorlageninstallation im Verzeichnis des Root-Benutzers installiert werden soll.

Darüber hinaus müssen die folgenden Parameter für die Vorlageninstallation konfiguriert werden:
- ntp
- dns (optional, wenn ein Proxy bereitgestellt wird)
- proxy

## Vorlage installieren

### Firewall konfigurieren

Da der Installationsprozess auf PXE-Netboot basiert, ist eine aktive Internetverbindung erforderlich. Die folgenden Firewall-Regeln sollten konfiguriert werden:```
sysctl net.ipv4.ip_forward=1
iptables -t nat -I POSTROUTING -s 192.168.90.0/24 -j MASQUERADE
iptables -t nat -I POSTROUTING -s 192.168.91.0/24 -j MASQUERADE

Oder mit nftables:``` sysctl net.ipv4.ip_forward=1 nft insert inet nat postrouting iifname "install-*" masquerade nft insert inet nat postrouting iifname "mof0" masquerade

root@kitploit:~
Wenn der Parameter `ip_forward` auf 1 gesetzt ist, sollte die FORWARD-Kette so konfiguriert werden, dass andere Geräte im Netzwerk den Host nicht als Router verwenden können.

Insgesamt werden die folgenden Regeln empfohlen:```
iptables -I INPUT -i mof0 -p udp --sport 68 --dport 67 -j ACCEPT -m comment --comment "mofos dhcp"
iptables -I INPUT -i mof0 -p udp --dport 69 -j ACCEPT -m comment --comment "mofos tftp"
iptables -I OUTPUT -o mof0 -j ACCEPT -m comment --comment "host -> mofos"
iptables -I FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD -i mof0 -j ACCEPT -m comment --comment "mofos ->"
iptables -t nat -I POSTROUTING -s 192.168.90.0/24 -j MASQUERADE
iptables -t nat -I POSTROUTING -s 192.168.91.0/24 -j MASQUERADE

Oder mit nftables:``` table inet filter {

root@kitploit:~
chain input {
  type filter hook input priority 0; policy drop
  
  iifname "install-*" ip daddr 255.255.255.255 udp sport 68 udp dport 67 accept comment "mofos dhcp"
  iifname "mof0" ip daddr 255.255.255.255 udp sport 68 udp dport 67 accept comment "mofos dhcp"
  iifname "install-*" udp dport 69 accept comment "mofos tftp"
}

chain forward {
  type filter hook forward priority 0; policy drop
  
  ct state established,related accept;
  ct state invalid drop;
  
  iifname "mof0" counter accept
  iifname "install-*" counter accept
}

chain output {
  type filter hook output priority 0; policy drop
  
  oifname "mof0" counter accept
}

} table inet nat { chain postrouting { type nat hook postrouting priority 100 iifname "mof0" masquerade iifname "install-*" masquerade } }

root@kitploit:~
Es wird empfohlen, Masquerade- und Weiterleitungsregeln basierend auf Ihren spezifischen Anforderungen einzuschränken, um zu verhindern, dass virtuelle Maschinen von mofos auf das gesamte Host-Netzwerk zugreifen.

Die Isolation zwischen virtuellen Maschinen wird automatisch durch einen libvirt-Hook erzwungen, der nft benötigt, um ordnungsgemäß zu funktionieren.

### Installation

Der erste Schritt besteht darin, die Basisschicht zu erstellen: die Vorlage. Standardmäßig kann Mofos eine auf Debian 12 basierende Vorlage installieren.```
mofos template create debian-template

Note: Für jeden Befehl kann die Option --debug verwendet werden, um detaillierte technische Informationen bei unerwartetem Verhalten zu erhalten. Insbesondere für diesen Befehl erzwingt das --debug-Flag auch ein grafisches Fenster, das den Installationsfortschritt anzeigt. Alternativ kann die Installation mit virt-manager. überwacht werden.

Derzeit wird nur die Debian-12-Vorlage für die Installation unterstützt. Das folgende Python-Wörterbuch gibt das zu verwendende Installationsabbild an:```python NETBOOT = { "debian-stable-amd64": { "variant": "debian11", "url": "https://deb.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/netboot.tar.gz", } }

root@kitploit:~
Die Variante ist auf `debian11` gesetzt, da in Debian 12 die `osinfo`-Variante für Debian 12 noch nicht über libvirt installierbar ist.

Um eine andere Distribution zu installieren, ändern Sie das Dictionary unter `/usr/lib/python3/dist-packages/mofos/settings.py`.

Wenn der obige Befehl ausgeführt wird, lädt Mofos die Netboot-Dateien herunter und speichert das `tar.gz`-Archiv im Cache unter `$HOME/.cache/template-installer`. Derzeit wird das Netboot-Archiv nicht erneut heruntergeladen, wenn es bereits vorhanden ist. Dies kann zu Fehlern führen, wenn das zwischengespeicherte Archiv veraltet ist. Wenn solche Fehler während der Installation auftreten, erzwingt das Entfernen des zwischengespeicherten Archivs, dass Mofos eine aktualisierte Version herunterlädt, was das Problem beheben sollte.

Anschließend wird das Archiv nach `/tmp` extrahiert und libvirt wird so konfiguriert, dass es seine Inhalte über TFTP bereitstellt.

Die virtuelle Vorlagenmaschine wird dann erstellt und so eingerichtet, dass sie über PXE bootet und die angegebene Distribution mithilfe der bereitgestellten Preseed-Datei installiert (standardmäßig `/usr/share/mofos/templates/debian/preseed.cfg.j2`). Diese Datei ist eine `jinja2`-Vorlage; bevor sie in das TFTP-Root-Verzeichnis kopiert wird, werden Variablen aus den Konfigurationsdateien (`ntp`, `proxy`, `dns`, `root_password`) eingefügt.

Am Ende der Installation wird das `postinstall`-Skript im TFTP-Verzeichnis abgelegt und auf der Vorlage ausgeführt. Standardmäßig wird das Skript unter `/usr/share/mofos/templates/postinstall.sh.j2` verwendet. Diese `jinja2`-Vorlage fügt den öffentlichen SSH-Schlüssel ein, der auf der Vorlage konfiguriert werden soll.

Zusätzlich zur Konfiguration des öffentlichen SSH-Root-Schlüssels werden die folgenden Vorgänge durchgeführt:
- Den standardmäßigen SSH-Dienst deaktivieren und einen SSHD über virtuelle Sockets (vsock) aktivieren.
- Die Datei `/etc/resolv.conf` leeren.
- Den GRUB-Timeout auf 0 Sekunden konfigurieren.
- Einen initramfs-Hook installieren, der das overlayfs einhängt, wenn eine Partition mit der Bezeichnung `overlay` erkannt wird.

Sobald die Installation abgeschlossen ist, wird die libvirt-Virtualmaschine übernommen und in eine lokale `qcow2`-Datei komprimiert, die im aktuellen Verzeichnis gespeichert wird.```
$ mofos template create debian-template
[*] Installing debian-template
[*] Configure the SSH host key of the template
[*] Waiting for the installation to be complete
[*] Installation is complete
[*] Downloading the resulting qcow2 disk
[*] Compressing the disk
[*] Save template's public ssh host key
[+] Template installation finished
[+] Template disk is debian-template-disk.qcow2

Zusätzlich zur qcow2-Datei erstellt dieser Prozess auch einen Eintrag in der Datei $HOME/.local/share/mofos/ssh.json, der den Namen der Maschine und ihren öffentlichen SSH-Schlüssel enthält:```json { "disk": { "debian-template-disk.qcow2": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINrbOdOPENEj2KeHrYLdorQe9Ez1b9Bu5agZmgNDMayy" } }

root@kitploit:~
Diese Datei wird während des Importvorgangs automatisch verwendet.

### Import

Der nächste Schritt besteht darin, die erstellte `qcow2`-Vorlagendatei in Mofos zu importieren.```
$ mofos template import debian-template debian-template-disk.qcow2 http://debian.org/debian/11 
[*] Uploading debian-template-disk.qcow2 to mofos pool
[*] Creating the virtual machine debian-template
[*] Configuring the template metadata
[*] Configuring the SSH key
[+] debian-template successfully imported

Derzeit ist die Variante osinfo obligatorisch. Sie befinden sich in der Datei: /usr/lib/python3/dist-packages/mofos/settings.py.

Nach dem Import kann die Vorlage im Befehl mofos ls angezeigt werden:``` $ mofos ls +----+-----------------+---------+-------------+-------+-----+--------------+ | Id | Name | State | Description | Alias | Cid | IPv4 address | +----+-----------------+---------+-------------+-------+-----+--------------+ | | debian-template | shutoff | | | | | +----+-----------------+---------+-------------+-------+-----+--------------+

root@kitploit:~
Ab diesem Punkt kann die Vorlage gestartet und bei Bedarf zur Änderung aufgerufen werden.```
$ mofos start debian-template
$ mofos ls
+----+-----------------+---------+-------------+-------+-----+----------------+
| Id | Name            | State   | Description | Alias | Cid | IPv4 address   |
+----+-----------------+---------+-------------+-------+-----+----------------+
| 3  | debian-template | running |             |       | 3   | 192.168.90.202 |
+----+-----------------+---------+-------------+-------+-----+----------------+

Bitte geben Sie den zu übersetzenden Markdown-Inhalt ein.``` $ mofos ssh debian-template --user root root@linux:~#

root@kitploit:~
## Leere Disk für die obere Ebene erstellen

Der folgende Befehl erstellt eine leere obere Ebene mit dem angegebenen Label auf der einzigen Partition der Disk:```
$ mofos template create-overlay-disk

Standardmäßig ist diese Festplatte auf 50 GB eingestellt, belegt anfänglich jedoch nur etwa 100 MB. Diese Größe kann in der Konfigurationsdatei angepasst werden.

Erstellen einer virtuellen Maschine

Hinweis: Es wird empfohlen, eine Vorlage immer herunterzufahren, bevor Sie Mofos-virtuelle Maschinen manipulieren. Obwohl das gleichzeitige Ausführen einer Vorlage und ihrer virtuellen Maschinen unterstützt wird, kann dies zu Instabilität führen.``` $ mofos new test [] New virtual machine name is test [+] Virtual machine test successfully created [] Triggering post install actions [] Create SSH known_hosts entries for test [] Waiting for test to be up [+] test is ready $ mofos ssh test -u root Last login: Mon Jun 2 11:09:51 2025 from UNKNOWN root@linux:~#

root@kitploit:~
Beachten Sie, dass SSH-Verbindungen über virtuelle Sockets hergestellt werden, sodass Sie sich nicht direkt per SSH mit der neu erstellten Maschine verbinden können. Stattdessen müssen Sie den Befehl mofos ssh verwenden. Alternativ können Sie eine SSH-Konfiguration erstellen, die einen `ProxyCommand `angibt, um auf den SSH-Port der Maschine zuzugreifen:```
$ mofos inventory --format ssh
Host debian-template
	User user
	PasswordAuthentication no
	IdentityFile /home/user/.ssh/id_ed25519
	ProxyCommand /usr/bin/mofos proxy-cmd %h
	CanonicalizeHostname=no

Host test
	User user
	PasswordAuthentication no
	IdentityFile /home/user/.ssh/id_ed25519
	ProxyCommand /usr/bin/mofos proxy-cmd %h
	CanonicalizeHostname=no

Features:

  • Instalação simples e fácil de usar
  • Roda nativamente em Windows, Linux e Mac``` $ mofos inventory --format ssh > ~/.ssh/mofos $ echo "Include ~/.ssh/mofos" >> ~/.ssh/config $ ssh root@test Linux linux 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64

The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Mon Jun 2 11:09:51 2025 from UNKNOWN root@linux:~#

root@kitploit:~
Während einer `mofos ssh`-Sitzung wird im Voraus ein `ControlMaster`-Socket eingerichtet, um nachfolgende Verbindungen zu beschleunigen. Aus diesem Grund wird die MOTD nicht angezeigt.

## Anpassung

Um die Anpassung von Vorlagen und virtuellen Maschinen zu vereinfachen, führt Mofos das Konzept von Hooks und Tags ein. Für jedes Tag kann ein entsprechender Hook (ein Bash-Skript) ausgeführt werden, um automatisierte Aktionen auf der Ziel-VM oder Vorlage durchzuführen und sie entsprechend zu konfigurieren.

Minimale Hooks befinden sich in `/usr/share/mofos/hooks`. Dabei handelt es sich um einfache Bash-Skripte, die die folgenden Eingaben erhalten:```
TAG=$1
NAME=$2
OS=$3
DISTRIB=$4
HOSTNAME=$5

Template - hook install

Dieser Mechanismus kann mit Ansible genutzt werden, um während der Template-Installation Playbooks auszuführen:```bash #!/bin/bash

During template installation, the machine is not yet managed by mofos,

the inventory would not working.

A custom inventory is created on the fly using the given tag as main ansible

group and the distribution as secondary.

TAG=$1 NAME=$2 OS=$3 DISTRIB=$4 HOSTNAME=$5

if [ -z "${TAG}" ] || [ -z "${NAME}" ] || [ -z "${DISTRIB}" ] ; then exit 1 fi

Create inventory

ANSIBLE_DIRECTORY="/home/user/Documents/ansible" RANDOM_SUFFIX=$(printf "%x" $RANDOM) INVENTORY_FILE="${ANSIBLE_DIRECTORY}/inventory-${NAME}-${RANDOM_SUFFIX}.ini"

trap 'rm -f "${INVENTORY_FILE}"; exit' EXIT

cat > $INVENTORY_FILE <<EOF [all:vars] ansible_ssh_common_args="-o ProxyCommand='mofos proxy-cmd %h' -o CanonicalizeHostname=no"

[${TAG}] ${NAME}

[${DISTRIB}] ${NAME} EOF

export ANSIBLE_CONFIG="/home/user/Documents/ansible/ansible.cfg" export ANSIBLE_VERBOSITY=1

/usr/bin/ansible-playbook
-i "${INVENTORY_FILE}"
-l "${NAME}"
/home/user/Documents/ansible/playbooks/pentest/install.yml

root@kitploit:~
Dieses Skript erstellt dynamisch ein Inventar und führt ein Playbook dagegen aus.

### Virtuelle Maschine - neuer Hook

Während der Erstellung der virtuellen Maschine kann ein weiterer Hook verwendet werden, um beispielsweise den Hostnamen zu randomisieren.

Standardmäßig erzeugt Mofos einen Alias basierend auf der klassischen Windows-Namenskonvention (z. B. `DESKTOP-2BF9753`). Dieser Name wird zusammen mit anderen Informationen an das Hook-Skript übergeben:```
#!/bin/bash

TAG=$1
NAME=$2
OS=$3
DISTRIB=$4
HOSTNAME=$5

if [ -z "${TAG}" ] || [ -z "${NAME}" ] || [ -z "${OS}" ] ; then
  exit 1
fi

if [ -z "${HOSTNAME}" ] ; then
  HOSTNAME="${NAME}"
fi

mofos run -u root "${NAME}" "echo ${HOSTNAME} > /etc/hostname && hostname ${HOSTNAME}"

Als Nächstes sollte die Konfiguration bearbeitet werden, um diesen Hook zu aktivieren:``` [hooks.test] new = "/home/user/.config/mofos/hooks/new.sh"

root@kitploit:~
Dann wird dieses Skript während der Erstellung der virtuellen Maschine ausgeführt:```
$ mofos new test2 --tags test 
[*] New virtual machine name is test2
[+] Virtual machine test2 successfully created
[*] Triggering post install actions
[*] Create SSH known_hosts entries for test2
[*] Waiting for test2 to be up
[*] Running new hook: test
[+] test2 is ready

The input text for chunk 53 is missing — there is no content after "INPUT:" to translate. Please provide the chunk text.``` $ mofos ssh test2 -u root Last login: Mon Jun 2 11:09:51 2025 from UNKNOWN root@DESKTOP-2BF9753:~#

root@kitploit:~
Ähnlich wie in der Installationsphase können Ansible-Playbooks auch in dieser Phase ausgeführt werden. In diesem Fall kann der Befehl `mofos inventory` verwendet werden, um ein Ansible-Inventar zu erzeugen, was die Auswahl und den Zugriff auf virtuelle Maschinen vereinfacht:```
$ mofos inventory 
{
    "_meta": {
        "hostvars": {
            "debian-template": {
                "ansible_host": "debian-template",
                "ansible_ssh_common_args": "-o ProxyCommand='/usr/bin/mofos proxy-cmd %h'  -o CanonicalizeHostname=no"
            },
            "test": {
                "ansible_host": "test",
                "ansible_ssh_common_args": "-o ProxyCommand='/usr/bin/mofos proxy-cmd %h'  -o CanonicalizeHostname=no"
            },
            "test2": {
                "ansible_host": "test2",
                "ansible_ssh_common_args": "-o ProxyCommand='/usr/bin/mofos proxy-cmd %h'  -o CanonicalizeHostname=no"
            }
        }
    },
    "debian": [
        "debian-template",
        "test",
        "test2"
    ],
    "test": [
        "test2"
    ]

Note that groups are created based on the distribution variant as well as tags. These groups can be used to load different variables.

For example, the script below runs an arbitrary playbook:```bash #!/bin/bash

TAG=$1 NAME=$2 OS=$3 DISTRIB=$4 HOSTNAME=$5

if [ -z "${TAG}" ] || [ -z "${NAME}" ] || [ -z "${OS}" ] ; then exit 1 fi

if [ -z "$HOSTNAME" ] ; then HOSTNAME=$NAME fi

if [ $OS == "windows" ] ; then TAGS="hostname,desktop" else TAGS="hostname,hosts,desktop" fi

export ANSIBLE_CONFIG="/home/user/Documents/ansible/ansible.cfg" export ANSIBLE_VERBOSITY=0

/usr/bin/ansible-playbook
-i /home/user/Documents/ansible/inventory.py
-l "${NAME}"
-t "${TAGS}"
-e "hostname=${HOSTNAME}"
/home/user/Documents/ansible/playbooks/pentest/update.yml

root@kitploit:~
### Virtuelle Maschine – Start-Hook

Ebenso wird der Start-Hook ausgeführt, wenn eine virtuelle Maschine startet. Er wird typischerweise verwendet, um Dienste zu starten, die von der virtuellen Maschine benötigt werden.

Um beispielsweise eine nahtlose Windows-Integration innerhalb der virtuellen Maschine zu ermöglichen, kannst du `Xpra` installieren.

Zuerst `ansible` installieren:```
# apt install ansible

Als Nächstes führen Sie das Benutzer-Playbook aus, das sich im Verzeichnis ansible befindet. Bearbeiten Sie zuvor die Datei playbooks/user.yml, um den Passwort-Hash und den öffentlichen SSH-Schlüssel zu aktualisieren, die im Home-Verzeichnis des Benutzers installiert werden sollen.``` ~/mofos/ansible$ ls ansible.cfg ansible.log inventory.sh playbooks

root@kitploit:~
Bitte fügen Sie den zu übersetzenden Markdown-Text ein.```
$ ansible-playbook playbooks/user.yml -l test2
Using /home/user/mofos/ansible/ansible.cfg as config file
[WARNING]: Found both group and host with same name: test

PLAY [Create and configure a user]

[...]

PLAY RECAP
test2 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0   

Danach können Sie sich per SSH in dieses Benutzerkonto einloggen, sofern die Konfiguration diesen Benutzer als Standard festlegt:``` $ mofos ssh test2 user@DESKTOP-2BF9753:~$

root@kitploit:~
Führen Sie als Nächstes das `Xpra`-Playbook aus. Dieses Playbook installiert Pakete von Debian-Mirrors. Bitte beachten Sie, dass das Mofos-Netzwerk standardmäßig kein DNS, keinen Proxy und kein Standard-Gateway konfiguriert. Diese müssen eingerichtet werden, bevor das Playbook ausgeführt wird.

Standardmäßig sind keine Änderungen am Playbook erforderlich.```
ansible-playbook playbooks/xpra.yml -l test2

Dieses Playbook installiert und konfiguriert Xpra und startet den xpra-Dienst auf der virtuellen Maschine.

Der Remote-Dienst kann manuell gestartet werden mit:``` user@DESKTOP-2BF9753:~$ systemctl --user start xpra

root@kitploit:~
Andernfalls startet der Dienst beim nächsten Neustart automatisch.

Dann kann der lokale Client-Dienst auch manuell gestartet werden:```
$ mofos xpra start test2

Zurück auf der virtuellen Maschine sollte das Display auf :10 (die Standardeinstellung) gesetzt sein, wonach eine grafische Anwendung gestartet werden kann und in der Desktop-Umgebung des Hosts erscheint.``` user@DESKTOP-2BF9753:$ export DISPLAY=:10 user@DESKTOP-2BF9753:$ xterm

root@kitploit:~
Um sicherzustellen, dass dieser Mechanismus reibungslos und automatisch abläuft, kann der Befehl `mofos xpra` aus dem Start-Hook gestartet werden.```bash
#!/bin/bash

TAG=$1
NAME=$2
OS=$3
DISTRIB=$4
HOSTNAME=$5

if [ -z "${TAG}" ] || [ -z "${NAME}" ] ; then
exit 1
fi

mofos xpra start "${NAME}"

Funktionen

Benachrichtigung beim Starten oder Stoppen von VMs einrichten

Um über den Start und Stopp von libvirt/qemu-Maschinen informiert zu werden, kann der libvirt qemu-Hook geändert werden, um den Namen des Host-Benutzers anzugeben (standardmäßig user):```

sed 's/USER = "user"/USER = "foobar"/' /etc/libvirt/hooks/qemu.d/90-mofos

root@kitploit:~
### Zwischenablage

Mofos kann auch die Zwischenablage zwischen virtuellen Maschinen und dem Host verwalten. Die Idee ist, eine bestimmte Tastenkombination zu konfigurieren, die eine SSH-Verbindung zur aktuell fokussierten VM auslöst, entweder um die X11-Zwischenablage abzurufen oder um Inhalte dorthin zu übertragen.

Um Inhalte in die X11-Zwischenablage der virtuellen Maschine zu übertragen:```
mofos clipboard in pentest-0

Um Inhalte aus der X11-Zwischenablage der virtuellen Maschine zu übernehmen:``` mofos clipboard out pentest-0

root@kitploit:~
Für jeden Vorgang stellt mofos eine SSH-Verbindung zur virtuellen Maschine her und verwendet xclip sowie auf dem Host `wl-copy` oder `xclip` – je nach Fenstertechnologie (wayland vs. X11).

Der Maschinenname im obigen Trace kann weggelassen werden; in diesem Fall ermittelt das Skript die aktuell fokussierte virtuelle Maschine und zielt auf diese.

Wenn Sie Gnome wayland verwenden, müssen Sie möglicherweise die Gnome-Shell-Erweiterung [email protected] mit `sudo make install_gnome_extension` installieren.
Sie müssen sich ab- und wieder anmelden, um sicherzustellen, dass die Erweiterung installiert ist.

### Einrichten des Routings zwischen Maschinen

Es gibt zwei Optionen in mofos, um eine VM zu routen:
- `mofos route`, das ein Gateway annimmt und auf dem Host eine `ip rule` konfiguriert, um die virtuelle Maschine über dieses Gateway zu routen.
- `mofos pivot`, das eine andere mofos-Maschine nimmt, deren IP-Adresse abruft und sie als Standard-Gateway für die aktuelle virtuelle Maschine konfiguriert.

Beide Optionen können einen DNS-Server annehmen, um ihn zu konfigurieren.

### Einrichten von Tunneling durch Pentest-Boxen

Der Befehl `mofos tunnel` richtet ein SSH-VPN (`ssh -w`) ein, um den Datenverkehr einer mofos-Maschine über einen Server zu routen. Diese Funktion hängt von einigen Konfigurationen ab:

Konkret führt der Befehl `mofos tunnel` die folgenden Aktionen aus (keine schwarze Magie):
1. Erstellen einer lokalen tun-Schnittstelle (`sudo /usr/libexec/mofos/mofosnet.py tun add pentest_box`) und Zuweisen einer IP-Adresse zu dieser Schnittstelle.
2. Ausführen von `tunneling.command` auf dem Remote-Server; dieser Befehl sollte eine tun-Schnittstelle erstellen, die dann mit der lokalen verbunden wird (`/usr/libexec/mofos/mofosnet.py sshvpn start pentest_box`).
3. Routen des Datenverkehrs einer mofos-Maschine über das Gateway der Remote-Box (`/usr/libexec/mofos/mofosnet.py route mofos_vm_ip gateway_ip`); das Standard-Gateway der mofos-VM wird ebenfalls geändert.

Der Befehl `tunneling.command` muss in der Konfigurationsdatei `/etc/mofos/mofosnet.toml` definiert werden. Zum Beispiel:```toml
[tunneling.command]
start = "sudo ssh-vpn start"  # the peer remote address will be supplied as argv[1]
stop = "sudo ssh-vpn stop"

Was die Befehle route und pivot betrifft, kann ebenfalls eine DNS-Adresse angegeben werden, um sie zu konfigurieren.

USB-Verwaltung

Der Befehl mofos usb ermöglicht die Verwaltung von USB-Geräten.

Geräte werden über ihre ID (vendor_id:product_id) identifiziert, die für den attach- und detach-Befehl benötigt wird:```console $ mofos ls usb +-----------+------------------------------------------------+-------------+ | ID | Device | Attached to | +-----------+------------------------------------------------+-------------+ | 0bda:8153 | Realtek, RTL8153 Gigabit Ethernet Adapter | | | 046d:c077 | Logitech, Mouse | | | 0a5c:5842 | Broadcom Corp, 58200 | | | 1bcf:28d2 | CN0Y9V728LG003AGBCJZA01, Integrated_Webcam_FHD | | +-----------+------------------------------------------------+-------------+ $ mofos usb attach pentest-1 0bda:8153 $ mofos usb +-----------+------------------------------------------------+-------------+ | ID | Device | Attached to | +-----------+------------------------------------------------+-------------+ | 0bda:8153 | Realtek, RTL8153 Gigabit Ethernet Adapter | pentest-1 | | 046d:c077 | Logitech, Mouse | | | 0a5c:5842 | Broadcom Corp, 58200 | | | 1bcf:28d2 | CN0Y9V728LG003AGBCJZA01, Integrated_Webcam_FHD | | +-----------+------------------------------------------------+-------------+ $ mofos usb detach pentest-4 0bda:8153

root@kitploit:~
Die Option `force` löst ein Gerät ab und hängt es wieder an. Sie wird üblicherweise verwendet, um ein Gerät erneut anzuhängen, das entfernt wurde, ohne zuvor abgelöst worden zu sein.

Hinweis: Das Anhängen eines USB-Geräts gilt nur für die aktuelle Lebensdauer der virtuellen Maschine. Wenn sie beendet wird, wird das Gerät automatisch abgelöst.

### Verwaltung von PCI-Geräten

Ähnlich wie bei USB-Geräten ermöglicht mofos das Anhängen eines PCI-Geräts an eine laufende virtuelle Maschine; die Befehle sind dieselben.

Eine zusätzliche Einschränkung betrifft einige PCI-Geräte, die zu einer Gruppe gehören. Beispielsweise kann das Anhängen der Ethernet-Karte an eine laufende virtuelle Maschine erforderlich machen, die gesamte PCI-Gruppe in die virtuelle Maschine zu verschieben. Da dies nicht sequenziell erfolgen kann, wird es derzeit nicht unterstützt. Bei einem einzelnen PCI-Gerät wie einer WLAN-Netzwerkkarte funktioniert es jedoch einwandfrei.

### Gemeinsame Ordner

Der Befehl `mofos mount` erstellt einen gemeinsamen Ordner und kann das neu hinzugefügte Dateisystem in ein Verzeichnis innerhalb der virtuellen Maschine einhängen. `mofos umount` hängt das Verzeichnis aus und entfernt die gemeinsamen Ordner aus der Konfiguration der virtuellen Maschine.

Dieser Mechanismus basiert auf der `virtiofsd`-Technologie, die die Aktivierung von gemeinsamem Speicher erfordert. Dies geschieht standardmäßig beim Erstellen einer virtuellen Maschine. Andernfalls aktiviert der folgende Befehl dies:```console
virt-xml -c qemu:///system --edit --memorybacking source.type=memfd,access.mode=shared DOMAIN

Darüber hinaus schränken die bereitgestellten AppArmor-Richtlinien die Verzeichnisse ein, die vom Host freigegeben werden können. Dies soll verhindern, dass Ihr Benutzer eine Freigabe für das Verzeichnis /etc oder das Dateisystem-Root konfiguriert und diese mit Root-Rechten innerhalb der virtuellen Maschine modifiziert. Daher ist es erforderlich, die Richtlinie usr.lib.qemu.virtiofsd zu ändern, um das Teilen beliebiger Verzeichnisse zu erlauben.

Zwei Zeilen sollten angepasst werden:``` @{SHARE_DIRS}=/data/libvirt/shares// /home/user/Public/**/ [...] pivot_root /data/libvirt/shares//, pivot_root /home/user/Public/**/,

root@kitploit:~
Die Variable `SHARE_DIRS` wird in der Policy wiederverwendet, jedoch ist es aufgrund von AppArmor-Einschränkungen nicht möglich, sie für `pivot_root`-Direktiven wiederzuverwenden. Daher müssen die `pivot_root`-Direktiven für jedes gemeinsame Verzeichnis manuell angepasst werden.

Um ein lokales Verzeichnis zu mounten:```
mofos mount test ./Public/share -d /home/user/share

Um die virtuelle Maschine, auf der die Freigabe eingebunden werden soll, nicht zu stören, wird eine Warnung ausgegeben, wenn das entfernte Verzeichnis nicht leer ist, und das Skript lässt Sie die Einbindungsoperation manuell durchführen.

Schließlich ist die Einbindungsoperation nicht dauerhaft und sollte bei jedem Neustart erneut ausgeführt werden.

Windows-Maschinen

Um Windows-VMs zu erstellen, muss zuerst manuell eine Vorlagenmaschine erstellt werden. Die Festplatte dieser Vorlage wird dann als Backing-Datei verwendet, um Child-Maschinen zu erstellen. Standardmäßig sind mit Mofos erstellte Windows-VMs nicht vorkonfiguriert. Es ist jedoch möglich, Mofos so zu konfigurieren, dass es Nachkonfigurationsaufgaben durchführt, z. B. den Hostnamen zu ändern und einen dedizierten Eintrag in der Datei known_hosts hinzuzufügen, indem Hooks verwendet werden.

Um das Setup nach der Erstellung zu aktivieren, sind die folgenden Voraussetzungen zwingend erforderlich:

  • Der OpenSSH-Server sollte lauschen
  • Ein SSH-Schlüssel sollte konfiguriert sein, um sich reibungslos als Administrators-Benutzer zu authentifizieren. Die authorized_keys muss in C:\Program Data\ssh\administrators_authorized_keys erstellt werden und eine spezifische ACL```powershell $admin_group = "Administrators" $system = "SYSTEM"

$acl = Get-Acl C:\ProgramData\ssh\administrators_authorized_keys $acl.SetAccessRuleProtection($true, $false) $administratorsRule = New-Object system.security.accesscontrol.filesystemaccessrule($admin_group,"FullControl","Allow") $systemRule = New-Object system.security.accesscontrol.filesystemaccessrule($system,"FullControl","Allow") $acl.SetAccessRule($administratorsRule) $acl.SetAccessRule($systemRule) $acl | Set-Acl

root@kitploit:~
- OpenSSH sollte mit einer `PowerShell`-Shell anstelle von `cmd.exe` konfiguriert werden.```powershell
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" `
                 -Name DefaultShell `
                 -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" `
                 -PropertyType String `
                 -Force
  • Der SSH-Hostschlüssel der Windows-Vorlage sollte in $HOME/.local/share/mofos/ssh.json definiert werden. Dadurch wird sichergestellt, dass für jede neue Maschine ein entsprechender known_hosts-Eintrag mit dem Hostschlüssel der Vorlage erstellt wird.
  • Die Metadaten der Vorlagenmaschine sollten geändert werden, um sie als Vorlage zu kennzeichnen:``` mofos metadata update --set_template windows-server-template
root@kitploit:~
## Autovervollständigung

Autovervollständigung sollte für `bash` und `fish` standardmäßig funktionieren. Für `zsh` müssen möglicherweise die folgenden Befehle ausgeführt werden:```
autoload -Uz compinit
compinit
source /usr/share/zsh/vendor-completions/_mofos

Überschneidende IP-Adressen

Virtuelle Maschinen, die auf derselben Vorlagen-Festplatte basieren, können dieselbe IP-Adresse erhalten, obwohl sich die MAC-Adresse ihrer Netzwerkkarte aufgrund der DHCP-Kennung ändert. Dieses Verhalten kann geändert werden, indem die Netzwerkkonfiguration der Vorlage bearbeitet wird:

Mit systemd-networkd:``` [Match] Name=eth0

[Network] DHCP=yes MulticastDNS=no IPv6AcceptRA=no

[DHCP] ClientIdentifier=mac

root@kitploit:~
Mit Legacy-Netzwerkschnittstellen `/etc/network/interfaces`:```
iface eth0 inet dhcp
  client no
Tool herunterladen