
Primeiro backdoor de System Management Mode de código aberto e publicamente disponível para plataformas baseadas em UEFI. Bom como playground de propósito geral para vários experimentos com SMM.
SMM backdoor para plataformas baseadas em UEFI
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Este é um projeto legado abandonado. Para a versão atual do backdoor, consulte a página do projeto SMM Backdoor Next Gen e a sua documentação:
https://github.com/Cr4sh/SmmBackdoorNg
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Para mais informações sobre este projeto, leia o seguinte artigo:
http://blog.cr4.sh/2015/07/building-reliable-smm-backdoor-for-uefi.html
Conteúdo do repositório:
SmmBackdoor.py -- Programa Python que permite infectar a imagem PE de um driver DXE UEFI com código de backdoor, comunicar com o backdoor instalado para ler a SMRAM e fazer outras coisas úteis.
SmmBackdoor/ -- código-fonte da parte UEFI que é executada no System Management Mode.
SmmBackdoor.efi, SmmBackdoor.pdb -- binário da parte UEFI e os seus símbolos de depuração.
smm_call/ -- programa Linux de prova de conceito que interage com o backdoor instalado para obter privilégios de root para o seu processo.
Para compilar o projeto SmmBackdoor, você precisa de uma máquina Windows com Visual Studio 2008 e o código-fonte do EDK2 (https://github.com/tianocore/edk2).
Instruções passo a passo:
Copie o subdiretório SmmBackdoor para o diretório do código-fonte do EDK2.
Edite o arquivo Conf/target.txt e defina o valor da propriedade ACTIVE_PLATFORM para OvmfPkg/OvmfPkgX64.dsc.
Edite o OvmfPkg/OvmfPkgX64.dsc e adicione as seguintes linhas no final do arquivo:
#
# 3-rd party drivers
#
SmmBackdoor/SmmBackdoor.inf {
<LibraryClasses>
DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf
MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
}
4. Execute o Prompt de Comando do Visual Studio 2008 e use cd para o diretório do EDK2.
Execute Edk2Setup.bat --pull para configurar o ambiente de compilação e baixar os binários necessários.
cd SmmBackdoor && build
Após a compilação, o arquivo de imagem PE resultante será criado em Build/OvmfX64/DEBUG_VS2008x86/X64/SmmBackdoor/SmmBackdoor/OUTPUT/SmmBackdoor.efi
Para executar o SmmBackdoor.efi como payload de infecção no exemplo da placa-mãe Intel DQ77KB:
Despeje o firmware da placa-mãe usando um programador SPI por hardware.
Abra a imagem de flash despejada no UEFITool.
Extraia a imagem PE do arquivo FFS com GUID = 26A2481E-4424-46A2-9943-CC4039EAD8F8 e salve-a no arquivo extracted.bin.
Infecte a imagem extraída com o SmmBackdoor.efi usando o SmmBackdoor.py:
$ python SmmBackdoor.py --infect extracted.bin --output infected.bin --payload SmmBackdoor.efi
No UEFITool, substitua a imagem PE original pelo infected.bin.
Salve a imagem de flash modificada em um arquivo e grave-a na ROM da placa-mãe com o programador.
O backdoor também possui recursos de saída de depuração que permitem ver mensagens de depuração da fase DXE na tela e receber mensagens de depuração da fase de runtime pela porta COM.
Para usar o SmmBackdoor.py, você precisa instalar a biblioteca Python pefile (https://pypi.python.org/pypi/pefile) e o framework CHIPSEC (https://github.com/chipsec/chipsec), incluindo os bindings Python.
Comandos suportados:
SmmBackdoor.py --infect <source_path> --output <dest_path> --payload <payload_path> — Infecta a imagem PE do driver DXE com o código de backdoor especificado.
SmmBackdoor.py --test — Verifica a presença do backdoor e imprime informações de status da estrutura BACKDOOR_INFO.
SmmBackdoor.py --dump-smram — Despeja todas as regiões SMRAM disponíveis em arquivos.
SmmBackdoor.py --read-phys
— Imprime o dump hexadecimal da página de memória física no endereço fornecido.SmmBackdoor.py --read-virt
— Imprime o dump hexadecimal da página de memória virtual no endereço fornecido.SmmBackdoor.py --timer-enable — Ativa o SMI de temporizador periódico necessário para o smm_call (por padrão, está ativado).
SmmBackdoor.py --timer-disable — Desativa o SMI de temporizador periódico.
Uso do smm_call:
smm_call [<arg_1> [<arg_2>]] — Envia o código de controle e os argumentos especificados para o backdoor SMM.
-
smm_call --privesc — Pede ao backdoor para conceder privilégios de root ao processo chamador e executar um shell de comandos.
Observe que este código foi testado apenas com a placa-mãe Intel DQ77KB. Você pode tentar executá-lo em qualquer outro hardware compatível com UEFI, mas alguns recursos do backdoor podem não funcionar.
Escrito por:
Dmytro Oleksiuk (aka Cr4sh)