
Asistente de investigación de vulnerabilidades que localiza llamadas a funciones de API potencialmente inseguras en un archivo binario.
# rhabdomancer [](https://github.com/0xdea/rhabdomancer) [](https://crates.io/crates/rhabdomancer) [](https://crates.io/crates/rhabdomancer) [](https://hex-rays.com/ida-pro) [](https://twitter.com/0xdea) [](https://infosec.exchange/@raptor) [](https://github.com/0xdea/rhabdomancer/actions/workflows/build.yml) [](https://github.com/0xdea/rhabdomancer/actions/workflows/doc.yml) > "El camino hacia los bugs explotables está pavimentado con bugs no explotables." > > -- Mark Dowd Rhabdomancer es un plugin headless de IDA extremadamente rápido que localiza llamadas a funciones de API potencialmente inseguras en un archivo binario. Los auditores pueden hacer un backtrace desde estos puntos candidatos para encontrar rutas que permitan el acceso a entrada no confiable.  ## Características - Experiencia de usuario headless y extremadamente rápida gracias a IDA 9.x y los bindings de Rust idalib-rs. - Soporte para objetivos binarios C/C++ compilados para cualquier arquitectura implementada por IDA. - Las ubicaciones de llamadas a funciones de API maliciosas se imprimen en stdout y se marcan en el IDB. - Las ubicaciones de llamadas en código de biblioteca reconocido por IDA (por ejemplo, un runtime enlazado estáticamente que coincide con firmas FLIRT) se etiquetan como `(lib)`. - Las llamadas a través de stubs (por ejemplo, las entradas `.plt` de binarios ELF o los stubs de importación de binarios PE y Mach-O, listados como thunks) se rastrean hasta sus llamadores. - En binarios ELF, una función se lista deliberadamente dos veces con las mismas ubicaciones de llamada: una vez como su stub `.plt` (marcado como thunk) y otra como su importación. Cada ubicación de llamada se marca solo una vez en el IDB. - Las funciones de API maliciosas conocidas se agrupan en niveles de peligrosidad para ayudar a priorizar el trabajo de auditoría. - [BAD 0] Prioridad alta - Funciones que generalmente se consideran inseguras. - [BAD 1] Prioridad media - Funciones interesantes que deberían revisarse en busca de casos de uso inseguros. - [BAD 2] Prioridad baja - Las rutas de código que involucran estas funciones deberían revisarse cuidadosamente. - La lista de funciones de API maliciosas conocidas está integrada y puede personalizarse fácilmente con un archivo de configuración basado en `conf/rhabdomancer.toml`. - Los nombres de funciones se comparan sin estas decoraciones: puntos y guiones bajos iniciales (por ejemplo, `_strcpy`), los prefijos de alias de biblioteca (por ejemplo, `__o_malloc` en el Universal CRT, `__libc_system` y `__GI___snprintf` en glibc) y, solo para stubs y dichos alias, el sufijo numérico que IDA añade a los nombres ya en uso (por ejemplo, `memset_0`). > [!NOTE] > Las funciones fortificadas (por ejemplo, `__strcpy_chk`, usada en lugar de `strcpy` al compilar con > `_FORTIFY_SOURCE`) deliberadamente no se comparan, ya que son las variantes verificadas de las funciones listadas. > Para marcar también sus llamadas, añádelas explícitamente a una configuración personalizada (por ejemplo, > `"__strcpy_chk"` con la misma prioridad que `strcpy`). ## Artículos - <https://hex-rays.com/blog/streamlining-vulnerability-research-idalib-rust-bindings> - <https://hnsecurity.it/blog/streamlining-vulnerability-research-with-ida-pro-and-rust> ## Véase también - <https://github.com/0xdea/ghidra-scripts/blob/main/Rhabdomancer.java> - <https://docs.hex-rays.com/release-notes/9_0#headless-processing-with-idalib> - <https://github.com/idalib-rs/idalib> - <https://books.google.it/books/about/The_Art_of_Software_Security_Assessment.html> ## Instalación La forma más sencilla de obtener la última versión es a través de [crates.io](https://crates.io/crates/rhabdomancer): 1. Descargue, instale y configure IDA (consulte <https://hex-rays.com/ida-pro>). 2. Instale LLVM/Clang (consulte <https://rust-lang.github.io/rust-bindgen/requirements.html>). 3. En Linux/macOS, instale de la siguiente manera: ```sh export IDADIR=/path/to/ida # if not set, the build script will check common locations cargo install rhabdomancer --locked ``` En Windows, en su lugar, utilice los siguientes comandos: ```powershell $env:LIBCLANG_PATH="\path\to\clang+llvm\bin" $env:PATH="\path\to\ida;$env:PATH" $env:IDADIR="\path\to\ida" # if not set, the build script will check common locations cargo install rhabdomancer --locked ``` ## Compilación Alternativamente, puedes compilar desde el [código fuente](https://github.com/0xdea/rhabdomancer): 1. Descarga, instala y configura IDA (consulta <https://hex-rays.com/ida-pro>). 2. Instala LLVM/Clang (consulta <https://rust-lang.github.io/rust-bindgen/requirements.html>). 3. En Linux/macOS, compila de la siguiente manera: ```sh git clone --depth 1 https://github.com/0xdea/rhabdomancer cd rhabdomancer export IDADIR=/path/to/ida # if not set, the build script will check common locations cargo build --release --locked ``` En Windows, en su lugar, utilice los siguientes comandos: ```powershell git clone --depth 1 https://github.com/0xdea/rhabdomancer cd rhabdomancer $env:LIBCLANG_PATH="\path\to\clang+llvm\bin" $env:PATH="\path\to\ida;$env:PATH" $env:IDADIR="\path\to\ida" # if not set, the build script will check common locations cargo build --release --locked ``` ## Uso 1. Asegúrate de que IDA esté configurado correctamente con una licencia válida. 2. Opcionalmente, personaliza la lista de funciones API maliciosas conocidas: copia [`conf/rhabdomancer.toml`](https://github.com/0xdea/rhabdomancer/blob/master/conf/rhabdomancer.toml) (elige la etiqueta que coincida con tu versión instalada para obtener su lista integrada exacta), edita la copia y establece la variable de entorno `RHABDOMANCER_CONFIG` con su ruta. El archivo debe definir los arrays `high`, `medium` y `low`, y ninguna otra clave. De lo contrario, se utiliza la lista integrada, que se incrusta en el binario en el momento de la compilación desde `conf/rhabdomancer.toml` (editar ese archivo requiere recompilar). 3. Asegúrate de que la variable de entorno `IDADIR` esté establecida si tu instalación de IDA se encuentra en una ubicación no estándar. 4. Ejecútalo de la siguiente manera: ```sh rhabdomancer <binary_file> ``` Cualquier archivo IDB `.i64` existente se actualizará; de lo contrario, se creará un nuevo archivo IDB. 5. Abra el archivo IDB `.i64` resultante con IDA. 6. Seleccione `View` > `Open subviews` > `Bookmarks` 7. Disfrute de sus resultados convenientemente recopilados en una ventana de IDA. > [!NOTE] > Rhabdomancer también añade comentarios en las ubicaciones de llamadas marcadas. Tanto los marcadores como los comentarios se etiquetan como > `[BAD n] <function_name>`, donde `n` es el nivel de prioridad (0 = alto, 1 = medio, 2 = bajo), de modo que los scripts puedan > buscarlos en los IDB. Este formato es estable entre versiones. ## Compatibilidad Solo se admite oficialmente la última versión de IDA, pero las versiones anteriores también pueden funcionar. La siguiente tabla resume la última versión compatible para cada versión de IDA: | Versión de IDA | Última versión compatible | | ----------- | ------------------------- | | v9.0.240925 | v0.2.4 | | v9.0.241217 | v0.3.5 | | v9.1.250226 | v0.6.2 | | v9.2.250908 | v0.7.6 | | v9.3.260213 | v0.8.1 | | v9.3.260327 | v0.9.0 | | v9.3.260421 | v0.9.3 | | v9.4.260714 | versión actual | | v9.4.260915 | versión actual | > [!NOTE] > Consulte la documentación de [idalib-rs](https://github.com/idalib-rs/idalib) para obtener información adicional. ## Créditos El desarrollo de este proyecto ha sido apoyado por las siguientes organizaciones: - [HN Security](https://hnsecurity.it) - [Hex-Rays](https://hex-rays.com) a través de su [Contributor Program](https://hex-rays.com/contributor-program) ## Registro de cambios - [CHANGELOG.md](https://github.com/0xdea/rhabdomancer/blob/master/CHANGELOG.md) ## TODO - Enriquecer aún más la lista conocida de funciones API maliciosas (consulte <https://github.com/0xdea/semgrep-rules>). - Seguir las llamadas a través de thunks fuera de los segmentos `.plt` (por ejemplo, thunks `j_` de enlace incremental de MSVC). - Considerar omitir el marcado de ubicaciones de llamadas en código de biblioteca reconocido por IDA (actualmente solo etiquetado como `(lib)`). - Implementar salida serializada para facilitar el análisis y el parseo automatizados. - Implementar un conjunto de reglas básico al estilo de [VulFi](https://github.com/Accenture/VulFi) y [VulnFanatic](https://github.com/Martyx00/VulnFanatic).