
Ghidra est un framework de rétro-ingénierie logicielle (SRE)
# Ghidra dockerisé
## Construction
Depuis le répertoire racine de votre version de Ghidra, exécutez la commande suivante.
```
./docker/build-docker-image.sh
```
Cela construira l'image docker ghidra avec une balise correspondant à la version de la version de Ghidra.
## La variable d'environnement MODE
Le conteneur Docker Ghidra prend en charge les modes d'exécution `MODE` suivants :
- gui
- headless
- ghidra-server
- bsim
- bsim-server
- pyghidra
La variable d'environnement `MODE` désigne quel point d'entrée de Ghidra exécuter.
Le script `entrypoint.sh` est exécuté au démarrage du conteneur.
## Configuration d'un conteneur
La configuration d'un conteneur se fait comme pour tout autre conteneur docker.
Des volumes peuvent être montés, des variables d'environnement définies, des ports mappés du conteneur vers l'hôte, etc.
Les étapes de configuration varient considérablement selon le MODE avec lequel le conteneur est démarré.
Le répertoire de base de Ghidra dans le conteneur se trouve à `/ghidra`.
Tous les emplacements par défaut de ghidra pour les fichiers, configurations, etc., sont les mêmes à l'intérieur de celui-ci.
Ghidra est exécuté en tant qu'utilisateur `ghidra` dans le conteneur, avec l'uid `1001` et le gid `1001`.
L'utilisateur `ghidra` n'a que les permissions sur les répertoires suivants à l'intérieur du conteneur :
- `/ghidra`
- `/home/ghidra`
Lorsqu'un conteneur ne reçoit aucun argument passé avec la commande `docker run`,
l'interface en ligne de commande (CLI) correspondant au `MODE` exécuté affichera son message d'utilisation.
### Mappage de volumes locaux vers un conteneur
Les volumes dans le conteneur peuvent rencontrer des problèmes de permissions si les volumes ne sont pas accessibles aux utilisateurs du groupe d'identifiant `1001`.
L'uid et le gid par défaut du conteneur sont `1001:1001`. Les volumes mappés au conteneur doivent être accessibles par cet uid/gid.
Ajouter l'utilisateur de la machine hôte au groupe `1001` sur l'hôte aide à gérer les volumes qui seront utilisés dans le conteneur.
Cela peut facilement être fait en exécutant `sudo usermod -aG 1001 <user>` sur Linux.
### Exemple de mode 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
```
Détaillons ligne par ligne :
- `docker run` va démarrer un conteneur docker en utilisant l'image `ghidra/ghidra:<version>`
- `--env MODE=headless` configure la variable d'environnement `MODE` dans le conteneur à la valeur `headless`
- `--rm` supprime le conteneur après la fin de la commande
- `--volume /path/to/myproject:/home/ghidra/myproject` monte le volume local `/path/to/myproject` de l'hôte vers `/home/ghidra/myproject` dans le conteneur
- `--volume /path/to/mybinary:/home/ghidra/mybinary` monte le volume local `/path/to/mybinary` de l'hôte vers `/home/ghidra/mybinary` dans le conteneur
- `ghidra/ghidra:<version>` est la référence complète de l'image docker, où `ghidra/ghidra` est le groupe et le nom de l'image, et `<version>` est la balise.
- `/home/ghidra/myproject programFolder -import /home/ghidra/mybinary` sont des arguments passés à l'interface en ligne de commande de l'analyseur headless de Ghidra
Ne passer aucun argument affichera l'utilisation de l'analyseur headless.
`/path/to/myproject` sur l'hôte doit être accessible au gid `1001` avec les permissions `rwx`.
### Exemple de mode GUI
Exécuter l'interface graphique (GUI) de Ghidra dans un conteneur docker n'est pas une méthode recommandée pour utiliser Ghidra.
Les interfaces graphiques ne sont pas un cas d'utilisation typique pour les applications dockerisées.
```
docker run \
--env MODE=gui \
-it \
--rm \
--net host \
--env DISPLAY \
--volume "$HOME/.Xauthority:/home/ghidra/.Xauthority" \
ghidra/ghidra:<version>
```
Dans ce mode, le conteneur repose sur le transfert X11 pour afficher l'interface graphique. La configuration de X11 peut varier, mais dans ce cas,
le fichier Xauthority de l'hôte est monté dans le conteneur, le conteneur est configuré pour utiliser le réseau de l'hôte, et la variable
d'environnement DISPLAY est passée au conteneur. Cela permet de rediriger l'interface graphique vers l'écran de la machine hôte. Les volumes
contenant des binaires doivent également être montés dans le conteneur, ainsi que les volumes pour les projets ghidra.
Le fichier `.Xauthority` de l'hôte doit avoir les permissions appropriées - attribuées au groupe `:1001` avec les permissions de groupe `rw`.
### Exemple de mode 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>
```
Des volumes doivent être montés dans le conteneur serveur pour sauvegarder les dépôts, les utilisateurs, et aussi pour configurer le serveur.
Pour utiliser svrAdmin, exécutez `docker exec -it <container-id> bash` dans le conteneur serveur ghidra en cours d'exécution pour obtenir un shell bash dans le conteneur.
Après être entré dans le conteneur, l'administration et la gestion du serveur Ghidra sont les mêmes qu'en dehors d'un environnement conteneurisé.
Pour arrêter le conteneur, exécutez la commande `docker stop <container-id>`.
NOTE : les ports que vous mappez de l'hôte au conteneur docker doivent correspondre. Vous pouvez modifier le port de base du serveur par défaut (par exemple `13100`) dans le fichier `server.conf` en utilisant l'option `-p<port>`.
### Exemple de mode 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` est le répertoire utilisé pour stocker les données de bsim dans le conteneur. D'autres répertoires pourraient être utilisés sur le conteneur,
mais assurez-vous que le dossier sur la machine hôte a les permissions appropriées, attribuées au groupe `:1001`.
Cet exemple démarre simplement un serveur bsim. La configuration du serveur bsim et son remplissage avec des données
peuvent être effectués après le démarrage dans le conteneur, d'une manière similaire à l'administration du serveur ghidra.
Un administrateur devrait exécuter `docker exec -it <container-id> bash` dans le conteneur serveur bsim en cours d'exécution,
et après être entré dans le conteneur, l'administration et la gestion du serveur Bsim sont les mêmes qu'en dehors d'un environnement conteneurisé.
Pour arrêter le conteneur, exécutez la commande `docker stop <container-id>`.
### Exemple de mode CLI BSIM
```
docker run \
--env MODE=bsim \
--rm \
-it \
ghidra/ghidra:<version> \
generatesigs ghidra://ghidrasvr/demo /home/ghidra \
--bsim postgresql://bsimsvr/demo \
--commit --overwrite \
--user ghidra
```
Dans cet exemple, le CLI bsim est utilisé pour se connecter à un serveur ghidra hébergé sur `ghidrasvr`,
générer des signatures pour le dépôt `demo` sur ce serveur ghidra et les sauvegarder dans `/home/ghidra`,
puis les valider sur le serveur BSIM hébergé sur `bsimsvr` dans la base de données `demo`.
### Exemple de mode Pyghidra GUI
Exécuter l'interface graphique (GUI) de Ghidra dans un conteneur docker n'est pas une méthode recommandée pour utiliser Ghidra.
Les interfaces graphiques ne sont pas un cas d'utilisation typique pour les applications dockerisées.
```
docker run \
--env MODE=pyghidra \
-it \
--rm \
--net host \
--env DISPLAY \
--volume="$HOME/.Xauthority:/home/ghidra/.Xauthority:rw" \
ghidra/ghidra:<version> -c
```
Dans ce mode, le conteneur repose sur le transfert X11 pour afficher l'interface graphique. La configuration de X11 peut varier, mais dans ce cas,
le fichier Xauthority de l'hôte est monté dans le conteneur, le conteneur est configuré pour utiliser le réseau de l'hôte, et la variable
d'environnement DISPLAY est passée au conteneur. Cela permet de rediriger l'interface graphique vers l'écran de la machine hôte. Les volumes
contenant des binaires doivent également être montés dans le conteneur, ainsi que les volumes pour les projets ghidra.
Le fichier `.Xauthority` de l'hôte doit avoir les permissions appropriées - appartenant à `:1001` avec les permissions de groupe `rw`.
### Exemple de mode 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
```
Ne passer aucun argument à l'analyseur headless pyghidra entraînera l'affichage du menu d'aide, tout comme l'analyseur headless.
Ce cas d'utilisation est très similaire à l'exemple du mode headless, avec l'avantage supplémentaire de pouvoir utiliser python3 pour les scripts Ghidra.
Encore une fois, dans cet exemple, des permissions appropriées et l'attribution de groupe pour `/path/to/myproject` et `/path/to/mybinary` sont nécessaires pour éviter des problèmes de permissions.