Pentesting con Powershell sin tener Powershell en Windows
Por supuesto que Powershell es una herramienta de administración y gestión en el mundo IT poderosa, pero si estás leyendo este blog sabes que para los profesionales del Ethical Hacking también tiene un potencial excepcional en todas las fases, pero sobretodo para la fase de pos-explotación.
Pero, ¿qué ocurre si estamos en un entorno que no es el ideal y no podemos tener acceso a esta poderosa herramienta? Muchas veces los pentesters o los equipos de Red Team no pueden ejecutar Powershell directamente, ya sea por permisos en el usuario actual o bien por que han aplicado una política de seguridad de fortificación tipo "Máxima Seguridad en Windows" para evitar la ejecución de Powershell. ¿Qué podemos hacer frente a esta limitación ?
Es en este punto donde marca la diferencia el pentester, aquel que destaca con su creatividad y pensamiento lateral y consigue llegar donde otros no llegan. Es eso lo que para nosotros es un "hacker", que consigue inventar un camino nuevo y llevar la tecnología a un lugar más allá del que había estado antes. Por ese motivo, y en honor a los creativos, vamos a saltarnos esta limitación de no poder utilizar una powershell.exe para aún así poder ejecutar código en Powershell.
Tanto Powershell como C# son “frontends” para el framework .NET, por ello vamos a utilizar esto a nuestro favor. Utilizaremos los ejecutables de C# para llamar a la misma funcionalidad de .NET con la que accederíamos a través de Powershell, y así sacar el máximo provecho a esta herramienta con sus infinitas posibilidades.
Si quieres conocer lo que puedes hacer con ella, no puedo dejar de recomendaros el libro de nuestro compañero el gran Pablo González de "Pentesting con Powershell" si quieres descubrir todas sus posibilidades.
Preparando el entorno
El proceso que voy a describir, que es muy "hacker", viene muy bien explicado y detallado en el siguiente post de Brian Fehrman. Vamos a necesitar el uso de varias herramientas que vienen por defecto en cualquier entorno de Windows donde puede variar la ubicación donde encontrar dichas herramientas en función de su arquitectura y versión. Primero necesitamos crearnos nuestro pequeño código en C#:
Como se puede observar en el código lo que se va a ejecutar es el texto íntegro que tengamos en nuestro “Script.ps1”. Tenemos nuestro fichero "codigo.cs" y, ¿ahora qué? El sistema operativo Windows nos brinda una herramienta que nos permite compilar el código de C#. En esta prueba de concepto el compilador se encuentra en el siguiente directorio :
Abrimos después las propiedades del acceso directo que hemos creado y en el "target" o "destino" introducimos el comando anterior, salvo la parte de la ruta de nuestro codigo.cs, ya que también estamos limitados a cierto número de caracteres en este campo. Aplicamos los cambios y arrastramos nuestro "codigo.cs" dentro del acceso directo.
De cualquiera de las dos formas conseguimos nuestro binario, pero podemos seguir limitados en la ejecución de binarios por no estar incluido en una lista blanca. No pasa nada. Hay que seguir resolviendo problemas y en este caso volvemos a tirar de otra herramienta del propio Windows:
Este script trata de descargarse la consola de nuestra querida iBombshell, que utilizamos en una entrada anterior del blog. Si abrimos el fichero “todo.txt” podemos ver que se ejecuta nuestro script y ha hecho la tarea que necesitábamos.
Así podemos lanzar pequeños script para volcar información que queramos recopilar en un test de intrusión sin vernos limitados por no poder utilizar una PowerShell. Es un buen ejemplo de pensamiento lateral que todo pentester debe desarrollar y no conformarse con las limitaciones con las que se puede encontrar en sus auditorías.
Saludos,
Autor: Víctor Rodríguez Boyero, Security Researcher en el equipo de "Ideas Locas" de la unidad CDCO de Telefónica.
Figura 1: Pentesting con Powershell sin tener Powershell en Windows |
Pero, ¿qué ocurre si estamos en un entorno que no es el ideal y no podemos tener acceso a esta poderosa herramienta? Muchas veces los pentesters o los equipos de Red Team no pueden ejecutar Powershell directamente, ya sea por permisos en el usuario actual o bien por que han aplicado una política de seguridad de fortificación tipo "Máxima Seguridad en Windows" para evitar la ejecución de Powershell. ¿Qué podemos hacer frente a esta limitación ?
Figura 2: Máxima Seguridad en Windows Gold Edition |
Es en este punto donde marca la diferencia el pentester, aquel que destaca con su creatividad y pensamiento lateral y consigue llegar donde otros no llegan. Es eso lo que para nosotros es un "hacker", que consigue inventar un camino nuevo y llevar la tecnología a un lugar más allá del que había estado antes. Por ese motivo, y en honor a los creativos, vamos a saltarnos esta limitación de no poder utilizar una powershell.exe para aún así poder ejecutar código en Powershell.
Figura 3: Relájate y be a good hacker |
Tanto Powershell como C# son “frontends” para el framework .NET, por ello vamos a utilizar esto a nuestro favor. Utilizaremos los ejecutables de C# para llamar a la misma funcionalidad de .NET con la que accederíamos a través de Powershell, y así sacar el máximo provecho a esta herramienta con sus infinitas posibilidades.
Figura 4: Pentesting con Powershell 2ª Edición |
Si quieres conocer lo que puedes hacer con ella, no puedo dejar de recomendaros el libro de nuestro compañero el gran Pablo González de "Pentesting con Powershell" si quieres descubrir todas sus posibilidades.
Preparando el entorno
El proceso que voy a describir, que es muy "hacker", viene muy bien explicado y detallado en el siguiente post de Brian Fehrman. Vamos a necesitar el uso de varias herramientas que vienen por defecto en cualquier entorno de Windows donde puede variar la ubicación donde encontrar dichas herramientas en función de su arquitectura y versión. Primero necesitamos crearnos nuestro pequeño código en C#:
Figura 5: Código en C# |
Como se puede observar en el código lo que se va a ejecutar es el texto íntegro que tengamos en nuestro “Script.ps1”. Tenemos nuestro fichero "codigo.cs" y, ¿ahora qué? El sistema operativo Windows nos brinda una herramienta que nos permite compilar el código de C#. En esta prueba de concepto el compilador se encuentra en el siguiente directorio :
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exeEjecutando el código anterior en una CMD, compilamos el fichero “codigo.cs” y obtenemos el binario “Poc.exe”. Podemos encontrarnos limitados también al no poder ejecutar una simple cmd.exe, que también es un proceso habitual de los que quieren tener Máxima Seguridad en Windows. En el caso de no poder ejecutar la consola, crearemos un acceso directo del ejecutable.
Figura 6: Compilación de codigo.cs con csc.exe |
Abrimos después las propiedades del acceso directo que hemos creado y en el "target" o "destino" introducimos el comando anterior, salvo la parte de la ruta de nuestro codigo.cs, ya que también estamos limitados a cierto número de caracteres en este campo. Aplicamos los cambios y arrastramos nuestro "codigo.cs" dentro del acceso directo.
Figura 7: Configuración del acceso directo |
De cualquiera de las dos formas conseguimos nuestro binario, pero podemos seguir limitados en la ejecución de binarios por no estar incluido en una lista blanca. No pasa nada. Hay que seguir resolviendo problemas y en este caso volvemos a tirar de otra herramienta del propio Windows:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exeComo en el caso anterior, crearemos un acceso directo en el escritorio que apunte a este ejecutable, en sus propiedades, modificaremos el “target” - para que ejecute el binario y hacer un volcado de todo el proceso resultado en un fichero de log - con el siguiente comando:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exeGuardamos los cambios, arrastramos nuestro binario “Poc.exe” dentro del acceso directo y esto ejecutará nuestro Script.ps1, que en nuestro ejemplo es coo sigue en la imagen siguiente.
/logfile=C:\Users\IEUser\Desktop\nps\log.txt /LogToConsole=false /U
Figura 8: Script.ps1 |
Este script trata de descargarse la consola de nuestra querida iBombshell, que utilizamos en una entrada anterior del blog. Si abrimos el fichero “todo.txt” podemos ver que se ejecuta nuestro script y ha hecho la tarea que necesitábamos.
Figura 9: Hemos conseguido ejecutar iBombShell |
Así podemos lanzar pequeños script para volcar información que queramos recopilar en un test de intrusión sin vernos limitados por no poder utilizar una PowerShell. Es un buen ejemplo de pensamiento lateral que todo pentester debe desarrollar y no conformarse con las limitaciones con las que se puede encontrar en sus auditorías.
Saludos,
Autor: Víctor Rodríguez Boyero, Security Researcher en el equipo de "Ideas Locas" de la unidad CDCO de Telefónica.
No hay comentarios:
Publicar un comentario