
Un proof-of-concept de Reflective Loader para Cobalt Strike que tiene como objetivo recrear, integrar y mejorar las funciones de evasión de Cobalt Strike.

Una prueba de concepto de User-Defined Reflective Loader (UDRL) que tiene como objetivo recrear, integrar y mejorar las funciones de evasión de Cobalt Strike.
| Contribuidor | Contribuciones notables | |
|---|---|---|
| Bobby Cooke | @0xBoku | Autor original y mantenedor del proyecto |
| Santiago Pecin | @s4ntiago_p | Mejoras importantes del Reflective Loader |
| Chris Spehn | @ConsciousHacker | Scripting de Aggressor |
| Joshua Magri | @passthehashbrwn | Hooking de IAT |
| Dylan Tran | @d_tranman | Reflective Call Stack Spoofing |
| James Yeung | @5cript1diot | Indirect System Calls |
El Cobalt Strike reflective loader integrado es robusto y maneja todas las funciones de evasión de Malleable PE que Cobalt Strike ofrece. La principal desventaja de usar un UDRL personalizado es que las funciones de evasión de Malleable PE pueden o no ser compatibles de fábrica.
El objetivo del proyecto público BokuLoader es ayudar a los equipos rojos a crear su propio UDRL interno para Cobalt Strike. El proyecto pretende ser compatible con todas las funciones de evasión de Malleable PE de CS que valgan la pena. Algunas funciones de evasión aprovechan la integración con CS, otras han sido recreadas por completo y algunas no son compatibles.
Antes de usar este proyecto, en cualquier forma, debes probar adecuadamente que las funciones de evasión funcionan como se espera. Entre el código C y el script de Aggressor, la compilación con diferentes versiones de sistemas operativos, compiladores y Java puede devolver resultados diferentes.
NtProtectVirtualMemory.obfuscate "true" con implementación personalizada del script de Aggressor del UDRL.0x1000 bytes serán nulos.XGetProcAddress para resolver símbolos.
Kernel32.GetProcAddress.xLoadLibrary para resolver la dirección base de las DLL y la carga de DLL.
TEB->PEB->PEB_LDR_DATA->InMemoryOrderModuleList.Kernel32.LoadLibraryA.makeBokuLoader.cnaScript Console para asegurarte de que BokuLoader se implementó en la compilación del beaconRAW funciona de fábrica. Cuando se usa Artifact Kit para el loader del beacon, la variable stagesize debe ser mayor que la predeterminada.
| Cadena original de Cobalt Strike | Cadena de BokuLoader en Cobalt Strike |
|---|---|
| ReflectiveLoader | BokuLoader |
| Microsoft Base Cryptographic Provider v1.0 | 12367321236742382543232341241261363163151d |
| (admin) | (tomin) |
| beacon | bacons |
Kernel32.LoadLibraryExA para mapear la DLL desde el disco.Kernel32.LoadLibraryExA es DONT_RESOLVE_DLL_REFERENCES (0x00000001)
RX o RWX en el heap si no se usa el sleepmask kit.Kernel32.CreateFileMappingA y Kernel32.MapViewOfFile para asignar memoria para la DLL beacon virtual.NtAllocateVirtualMemory, NtProtectVirtualMemoryntdll.dll no detectará estos systemcalls.mov eax, r11d; mov r11, r10; mov r10, rcx; jmp r11 dentro de su memoria ejecutable.0x1000 bytes de la DLL beacon virtual son ceros.| Comando | Opción(es) | Compatible |
|---|
allocator | HeapAlloc, MapViewOfFile, VirtualAlloc | Todas compatibles mediante la implementación de BokuLoader |
module_x64 | string (Nombre de DLL) | Compatible mediante la implementación de BokuLoader. Se aplican los mismos requisitos de sobrescritura de DLL que en la implementación de CS |
obfuscate | true/false | Los beacons HTTP/S son compatibles mediante la implementación de BokuLoader. SMB/TCP actualmente no es compatible con obfuscate true. Detalles en el issue. Se acepta ayuda si puedes corregirlo :) |
entry_point | RVA como número decimal | Compatible mediante la implementación de BokuLoader |
cleanup | true | Compatible mediante la integración con CS |
userwx | true/false | Compatible mediante la implementación de BokuLoader |
sleep_mask | (true/false) o (Sleepmask Kit+true) | Compatible. Cuando se usa el "sleepmask true" por defecto (sin sleepmask kit) establece "userwx true". Cuando se usa el sleepmask kit que soporta memoria RX de beacon.text (src47/Ekko) establece "sleepmask true" y "userwx false". |
magic_mz_x64 | cadena de 4 caracteres | Compatible mediante la integración con CS |
magic_pe | cadena de 2 caracteres | Compatible mediante la integración con CS |
transform-x64 prepend | cadena hexadecimal escapada | Modificación del script de Aggressor BokuLoader.cna |
transform-x64 strrep | cadena cadena | Modificación del script de Aggressor BokuLoader.cna |
stomppe | true/false | No compatible. BokuLoader no copia las cabeceras de la DLL beacon. Los primeros 0x1000 bytes de la DLL beacon virtual son 0x00 |
checksum | número | Experimental. Modificación del script de Aggressor BokuLoader.cna |
compile_time | cadena de fecha-hora | Experimental. Modificación del script de Aggressor BokuLoader.cna |
image_size_x64 | valor decimal | No compatible |
name | cadena | Experimental. Modificación del script de Aggressor BokuLoader.cna |
rich_header | cadena hexadecimal escapada | Experimental. Modificación del script de Aggressor BokuLoader.cna |
stringw | cadena | No compatible |
string | cadena | No compatible |