
ScareCrow - Marco de creación de payloads diseñado para la evasión de EDR.
Para ver la última versión de ScareCrow o reportar un problema, consulte https://github.com/Tylous/ScareCrow.
Si desea obtener más información sobre las técnicas utilizadas en este framework, consulte Parte 1 y Parte 2
ScareCrow es un framework de creación de payloads para side loading (no inyección) en un proceso legítimo de Windows (evitando los controles de Application Whitelisting). Una vez que el cargador DLL se carga en memoria, utiliza una técnica para eliminar los hooks de un EDR de las DLL del sistema que se ejecutan en la memoria del proceso. Esto funciona porque sabemos que los hooks del EDR se colocan cuando se crea un proceso.
ScareCrow puede apuntar a estas DLL y manipularlas en memoria utilizando la función de API VirtualProtect, que cambia los permisos de una sección de la memoria de un proceso a un valor diferente, específicamente de Ejecutar-Leer a Leer-Escribir-Ejecutar.
ScareCrow utiliza 1 de 2 métodos para desenganchar (unhook)
Cuando se ejecuta, ScareCrow copia los bytes de las DLL del sistema almacenadas en disco en C:\Windows\System32\. Estas DLL se almacenan en disco "limpias" de hooks del EDR porque son utilizadas por el sistema para cargar una copia sin alterar en un nuevo proceso cuando se crea. Dado que los EDR solo enganchan estos procesos en memoria, permanecen sin alterar. ScareCrow no copia todo el archivo DLL, sino que solo se centra en la sección .text de las DLL. Esta sección de una DLL contiene el ensamblado ejecutable, y al hacer esto, ScareCrow ayuda a reducir la probabilidad de detección, ya que releer archivos completos puede hacer que un EDR detecte una modificación en un recurso del sistema. Luego, los datos se copian en la región de memoria correcta utilizando el desplazamiento de cada función. Cada función tiene un desplazamiento que denota el número exacto de bytes desde la dirección base donde residen, proporcionando la ubicación de la función en la pila.
Para hacer esto, ScareCrow cambia los permisos de la región de memoria .text usando VirtualProtect. Aunque se trata de una DLL del sistema, dado que se ha cargado en nuestro proceso (que controlamos), podemos cambiar los permisos de memoria sin requerir privilegios elevados.
ScareCrow carga el shellcode en memoria descifrando primero el shellcode, que está cifrado mediante uno de tres métodos de cifrado (descritos a continuación). Una vez descifrado y cargado, el shellcode se ejecuta. Dependiendo de las opciones de cargador especificadas, ScareCrow configurará diferentes funciones de exportación para la DLL. La DLL cargada tampoco contiene la función DLLMain estándar que todas las DLL normalmente necesitan para funcionar. La DLL se ejecutará sin problemas porque el proceso en el que cargamos buscará esas funciones de exportación y no se preocupará por la presencia de DLLMain.
Después
KnownDLLs es una lista de DLL que Windows carga durante el inicio del sistema. Debido a que estas DLL se consideran esenciales para el funcionamiento del sistema operativo, se almacenan en caché para ayudar a reducir los tiempos de carga y mejorar el rendimiento cuando las aplicaciones se inician. KnownDLLs incluye DLL como kernel32.dll, kernelbase.dll y ntdll.dll.
Utilizando estos KnownDlls, ScareCrow mapea una copia de la DLL desde \KnownDlls\<dllname> usando una combinación de NtOpenSection y NtMapViewOfSection para cargarla en la memoria del proceso. ScareCrow no carga toda la DLL, sino que solo carga la sección .text de la DLL (ya que contiene todas las syscalls). A partir de ahí, ScareCrow utiliza llamadas indirectas al sistema (indirect syscalls) para llamar a NtProtectVirtualMemory y cambiar los permisos de la sección de memoria .text de la DLL para permitir que ScareCrow sobrescriba los hooks del EDR antes de restaurar los permisos.
Para obtener más información, puede leer el artículo detallado de modexp.
Una vez que se eliminan estos hooks, ScareCrow utiliza llamadas al sistema personalizadas para cargar y ejecutar shellcode en memoria. ScareCrow hace esto incluso después de eliminar los hooks del EDR para ayudar a evitar la detección por herramientas de recopilación de telemetría que no están basadas en el espacio de usuario (userland), como Event Tracing for Windows (ETW) u otros mecanismos de registro de eventos. Estas llamadas al sistema personalizadas también se utilizan para realizar la llamada VirtualProtect para eliminar los hooks colocados por los EDR, descrito anteriormente, para evitar la detección por los controles anti-manipulación de cualquier EDR. Esto se hace llamando a una versión personalizada de la syscall VirtualProtect, NtProtectVirtualMemory. ScareCrow utiliza Golang para generar estos cargadores y luego ensamblador para estas funciones de syscall personalizadas.
Durante el proceso de creación del cargador, ScareCrow utiliza una biblioteca para mimetizarse en segundo plano después de que un beacon se comunica con el centro de control. Esta biblioteca hace dos cosas:
Los archivos firmados con certificados de firma de código suelen recibir menos escrutinio, lo que facilita su ejecución sin ser cuestionados, ya que los archivos firmados por un nombre de confianza suelen ser menos sospechosos que otros. La mayoría de los productos antimalware no tienen tiempo para validar y verificar estos certificados (ahora algunos lo hacen, pero normalmente los nombres de proveedores comunes están incluidos en una lista blanca). ScareCrow crea estos certificados utilizando una versión en paquete de Go de la herramienta limelighter para crear un archivo pfx12. Este paquete toma un nombre de dominio ingresado por el usuario para crear un certificado de firma de código para ese dominio. Si es necesario, también puede usar su propio certificado de firma de código si tiene uno, usando la opción de línea de comandos valid.
clone, junto con la ruta al archivo del cual desea copiar el certificado. Al firmar el cargador con microsoft.com, usarlos contra productos de WINDOWS DEFENDER ATP puede no ser tan efectivo, ya que pueden validar el certificado porque les pertenece. Si está utilizando un cargador contra un producto de Windows, posiblemente use un dominio diferente.