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:
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/
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
Publicar un comentario