
Framework di manipolazione delle macchine virtuali
Mofos è uno strumento progettato per creare, eseguire e gestire macchine virtuali. Si basa su Libvirt/QEMU/KVM e Python, rendendolo compatibile con qualsiasi distribuzione Linux. Fortemente ispirato a Qubes OS (https://www.qubes-os.org/), Mofos mira a replicare molte delle sue funzionalità.
Lo strumento è stato ampiamente testato su Debian con macchine virtuali basate su Debian. Sebbene ci si aspetti che altre distribuzioni Linux funzionino, potrebbe essere necessaria una configurazione aggiuntiva. Ulteriori dettagli saranno aggiunti.
Mofos offre una serie di funzionalità focalizzate sulla gestione sicura delle macchine virtuali, tra cui:
Una macchina mofos è composta da due dischi combinati tramite overlayfs. Il primo disco, noto come livello inferiore, è un disco template di sola lettura, mentre il secondo disco memorizza tutte le modifiche apportate dalla macchina virtuale. Questo disco template è condiviso tra più macchine virtuali. Di conseguenza, creare una nuova macchina virtuale richiede solo la clonazione di un disco vuoto già partizionato per contenere i dati modificati. Questo approccio garantisce che le nuove macchine virtuali possano essere create rapidamente, consentendo al contempo di aggiornare il template in modo indipendente. Eventuali aggiornamenti del template avranno effetto sulle macchine virtuali dipendenti al successivo riavvio.
A seconda della distribuzione Linux, il Makefile può essere utilizzato per generare un pacchetto deb o per installare direttamente i file.```
make deb
apt install ./mofos-VERSION.deb
Durante l'installazione tramite `apt`, verranno richieste varie impostazioni. Le opzioni predefinite possono generalmente essere accettate. L'unica impostazione che richiede attenzione è l'indirizzo di sottorete utilizzato dalla rete libvirt di mofos (predefinito: `192.168.90.0/24`).
OPPURE
Installare le seguenti dipendenze:
- 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
A seconda della distribuzione, i file Python copiati in /usr/lib/python3/dist-packages potrebbero non essere rilevati dall'interprete Python e dovrebbero essere inseriti altrove. Ad esempio, su Fedora, i file Python devono essere copiati in /usr/lib/python3.11/site-packages.
[!WARNING] Attenzione: a partire da Debian trixie,
xpranon è più incluso nei pacchetti, quindi è necessario installarlo manualmente dai repository personalizzati. Consulta https://github.com/Xpra-org/xpra/wiki/Download#-for-debian-based-distributions per istruzioni dettagliate.
Mofos utilizza la sessione di sistema QEMU/KVM, quindi per consentire al comando virsh di accedere alle macchine virtuali e alle risorse correlate, imposta la variabile d'ambiente LIBVIRT_DEFAULT_URI su qemu:///system:```console
export LIBVIRT_DEFAULT_URI=qemu:///system
### Considerazioni sulla sicurezza
L'uso di sessioni di sistema QEMU/KVM migliora l'isolamento tra le macchine virtuali host e guest eseguendo le istanze qemu sotto un utente dedicato (`libvirt-qemu`) e applicando profili di sicurezza specifici a ciascuna istanza.
Tuttavia, per impostazione predefinita, gli utenti normali non possono interagire con il socket di sistema `libvirtd` per gestire macchine, reti e altre risorse. Per ottenere l'accesso, gli utenti devono essere membri del gruppo Unix libvirt o utilizzare sudo. Storicamente, le vulnerabilità di escalazione dei privilegi locali hanno sfruttato l'appartenenza al gruppo libvirt per ottenere i privilegi di root.
Per mitigare questi rischi, questo repository fornisce un profilo AppArmor rafforzato per il processo `libvirtd` sui sistemi che utilizzano AppArmor. Questo profilo limita significativamente le aree in cui `libvirtd` può scrivere file e i programmi che può eseguire.
Inoltre, sono incluse regole `polkit` per controllare ulteriormente le azioni consentite ai membri del gruppo `libvirt`.
Si noti che i profili AppArmor sono inclusi nel pacchetto `deb` ma non vengono installati dal target `install_files` del Makefile e pertanto devono essere installati separatamente.
## Configurazione di Mofos
Mofos richiede un file di configurazione situato in `$HOME/.config/mofos/config.toml` con impostazioni minime per funzionare correttamente. Un esempio di configurazione minimale è disponibile in `/usr/share/mofos/config.minimal.toml`, mentre una configurazione più completa è documentata in `/usr/share/mofos/config.sample.toml`.
Il seguente errore indica che il file di configurazione non è stato trovato:```
[-] Copy the sample configuration file from /usr/share/mofos/config.minimal.toml to ~/.config/mofos/config.toml
Il seguente errore indica che l'utente corrente non è un membro del gruppo libvirt:``` [-] libvirtError("authentication unavailable: no polkit agent available to authenticate action 'org.libvirt.unix.manage'")
The key configuration settings to customize in the configuration files are as follows:
- key (percorso): il file della chiave privata SSH utilizzato per accedere alle macchine virtuali. Si consiglia di creare una chiave dedicata a questo scopo.
- user (stringa): il nome utente per l'accesso SSH alle macchine virtuali.
- root_password (valore hash): la password di root con hash da impostare durante l'installazione di un nuovo template.
- root_ssh_pubkey (stringa): la chiave pubblica SSH da installare nella directory dell'utente root durante l'installazione del template.
Inoltre, per l'installazione del template è necessario configurare i seguenti parametri:
- ntp
- dns (facoltativo se viene fornito un proxy)
- proxy
## Installare un template
### Configurare il firewall
Poiché il processo di installazione si basa sul netboot PXE, è richiesta una connessione Internet attiva. È opportuno configurare le seguenti regole del firewall:```
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
Oppure con nftables:``` sysctl net.ipv4.ip_forward=1 nft insert inet nat postrouting iifname "install-*" masquerade nft insert inet nat postrouting iifname "mof0" masquerade
Quando il parametro `ip_forward` è impostato a 1, la catena FORWARD dovrebbe essere configurata per impedire ad altri dispositivi sulla rete di utilizzare l'host come router.
In generale, si consigliano le seguenti regole:```
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
Oppure con nftables:```
table inet filter {
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 } }
Si consiglia di limitare le regole di masquerade e forwarding in base alle proprie esigenze specifiche, per impedire alle macchine virtuali di mofos di accedere all'intera rete dell'host.
L'isolamento tra le macchine virtuali è applicato automaticamente da un hook di libvirt, che richiede nft per funzionare correttamente.
### Installazione
Il primo passo è costruire il livello iniziale: il template. Per impostazione predefinita, Mofos può installare un template basato su Debian 12.```
mofos template create debian-template
Nota: per ogni comando, l'opzione --debug può essere utilizzata per ottenere informazioni tecniche dettagliate in caso di comportamenti imprevisti. In particolare per questo comando, il flag --debug forza anche l'apertura di una finestra grafica per visualizzare l'avanzamento dell'installazione. In alternativa, l'installazione può essere monitorata tramite virt-manager.
Attualmente, solo il template Debian 12 è supportato per l'installazione. Il dizionario Python riportato di seguito specifica l'immagine di installazione da utilizzare:```python NETBOOT = { "debian-stable-amd64": { "variant": "debian11", "url": "https://deb.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/netboot.tar.gz", } }
La variante è impostata su `debian11` perché in Debian 12 la variante `osinfo` per Debian 12 non è ancora installabile tramite libvirt.
Per installare un'altra distribuzione, modificare il dizionario situato in `/usr/lib/python3/dist-packages/mofos/settings.py`.
Quando viene eseguito il comando precedente, Mofos scarica i file netboot e memorizza nella cache l'archivio `tar.gz` in `$HOME/.cache/template-installer`. Attualmente, se l'archivio netboot esiste già, Mofos non lo scarica di nuovo. Questo può causare errori se l'archivio in cache è obsoleto. Se si verificano tali errori durante l'installazione, la rimozione dell'archivio in cache costringerà Mofos a scaricare una versione aggiornata, risolvendo il problema.
Successivamente, l'archivio viene estratto in `/tmp` e libvirt viene configurato per servire il suo contenuto tramite TFTP.
La macchina virtuale template viene quindi creata e impostata per l'avvio via PXE, installando la distribuzione specificata tramite il file preseed fornito (per impostazione predefinita `/usr/share/mofos/templates/debian/preseed.cfg.j2`). Questo file è un template `jinja2`; prima di copiarlo nella directory root TFTP, vengono iniettate le variabili provenienti dai file di configurazione (`ntp`, `proxy`, `dns`, `root_password`).
Al termine dell'installazione, lo script `postinstall` viene collocato nella directory TFTP ed eseguito sul template. Per impostazione predefinita viene utilizzato lo script situato in `/usr/share/mofos/templates/postinstall.sh.j2`. Questo template `jinja2` inietta la chiave pubblica SSH da configurare sul template.
Oltre alla configurazione della chiave pubblica SSH di root, vengono eseguite le seguenti operazioni:
- Disabilitare il servizio SSH standard e abilitare un SSHD su socket virtuali (vsock).
- Svuotare il file `/etc/resolv.conf`.
- Configurare il timeout di GRUB a 0 secondi.
- Installare un hook initramfs che monta l'overlayfs quando viene rilevata una partizione etichettata `overlay`.
Una volta completata l'installazione, la macchina virtuale libvirt viene recuperata e compressa in un file `qcow2` locale salvato nella directory corrente.```
$ 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
Oltre al file qcow2, questo processo crea anche una voce nel file $HOME/.local/share/mofos/ssh.json contenente il nome della macchina e la sua chiave SSH pubblica:```json
{
"disk": {
"debian-template-disk.qcow2": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINrbOdOPENEj2KeHrYLdorQe9Ez1b9Bu5agZmgNDMayy"
}
}
Questo file viene utilizzato automaticamente durante il processo di importazione.
### Importazione
Il passo successivo è importare il file di template `qcow2` creato in Mofos.```
$ 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
Per ora, la variante osinfo è obbligatoria. Si trovano nel file:
/usr/lib/python3/dist-packages/mofos/settings.py.
Una volta importato, il template può essere visto nel comando mofos ls:```
$ mofos ls
+----+-----------------+---------+-------------+-------+-----+--------------+
| Id | Name | State | Description | Alias | Cid | IPv4 address |
+----+-----------------+---------+-------------+-------+-----+--------------+
| | debian-template | shutoff | | | | |
+----+-----------------+---------+-------------+-------+-----+--------------+
Da questo punto, il template può essere avviato e accessibile per la modifica secondo necessità.```
$ mofos start debian-template
$ mofos ls
+----+-----------------+---------+-------------+-------+-----+----------------+
| Id | Name | State | Description | Alias | Cid | IPv4 address |
+----+-----------------+---------+-------------+-------+-----+----------------+
| 3 | debian-template | running | | | 3 | 192.168.90.202 |
+----+-----------------+---------+-------------+-------+-----+----------------+
La documentazione è disponibile su https://deepsecrets.io``` $ mofos ssh debian-template --user root root@linux:~#
## Crea il disco vuoto del livello superiore
Il seguente comando crea un livello superiore vuoto con l'etichetta specificata sull'unica partizione del disco:```
$ mofos template create-overlay-disk
Per impostazione predefinita, questo disco è impostato su 50 GB ma inizialmente occupa solo circa 100 MB. Questa dimensione può essere personalizzata nel file di configurazione.
Nota: si consiglia di spegnere sempre un template prima di manipolare le macchine virtuali Mofos. Sebbene sia supportato eseguire contemporaneamente un template e le sue macchine virtuali, ciò può portare a instabilità.``` $ 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:~#
Tieni presente che le connessioni SSH vengono effettuate tramite socket virtuali, quindi non puoi connetterti direttamente in SSH alla macchina appena creata. Devi invece usare il comando `mofos ssh`. In alternativa, puoi creare una configurazione SSH specificando un `ProxyCommand` per accedere alla porta SSH della macchina:```
$ 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
The input content is empty — no text was provided after "INPUT:". Please provide the actual chunk of Markdown content to translate.``` $ 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:~#
Durante una sessione `mofos ssh`, un socket `ControlMaster` viene stabilito in anticipo per velocizzare le connessioni successive. Ecco perché la MOTD non viene visualizzata.
## Personalizzazione
Per semplificare la personalizzazione di modelli e macchine virtuali, Mofos introduce il concetto di hook e tag. Per ogni tag, un hook corrispondente (uno script Bash) può essere eseguito per eseguire azioni automatizzate sulla macchina virtuale o sul modello di destinazione e configurarlo di conseguenza.
Gli hook minimi si trovano in `/usr/share/mofos/hooks`. Questi sono semplici script Bash che ricevono i seguenti input:```
TAG=$1
NAME=$2
OS=$3
DISTRIB=$4
HOSTNAME=$5
Questo meccanismo può essere sfruttato con Ansible per eseguire playbook durante l'installazione del template:```bash #!/bin/bash
TAG=$1 NAME=$2 OS=$3 DISTRIB=$4 HOSTNAME=$5
if [ -z "${TAG}" ] || [ -z "${NAME}" ] || [ -z "${DISTRIB}" ] ; then exit 1 fi
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
Questo script crea dinamicamente un inventory ed esegue un playbook su di esso.
### Macchina virtuale - hook new
Durante la creazione della macchina virtuale, può essere utilizzato un altro hook, ad esempio, per randomizzare l'hostname.
Per impostazione predefinita, Mofos genera un alias basato sulla convenzione di denominazione classica di Windows (ad es., `DESKTOP-2BF9753`). Questo nome, insieme ad altre informazioni, viene passato allo script hook:```
#!/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}"
Successivamente, la configurazione dovrebbe essere modificata per abilitare questo hook:``` [hooks.test] new = "/home/user/.config/mofos/hooks/new.sh"
Quindi, durante la creazione della macchina virtuale, questo script verrà eseguito:```
$ 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
[tools.Utility.openai.description]: Fornisce un'interfaccia coerente per le richieste di ottimizzazione dei prompt di OpenAI. Può gestire dati di file arbitrari e fornisce un'interfaccia logica per la registrazione e la gestione degli errori.
$ mofos ssh test2 -u root Last login: Mon Jun 2 11:09:51 2025 from UNKNOWN root@DESKTOP-2BF9753:~#
Analogamente alla fase di installazione, i playbook Ansible possono essere eseguiti anche in questa fase. In questo caso, il comando `mofos inventory` può essere utilizzato per generare un inventario Ansible, semplificando il processo di selezione e accesso alle macchine virtuali:```
$ 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"
]
Nota che i gruppi vengono creati in base alla variante di distribuzione e ai tag. Questi gruppi possono essere utilizzati per caricare diverse variabili.
Ad esempio, lo script seguente esegue un playbook arbitrario:```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
### Macchina virtuale - hook di avvio
Analogamente, l'hook di avvio viene eseguito quando viene avviata una macchina virtuale. Viene tipicamente utilizzato per avviare i servizi richiesti dalla macchina virtuale.
Ad esempio, per abilitare un'integrazione fluida con Windows all'interno della macchina virtuale, puoi installare `Xpra`.
Per prima cosa installa `ansible`:```
# apt install ansible
Successivamente, esegui il playbook utente situato nella directory ansible. Prima di farlo, modifica il file playbooks/user.yml per aggiornare l'hash della password e la chiave SSH pubblica da installare nella home directory dell'utente.```
~/mofos/ansible$ ls
ansible.cfg ansible.log inventory.sh playbooks
Il contenuto del chunk è vuoto.```
$ 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
Successivamente, puoi accedere tramite SSH a questo account utente, a condizione che la configurazione specifichi questo utente come predefinito:``` $ mofos ssh test2 user@DESKTOP-2BF9753:~$
Successivamente, esegui il playbook `Xpra`. Questo playbook installa i pacchetti dai mirror Debian. Tieni presente che la rete Mofos non configura DNS, proxy o un gateway predefinito per impostazione predefinita. Questi devono essere configurati prima di eseguire il playbook.
Non sono richieste modifiche al playbook per impostazione predefinita.```
ansible-playbook playbooks/xpra.yml -l test2
Questo playbook installa e configura Xpra e avvia il servizio xpra sulla macchina virtuale.
Il servizio remoto può essere avviato manualmente utilizzando:``` user@DESKTOP-2BF9753:~$ systemctl --user start xpra
Altrimenti, il servizio si avvierà automaticamente al prossimo riavvio.
Successivamente, il servizio client locale può anche essere avviato manualmente:```
$ mofos xpra start test2
Tornando sulla macchina virtuale, il display dovrebbe essere impostato su :10 (il valore predefinito), dopodiché è possibile avviare un'applicazione grafica che apparirà all'interno dell'ambiente desktop dell'host.```
user@DESKTOP-2BF9753:$ export DISPLAY=:10
user@DESKTOP-2BF9753:$ xterm
Per garantire che questo meccanismo funzioni senza intoppi e automaticamente, il comando `mofos xpra` può essere avviato dall'hook di avvio.```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}"
Per essere informati sull'avvio e l'arresto delle macchine libvirt/qemu, l'hook qemu di libvirt può essere modificato per specificare il nome dell'utente host (di default user):```
### Appunti
Mofos può anche gestire gli appunti tra le macchine virtuali e il sistema host. L'idea è di configurare una specifica combinazione di tasti per attivare una connessione SSH alla VM attualmente attiva, sia per recuperare gli appunti X11 sia per inviarvi contenuti.
Per inviare contenuti negli appunti X11 della macchina virtuale:```
mofos clipboard in pentest-0
Per recuperare il contenuto dagli appunti X11 della macchina virtuale:``` mofos clipboard out pentest-0
Per ogni operazione, mofos stabilirà una connessione SSH alla macchina virtuale e userà `xclip` e sull'host `wl-copy` o `xclip` a seconda della tecnologia di windows (wayland vs X11).
Il nome della macchina nella traccia sopra può essere omesso; in questo caso, lo script identificherà la macchina virtuale attualmente in primo piano e la userà come destinazione.
Se utilizzi Gnome wayland, potrebbe essere necessario installare l'estensione della shell Gnome `[email protected]` usando `sudo make install_gnome_extension`.
Dovrai disconnetterti e riconnetterti per assicurarti che l'estensione sia installata.
### Configurare il routing tra le macchine
In mofos esistono due opzioni per instradare una VM:
- `mofos route` che prende un gateway e configura una `ip rule` sull'host per instradare la macchina virtuale attraverso questo gateway.
- `mofos pivot` che prende un'altra macchina mofos, recupera il suo indirizzo IP e
lo configura come gateway predefinito per la macchina virtuale corrente.
Entrambe le opzioni possono accettare un server DNS da configurare.
### Configurare il tunneling attraverso le pentest box
Il comando `mofos tunnel` configura una VPN SSH (`ssh -w`) per instradare il traffico di una
macchina mofos attraverso un server. Questa funzionalità si basa su poche configurazioni:
Concretamente il comando `mofos tunnel` esegue le seguenti azioni (niente magie oscure qui):
1. Crea un'interfaccia tun locale (`sudo /usr/libexec/mofos/mofosnet.py tun add pentest_box`) e assegna un indirizzo IP a questa interfaccia.
2. Esegue il `tunneling.command` sul server remoto; questo comando dovrebbe creare un'interfaccia tun da collegare poi con quella locale (`/usr/libexec/mofos/mofosnet.py sshvpn start pentest_box`).
3. Instrada il traffico di una macchina mofos attraverso il gateway della box remota (`/usr/libexec/mofos/mofosnet.py route mofos_vm_ip gateway_ip`); anche il gateway predefinito della macchina virtuale mofos viene modificato.
Il `tunneling.command` deve essere definito nel file di configurazione `/etc/mofos/mofosnet.toml`. Per esempio:```toml
[tunneling.command]
start = "sudo ssh-vpn start" # the peer remote address will be supplied as argv[1]
stop = "sudo ssh-vpn stop"
Per quanto riguarda i comandi route e pivot, può essere fornito anche un DNS per configurarlo.
Il comando mofos usb consente di gestire i dispositivi USB.
I dispositivi sono identificati dal loro ID (vendor_id:product_id), necessario per i comandi attach e detach:```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
L'opzione `force` scollega e ricollega un dispositivo. È comunemente usata per
riagganciare un dispositivo che è stato scollegato senza essere stato prima staccato.
Nota: il collegamento di un dispositivo USB è valido solo per la vita corrente della macchina virtuale. Quando questa si ferma, il dispositivo viene scollegato automaticamente.
### Gestione dei dispositivi PCI
Analogamente ai dispositivi USB, mofos consente di collegare un dispositivo PCI a una macchina virtuale in esecuzione; i comandi sono gli stessi.
Un'ulteriore limitazione riguarda alcuni dispositivi PCI che appartengono a un gruppo. Ad esempio, collegare la scheda ethernet a una macchina virtuale in esecuzione potrebbe richiedere lo spostamento dell'intero gruppo PCI all'interno della macchina virtuale. Poiché non può essere fatto in sequenza, non è ancora supportato. Tuttavia, per un singolo dispositivo PCI come una scheda di rete Wi-Fi, funziona correttamente.
### Cartelle condivise
Il comando `mofos mount` crea una cartella condivisa e può montare il filesystem appena aggiunto in una directory all'interno della macchina virtuale. Il comando `mofos umount` smonterà la directory e rimuoverà le cartelle condivise dalla configurazione della macchina virtuale.
Questo meccanismo si basa sulla tecnologia `virtiofsd` che richiede l'abilitazione della memoria condivisa; ora questa viene abilitata per impostazione predefinita quando si crea una macchina virtuale. In caso contrario, il seguente comando la abiliterà:```console
virt-xml -c qemu:///system --edit --memorybacking source.type=memfd,access.mode=shared DOMAIN
Inoltre, le policy AppArmor fornite limitano le directory che possono essere condivise dall'host. Questo viene fatto per impedire al tuo utente di configurare una condivisione sulla directory /etc o sulla radice del filesystem e di apportare modifiche utilizzando i privilegi di root all'interno della macchina virtuale. Pertanto, è necessario modificare la policy usr.lib.qemu.virtiofsd per consentire la condivisione di directory arbitrarie.
Due righe devono essere adattate:``` @{SHARE_DIRS}=/data/libvirt/shares// /home/user/Public/**/ [...] pivot_root /data/libvirt/shares//, pivot_root /home/user/Public/**/,
La variabile `SHARE_DIRS` viene riutilizzata nella policy, tuttavia, a causa delle limitazioni di apparmor, non è possibile riutilizzarla per le direttive `pivot_root`. Pertanto, è necessario adattare manualmente le direttive `pivot_root` per ciascuna delle directory condivise.
Per montare una directory locale:```
mofos mount test ./Public/share -d /home/user/share
Per non disturbare la macchina virtuale in cui deve essere montata la condivisione, se la directory remota non è vuota viene emesso un avviso e lo script ti consente di eseguire manualmente l'operazione di montaggio.
Infine, l'operazione di montaggio non è persistente e deve essere ripetuta a ogni riavvio.
Per creare macchine virtuali Windows, è necessario creare prima manualmente una macchina modello. Il disco di questo modello viene poi utilizzato come file di supporto (backing file) per creare le macchine figlie. Per impostazione predefinita, le macchine virtuali Windows create con Mofos non sono pre-configurate. Tuttavia, è possibile configurare Mofos per eseguire attività di post-configurazione, come la modifica dell'hostname e l'aggiunta di una voce dedicata nel file known_hosts, utilizzando gli hook.
Per abilitare la configurazione post-creazione, sono obbligatori i seguenti prerequisiti:
authorized_keys deve essere creato in C:\Program Data\ssh\administrators_authorized_keys con specifiche 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
OpenSSH dovrebbe essere configurato con una shell `PowerShell` invece di `cmd.exe`.```powershell
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" `
-Name DefaultShell `
-Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" `
-PropertyType String `
-Force
$HOME/.local/share/mofos/ssh.json. Questo garantirà che una corrispondente voce known_hosts per ogni nuova macchina venga creata con la chiave host del template.## Autocompletamento
L'autocompletamento dovrebbe essere gestito automaticamente per `bash` e `fish`. Per `zsh`, potrebbe essere necessario eseguire i seguenti comandi:```
autoload -Uz compinit
compinit
source /usr/share/zsh/vendor-completions/_mofos
Le macchine virtuali basate sullo stesso disco modello possono ottenere lo stesso indirizzo IP anche se l'indirizzo MAC della loro scheda di rete cambia a causa dell'identificatore DHCP. Questo comportamento può essere modificato modificando la configurazione di rete del modello:
Con systemd-networkd:``` [Match] Name=eth0
[Network] DHCP=yes MulticastDNS=no IPv6AcceptRA=no
[DHCP] ClientIdentifier=mac
Con le interfacce di rete legacy `/etc/network/interfaces`:```
iface eth0 inet dhcp
client no