
Ghidra es un framework de ingeniería inversa de software (SRE)
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.
El Contenedor Docker de Ghidra soporta los siguientes MODE de ejecución:
La variable de entorno MODE designa qué punto de entrada de Ghidra ejecutar.
El script entrypoint.sh se ejecuta al iniciar el 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/ghidraCuando 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.
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.
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 contenedorghidra/ghidra:<version> es la referencia completa de la imagen docker, donde es el grupo y nombre de la imagen, y es la etiqueta.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.
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.
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>.
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>.
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.
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.
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.
ghidra/ghidra<version>/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