
ghidra Ghidra_12.1.3_build
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 runva a iniciar un contenedor docker usando la imagenghidra/ghidra<:<version>--env MODE=headlessconfigura la variable de entornoMODEdentro del contenedor con el valorheadless--rmelimina el contenedor después de que el comando se complete--volume /path/to/myproject:/home/ghidra/myprojectmonta el volumen local/path/to/myprojecten el host a/home/ghidra/myprojectdentro del contenedor--volume /path/to/mybinary:/home/ghidra/mybinarymonta el volumen local/path/to/mybinaryen el host a/home/ghidra/mybinarydentro del contenedorghidra/ghidra:<version>es la referencia completa de la imagen docker, dondeghidra/ghidraes el grupo y nombre de la imagen, y<version>es la etiqueta./home/ghidra/myproject programFolder -import /home/ghidra/mybinaryson 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.