Muy buenas a todos!

Esta semana os traigo una pequeña herramienta llamada Invoke-Transfer, que nos permitirá enviar ficheros en entornos restringidos, siempre que podamos utilizar el clipboard sin muchas restricciones. Además, podremos recibir ficheros a través del OCR nativo de Windows y reconstruirlos de forma totalmente automática.


Uno de los principales objetivos durante cualquier auditoría o ejercicio de Red Team, es obtener hashes, credenciales, o cualquier tipo de información que nos permita mejorar nuestros privilegios. Adicionalmente, esto nos permitiría poder acceder a otros servidores y endpoints, llegando incluso, a comprometer un dominio o bosque de Active Directory.

Por otra parte, en muchas ocasiones necesitaremos subir todo tipo de ficheros al equipo víctima, como payloads, shellcodes, o cualquier otro ejecutable que nos permita escalar privilegios u obtener acceso remoto a través de un C2.

Aunque a priori esto pueda parecer trivial, en los entornos más restringidos, podríamos tener bastantes problemas para subir o descargar ficheros.

Seguramente (aunque no te dediques a la ciberseguridad), en algún momento, te habrás encontrado en la situación de tener que acceder a un servicio crítico a través de un medio seguro. Normalmente, se suelen utilizar diferentes productos para ello, como pueden ser Citrix, RDP, Guacamole, etc..

Estas tecnologías nos permiten acceder de forma remota a través de escritorios virtuales, limitando el acceso a ciertas unidades y dispositivos, así como la posibilidad de copiar o pegar ficheros en ninguna dirección, con el objetivo de evitar este tipo de factores de riesgo.

Eso no implica que no exista ninguna forma de transferir ficheros entre ellos 😋

Una posible opción, sería utilizar covert channels o cualquier medio de comunicación disponible (HTTP, DNS, ICMP..) directamente desde la máquina víctima. Sin embargo, hoy nos centraremos en otro método totalmente diferente.

Recientemente, mientras realizaba el curso Certified Red Team Operator de Zero-Point Security junto a mi buen amigo y compañero @3v4Si0N, nos encontramos en la situación que originó la creación de esta herramienta.

Básicamente, en la mayoría de los casos es posible copiar una cierta cantidad de texto desde la máquina atacante hacia la máquina víctima. En otros, incluso es posible hacerlo en sentido inverso, pero nosotros nos situaremos en la peor situación posible para hacerlo más realista.

Llegados a este punto, nos formulamos la siguiente pregunta:

Suponiendo que podemos copiar una pequeña cantidad de texto, sería posible codificarlo en Base64, simular pulsaciones de teclado y/o ratón y enviarlo a la víctima en pequeños trozos? Y si fuera así, sería posible copiar el mismo script en la víctima para generar el fichero original en el otro extremo automáticamente?

Como os podéis imaginar, la respuesta es sí 😄

Antes de comenzar con la parte técnica, os dejo el enlace de la herramienta en GitHub a continuación: https://github.com/JoelGMSec/Invoke-Transfer

Es importante tener en cuenta que esta herramienta solo funciona en Windows 10/11.

Lo primero que haremos, será clonar o descargar el proyecto como de costumbre:

git clone https://github.com/JoelGMSec/Invoke-Transfer

Una vez descargado, consultaremos la ayuda de la siguiente forma:

.\Invoke-Transfer.ps1 -h

Como puede verse en la imagen anterior, el uso de la herramienta es muy sencillo:

– Si queremos enviar un fichero, usaremos el parámetro -split
– Si queremos generarlo desde un Base64, usaremos el parámetro -merge
– Si queremos leer el texto de un screenshot, usaremos el parámetro -read

Para este ejemplo, enviaremos un binario (SharpHound.exe) utilizando la primera opción. Adicionalmente, añadiremos un delay de 2 segundos entre envíos con el parámetro -sec utilizando el comando que os dejo a continuación:

.\Invoke-Transfer.ps1 -split .\SharpHound.exe -sec 2

Lo siguiente que sucederá, es que la herramienta dividirá el fichero en pequeños chunks de 120KB y nos avisará cuando esté preparada para realizar la transmisión. Una vez pulsemos la tecla intro, tendremos unos segundos para seleccionar con el teclado o el ratón el lugar donde se copiará el texto en cuestión.

A partir de este punto, solo tendremos que observar como sucede la magia de forma totalmente automática:

Esta técnica nos servirá para la mayoría de escenarios, aunque durante nuestras pruebas, nos encontramos con un duro rival: Apache Guacamole.

En este caso concreto, sucede algo totalmente diferente. Sin entrar demasiado en detalle, Guacamole nos permite utilizar tres métodos para introducir texto en el otro extremo. Para llevar a cabo nuestro objetivo de la forma más rápida posible, solo nos servirá el primero.

Para poder utilizarlo, tendríamos que pulsar la combinación de teclas Ctrl + Alt + Shift con el objetivo de abrir una consola donde pegar nuestro texto. Una vez copiado, lo podremos utilizar de la forma habitual dentro del sistema operativo.

Realizar este proceso manualmente un número elevado de veces, puede ser un poco aburrido. Por suerte para nosotros, Invoke-Transfer es capaz de realizar todo el proceso automáticamente, simplemente añadiendo el parámetro -guaca al comando anterior:

Por último, solo tendríamos que copiar el propio script en el otro extremo y reconstruir el fichero original a través del texto que hemos generado con la herramienta, ejecutando lo siguiente:

.\Invoke-Transfer.ps1 -merge .\SharpHound.txt -out .\SharpHound.exe

Ahora bien, que sucede si queremos hacer este proceso a la inversa? 🤔

En función del escenario, simplemente podremos copiar y pegar bidireccionalmente. En otros, no resultará tan sencillo.

Para llevar a cabo esta funcionalidad (bastante experimental), realizaremos una captura de pantalla desde nuestro host. En mi caso, yo utilizaré el siguiente fragmento de código de PSAsyncShell como referencia:

Una vez hecho el screenshot, ejecutaremos el siguiente comando para leer el fichero y transformarlo en formato legible, con el fin de utilizarlo a nuestro gusto:

.\Invoke-Transfer.ps1 -read .\ScreenShot.png -out .\ScreenShot.txt

Es importante tener en cuenta que, el sistema de reconocimiento de imágenes de Microsoft, podría producir textos erróneos o simplemente, no reconocer la imagen en función de la fuente, el color y el contraste de la misma.

Antes de terminar el post, me gustaría mencionar que, a pesar de que en la mayoría de las ocasiones es posible utilizar este sistema, existen bastantes posibilidades de que no puedas copiar texto en algunos escenarios. En tal caso, deberías utilizar un simulador de teclado virtual o el método SendKeys para enviar las pulsaciones una por una.

Como conclusión final, la herramienta se encuentra en fase «beta» y es probable que se produzcan fallos en algunos sistemas y configuraciones específicas. Si encuentras alguno, no dudes en hacérmelo saber 🙂

Espero que os haya gustado y os resulte útil en vuestras próximas auditorías.

Nos vemos en la próxima!