
Ghidra es un framework de ingeniería inversa de software (SRE)
# Ghidra Dockerizado
## Construcción
Desde el directorio raíz de tu versión de Ghidra, ejecuta el siguiente comando.
```
./docker/build-docker-image.sh
```
Esto construirá la imagen docker de Ghidra con una etiqueta correspondiente a la versión de Ghidra.
## La variable de entorno MODE
El Contenedor Docker de Ghidra soporta los siguientes `MODE` de ejecución:
- gui
- headless
- ghidra-server
- bsim
- bsim-server
- pyghidra
La variable de entorno `MODE` designa qué punto de entrada de Ghidra ejecutar.
El script `entrypoint.sh` se ejecuta al iniciar el contenedor.
## Configuración de un Contenedor
La configuración de un contenedor se realiza igual que cualquier otro contenedor docker.
Se pueden montar volúmenes, establecer variables de entorno, mapear puertos del contenedor al host, etc.
Los pasos de configuración varían mucho según el `MODE` con el que se inicie el contenedor.
El directorio base de Ghidra dentro del contenedor se encuentra en `/ghidra`.
Todas las ubicaciones predeterminadas de Ghidra para archivos, configuraciones, etc., son las mismas dentro de ese directorio.
Ghidra se ejecuta como el usuario `ghidra` dentro del contenedor, con uid `1001` y guid `1001`.
El usuario `ghidra` solo tiene permisos sobre los siguientes directorios dentro del contenedor:
- `/ghidra`
- `/home/ghidra`
Cuando un contenedor no recibe ningún argumento pasado con el comando `docker run`,
la Interfaz de Línea de Comandos (CLI) correspondiente al `MODE` ejecutado mostrará su declaración de uso.
### Mapeo de Volúmenes Locales a un Contenedor
Los volúmenes dentro del contenedor pueden tener problemas de permisos si no son accesibles por usuarios del grupo id `1001`.
El uid y guid predeterminados para el contenedor son `1001:1001`. Los volúmenes que se mapeen al contenedor deben ser accesibles por este uid/guid.
Agregar el usuario de la máquina host al grupo `1001` en el host ayuda a gestionar los volúmenes que se usarán en el contenedor.
Esto se puede hacer fácilmente ejecutando `sudo usermod -aG 1001 <usuario>` en Linux.
### Ejemplo del Modo 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
```
Desglosando esto línea por línea:
- `docker run` va a iniciar un contenedor docker usando la imagen `ghidra/ghidra<:<version>`
- `--env MODE=headless` configura la variable de entorno `MODE` dentro del contenedor con el valor `headless`
- `--rm` elimina el contenedor después de que el comando se complete
- `--volume /path/to/myproject:/home/ghidra/myproject` monta el volumen local
`/path/to/myproject` en el host a `/home/ghidra/myproject` dentro del contenedor
- `--volume /path/to/mybinary:/home/ghidra/mybinary` monta el volumen local
`/path/to/mybinary` en el host a `/home/ghidra/mybinary` dentro del contenedor
- `ghidra/ghidra:<version>` es la referencia completa de la imagen docker, donde `ghidra/ghidra` es el grupo y nombre de la imagen, y `<version>` es la etiqueta.
- `/home/ghidra/myproject programFolder -import /home/ghidra/mybinary` son argumentos que se pasan a la interfaz de línea de comandos del analizador headless de Ghidra
No pasar argumentos resultará en que se muestre el uso del analizador headless.
`/path/to/myproject` en el host debe ser accesible para el guid `1001` con permisos `rwx`.
### Ejemplo del Modo Gui
Ejecutar la Interfaz Gráfica de Usuario (GUI) de Ghidra en el contenedor docker no es un método recomendado para ejecutar Ghidra.
Las GUI no son un caso de uso típico para aplicaciones dockerizadas.
```
docker run \
--env MODE=gui \
-it \
--rm \
--net host \
--env DISPLAY \
--volume "$HOME/.Xauthority:/home/ghidra/.Xauthority" \
ghidra/ghidra:<version>
```
En este modo, el contenedor depende del reenvío X11 para mostrar la GUI. La configuración de X11 puede variar, pero en este caso,
el archivo Xauthority del host se monta dentro del contenedor, el contenedor está configurado para usar la red del host, y la variable
de entorno DISPLAY se pasa al contenedor. Esto permite reenviar la GUI de vuelta a la pantalla de la máquina host. Los volúmenes
que contengan binarios aún deberán montarse en el contenedor, así como los volúmenes para los proyectos de Ghidra.
El archivo `.Xauthority` del host debe tener permisos apropiados - asignado al grupo `:1001` con permisos de grupo `rw`.
### Ejemplo del Modo 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>
```
Sería necesario montar volúmenes en el contenedor del servidor para guardar los repositorios, usuarios, y también para configurar el servidor.
Para utilizar svrAdmin, ejecuta exec en el contenedor del servidor ghidra en funcionamiento (`docker exec -it <id-contenedor> bash`) para obtener un shell bash en el contenedor.
Después de ejecutar exec en el contenedor, la administración y gestión del servidor Ghidra es la misma que fuera de un entorno contenerizado.
Para detener el contenedor, ejecuta el comando `docker stop <id-contenedor>`.
NOTA: los puertos que mapees del host al contenedor docker deben coincidir. Puedes cambiar el puerto base del servidor predeterminado (por ejemplo, `13100`) en el archivo `server.conf` usando la opción `-p<puerto>`.
## Ejemplo del Modo 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` es el directorio utilizado para almacenar los datos de bsim en el contenedor. Se podrían usar otros directorios en el contenedor,
pero asegúrate de que la carpeta en la máquina host tenga permisos apropiados, asignada al grupo `:1001`.
Este ejemplo simplemente inicia un servidor bsim. Configurar el servidor bsim y poblarlo con datos
se podría hacer después del inicio dentro del contenedor de manera similar a como se realiza la administración del servidor ghidra.
Un administrador tendría que ejecutar exec en el contenedor del servidor bsim en funcionamiento (`docker exec -it <id-contenedor> bash`),
y después de ejecutar exec en el contenedor, la administración y gestión del servidor Bsim es la misma que fuera de un entorno contenerizado.
Para detener el contenedor, ejecuta el comando `docker stop <id-contenedor>`.
## Ejemplo del Modo 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
```
En este ejemplo, la CLI de bsim se utiliza para conectarse a un servidor ghidra alojado en `ghidrasvr`,
generar firmas para el repositorio `demo` en ese servidor ghidra y guardarlas en `/home/ghidra`,
y luego enviar las firmas al servidor BSIM alojado en `bsimsvr` en la base de datos `demo`.
## Ejemplo del Modo Pyghidra Gui
Ejecutar la Interfaz Gráfica de Usuario (GUI) de Ghidra en el contenedor docker no es un método recomendado para ejecutar Ghidra.
Las GUI no son un caso de uso típico para aplicaciones dockerizadas.
```
docker run \
--env MODE=pyghidra \
-it \
--rm \
--net host \
--env DISPLAY \
--volume="$HOME/.Xauthority:/home/ghidra/.Xauthority:rw" \
ghidra/ghidra:<version> -c
```
En este modo, el contenedor depende del reenvío X11 para mostrar la GUI. La configuración de X11 puede variar, pero en este caso,
el archivo Xauthority del host se monta dentro del contenedor, el contenedor está configurado para usar la red del host, y la variable
de entorno DISPLAY se pasa al contenedor. Esto permite reenviar la GUI de vuelta a la pantalla de la máquina host. Los volúmenes
que contengan binarios aún deberán montarse en el contenedor, así como los volúmenes para los proyectos de Ghidra.
El archivo `.Xauthority` del host debe tener permisos apropiados - propiedad de `:1001` con permisos de grupo `rw`.
## Ejemplo del Modo 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
```
No pasar argumentos al analizador headless de pyghidra resultará en que se muestre el menú de ayuda, igual que con el analizador headless.
Este caso de uso es muy similar al ejemplo del modo headless con el beneficio adicional de poder utilizar python3 para Scripts de Ghidra.
Nuevamente, en este ejemplo, son necesarios permisos apropiados y asignación de grupo para `/path/to/myproject` y `/path/to/mybinary`
para no encontrarse con problemas de permisos.