0
votes

Ce code est-il un keylogger? Qu'est ce que ça fait?

En raison de mon gestionnaire de tâches Windows10, j'ai un powershell.exe en cours d'exécution qui consomme continuellement 8% de CPU et bloque 64 Mo de RAM. Après avoir inspecté mon journal des événements Windows, j'ai trouvé un événement de pipeline (800) avec le code suivant:

Add-Type -AssemblyName System.Core
function Run-Server() {
  param([string]$h);
  $b = New-Object byte[] 8;
  $p = New-Object System.IO.Pipes.AnonymousPipeClientStream -ArgumentList @([System.IO.Pipes.PipeDirection]::In, $h);
  if ($p) {
    $l = $p.Read($b, 0, 8); while ($l -gt 7) {
      $c = [System.BitConverter]::ToInt32($b, 0); $l = System.BitConverter]::ToInt32($b, 4);
      $t = $null; if ($l -gt 0) {
        $t1 = New-Object byte[] $l;
        $l = $p.Read($t1, 0, $t1.Length);
        $t = [System.Text.Encoding]::UTF8.GetString($t1, 0, $l) }
      if ($c -eq 1) { Invoke-Expression $t } elseif ($c -eq 9) { break } $l = $p.Read($b, 0, 8) } 
   $p.Dispose() 
    } 
} Run-Server -h 728

Je travaille dans un environnement d'entreprise et je ne suis pas un expert de Powershell, mais il semble que le script capte octet par octet et en fait une chaîne? Avez-vous une idée de ce à quoi ce script pourrait être utilisé? Pensez-vous que cela peut provoquer l'indication donnée d'une utilisation de 8% du processeur et de 64 Mo de RAM?


4 commentaires

Cela ressemble à un écouteur (malveillant) qui prend les commandes d'une autre application.


Peut-être pas malveillant si dans un environnement d'entreprise. Peut-être quelque chose utilisé par quelqu'un avec un besoin légitime d'envoyer des commandes. Je vous suggère de demander à votre support informatique


J'ai déjà parlé à notre responsable de la gestion des correctifs / sécurité ainsi qu'à quelqu'un qui connaît Powershell. Ils ont dit qu'ils ne connaissaient pas ce genre de processus dans notre environnement d'entreprise. C'est pourquoi je demande ici en plus. Je souhaite recevoir une confirmation ou des idées alternatives. Notre service informatique n'a officiellement pas un tel script.


Avez-vous une idée de ce que je pourrais faire pour obtenir plus d'informations?


3 Réponses :


3
votes

J'ai formaté le code, changé les noms des variables et ajouté quelques commentaires pour le rendre plus facile à comprendre:

Add-Type -AssemblyName System.Core

function Run-Server() {

    param(
        [string]$h
    );


    $buffer = New-Object byte[] 8;

    # Creates an annonymous pipe
    $pipe = New-Object System.IO.Pipes.AnonymousPipeClientStream -ArgumentList @([System.IO.Pipes.PipeDirection]::In, $h);

    if ($pipe) {

        # Read up to 8 bytes from the pipe
        $readBytes = $pipe.Read($buffer,0, 8); #(byte[] buffer, int offset, int count);

        # if it managed to read 8 bytes
        while ($readBytes -gt 7) {

            # Seems the sender is sending some kind of 'command' or instruction. 
            # If command is '1' means execute the rest as a script
            # If command is '9' means terminate
            $command = [System.BitConverter]::ToInt32($buffer,0); 

            # Seems that in position 4 it sends how big the text will be
            $textSize = [System.BitConverter]::ToInt32($buffer,4); # ToInt32 (byte[] value, int startIndex);

            # based on the $textSize, read the full message and convert it to string ($text)
            $text = $null;
            if ($readBytes -gt 0) {
                $text1 = New-Object byte[] $textSize;
                $readBytes = $pipe.Read($text1, 0, $text1.Length);
                $text = [System.Text.Encoding]::UTF8.GetString($text1, 0, $readBytes) 
            }

            if ($command -eq 1) { 
                # Scary! execute the text string that came from the pipe
                Invoke-Expression $text 
            }
            elseif ($command -eq 9) {
                 break 
            } 
            $readBytes = $pipe.Read($buffer,0, 8) 
        } 
        $pipe.Dispose() 
    } 
} 

Run-Server -h 728

Infor about pipe: Classe AnonymousPipeClientStream

Ce code crée une Conduite avec poignée 728 et reçoit un script d'un autre processus, il exécute le script

Quelques détails:

Le premier message semble être une sorte de commande ($ c) et une indication de la taille du script ($ l)

Ensuite, il lit un deuxième message de taille ($ l) et, si command == 1 , il exécute le deuxième message comme s'il s'agissait d'un script PowerShell: Invoke-Expression $t (effrayant!)


13 commentaires

Ouah merci. Et pensez-vous que cela pourrait être une solution officielle pour l'administration à distance automatisée (pour être utilisé dans la gestion des correctifs et des mises à jour) ou diriez-vous que son style ressemble plus à un script malveillant qui n'est / ne devrait pas être utilisé officiellement? Je travaille en Allemagne. Nous avons une sorte de restrictions strictes en matière de collecte de données personnelles. Même dans les entreprises. Vous attendriez-vous à ce que ce soit un Keylogger ou diriez-vous que son objectif principal est quelque chose de différent? Je fais confiance à vos attentes, mais votre conclusion n'est pas claire à 100% pour moi car je ne comprends pas très bien le sujet donné.


Je ne sais pas pourquoi vous avez cela et qui le dirige. En termes de GDPR, cela n'a rien à voir, ce n'est pas un keyloger, c'est pire :). Celui-ci reçoit un texte aléatoire et l'exécute en tant que script. Cela peut être n'importe quoi, comme "format C: \". Je ne peux pas imaginer pourquoi vous feriez cela.


Je ne sais pas si cela compte, mais selon la journalisation des événements Windows, la poignée diffère par jour d'activité. Le script est également exécuté deux fois avec un numéro de séquence différent. Le premier commence par: & {Add-Type -AssemblyName System.Core et numéro de séquence: 15. Le second commence par Add-Type -AssemblyName System.Core et a le numéro de séquence: 17. L'ordre peut être erroné. Les deux scripts sont lancés au même moment en fonction de l'horodatage disponible pour l'exécution.


Les scripts sont-ils toujours en cours d'exécution périodiquement? où le voyez-vous courir? et si vous modifiez le script pour enregistrer tout ce qu'il fait? par exemple, au lieu d' Invoke-Expression vous pouvez écrire $ text dans un fichier, de cette façon vous pouvez voir quels scripts sont réellement exécutés. Ce code exécute simplement n'importe quel script donné


Eh bien ... peut-être que je n'étais pas assez clair. Cela ne peut être appelé que par un processus parent, donc le processus qui ouvre le tube doit également exécuter le PowerShell


Oui, tous les jours depuis une semaine maintenant. Il démarre après que je me suis connecté pour la première fois et redémarré (pas périodiquement) après l'avoir tué dans le gestionnaire de tâches. Je l'ai vu pour la première fois dans mon gestionnaire de tâches après avoir constamment bloqué le processeur et la RAM% et allumé mes ventilateurs de refroidissement, même en ne faisant rien. Il ne semble pas créer de trafic réseau ou d'E / S sur disque dur notable. La seule façon pour moi de le voir est via la journalisation des événements Windows 10 / Journaux d'applications et de services / Windows Power Shell / Journaux de filtre sur l'événement 800. Je ne sais malheureusement pas comment manipuler le script comme vous le recommandez.


Lors de la journalisation et après certaines méta-informations HostName=ConsoleHost HostVersion=5.1.17134.858 HostId=4d357548-6508-4393-b558-ecb4b48ba51f HostApplication=C:\windows\System32\WindowsPowerShell\v1.0\p‌​owershell.exe -NonInteractive -NoProfile -Command & {Add-Type -AssemblyName System.Core function Run-Server() { param([string]$h); $b [...] le script démarre comme HostName=ConsoleHost HostVersion=5.1.17134.858 HostId=4d357548-6508-4393-b558-ecb4b48ba51f HostApplication=C:\windows\System32\WindowsPowerShell\v1.0\p‌​owershell.exe -NonInteractive -NoProfile -Command & {Add-Type -AssemblyName System.Core function Run-Server() { param([string]$h); $b [...] : HostName=ConsoleHost HostVersion=5.1.17134.858 HostId=4d357548-6508-4393-b558-ecb4b48ba51f HostApplication=C:\windows\System32\WindowsPowerShell\v1.0\p‌​owershell.exe -NonInteractive -NoProfile -Command & {Add-Type -AssemblyName System.Core function Run-Server() { param([string]$h); $b [...]


Utilisez Process Explorer ( docs.microsoft.com/en-us/sysinternals/downloads/… ) pour récupérer des informations sur la personne qui démarre le script. C'est très important car le tube est ouvert parent -> enfant


Hé @Christian, as-tu compris à quoi servait le script ou qui l'invoquait?


Bonjour Carlos, en partie. Mais toujours pas sûr. Avant de partir ce jour-là, j'ai eu une conversation avec nos informaticiens. En fin de compte, j'étais prêt à vider ma machine et j'avais prévu de faire une sauvegarde mais avant de commencer la sauvegarde, j'ai décidé de lancer une analyse approfondie avec «Symantec Endpoint Protection». En effectuant l'analyse, j'ai remarqué quelque chose d'intéressant: l'analyse montre une caractéristique similaire à celle du script (CPU, RAM). J'ai donc commencé à penser que le powershell.exe pouvait être appelé depuis Symantec. Le lendemain, j'ai parlé de mon idée aux informaticiens et ils ont en quelque sorte accepté.


Ils ne semblent pas le savoir mieux. Je suis encore un peu curieux car mes collègues utilisent également ce programme mais n'ont pas le script mentionné précédemment dans leurs journaux. Fondamentalement, Symantec pourrait avoir un sens pour moi, car les analyses rapides / approfondies planifiées doivent avoir un contrôle total pour qurantining, suppression, et cetera. Je pourrais être d'accord, mais comme étant triste: mes collègues n'ont pas la même entrée / entrées de journal que moi. Qu'est-ce que tu penses?


Hey Christian, je pense que votre objectif devrait être de voir quel processus exécute ceci, cela vous donnera une très bonne idée de pourquoi cela est exécuté.


Bonjour Carlos, Merci pour les conseils. Je l'ai fait maintenant. Quelles colonnes supplémentaires doivent être activées? Il y en a assez de disponibles. Ou en d'autres termes: comment identifier le processus d'appel?



1
votes

Je suis tombé sur le même problème. Après quelques fouilles dans mon système (grep), j'ai découvert que le code incriminé se produit dans un exécutable «snowagent.exe». Autant que je sache, il est utilisé par notre service informatique (de l'entreprise) pour obtenir un inventaire des applications installées sur ma machine, et peut-être plus. En tant que tel, je conclus que ce n'est au moins pas un gros problème (virus / malware). Pourtant, si je suis gêné par cela (c'est-à-dire ronger 13% de CPU), je le tue. gr M.


0 commentaires

0
votes

Mes amis, je suis de Snow Software et je peux confirmer qu'il s'agit d'un code légitime exécuté par Snow Inventory Agent pour exécuter des scripts PowerShell qui sont déployés avec les agents afin de collecter des informations plus avancées sur l'appareil et certaines applications installées dessus. Il exécute en effet le canal anonyme et envoie le code Powershell sous forme de texte provenant des fichiers de script chiffrés qui sont déployés avec l'agent. Les données collectées sont utilisées par la suite de produits Snow Software et Technology Asset Management et sont déployées par de grandes organisations pour optimiser les dépenses technologiques, obtenir la visibilité et la gérabilité des actifs technologiques. Dites moi si vous avez d'autres questions!


0 commentaires