
Ghidra è un framework di reverse engineering del software (SRE)
# Ghidra in Docker
## Build
Dalla directory principale della tua release di Ghidra, esegui il comando seguente.
```
./docker/build-docker-image.sh
```
Questo creerà l'immagine docker di ghidra con un tag corrispondente alla versione di release di Ghidra.
## La variabile d'ambiente MODE
Il container Docker di Ghidra supporta le seguenti modalità di esecuzione `MODE`:
- gui
- headless
- ghidra-server
- bsim
- bsim-server
- pyghidra
La variabile d'ambiente `MODE` designa quale punto di ingresso di Ghidra eseguire.
Lo script `entrypoint.sh` viene eseguito all'avvio del container.
## Configurazione di un Container
La configurazione di un container viene effettuata come qualsiasi altro container docker.
I volumi possono essere montati, le variabili d'ambiente possono essere impostate, le porte possono essere mappate dal container all'host e così via.
I passaggi di configurazione variano molto in base alla MODALITÀ con cui viene avviato il container.
La directory base per Ghidra all'interno del container si trova in `/ghidra`.
Tutte le posizioni predefinite di ghidra per file, configurazioni, ecc., sono le stesse all'interno di essa.
Ghidra viene eseguito come utente `ghidra` all'interno del container, con uid `1001` e guid `1001`.
L'utente `ghidra` ha solo i permessi per le seguenti directory all'interno del container:
- `/ghidra`
- `/home/ghidra`
Quando un container non riceve argomenti passati con il comando `docker run`, la corrispondente interfaccia a riga di comando (CLI) per la `MODE` eseguita visualizzerà il suo messaggio di utilizzo.
### Mappatura dei Volumi Locali a un Container
I volumi all'interno del container potrebbero incontrare problemi di permessi se i volumi non sono accessibili dagli utenti del gruppo id `1001`.
L'uid e guid predefiniti per il container sono `1001:1001`.
I volumi che vengono mappati al container dovrebbero essere accessibili da questo uid/guid.
Aggiungere l'utente della macchina host al gruppo `1001` sull'host aiuta a gestire i volumi che verranno utilizzati nel container.
Questo può essere facilmente fatto eseguendo `sudo usermod -aG 1001 <user>` su Linux.
### Esempio di Modalità Headless
```
docker run \
--env MODE=headless \
--rm \
--volume /path/to/myproject:/home/ghidra/myproject \
--volume /path/to/mybinary:/home/ghidra/mybinary \
ghidra/ghidra:<version> \
/home/ghidra/myproject programFolder -import /home/ghidra/mybinary
```
Analizzando questo comando riga per riga:
- `docker run` avvierà un container docker usando l'immagine `ghidra/ghidra<:<version>`
- `--env MODE=headless` configura la variabile d'ambiente `MODE` all'interno del container al valore `headless`
- `--rm` rimuove il container dopo il completamento del comando
- `--volume /path/to/myproject:/home/ghidra/myproject` monta il volume locale `/path/to/myproject` sull'host in `/home/ghidra/myproject` all'interno del container
- `--volume /path/to/mybinary:/home/ghidra/mybinary` monta il volume locale `/path/to/mybinary` sull'host in `/home/ghidra/mybinary` all'interno del container
- `ghidra/ghidra:<version>` è il riferimento completo per l'immagine docker, dove `ghidra/ghidra` è il gruppo e il nome dell'immagine, e `<version>` è il tag.
- `/home/ghidra/myproject programFolder -import /home/ghidra/mybinary` sono argomenti passati all'interfaccia a riga di comando dell'analizzatore headless di Ghidra
Non passare argomenti comporterà la visualizzazione dell'utilizzo dell'analizzatore headless.
`/path/to/myproject` sull'host deve essere accessibile al guid `1001` con permessi `rwx`.
### Esempio di Modalità GUI
Eseguire l'interfaccia grafica utente (GUI) di Ghidra nel container docker non è un metodo raccomandato per eseguire Ghidra.
Le GUI non sono un caso d'uso tipico per applicazioni dockerizzate.
```
docker run \
--env MODE=gui \
-it \
--rm \
--net host \
--env DISPLAY \
--volume "$HOME/.Xauthority:/home/ghidra/.Xauthority" \
ghidra/ghidra:<version>
```
In questa modalità, il container si basa sul forwarding X11 per visualizzare la GUI. La configurazione di X11 può variare, ma in questo caso, il file Xauthority dell'host viene montato nel container, il container è configurato per utilizzare la rete dell'host, e la variabile d'ambiente DISPLAY viene passata al container. Ciò consente di reindirizzare la GUI al display della macchina host. I volumi contenenti binari dovrebbero comunque essere montati nel container, così come i volumi per i progetti ghidra.
Il file `.Xauthority` dell'host deve avere i permessi appropriati - assegnati al gruppo `:1001` con permessi di gruppo `rw`.
### Esempio di Modalità Ghidra Server
```
docker run \
--env MODE=ghidra-server \
--rm \
-it \
--volume /path/to/my/repositories:/ghidra/repositories \
--volume /path/to/my/configs/server.conf:/ghidra/server/server.conf \
-p 13100:13100 \
-p 13101:13101 \
-p 13102:13102 \
ghidra/ghidra:<version>
```
I volumi dovrebbero essere montati nel container del server per salvare i repository, gli utenti e anche per configurare il server.
Per utilizzare svrAdmin, esegui exec nel container del server ghidra in esecuzione (`docker exec -it <container-id> bash`) per una shell bash nel container. Dopo aver eseguito exec nel container, l'amministrazione e la gestione del server Ghidra sono le stesse di un ambiente non containerizzato.
Per fermare il container, esegui il comando `docker stop <container-id>`.
NOTA: le porte che mappi dall'host al container docker devono corrispondere. Puoi cambiare la porta base del server predefinita (es. `13100`) nel file `server.conf` usando l'opzione `-p<port>`.
## Esempio di Modalità BSIM Server
```
docker run \
--env MODE=bsim-server \
--rm \
-it \
--volume /path/to/my/datadir:/ghidra/bsim_datadir \
-p 5432:5432 \
ghidra/ghidra:<version> \
/ghidra/bsim_datadir
```
`/ghidra/bsim_datadir` è la directory utilizzata per memorizzare i dati di bsim nel container. Altre directory potrebbero essere usate sul container, ma assicurati che la cartella sulla macchina host abbia i permessi appropriati, assegnati al gruppo `:1001`.
Questo esempio avvia semplicemente un server bsim. Configurare il server bsim e popolarlo con dati potrebbe essere fatto dopo l'avvio all'interno del container in modo simile a come viene fatta l'amministrazione del server ghidra. Un amministratore dovrebbe eseguire exec nel container del server bsim in esecuzione (`docker exec -it <container-id> bash`), e dopo aver eseguito exec nel container, l'amministrazione e la gestione del server Bsim sono le stesse di un ambiente non containerizzato.
Per fermare il container, esegui il comando `docker stop <container-id>`.
## Esempio di Modalità BSIM CLI
```
docker run \
--env MODE=bsim \
--rm \
-it \
ghidra/ghidra:<version> \
generatesigs ghidra://ghidrasvr/demo /home/ghidra \
--bsim postgresql://bsimsvr/demo \
--commit --overwrite \
--user ghidra
```
In questo esempio, la CLI bsim viene utilizzata per connettersi a un server ghidra ospitato su `ghidrasvr`, generare firme per il repository `demo` in quel server ghidra e salvarle in `/home/ghidra`, e poi inviare le firme al server BSIM ospitato su `bsimsvr` nel database `demo`.
## Esempio di Modalità Pyghidra GUI
Eseguire l'interfaccia grafica utente (GUI) di Ghidra nel container docker non è un metodo raccomandato per eseguire Ghidra.
Le GUI non sono un caso d'uso tipico per applicazioni dockerizzate.
```
docker run \
--env MODE=pyghidra \
-it \
--rm \
--net host \
--env DISPLAY \
--volume="$HOME/.Xauthority:/home/ghidra/.Xauthority:rw" \
ghidra/ghidra:<version> -c
```
In questa modalità, il container si basa sul forwarding X11 per visualizzare la GUI. La configurazione di X11 può variare, ma in questo caso, il file Xauthority dell'host viene montato nel container, il container è configurato per utilizzare la rete dell'host, e la variabile d'ambiente DISPLAY viene passata al container. Ciò consente di reindirizzare la GUI al display della macchina host. I volumi contenenti binari dovrebbero comunque essere montati nel container, così come i volumi per i progetti ghidra.
Il file `.Xauthority` dell'host deve avere i permessi appropriati - di proprietà di `:1001` con permessi di gruppo `rw`.
## Esempio di Modalità Pyghidra Headless
```
docker run \
--env MODE=pyghidra \
--rm \
--volume /path/to/myproject:/myproject \
--volume /path/to/mybinary:/mybinary \
ghidra/ghidra:<version> -H \
/myproject programFolder -import /mybinary
```
Non passare argomenti all'analizzatore headless pyghidra comporterà la visualizzazione del menu di aiuto, proprio come per l'analizzatore headless.
Questo caso d'uso è molto simile all'esempio della modalità headless con il vantaggio aggiuntivo di poter utilizzare python3 per gli script di Ghidra.
Ancora, in questo esempio, permessi appropriati e assegnazione del gruppo per `/path/to/myproject` e `/path/to/mybinary` sono necessari per non incontrare problemi di permessi.