miércoles, junio 27, 2018

macOS & Windows: Pentesting it with iBombshell (Part 1 de 2)

El fin de semana pasado estuvimos en Euskalhack 2018. Una CON que sin duda merece, y mucho, la pena. No solo por la calidad de los ponentes, sino también por la calidad humana y el trato que todos recibimos. Buena gente, buena comida, buen paisaje, buen hacking, ¿qué más se puede pedir? Junto a mi compañero Álvaro Nuñez-Romero daba una charla el pasado sábado 23 de junio.

Figura 1: macOS & Windows: Pentesting it with iBombshell (Part 1 de 2)

La charla tenía que ver con algo que todo pentester debe conocer a la perfección, el mundo del Pentesting con PowerShell, en la que, basándonos en una idea anterior, presentábamos una nueva herramienta que ayuda a integrar un sin fin de funciones en Powershell directamente a memoria, que proporciona un prompt flexible y potente y que proporciona una vía de post-explotación gracias al concepto de “warrior”.

La primera idea: El comienzo del juego

La llegada de Powershell al mundo GNU/Linux y macOS llamó mi atención hace un tiempo. Powershell es una de las líneas de comandos más potentes, si no la que más, y poder utilizar su potencial en otros sistemas es algo interesante. Es cierto que el no disponer por defecto de Powershell en macOS - donde tradicionalmente se utilizan otras técnicas de hacking en macOS - y GNU/Linux es algo que lo penaliza, por ejemplo, frente a su uso en sistemas Microsoft, en los cuales viene por defecto desde Windows 7 - por eso es pieza clave en el Hacking de Windows -.

Basándonos en los antecedes de algunos de mi trabajos sobre Powershell, como el caso de PSBot - y su uso en el ámbito del Ethical Hacking llegamos a la conclusión de que sería interesante aunar posibilidades en una nueva función de Powershell que permitiera integrar diferentes funciones orientadas a pentesting, aportar flexibilidad en el manejo del prompt y poder usar en cualquier sistema. Además, de crearnos todo lo necesario para llevarlo a cabo. Aquí nació la primera propuesta "macindows", la cual fue cambiada a "ibombshell". Pregúntenle por los nombres a mi compañero Álvaro.


Figura 2: PSBot, dame una PowerShell y moveré el mundo

En los trabajos anteriores se mostraba un escenario inicial en el que el pentester no tenía la posibilidad de instalar herramientas y tiraba de las posibilidades de Powershell. En ambos trabajos se presentaba una herramienta que proporcionaba la posibilidad de cargar funciones, en la primera tocando disco y en la segunda directa a memoria. Las instrucciones se encontraban en un servidor del propio usuario, mientras que en el primer trabajo se utilizaba un covert channel, como Twitter, para llevar a cabo las acciones.

En un primer lugar, la idea era una pequeña herramienta que podía ser manejada de forma remota a través de tuits de Twitter. Poco a poco la idea fue cambiando a que el pentester pudiera tener una función desde la que poder descargar instrucciones y funciones. Uno de los objetivos del principio era utilizar el menos código posible.

La nueva idea: ibombshell

La evolución del trabajo surge con la aparición de UAC-A-Mola y a una conversación con mi compañero Santiago Hernández Ramos. En este trabajo que realizamos de forma conjunta llegamos a la conclusión de que sería muy interesante poder tener en memoria, a través de Powershell, un prompt de UAC-A-Mola, y llegará ;)


Figura 3: CodeTalk 4 devs: UAC-a-mola


La idea era interesante. Abrir una Powershell y poder descargar lo necesario en funciones de Powershell para jugar con nuestro UAC-A-Mola. Esta idea fue cambiando y derivó en tener el mismo juego, es decir, abrir una Powershell y disponer de todas las funciones necesarias al alcance de una manera sencilla y flexible. Que sea cómodo para el usuario y que cualquier pudiera ir añadiendo funciones al repositorio. Que estuviera disponible en cualquier instante y en cualquier lugar, es decir, "everywhere".

Figura 4: UAC-A-Mola en GitHub

La primera idea que quisimos llevar a cabo fue esto. Un prompt que esté en el repositorio de Github y que puedas descargar en cualquier instante y desde cualquier lugar. En otras palabras:
1. Abrimos una powershell.exe 
2. Ejecutamos una instrucción que viene en el repositorio de Github, la cual es iex(new-object net.webclient).downloadstring([URL github]) 
3. Ejecutamos la función console y obtenemos nuestro prompt, sin necesidad de tenerlo en nuestro disco 
4. Ahora tienes a tu alcance todo lo necesario
Sencilo, ¿verdad? Es más, hasta ahora la instrucción iex(new-object net.webclient).downloadstring([URL github]) nos ayuda a bajarnos un prompt que aporta simplicidad, flexibilidad y ayuda al usuario que quiere utilizarlo, pero lógicamente, nuestro loader es similar a iwr([URL snippet function]).context|iex.

Lo interesante es aportar simplicidad, flexibilidad, posibilidad de almacenar en registro las diferentes funciones para no tener que descargarlas de Internet e integración en un mismo scope con el objetivo de hacer que varias acciones se puedan involucrar. Además, se podrá, aunque aún no lo hemos contado, ejecutar diferentes ibombshell con distintos modos e interactuar con ellas y entre otras máquinas. Esto viene bien para la parte de post-explotación.

Figura 5: Función loader

Aquí nos surgió una segunda idea, es interesante proporcionar un prompt dónde cualquiera pueda utilizar funciones de Powershell a través de una shell sencilla, pero suma, y mucho, la posibilidad de utilizar ibombshell de forma remota y que lo haga en modo sigiloso. Es decir, poder ejecutar el prompt de forma remota y de forma oculta y poder ser gestionado desde un panel de control escrito en un lenguaje que aman los pentesters: Python.

iBombshell: Funcionamiento

En resumen, en primera instancia ibombshell nos proprociona un prompt descargado y ejecutado en memoria. Este prompt hace lo siguiente:
1. Verifica si existe en el registro de Windows una entrada en HKCU:\Software\Classes\ibombshell. Si está entrada existe, significa que habrá funciones de Powershell almacenadas en el registro. ¿Cómo se hace esto? ibombshell proporciona la posibilidad de almacenar funciones en el registro de Windows. Cada línea de la función será una clave en el registro. Por ejemplo, si tenemos la función txuleta, tendremos la clave HKCU:\Software\Classes\ibombshell\txuleta y dentro de la ruta tendremos del 0 hasta N claves con las líneas de la función. Si existen funciones en el registro el prompt las recupera y las carga en memoria. 
 2. Lee de Github las funciones disponibles. El prompt lee un fichero denominado functions.txt, el cual tiene por cada línea una función disponible en el repositorio de código. Hay funciones que están creadas para aportar funcionalidad y flexibilidad a la herramienta y luego hay funciones orientadas al pentesting.
Figura 6: Fichero functions.txt
3. El prompt verifica el modo en el que ha sido ejecutado, es decir, ibombshell a día de hoy tiene dos modos de ejecución, el primero es el que hemos comentado, mientras que el segundo se comentará más adelante. Si el modo es su modo normal o everywhere, mostrará un prompt y nos solicitará alguna acción.
4. La función showcommands nos muestra las posibles funciones disponibles en el repositorio de Github.
5. La función showfunctions nos muestra las funciones cargadas en memoria en el ámbito o scope de ibombshell.
Figura 7: Showcommands y Showfunctions

Como se puede ver en la imagen, las posibilidades empiezan a ser grandes y eso que estamos comenzando. Para simplificar la carga de cualquier otro repositorio o función que se encuentre en otro lado y que no esté en nuestro repositorio se dispone de una función llamada loaderext. Esta función proporciona el mecanismo adecuado para cargar la función remota y de otro ‘repo’ en nuestro ámbito de ejecución de ibombshell.

Para descargar la función ejecutamos la ruta a la función, como se puede ver en la imagen anterior system/loaderext. Tras cargar la función, si ejecutamos showfunctions veremos que está cargada ya con su nombre loaderext.

Figura 8: Carga de una función

Existe la posibilidad de bajarnos una función ayuda, denominada help!, con la que podemos consultar la ayuda disponible de cada función de la siguiente manera: help! –function [función cargada].

Figura 9: Acceso al catálogo disponible de funciones

Una de las ideas que tenemos en mente es ampliar las posibilidades de loaderext y que muestre un gran catálogo de posibilidades con funciones interesantes para el pentesting con Powershell. En la imagen superior se puede ver como con el parámetro –catalog se puede listar URLs de funciones interesantes para pentesting. Estamos en la construcción de dicho catálogo. Más adelante, se puede ver como se carga la función y está disponible en memoria.

[Segunda parte del artículo]

Autor: Pablo González Pérez (@pablogonzalezpe), escritor de los libros "Metasploit para Pentesters", "Hacking con Metasploit: Advance Pentesting" "Hacking Windows", "Ethical Hacking", "Got Root" y “Pentesting con Powershell”, Microsoft MVP en Seguridad y Security Researcher en ElevenPaths

No hay comentarios:

Entrada destacada

Seis recomendaciones personales de libros de @0xWord para disfrutar y aprender

Este verano pude disfrutar de la lectura de un libro que me encantó. El libro de Factfulness que me había regalado mi compañera Beatriz Ce...

Entradas populares