Hace unos años, Chema Alonso y Manuel Fernández trabajaron el concepto de la Javascript Botnet, exponiéndola en diferentes congresos
internacionales. Poco después, en el libro de Hacking a dispositivos iOS se
mostraba el cómo llevar a cabo esta prueba de concepto y se podía observar como
las consecuencias eran fatales para cualquier dispositivo que navegase por la
red. Este hecho tiene que ver con el artículo de hoy, ya que hoy en día tenemos
diferentes soluciones para utilizar Javascript
como un payload y poder utilizarlo
para lograr el control de una máquina, dentro del contexto de pentesting en un proyecto de hacking
ético.
El investigador Casey Smith, originalmente, desarrolló un prototipo de herramienta que
utiliza Javascript como un payload y permite conectar contra un servidor web que se encuentra a la escucha.
Un investigador de seguridad llamado 3gstudent
extendió las funcionalidades de la herramienta de Casey Smith para que ésta
trabajase con Powershell, añadiendo
algo de funcionalidades extra. Existen más variaciones de la herramienta, por
ejemplo, una en Python. En el caso de
la herramienta en Powershell está basada en PoshC2.
La herramienta JSRat es un Command and Control o C&C, el cual utiliza Javascript y el protocolo HTTP para
ejecutar payloads y tener
comunicación entre el servidor y las máquinas comprometidas. Como comenté
anteirormente, hay dos implementaciones, una en Powershell y otra en Python.
Son totalmente embebibles en el Pentesting con Powershell y en el Pentesting
con Python.
Jugando con JSRat y PoshC2
en Powershell
El esquema de JSRat y PoshC2 es sencillo. Tenemos un servidor,
el cual será ejecutado en nuestra Powershell,
con privilegios. Por otro lado, están los hosts
que pueden haber sido comprometidos o que ejecuten el código Javascript desde cualquier parte del
sistema.
En primer lugar, vamos a ejecutar en un Windows 10 el script JSRat.ps1. Esto
nos deja el puerto 80 del equipo abierto para recibir las conexiones. Como se
puede leer, obtenemos el estado de “Listening…”.
Hay que tener en cuenta que la dirección IP del servidor viene “hardcodeada” en el código, por lo que
es recomendable que se observe el código, se entienda y se cambie lo necesario.
¿Cómo se puede ejecutar el código para que se conecten las máquinas?
Nosotros lo vamos a hacer desde la consola con el binario rundll32.exe, pero se podría utilizar una máquina comprometida con
otros mecanismos para lograr ejecutar este tipo de código.
Como se puede ver en la imagen, en la máquina que será comprometida se
utiliza rundll32.exe para ejecutar el
código Javascript. Hay que indicar
que este código tiene la dirección IP que hay que modificar, como ocurría en el
servidor.
Cuando en el equipo se ejecuta el código se obtiene el control remoto.
Obtenemos una pequeña shell con
varias opciones. El script de JSRat
nos proporciona las siguientes posibilidades:
·
Poder
abrir una cmd, con la que se pueda
ejecutar comandos.
·
Eliminar
un fichero de la máquina comprometida.
·
Leer
un fichero de la máquina comprometida.
·
Ejecutar
un binario.
·
Descargar
un archivo desde la máquina comprometida.
·
Subir
un fichero hacia la máquina comprometida.
Si queremos eliminar un fichero o leerlo, podemos ejecutar delete o read, respectivamente, e introducir la ruta del fichero en
cuestión. Realmente el uso del script
es muy sencillo. Si, por otro lado, queremos subir o descargar un archivo es
igual, salvo que en el caso de la subida debemos indicar la ruta local y no la
ruta remota.
En el caso de ejecutar algo podemos utilizar el comando run. Una vez introducido la shell nos pedirá información sobre el
binario que queremos ejecutar y sus argumentos. En este caso, y a modo de
ejemplo, vamos a ejecutar rundll32.exe
para ejecutar una DLL creada con msfvenom
y que contiene un Meterpreter. Para
ello, escribimos la instrucción rundll32
shell32.dll,Control_RunDLL [ruta DLL con Meterpreter].
Si hemos configurado un handler
de Metasploit para recibir la conexión, la DLL nos otorgará una sesión de Meterpreter en nuestra máquina Kali
Linux, tal y como se puede ver en la imagen. Realmente, esto es para
simplificar que podemos ejecutar cualquier cosa con el comando run de JSRat, como se puede observar.
Una de las grandes ventajas que nos ofrece este Command & Control o C&C
es que no necesita ser escrito en disco. Proporciona una comunicación vía HTTP
rápida a través de un protocolo común. La detección de JSRat a través de Javascript
es difícil, a no ser que, en este caso, rundll32
esté siendo monitorizado. Sea como sea, y de todos modos, habilitando y
configurando AppLocker para denegar
la ejecución de rundll32.exe se evita
el ataque.