
DLL sideloading/proxying with Nim!
Este repositório permite gerar facilmente DLLs Nim que pode utilizar para sideloading / proxy loading. Se não estiver familiarizado com o que é sideloading de DLL, dê uma olhada neste artigo de blog.
Coloque a DLL legítima (ou várias DLLs) que pretende usar como proxy no diretório build deste repositório e depois execute make.
Isto irá gerar dois .dlls no diretório out:
Se o sideloading for bem-sucedido, deverá ver uma caixa de mensagem (popup) e/ou um ficheiro criado no ambiente de trabalho.
Para "weaponizar" realmente o payload, pode dar uma olhada no repositório OffensiveNim para obter ideias e fragmentos de código prontos a usar :).
dllproxy.nim é a DLL de proxy que irá executar o seu payload e encaminhar (proxy) as chamadas de função legítimas para a(s) DLL(s) original(is)gen_def.py analisa a tabela de exportação da DLL original e gera um ficheiro de definição de módulo (.def).O ficheiro .def é então passado ao linker na altura da compilação, de forma a encaminhar as chamadas de função legítimas.
NimMain da tabela de exportação de uma DLL NimConsulte este artigo da Microsoft
Repare na última linha deste ficheiro .def:
EXPORTS
GetFileVersionInfoA=ZCnerzNI.GetFileVersionInfoA @1
GetFileVersionInfoByHandle=ZCnerzNI.GetFileVersionInfoByHandle @2
GetFileVersionInfoExA=ZCnerzNI.GetFileVersionInfoExA @3
GetFileVersionInfoExW=ZCnerzNI.GetFileVersionInfoExW @4
GetFileVersionInfoSizeA=ZCnerzNI.GetFileVersionInfoSizeA @5
GetFileVersionInfoSizeExA=ZCnerzNI.GetFileVersionInfoSizeExA @6
GetFileVersionInfoSizeExW=ZCnerzNI.GetFileVersionInfoSizeExW @7
GetFileVersionInfoSizeW=ZCnerzNI.GetFileVersionInfoSizeW @8
GetFileVersionInfoW=ZCnerzNI.GetFileVersionInfoW @9
VerFindFileA=ZCnerzNI.VerFindFileA @10
VerFindFileW=ZCnerzNI.VerFindFileW @11
VerInstallFileA=ZCnerzNI.VerInstallFileA @12
VerInstallFileW=ZCnerzNI.VerInstallFileW @13
VerLanguageNameA=ZCnerzNI.VerLanguageNameA @14
VerLanguageNameW=ZCnerzNI.VerLanguageNameW @15
VerQueryValueA=ZCnerzNI.VerQueryValueA @16
VerQueryValueW=ZCnerzNI.VerQueryValueW @17
NimMain @19 NONAME PRIVATE
Esta última linha basicamente diz ao linker para remover o nome da função NimMain. Compilar a DLL e passar o ficheiro .def acima ao linker resulta na seguinte entrada se observarmos a tabela de exportação da .dll:
