
Script di build per immagini VM Kali Linux
Questo è lo script di build per creare le immagini di macchina virtuale (VM) Kali Linux.
Attualmente sono possibili due metodi di build:
build.sh - build direttamente dalla tua macchinabuild-in-container.sh - build dall'interno di un container (Docker o Podman)In entrambi i casi, la build avviene effettivamente all'interno di una macchina virtuale creata al volo dallo strumento di build debos. Debos usa fakemachine internamente, che a sua volta si basa su QEMU/KVM.
Assicurati che il repository git sia clonato localmente:
$ sudo apt install -y git
$ git clone https://gitlab.com/kalilinux/build-scripts/kali-vm.git
$ cd kali-vm/
A causa dei requisiti di QEMU/KVM, devi far parte del gruppo kvm.
Puoi verificarlo eseguendo:
$ # Not apart of the group
$ grep kvm /etc/group
kvm:x:104:
$
$ # In the group
$ grep kvm /etc/group
kvm:x:104:kali
Se il tuo nome utente non compare nella riga restituita, significa che non sei nel gruppo e devi aggiungerti al gruppo kvm:
$ sudo adduser $USER kvm
Quindi effettua il logout e il login affinché la modifica abbia effetto.
Se esegui la build direttamente dalla tua macchina, usando build.sh, dovrai installare debos:
$ sudo apt install -y 7zip debos dosfstools qemu-utils zerofree
Quindi usa lo script build.sh per generare un'immagine VM direttamente sulla tua macchina.
Se preferisci eseguire la build dall'interno di un container, dovrai installare e configurare docker o podman sulla tua macchina.
Quindi usa lo script build-in-container.sh per generare un'immagine.
build-in-container.sh è semplicemente un wrapper sopra build.sh.
Rileva quale motore container conforme a OCI usare, si occupa di creare la container image se mancante e infine avvia il container per eseguire la build dall'interno.
docker richiede che l'utente venga aggiunto al gruppo Docker, come sopra con KVM, oppure l'uso dell'account root (ad es. $ sudo ./build-in-container.sh).
podman è stato testato sia in modalità rootful (ad es. $ sudo ./build-in-container.sh) che rootless (ad es. $ ./build-in-container.sh).
Usa build.sh o build-in-container.sh, a tua scelta.
Da questo punto useremo build.sh per brevità.
Il miglior punto di partenza, come sempre, è il messaggio di utilizzo:
$ ./build.sh -h
Usage: build.sh <options> [-- <debos options>]
Build a Kali Linux VM image
Build options:
-a ARCH Build an image for this architecture, default: amd64
Supported values: amd64
-b BRANCH Kali branch used to build the image, default: kali-rolling
Supported values: kali-dev kali-last-snapshot kali-rolling
-f FORMAT Format to export the image to, default depends on the VARIANT
Supported values: hyperv ova ovf qemu raw vagrant virtualbox vmware
-k Keep raw disk image and other intermediary build artifacts
-m MIRROR Mirror used to build the image, default: http://http.kali.org/kali
-r ROOTFS rootfs to use to build the image, default: none
-s SIZE Size of the disk image in GB, default: 86
-v VARIANT Variant of image to build (see below for details), default: generic
Supported values: generic hyperv qemu rootfs virtualbox vmware
-x VERSION What to name the image release as, default: rolling
-z Zip images and metadata files after the build
Customization options:
-D DESKTOP Desktop environment installed in the image, default: xfce
Supported values: e17 gnome i3 kde lxde mate xfce none
-H HOSTNAME Set system host name, default: kali
-K KEYBOARD Set keyboard layout, default: us
Refer to the README.md for more details
-L LOCALE Set locale, default: en_US.UTF-8
-P PACKAGES Install extra packages (comma/space separated list)
-T TOOLSET The selection of tools to include in the image, default: default
Supported values: default everything headless large none
-U USERPASS Username and password, separated by a colon, default: kali:kali
-Z TIMEZONE Set timezone, default: America/New_York
The different variants of images are:
generic Image with all virtualization support pre-installed, default format: raw
hyperv Image pre-configured for Hyper-V "Enhanced Session Mode", default format: hyperv
qemu Image with QEMU and SPICE guest agents pre-installed, default format: qemu
rootfs Not an image, a root filesystem (no bootloader/kernel), packed in a .tar.gz
virtualbox Image with VirtualBox guest utilities pre-installed, default format: virtualbox
vmware Image with Open VM Tools pre-installed, default format: vmware
The different formats are:
hyperv VHDX disk image, powershell install scripts
ova streamOptimized VMDK disk image, OVF metadata file, packed in a OVA archive
ovf monolithicSparse VMDK disk image, OVF metadata file
qemu QCOW2 disk image, no metadata
raw sparse disk image, no metadata
virtualbox VDI disk image, .vbox metadata file
vmware 2GbMaxExtentSparse VMDK disk image, VMX metadata file
Supported environment variables:
http_proxy HTTP proxy URL, refer to the README.md for more details
Most useful debos options:
--artifactdir DIR Set artifact directory, default: images
--memory, -m SIZE Limit amount of memory to build VM in GB, default: 4G
--scratchsize SIZE Limit amount of HDD to build VM in GB, default: 45G
--debug-shell Get a shell on the VM
--help, -h See the complete list of options for debos
Refer to the README.md for examples
Le opzioni predefinite generano un'immagine Kali rolling, con desktop predefinito e toolset predefinito per architettura AMD64.
Questa è un'immagine disco raw, cioè un'immagine binaria semplice del disco (che può essere avviata con QEMU).
Esempio:
$ ./build.sh
Per generare un'immagine Kali Linux personalizzata per VMware. Significa che include gli Open VM Tools preinstallati e che l'immagine prodotta è pronta per essere importata "così com'è" in VMware.
Inoltre, la genereremo dalla ultima versione stabile di Kali e useremo GNOME come ambiente desktop, invece del solito Xfce predefinito:
./build.sh -v vmware -b kali-last-snapshot -D gnome
Per generare un'immagine Kali Linux progettata per VirtualBox. Include le utility guest di VirtualBox preinstallate e l'immagine può essere importata "così com'è" in VirtualBox.
Inoltre, vogliamo un disco virtuale da 150 GB e installeremo la selezione di strumenti "everything":
./build.sh -v virtualbox -s 150 -S everything
Per generare un'immagine Kali leggera, senza ambiente desktop e senza toolset predefinito. Questa è un'immagine generica, include il supporto per la maggior parte dei motori VM disponibili. La esporteremo nel formato OVA, adatto sia a VMware che a VirtualBox.
Puoi installare pacchetti aggiuntivi con l'opzione -P.
Puoi usare l'opzione più volte (ad es. -P pkg1 -P pkg2 ...), oppure fornire un valore separato da virgole/spazi (ad es. -P "pkg1,pkg2, pkg3 pkg4"), oppure un mix di entrambi.
Installiamo anche il pacchetto metasploit-framework:
./build.sh -v generic -f ova -D headless -P metasploit-framework
Quando si genera una serie di immagini, potrebbe essere più comodo (e più veloce) suddividere la build in due parti: prima si crea un rootfs, poi si generano le immagini riutilizzando questo rootfs come punto di partenza.
Nell'esempio seguente, abbiamo prima creato un rootfs kali-rolling e poi generato una serie di immagini Vagrant:
./build.sh -b kali-rolling -v rootfs
./build.sh -r images/rootfs-rolling-amd64.tar.gz -f vagrant -v hyperv
./build.sh -r images/rootfs-rolling-amd64.tar.gz -f vagrant -v qemu
./build.sh -r images/rootfs-rolling-amd64.tar.gz -f vagrant -v virtualbox
./build.sh -r images/rootfs-rolling-amd64.tar.gz -f vagrant -v vmware
Per impostare keyboard settings, usa l'opzione -K.
L'impostazione ha la forma <layouts>/<models>/<variants>/<options>. Ogni impostazione può essere omessa (in tal caso viene usato il valore predefinito) oppure può avere più valori separati da virgole. Nel caso più semplice, potresti voler cambiare solo la disposizione della tastiera, quindi imposteresti us per una disposizione US, de per una disposizione tedesca, e così via. Spiegazioni più lunghe ed esempi si trovano nella pagina di manuale keyboard(5).
Per l'elenco dei valori supportati, puoi fare riferimento al file /usr/share/X11/xkb/rules/xorg.lst (fornito dal pacchetto xkb-data su Debian e sistemi simili). Questo file ha diverse sezioni (! layout, ! model, !variant e !option) che elencano i possibili valori per ciascuna impostazione.
Puoi anche verificare cosa è configurato sul tuo sistema con cat /etc/default/keyboard.
Esiste anche una scorciatoia -K same per replicare il sistema host (cioè ciò che è impostato nel file /etc/default/keyboard).
Per impostare locale, usa l'opzione -L.
Scegli un valore nella prima colonna di /usr/share/i18n/SUPPORTED, oppure controlla cosa è configurato sul tuo sistema con grep -v ^# /etc/locale.gen, o semplicemente echo $LANG.
Esiste anche una scorciatoia -L same per replicare il sistema host.
Per impostare timezone, usa l'opzione -Z.
Guarda in /usr/share/zoneinfo e scegli una directory e una sottodirectory.
In caso di dubbi, esegui tzselect per farti guidare, oppure osserva cosa è configurato sul tuo sistema con realpath /etc/localtime.
Esiste anche una scorciatoia -Z same per replicare il sistema host.
Per impostare nome utente e password per l'utente non privilegiato, usa l'opzione -U.
Il valore è una singola stringa e : viene usato per separare il nome utente dalla password.
Qui genereremo un'immagine Kali e la configureremo per imitare il sistema host: stessa locale, stesso fuso orario e stesso nome utente (con password password):
./build.sh -K same -L same -Z same -U $USER:password
È possibile generare diverse varianti di immagine, a seconda del motore VM in cui vuoi eseguire l'immagine Kali. La VARIANT definisce principalmente quale pacchetto aggiuntivo viene installato nell'immagine per aggiungere il supporto a un particolare motore VM. Il FORMAT definisce invece il formato del disco virtuale e quali file di metadati aggiuntivi produrre.
Se non impostato, il formato (opzione -f) viene impostato automaticamente in base alla variante (opzione -v).
Non tutte le combinazioni di variante e formato hanno senso, quindi la tabella seguente riassume le combinazioni più comuni.
| variante | formato | formato disco | metadati | pacchetto |
|---|---|---|---|---|
| generic | raw | raw (file sparso) | nessuno | |
| generic | ova | streamOptimized VMDK | OVF | OVA |
| generic | ovf | monolithicSparse VMDK | OVF | |
| qemu | qemu | QCOW2 | nessuno | |
| virtualbox | virtualbox | VDI | VBOX | |
| vmware | vmware | 2GbMaxExtentSparse VMDK | VMX |
Le immagini generic includono pacchetti di supporto alla virtualizzazione preinstallati per QEMU, VirtualBox e VMware, da qui il nome "generic".
Le altre immagini, che hanno come target un motore VM specifico, includono solo il supporto per quel particolare motore di virtualizzazione.
Solo il formato ova definisce un contenitore: il risultato della build è un file .ova, che è semplicemente un archivio tar.
Per gli altri formati, la build produce file separati.
Possono essere raggruppati in un archivio 7z con l'opzione -z.
Esiste anche un tipo rootfs: non è un'immagine.
È semplicemente un albero del filesystem root Kali Linux, senza kernel e bootloader, impacchettato in un archivio .tar.gz.
Il caso d'uso principale è riutilizzarlo come input per generare un'immagine di un sistema operativo, e non è pensato per essere usato al di fuori del sistema di build.
Quando si generano immagini di sistemi operativi, è utile avere un meccanismo di cache per evitare di scaricare tutti i pacchetti da Internet, ancora e ancora.
A questo scopo, lo script di build tenta di rilevare i proxy di cache noti che potrebbero essere in esecuzione sull'host locale.
Prima fa riferimento alla configurazione APT locale Acquire::http::Proxy.
Se non è impostata, tenta quindi di rilevare apt-cacher-ng e squid-deb-proxy controllando se un servizio è in ascolto sulla loro porta predefinita.
Questo meccanismo non funziona per approx (un noto proxy di cache APT), poiché viene avviato automaticamente on demand.
Per sovrascrivere questo rilevamento, puoi esportare tu stesso la variabile d'ambiente http_proxy.
Tuttavia, ricorda che la build avviene all'interno di una macchina virtuale QEMU, quindi localhost nell'ambiente di build si riferisce alla VM, non all'host.
Se vuoi raggiungere l'host dalla VM, probabilmente vorrai usare http://10.0.2.2.
Ad esempio, se vuoi usare un proxy in esecuzione sulla tua macchina sulla porta 9876, usa: export http_proxy=http://10.0.2.2:9876.
Se vuoi assicurarti che non venga usato alcun proxy, usa: export http_proxy=.
Vedi anche https://github.com/go-debos/debos#environment-variables per maggiori dettagli.
In alternativa, puoi configurare un mirror locale.
È possibile suddividere la build in due passaggi.
Puoi prima generare un rootfs con ./build.sh -v rootfs, e poi generare un'immagine basata su questo rootfs con ./build.sh -r ROOTFS_NAME.tar.gz.
Ha senso, ad esempio, se prevedi di generare più tipi di immagine.
Quando l'area scratch si riempie (cioè il valore di --scratchsize è troppo basso), la build potrebbe fallire con questo tipo di messaggi di errore:
[...]: failed to write (No space left on device)
[...]: Cannot write: No space left on device
Soluzione: aumenta il valore di --scratchsize.
Puoi passare argomenti a debos dopo il carattere speciale --; quindi, se ti servono ad esempio 50G, puoi eseguire ./build.sh [...] -- --scratchsize=50G.
Quando si esegue il debug di errori di build, è comodo essere portati in una shell all'interno della VM in cui avviene la build.
Questo è possibile fornendo l'opzione --debug-shell a debos: ./build.sh [...] -- --debug-shell.
Questo è un problema noto; fai riferimento a https://gitlab.com/kalilinux/build-scripts/kali-vm/-/work_items/25#note_1301070132 per una soluzione alternativa.