PESecurity: verificando las protecciones de un binario en Windows (ASLR, DEP y SafeSEH) con Powershell:

A la hora de reversear o explotar una DLL o un EXE es capital saber si este fue compilado con ASLR (Address Space Layout Randomization), DEP (Data Execution Prevention) o SafeSEH (Structured Exception Handling).

PowerShell es una gran opción para ver las características de un PE (Portable Executable) porque es una herramienta nativa y puede acceder a la API de Windows y extraer información dentro de los archivos. Simplificándolo un poco, los encabezados PE contienen toda la información que necesita Windows para ejecutar imágenes compiladas. Dentro de los encabezados PE (Optional Header 0x18) hay una sección opcional DLLCharacteristics con valores hexadecimales que proporcionan información para las opciones compiladas en un archivo. Los valores posibles figuran en la siguiente tabla:

Constant Value Description
0x0001 Reserved, must be zero.
0x0002 Reserved, must be zero.
0x0004 Reserved, must be zero.
0x0008 Reserved, must be zero.
IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE 0x0040 DLL can be relocated at load time.
IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY 0x0080 Code Integrity checks are enforced.
IMAGE_DLL_CHARACTERISTICS_NX_COMPAT 0x0100 Image is NX compatible.
IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200 Isolation aware, but do not isolate the image.
IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400 Does not use structured exception (SE) handling. No SE handler may be called in this image.
IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800 Do not bind the image.
0x1000 Reserved, must be zero.
IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000 A WDM driver.
IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000 Terminal Server aware.

Como podéis ver en la tabla hay valores relacionados con el estado de ASLR (IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE), DEP (IMAGE_DLLCHARACTERISTICS_NX_COMPAT) y SEH (IMAGE_DLLCHARACTERISTICS_NO_SEH). Los valores comunes de las características DLLC son 140 para ASLR, DEP y SEH, y 400 para ningún ASLR, DEP y SEH. Si IMAGE_DLLCHARACTERISTICS_NO_SEH es verdadero, entonces no hay SEH y SafeSEH no es necesario.

Tened en cuenta que SafeSEH solo está disponible para imágenes de 32 bits y puede usarse solo si cada módulo vinculado lo admite. Para verificar SafeSEH necesitamos mirar los campos SafeSEH que residen en la sección IMAGE_LOAD_CONFIG_DIRECTORY del PE. Dentro de esta estructura están el SEHandlerTable, que contiene la dirección virtual de una tabla de direcciones virtuales relativas para cada controlador válido, y el SEHandlerCount, que es el número de controladores en la tabla de controlador válida de SEHandlerTable. Si no se utiliza SafeSEH, estos miembros y, en ocasiones, la sección IMAGE_LOAD_CONFIG_DIRECTORY estarán vacíos.

Para automatizar estas comprobaciones y saber si un binario de Windows (EXE/DLL) ha sido compilado con estas opciones (además de StrongNaming, Authenticode, Control Flow Guard y HighEntropyVA) la gente de NetSPI ha publicado un script en Powershell muy útil llamado PESecurity (https://github.com/NetSPI/PESecurity):

Para usarlo empezaremos importando el módulo:

Import-Module .\Get-PESecurity.psm1

Analizar un binario:

C:\PS> Get-PESecurity -file C:\Windows\System32\kernel32.dll


Chequear un directorio entero de DLLs y EXEs:

C:\PS> Get-PESecurity -directory C:\Windows\System32\


Chequear un directorio entero de DLLs y EXEs recursivamente:

C:\PS> Get-PESecurity -directory C:\Windows\System32\ -recursive

Exportar los resultados a un CSV:

C:\PS>  Get-PESecurity -directory C:\Windows\System32\ -recursive | Export-CSV file.csv

Mostrar los resultados en una tabla:

C:\PS> Get-PESecurity -directory C:\Windows\System32\ -recursive | Format-Table


Mostrar los resultados en una tabla y ordenarlos por una columna:

C:\PS> Get-PESecurity -directory C:\Windows\System32\ -recursive | Format-Table | sort ASLR

Enlaces:

- http://msdn.microsoft.com/en-us/library/windows/desktop/ms680336(v=vs.85).aspx
- http://msdn.microsoft.com/en-us/library/windows/desktop/ms680339(v=vs.85).aspx
- http://msdn.microsoft.com/en-us/library/windows/desktop/ms680328(v=vs.85).aspx
- http://msdn.microsoft.com/en-us/library/9a89h429.aspx
- https://github.com/mattifestation/PowerSploit

Referencias:

https://blog.netspi.com/verifying-aslr-dep-and-safeseh-with-powershell/

Comentarios