Guide Sysmon Threat Intelligence, partie 3. Analyse graphique avancée des menaces Sysmon





Cet article est le troisiÚme et dernier volet de la série Sysmon Threat Analysis. Toutes les autres parties de la série:



Partie 1. Présentation de Sysmon Log Analysis

Partie 2. Utilisation des données d'événement Sysmon pour détecter les menaces

Partie 3. Analyse avancée des menaces Sysmon à l'aide de graphiques (nous sommes ici)



Recherche de sous-graphes non standard avec les données d'événement Sysmon (exemple simple)



Avant de regarder un exemple d'identification des anomalies dans les sous-graphiques qui indiquent une menace potentielle (et si ces mots ne réveillent pas le nerd en vous, alors rien ne vous réveillera!), Faisons une petite digression.



À ce stade, je dois Ă©mettre un avertissement: cet article, ainsi que le code sur GitHub, ne peut pas remplacer une solution de niveau entreprise. Cela peut aider Ă  identifier les menaces Ă  plus petite Ă©chelle, mais ma noble mission est d'aider les professionnels de la sĂ©curitĂ© informatique Ă  comprendre et Ă  apprĂ©cier les solutions de protection contre les menaces du monde rĂ©el. Et une façon d'y parvenir est de crĂ©er vous-mĂȘme votre propre solution (avec mon aide).



Des expĂ©riences Ă  domicile vous aideront Ă  comprendre Ă  quel point il est difficile de faire Ă©voluer un logiciel de dĂ©tection des menaces de bricolage. Vous devrez travailler avec de grands ensembles de donnĂ©es et tout ce qui y est liĂ©: nettoyage (qui est une tĂąche extrĂȘmement difficile), traitement efficace (trouver les structures de donnĂ©es nĂ©cessaires, algorithmes, etc.) et fournir des rĂ©sultats avec un faible nombre de faux positifs afin que votre les mĂȘmes collĂšgues ne vous ont alors pas grimpĂ© avec leurs poings. Dans cet esprit, vous voudrez peut-ĂȘtre envisager une solution de dĂ©tection des menaces toute faite ... mais seulement aprĂšs avoir terminĂ© notre sĂ©rie d'articles et menĂ© vos propres expĂ©riences.



DĂ©finition des poids des graphiques



Un moyen simple de créer une solution de protection contre les menaces qui ne repose pas sur les signatures de logiciels malveillants consiste à utiliser le graphique des menaces de la partie précédente .



Un tel graphique connecte les nƓuds de processus en fonction des entrĂ©es du journal des Ă©vĂ©nements Sysmon.

Remarque: je n'ai pas séparé chaque événement de démarrage de processus (ID d'événement 1 dans les événements Sysmon) en un sommet distinct. Au lieu de cela, j'ai créé un graphique plus abstrait qui montre, par exemple, que le sommet PowerShell a un lien vers n'importe quelle application à partir de laquelle il s'exécute sous n'importe quel utilisateur - un lien pour Excel, un pour le navigateur, etc.



L'arborescence PSQuickGraph de mon graphique de menaces Sysmon.  Notez la branche anormale sous cmd.exe



L'arborescence PSQuickGraph de mon graphique de menaces Sysmon. Faites attention Ă  la branche anormale sous cmd.exe





Cependant, nous voulons toujours garder une trace de la frĂ©quence des processus en cours d' exĂ©cution. Par exemple, si PowerShell a lancĂ© "whoami" 1 fois et l'Ă©diteur Windows obsolĂšte "Notepad.exe" 10 fois, les donnĂ©es des arĂȘtes du graphique s'Ă©tendant Ă  partir du sommet PowerShell doivent ĂȘtre marquĂ©es avec les "pondĂ©rations" correspondantes de 1 et 10, respectivement. Est-ce logique?



Dans la plupart des algorithmes de détection des menaces les plus simples, ce poids devient une métrique pour comparer les régions du graphique. Le point principal est qu'un sous-graphe avec un poids moyen inférieur par rapport au poids moyen global est suspect.

N'est-ce pas? Le sommet rarement visité est une zone anormale. Par conséquent, si les actions de l'utilisateur dans l'analyse des menaces potentielles vont vers un sous-graphique rarement utilisé, vous devez augmenter le niveau d'alarme au jaune.



L'approche que je dĂ©cris et les scripts PowerShell ci-dessous ne sont pas destinĂ©s Ă  ĂȘtre utilisĂ©s Ă  des fins pratiques pour de grandes infrastructures. Mais pour un serveur distinct, la solution peut s'avĂ©rer efficace, ou au moins fournir une vĂ©rification indĂ©pendante des solutions d'entreprise que vous utilisez.



Ai-je mentionné que les algorithmes PowerShell de Doug Finke pour les structures de données sont des outils formidables et puissants? Sans son travail, je n'aurais rien réalisé dans mon projet de graphes d'anomalies. Merci encore, Doug!



Avec l'aide de sa bibliothĂšque PowerShell de belles fonctions graphiques, je peux facilement calculer le poids de mon graphique de menace Sysmon avec seulement quelques lignes PS, et Ă©galement connaĂźtre le poids moyen des sommets pour l'ensemble du graphique. En parcourant le graphe, le code attribue Ă©galement Ă  chaque sommet le poids de toutes ses arĂȘtes sortantes:



$AW=0 #average weight
$GW=0 #total weight

$mset = [System.Collections.ArrayList]@() #master set of subraphs
#calculate total weight by summing up the frequencies or weights of the edges
foreach ($e in $g.getAllEdges() ) {
    $GW = $GW + $e.weight
}
write-host "Weight of Graph: " $GW
$AW = $GW / $g.vertices.count
write-host "Average weight per vertex: " $AW

#assign weight of edges to vertice
for ($i=0; $i -lt $g.vertices.count; $i++) { 
   $w=0
   $v=$g.vertices[$i]
   foreach($e in $v.getEdges()) {
      if($e -eq $null) {continue}
      $w=$w + $e.weight
   }
   $v.value.Weight = $w
}


Le code ci-dessus fait les calculs dont nous avons besoin. Dans ce cas, chaque sommet peut ĂȘtre considĂ©rĂ© comme la frĂ©quence des visites, en fonction des arĂȘtes sortantes.



La partie la plus difficile de mon script de graphique d'anomalies PowerShell - que je vais vous montrer sous peu - est de trouver les rĂ©gions du graphique les moins susceptibles de se produire, puis de trouver le plus grand sous-graphique qui les contient . Vous devrez peut-ĂȘtre feuilleter un vieux livre d'informatique pour terminer cette tĂąche. Mais ce n'est en fait pas si difficile Ă  Ă©crire!



J'ai utilisé la recherche classique en largeur d'abord pour mon graphe en visitant chaque sommet, puis en l'élargissant aux dépens des sommets voisins jusqu'à ce que mon sous-graphe atteigne un certain seuil en fonction du poids moyen du sommet. Comme ça:



function extend-subgraph($v, $t) {
    $vertexQueue = New-Object Queue
    
    #initialize
    $vertexQueue.enqueue($v)
    $h=$v.value.Weight
    $s=@() #subgraph
    $s+=$v
    $extend=$false
    while (!$vertexQueue.isEmpty()) { #bfs
        $currentVertex = $vertexQueue.dequeue()
        $es= $currentVertex.getEdges()
        foreach($e in $es) {
            $ev= $e.endVertex                
            if ((($h + $ev.value.Weight)/($s.count+1) -lt $th)  {        
                #extend the sub-graph
                $s+=$ev
                $h =$h + $ev.value.weight
                #queue it up
                $vertexQueue.enqueue($ev)
            }
        }


Un petit mot pour les bricoleurs: pour crĂ©er un tableau de tableaux, utilisez le type arraylist et vous vous Ă©pargnerez beaucoup de maux de tĂȘte.



Menaces et sous-graphiques de faible poids



Il existe de nombreux algorithmes différents pour les graphes anormaux. Celui que j'ai utilisé est basé sur un certain graphBAD que j'ai trouvé sur Internet - et je vous donnerai un lien dÚs que je le retrouverai.



En gĂ©nĂ©ral, le principal problĂšme dans la dĂ©tection pratique des menaces est de trouver un bon ensemble de donnĂ©es pour former une base de rĂ©fĂ©rence. En tant que blogueur Ă  plein temps et spĂ©cialiste de la dĂ©tection des menaces pendant les fĂȘtes, je n'ai jamais rĂ©ussi Ă  crĂ©er un journal Sysmon suffisamment intĂ©ressant contenant de nombreuses applications diffĂ©rentes. Il Ă©tait assez difficile de gĂ©nĂ©rer des sous-graphiques anormaux car je n'avais pas un Ă©cart de poids assez important. D'une maniĂšre ou d'une autre, lorsque vous utilisez un vrai serveur, vous pouvez vous retrouver avec un bien meilleur ensemble de donnĂ©es que l'utilisation occasionnelle d'une instance AWS Windows, comme dans mon cas.



Le script PS de graphes anormaux que j'ai Ă©crit Ă©tait tout Ă  fait capable de produire des sous-graphes suspects avec des poids moyens faibles. Et j'ai mĂȘme rĂ©ussi Ă  attraper des environnements intĂ©ressants (voir ci-dessous).



Algorithme de pondération de sous-graphe en action: environnement intéressant avec un faible poids du sous-graphe # 7



Algorithme de pondérations de sous-graphes en action: un environnement intéressant avec des pondérations de sous-graphe 7 faibles





Comme je l'ai mentionnĂ© plus tĂŽt, il existe d'autres algorithmes pour dĂ©tecter les anomalies dans les graphiques avec des mĂ©triques autres que les poids simples qui valent la peine d'ĂȘtre appris. L'un d'eux recherche des clusters de sommets «similaires» et remarque les connexions ou connexions entre diffĂ©rents environnements. Dans ce cas, l'anomalie rĂ©side dans l'utilisateur ou le processus qui connecte les environnements via une autre caractĂ©ristique. Cela a du sens, n'est-ce pas?



Si votre nerd intĂ©rieur est fort en vous, vous pouvez consulter SCAN(Algorithme de clustering structurel pour les rĂ©seaux), qui fait ce qui prĂ©cĂšde. Avec les algorithmes PowerShell de Doug Finke, vous pouvez mĂȘme l'utiliser. Je veux moi-mĂȘme prendre en charge ce projet et le publier bientĂŽt sur mon GitHub .



Trouvez des anomalies grùce à des marches aléatoires



Terminons cette section avec une autre façon de trouver des anomalies dans le graphique des menaces. J'ai évoqué cette approche à la fin de la partie précédente . Pour moi, en tant que personne avec les mathématiques sur le «vous», il est plus intuitif. Et les fans de la vieille émission de télévision numb3rs reconnaßtront immédiatement le concept des chaßnes de Markov [s'éclaircir la gorge].



Pour tout le monde, vous pouvez considĂ©rer cela comme une "promenade alĂ©atoire" dans le graphique. A chacun des sommets, nous lançons un dĂ© et sĂ©lectionnons une arĂȘte du graphe en fonction de son poids: plus le poids de l'arĂȘte est Ă©levĂ©, plus les chances que nous le suivions soient Ă©levĂ©es. Vous devez diviser le graphe en deux parties - appelĂ©es graphe biparti en thĂ©orie des graphes - avec les utilisateurs d'une part et les applications de l'autre.



Ensuite, vous classeztoutes les applications de sommet pouvant ĂȘtre atteintes par l'utilisateur en fonction de la probabilitĂ© d'atteindre un sommet particulier. Pour analyser la menace, vous rechercherez ensuite les applications en cours d'exĂ©cution, et si l'une d'entre elles a une trĂšs faible probabilitĂ© de l'atteindre, alors vous avez peut-ĂȘtre trouvĂ© une menace rĂ©elle!



Plus un karma pour celui qui l'a lié à l'algorithme PageRank de Google . Je vais décrire cela plus en détail dans la section suivante, mais les personnes intéressées peuvent rechercher sur Google l'expression marche aléatoire avec redémarrage .



Théorie de la traversée aléatoire et pratique EQL



Prenons une autre digression et analysons ce que nous essayons de rĂ©aliser avec le journal Sysmon, qui est un excellent outil pour dĂ©tecter les menaces et mener des enquĂȘtes post-incident.



  • , Sysmon. Sysmon , .
  • 2 Sysmon , , .
  • Dans la troisiĂšme partie, nous avons plongĂ© dans un aperçu d'un algorithme simple qui considĂšre les connexions de bord comme des poids. Les sections d'un graphique pesant moins (en termes d'arĂȘtes) que le poids moyen total sur l'ensemble du graphique peuvent constituer une menace potentielle. Je vais tĂ©lĂ©charger les scripts PowerShell des algorithmes de cette section sur mon GitHub (aprĂšs les avoir survolĂ©s).


L'avantage de ces méthodes est qu'elles ne dépendent pas de commandes spécifiques ou de noms de processus que les attaquants modifient ou masquent constamment.

En outre, il existe une autre méthode basée sur les probabilités pour trouver des vulnérabilités. Regardons cela de plus prÚs.



Traversée accidentelle du graphique de vulnérabilité à partir de données basées sur des événements Sysmon



Au lieu d'analyser la structure du graphe lui-mĂȘme, nous pouvons considĂ©rer les liens comme un chemin ou une feuille de route, dans laquelle chaque application est un arrĂȘt distinct en cours de route. À partir des donnĂ©es du journal Sysmon, nous pouvons obtenir la frĂ©quence Ă  laquelle chaque application dĂ©marre Ă  partir de son parent.



Si vous regardez mon script de graphique de menace sur GitHub, vous constaterez que cette fréquence est stockée dans chaque objet de bord en utilisant les merveilleux algorithmes PowerShell de Doug Finke.



On peut considĂ©rer la frĂ©quence de franchissement de chacune des arĂȘtes du graphe de vulnĂ©rabilitĂ© comme une probabilitĂ©!



On peut considĂ©rer la frĂ©quence de franchissement de chacune des arĂȘtes du graphe de vulnĂ©rabilitĂ© comme une probabilitĂ©!





L'étape suivante consiste à utiliser ces informations pour déterminer la probabilité, par exemple, de lancer une application PowerShell taskmgr.exe, un analyseur de processus Windows, un bloc-notes ou hostname.exe.



Qu'est-ce que je veux en venir?



En bref: je peux crĂ©er une matrice de transition de probabilitĂ©, si apprĂ©ciĂ©e des adeptes de Markovet couramment utilisĂ© dans les systĂšmes de modĂ©lisation. En fait, lancer les dĂ©s, passer Ă  l'application suivante dans le graphique et rĂ©pĂ©ter ces actions est un parcours alĂ©atoire du graphique. Finalement, cette mĂ©thode mathĂ©matique classe chaque sommet du graphe en fonction de la probabilitĂ© d'y arriver Ă  partir du point de dĂ©part. Et vous dĂ©couvrirez que, par exemple, le lancement de feuilles de calcul Ă  partir de l'Explorateur Windows est un processus extrĂȘmement courant et que le moteur Windows Script Host Engine est thĂ©oriquement extrĂȘmement non standard et, par consĂ©quent, potentiellement un indicateur de menace.

Cette méthode est connue sous le nom de Random Walk With Restart (ci-aprÚs - RWWR, marche aléatoire avec redémarrage) et est une variante du désormais légendaire algorithme de classement Google PageRank .

Jetons un coup d'Ɠil Ă  un morceau de script que j'ai Ă©crit pour calculer ces classements:



#lets build a row
$row= @(0)*$g.vertices.count
$w=0

foreach($e in $start.getEdges()) {    #calculate total frequency
    $w+=$e.weight
}
if ($w -eq 0)  {   #make it connected
$row[$ix] =1
}
else {  #we assign probabilitys
    #now create transition probability
    foreach($e in $start.getEdges()) {
        $ev = $e.endVertex
        $p = $e.weight
        $jx = v-index $ev.value.Key
        $row[$jx]= $p/$w #normalize by dividing by total
    }
}
$P[$ix] = $row  #yay! One row added to transition matrix


Pour chaque sommet, je calcule la fréquence résultante de tous les voisins, puis j'assigne la probabilité de chaque transition à travers la normalisation par le total. Ainsi, si PowerShell.exe a 20 visites à tous ses voisins, mais que nc.exe n'a été visité qu'une seule fois à partir du haut de PowerShell.exe, la probabilité d'y aller sera de 1/20 ou 0,05. Est-ce logique?



La difficulté réside dans le calcul de la matrice utilisée dans RWWR, mais pour ceux qui ont suivi des cours de modélisation probabiliste, cette procédure ne sera pas difficile. Il y a un bon article de synthÚse à ce sujet sur le site Web de Medium .



Mon script, que j'appelle random-rater , classe et produit les 10 plus petitsvaleurs de la liste. De cette maniĂšre, vous pouvez obtenir des applications qui ont la plus faible probabilitĂ© d'ĂȘtre lancĂ©es, Ă  partir d'un sommet donnĂ© du graphique des menaces. Voici le rĂ©sultat lorsque vous utilisez PowerShell.exe comme point de dĂ©part:



L'algorithme Random Walk With Restart peut produire un classement des menaces de type Google.  Hmmm, whoami est le moins susceptible de commencer



L'algorithme Random Walk With Restart peut produire un classement des menaces de type Google. Hmmm, whoami est le moins susceptible de fonctionner.





En guise de note pratique et d'avertissement, il convient de noter que PWWR sera un problĂšme de big data dans un systĂšme rĂ©el. MĂȘme dans le cas de mon petit journal Sysmon, le retard de calcul Ă©tait assez perceptible en raison du grand nombre d'opĂ©rations en virgule flottante.



Event Query Language (EQL) pour l'analyse des menaces



Pour l'instant, il convient de noter que les fournisseurs qui utilisent des approches plus sophistiquĂ©es pour dĂ©tecter les menaces dans leurs produits vont bien au-delĂ  de ce que vous ou moi pouvons faire par vous-mĂȘme. Et, certainement, avec une prĂ©cision beaucoup plus Ă©levĂ©e.



Pour ceux qui veulent se plonger dans le sujet de la dĂ©tection des menaces, mais qui ne veulent pas travailler avec mes scripts - je comprends! - il existe un langage de requĂȘte d'Ă©vĂ©nement ou EQL . C'est un projet open source pour appliquer le journal Sysmon Query Language, que vous pouvez en savoir plus sur la trĂšs complĂšte aprĂšs... EQL n'est pas seulement idĂ©al pour enquĂȘter sur les incidents, mais il peut Ă©galement ĂȘtre utilisĂ© comme un outil tant que vous disposez d'une copie rĂ©cente du journal Sysmon.



La suite EQL fournit un gestionnaire d'Ă©vĂ©nements qui convertit le journal en JSON lisible par l'homme. Vous pouvez consulter une copie de ma branche sur GitHub. Contrairement Ă  mon script PS statique show-menace-path , EQL vous permet d'effectuer des requĂȘtes Ă  la volĂ©e.



Disons que je suis intĂ©ressĂ© par tous les shells cmd.exe qui ont Ă©tĂ© lancĂ©s au nom de scvhost.exe - cela peut ĂȘtre un signe de l'utilisation par l'attaquant de psexec.exe ou smb.exe. La demande ressemblera Ă  ceci:



Utilisation d'EQL pour rechercher les shells cmd.exe lancés à partir de svchost.exe.  Au fait, jq est un utilitaire Linux pour afficher des données JSON



Utilisation d'EQL pour rechercher les shells cmd.exe lancés à partir de svchost.exe. Au fait, jq est un utilitaire Linux pour afficher des données JSON.



Il existe un moyen encore plus cool et plus puissant d'obtenir ce rĂ©sultat en utilisant le modificateur enfant. Cette requĂȘte EQL vous permet de rechercher dans tous les processus avec un ancĂȘtre spĂ©cifiĂ©, n'importe oĂč dans la hiĂ©rarchie. Par exemple, vous pouvez rechercher des applications qui, par exemple, avaient le processus regsvr32.exe comme ancĂȘtre et pourraient avoir exploitĂ© une vulnĂ©rabilitĂ© bien connue que j'ai dĂ©crite ici .



Il y a trop de choses à dire sur EQL dans cet article déjà long, je préfÚre donc publier un article séparé sur les détails de la maßtrise d'EQL pour la détection de vulnérabilités.



Réflexions finales sur les solutions de détection des menaces de bricolage



J'ai promis de télécharger le référentiel Sysmon avec tous les scripts de détection des menaces décrits dans cet article. Revenez réguliÚrement sur mon GitHub car j'ajouterai de nouveaux outils de détection des menaces basés sur des graphiques au fil du temps, ainsi que de la documentation supplémentaire - trop de choses à couvrir dans un article.

Vous ĂȘtes arrivĂ© Ă  cet endroit, fĂ©licitations!



Essayez mes scripts ou utilisez-les comme base pour dĂ©velopper vos propres idĂ©es de dĂ©tection des menaces. PowerShell est bien adaptĂ© aux algorithmes complexes. Pour moi, qui a grandi dans le langage shell Linux, ce fut une agrĂ©able surprise de travailler avec un langage de script mature. Et je vous conseille de consulter la galerie PowerShell, une autre excellente ressource pour les scripts de combat prĂȘts Ă  l'emploi: vous n'avez pas Ă  rĂ©inventer la roue dans le monde PowerShell.



Un autre point plus important à retenir de l'article entier sera la réalisation que les fournisseurs de solutions de niveau entreprise utilisent non seulement des technologies de détection des menaces beaucoup plus sophistiquées que celles qu'un développeur informatique peut écrire pendant son temps libre, mais également l'adaptabilité de ces solutions pour travailler avec le niveau de trafic. grande organisation. Bien entendu, utiliser des solutions de bricolage pour analyser un serveur sous-utilisé ou une validation supplémentaire de produits d'entreprise est une bonne idée. Mais l' intelligence et l'identification des menaces sont en effet un problÚme de Big Data , et évidemment pas un défi que PowerShell peut résoudre.



Si vous souhaitez en savoir plus sur la façon dont Varonis gÚre l'analyse et la détection des menaces, vous pouvez toujours demander une démonstration personnelle .



All Articles