May 30 2013

Powershell: Forensics one-liners

Nous allons décrire dans ce post quelques one-liners Powershell afin de déterminer qui accède à une machine. Cela en analysant le journal de sécurité grâce au cmdlet Get-EventLog et en affichant les connexions actives grâce à la commande Netstat.

Le one-liner, présent dans le document Windows Logon Forensics (chapitre 6.4. Querying Events) permet de retrouver les événements enregistrés les 5 derniers jours de catégorie Connexion à un compte. Ils correspondent aux événements suivants:

  • Un ticket d’authentification Kerberos (TGT) a été demandé.
  • L’ordinateur a tenté de valider les informations d’identification d’un compte.

Nous nous inspirons du onliner du document cité, téléchargé sur le site du SANS, pour identifier dans le journal de sécurité une activité suspecte qui peut être signe d’une attaque sur nos machines. Pour cela nous configurons la politique d’audit détaillée afin d’enregistrer les évènements de catégorie: Process Tracking\Process Creation, Object Access\Detailed File Share et Privilege Use\Sensitive Privilege Use. Cela peut être réalisé via GPO:

2Audit_gpo

Le paramètre force audit policy subcategory settings, permet d’assurer que la politique d’audit détaillée l’emporte sur une politique d’audit générale (paramètre sous Windows 2003/XP). Cette politique est mise en place sur un environnement Windows 7/2008R2. Attention aux conséquences, les politiques legacy seront ignorées.

Attention, ne pas activer le paramètre Object Access\Detailed File Share sur tous types de serveurs: Par exemple sur un DC, l’accès au répertoire partagé SYSVOL représente un nombre important de logs à stocker/traiter.

Le one-liner va chercher les événements suivants:.

  • Event ID 5145: Catégorie Object Access\Detailed File Share, qui indique les accès aux partages. Si un des partages administratifs IPC$,ADMIN$,C$ est accédé et que l’accès demandé est en écriture, %%4417 = WriteData(or Add File), alors l’événement est retourné.

Sharetoken

  • Event ID 4688: Catégorie Process Tracking\Process Creation, qui surveille les creations de processus. Si un processus est créé avec un TokenElevationType de type TokenElevationTypeDefault (%%1936) ou TokenElevationTypeFull (%%1937) alors l’événement est retourné.

Processcreation_TokenElevation

  • Event ID 4674: Catégorie Privilege Use\Sensitive Privilege Use, si un des privilèges SeTcbPrivilege (Act as part of the operating system), SeTakeOwnershipPrivilege (Take ownership of files or other objects), SeDebugPrivilege (Debug programs) est demandé alors l’événement est retourné:

SetakeOwnerShip

Ce qui nous donne le one-liner suivant, qui cherche les 3 événements sur les 5 derniers jours:

get-eventlog -log security | where-object {$_.TimeGenerated -gt (get-date).adddays(-5) -AND $_.EntryType -eq 'SuccessAudit' –AND  (($_.EventID -eq "5145" -AND $_.Message -match "\\\\\*\\ADMIN\$|\\\\\*\\C\$|\\\\\*\\IPC\$"  -AND $_.Message -match "\%\%4417") -OR ($_.EventID -eq "4674" -AND $_.Message -match "SeTakeOwnershipPrivilege|SeDebugPrivilege|SeTcbPrivilege") -OR ($_.EventID -eq "4688"  -AND $_.Message -match "\%\%1936|\%\%1937"))} | sort-object -property TimeGenerated

Le caractère d’échappement pour écrire des caractères spéciaux avec une expression régulière est ‘\’, ce qui nous donne de jolies regex sur ce one-liner 🙂

La succession de ces 3 types d’événements peut indiquer une attaque à distance sur votre machine:

launch-onliner

Les logs de sécurité nous indiquent que l’IP de l’attaquant est 192.168.206.135. Nous allons utiliser la commande netstat afin de voir les connexions actives.

Le one-liner suivant affiche les informations issues de cette commande en indiquant le nom du process initiant la connexion sous une manière plus lisible que la commande netstat -anb.

netstat -ano | Select-String -Pattern '\s+(TCP|UDP)' | foreach-object{$item = $_.line.split(' ',[System.StringSplitOptions]::RemoveEmptyEntries);if(($item[2] -notmatch '127.0.0.1:|\[::1\]:') -and ($item[2] -ne '*:*') -and ($item[2] -ne '0.0.0.0:0') -and ($item[2] -ne '[::]:0')){($item[0]+"`t"+$item[1]+"`t"+$item[2]+"`t"+$item[3]+"`t"+(get-process -id $item[4]).Name) | ft}}

On voit alors la connexion initiée par la machine attaquante:

launchnetstat

Pour un script plus complet de l’utilisation de netstat avec PowerShell c’est ici.

This post is also available in: Anglais

No Comments

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment

*

WordPress Themes

Blossom Icon Set

Software Top Blogs