
Primer backdoor de código abierto y disponible públicamente para System Management Mode (SMM) en plataformas basadas en UEFI. Ideal como campo de pruebas de propósito general para diversos experimentos con SMM.
SMM backdoor para plataformas basadas en UEFI
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Este es un proyecto antiguo y abandonado. Para la versión actual del backdoor consulta la página del proyecto SMM Backdoor Next Gen y su documentación:
https://github.com/Cr4sh/SmmBackdoorNg
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Para obtener más información sobre este proyecto, lee el siguiente artículo:
http://blog.cr4.sh/2015/07/building-reliable-smm-backdoor-for-uefi.html
Contenido del repositorio:
SmmBackdoor.py -- Programa en Python que permite infectar la imagen PE de un controlador DXE de UEFI con el código del backdoor, comunicarse con el backdoor instalado para leer SMRAM y hacer otras cosas útiles.
SmmBackdoor/ -- Código fuente de la parte UEFI que se ejecuta en el modo de gestión del sistema (System Management Mode).
SmmBackdoor.efi, SmmBackdoor.pdb -- Binario de la parte UEFI y sus símbolos de depuración.
smm_call/ -- Programa Linux de prueba de concepto que interactúa con el backdoor instalado para obtener privilegios de root para su proceso.
Para compilar el proyecto SmmBackdoor necesitas una máquina Windows con Visual Studio 2008 y el código fuente de EDK2 (https://github.com/tianocore/edk2).
Instrucciones paso a paso:
Copia el subdirectorio SmmBackdoor al directorio del código fuente de EDK2.
Edita el archivo Conf/target.txt y establece el valor de la propiedad ACTIVE_PLATFORM en OvmfPkg/OvmfPkgX64.dsc.
Edita OvmfPkg/OvmfPkgX64.dsc y añade las siguientes líneas al final del archivo:
#
# Controladores de terceros
#
SmmBackdoor/SmmBackdoor.inf {
<LibraryClasses>
DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf
MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
}
4. Ejecuta el Símbolo del sistema de Visual Studio 2008 y haz cd al directorio de EDK2.
Ejecuta Edk2Setup.bat --pull para configurar el entorno de compilación y descargar los binarios necesarios.
cd SmmBackdoor && build
Después de la compilación, la imagen PE resultante se creará en Build/OvmfX64/DEBUG_VS2008x86/X64/SmmBackdoor/SmmBackdoor/OUTPUT/SmmBackdoor.efi
Para ejecutar SmmBackdoor.efi como payload del infector en el ejemplo de la placa base Intel DQ77KB:
Vuelca el firmware de la placa base utilizando un programador SPI por hardware.
Abre la imagen de flash volcada en UEFITool.
Extrae la imagen PE del archivo FFS con GUID = 26A2481E-4424-46A2-9943-CC4039EAD8F8 y guárdala en el archivo extracted.bin.
Infecta la imagen extraída con SmmBackdoor.efi usando SmmBackdoor.py:
$ python SmmBackdoor.py --infect extracted.bin --output infected.bin --payload SmmBackdoor.efi
En UEFITool reemplaza la imagen PE original con infected.bin.
Guarda la imagen de flash modificada en un archivo y escríbela en la ROM de la placa base con el programador.
El backdoor también tiene capacidades de salida de depuración que permiten ver los mensajes de depuración de la fase DXE en pantalla y recibir los mensajes de depuración de la fase runtime a través del puerto COM.
Para usar SmmBackdoor.py necesitas instalar la biblioteca de Python pefile (https://pypi.python.org/pypi/pefile) y el framework CHIPSEC (https://github.com/chipsec/chipsec), incluyendo los bindings de Python.
Comandos admitidos:
SmmBackdoor.py --infect <source_path> --output <dest_path> --payload <payload_path> - Infecta la imagen PE del controlador DXE con el código de backdoor especificado.
SmmBackdoor.py --test - Comprueba la presencia del backdoor e imprime la información de estado de la estructura BACKDOOR_INFO.
SmmBackdoor.py --dump-smram - Vuelca todas las regiones SMRAM disponibles en archivos.
SmmBackdoor.py --read-phys
- Imprime un volcado hexadecimal de la página de memoria física en la dirección dada.SmmBackdoor.py --read-virt
- Imprime un volcado hexadecimal de la página de memoria virtual en la dirección dada.SmmBackdoor.py --timer-enable - Habilita el SMI de temporizador periódico que se requiere para smm_call (por defecto está habilitado).
SmmBackdoor.py --timer-disable - Deshabilita el SMI de temporizador periódico.
Uso de smm_call:
smm_call [<arg_1> [<arg_2>]] - Envía el código de control y los argumentos especificados al backdoor SMM.
-
smm_call --privesc - Pide al backdoor que otorgue privilegios de root al proceso que llama y ejecuta un shell de comandos.
Ten en cuenta que este código solo se probó con la placa base Intel DQ77KB. Puedes intentar ejecutarlo en cualquier otro hardware compatible con UEFI, pero algunas de las funciones del backdoor podrían no funcionar.
Escrito por:
Dmytro Oleksiuk (alias Cr4sh)