PowerShell est un outil d'automatisation assez répandu, souvent utilisé tant par les développeurs de logiciels malveillants que par les professionnels de la sécurité informatique.
Cet article examinera l'utilisation de PowerShell pour la collecte à distance de données depuis des dispositifs finaux lors de la réponse aux incidents de cybersécurité. Pour cela, il sera nécessaire d'écrire un script qui sera exécuté sur le dispositif final, et une description détaillée de ce script suivra.
function CSIRT{
param($path)
if ($psversiontable.psversion.major -ge 5)
{
$date = Get-Date -Format dd.MM.yyyy_hh_mm
$Computer = $env:COMPUTERNAME
New-Item -Path $path$computer$date -ItemType 'Directory' -Force | Out-Null
$path = "$path$computer$date"
$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname,
processid, commandline, parentprocessid
$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress,
localport, remoteaddress, remoteport, owningprocess, state
$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress,
localport, remoteaddress, remoteport, owningprocess, state
$task = get-ScheduledTask | Select-Object author, actions, triggers, state, description, taskname|
where author -notlike '*Microsoft*' | where author -ne $null |
where author -notlike '*@%systemroot%*' | where author -notlike '*microsoft*'
$job = Get-ScheduledJob
$ADS = get-item * -stream * | where stream -ne ':$Data'
$user = quser
$runUser = Get-ItemProperty "HKCU:SoftwareMicrosoftWindowsCurrentVersionRun"
$runMachine = Get-ItemProperty "HKLM:SoftwareMicrosoftWindowsCurrentVersionRun"
$array = $process, $netTCP, $netUDP, $task, $user, $runUser, $runMachine, $job, $ADS
$arrayName = "Processes", "TCPConnect", "UDPConnect", "TaskScheduled", "Users", "RunUser", "RunMachine",
"ScheduledJob", "AlternativeDataStream"
for ($w = 0; $w -lt $array.count; $w++){
$name = $arrayName[$w]
$array[$w] >> $path$name.txt
}
}
}Pour commencer, une fonction est créée CSIRT, qui prendra un argument : le chemin pour enregistrer les données reçues. Étant donné que la plupart des cmdlets fonctionnent dans Powershell v5, une vérification de la version de PowerShell a été effectuée pour assurer un fonctionnement correct.
function CSIRT{
param($path)# lors de l'exécution du script, il est nécessaire de spécifier le répertoire pour l'enregistrement
if ($psversiontable.psversion.major -ge 5)Pour faciliter la navigation dans les fichiers créés, deux variables sont initialisées : $date et $Computer, auxquelles seront attribués le nom de l'ordinateur et la date actuelle.
$date = Get-Date -Format dd.MM.yyyy_hh_mm
$Computer = $env:COMPUTERNAME
New-Item -Path $path$computer$date –ItemType 'Directory' -Force | Out-Null
$path = "$path$computer$date"Nous pouvons obtenir la liste des processus en cours d'exécution au nom de l'utilisateur actuel de la manière suivante : créons une variable $process en lui assignant le cmdlet get-ciminstance avec la classe win32_process. En utilisant le cmdlet Select-Object, nous pouvons ajouter des paramètres de sortie supplémentaires, dans notre cas ce seront parentprocessid (identifiant du processus parent PPID), creationdate (date de création du processus), processed (identifiant du processus PID), processname (nom du processus), commandline (commande de lancement).
$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname, processid, commandline, parentprocessidPour obtenir la liste de toutes les connexions TCP et UDP, créons des variables $netTCP et $netUDP en leur assignant respectivement les cmdlets Get-NetTCPConnection et Get-NetUDPEndpoint.
$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state
$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, stateIl sera également important de connaître la liste des tâches et des travaux planifiés. Pour cela, nous utiliserons les cmdlets get-ScheduledTask et Get-ScheduledJob. Nous leur assignerons des variables $task et $job, car initialement, il existe de nombreuses tâches planifiées dans le système, donc pour identifier une activité malveillante, il est préférable de filtrer les tâches planifiées légitimes. Le cmdlet Select-Object nous aidera dans cette tâche.
$task = get-ScheduledTask | Select-Object author, actions, triggers, state, description, taskname | where author -notlike '*Microsoft*' | where author -ne $null | where author -notlike '*@%systemroot%*' | where author -notlike '*microsoft*' # $task exclut les auteurs contenant “Microsoft”, “*@%systemroot%*”, ainsi que les auteurs « vides »
$job = Get-ScheduledJobDans le système de fichiers NTFS, il existe un concept appelé flux de données alternatifs (Alternate Data Streams, ADS). Cela signifie qu'un fichier dans NTFS peut être lié de manière supplémentaire à plusieurs flux de données de taille arbitraire. Grâce aux ADS, il est possible de cacher des données qui ne seront pas visibles lors des vérifications standard du système. Cela permet d'injecter du code malveillant et/ou de cacher des données.
Pour afficher les flux de données alternatifs dans PowerShell, nous utiliserons le cmdlet get-item et l'outil Windows stream avec le symbole * pour visualiser tous les flux possibles, pour cela, créons une variable $ADS.
$ADS = get-item * -stream * | where stream –ne ':$Data' Il serait utile de connaître la liste des utilisateurs connectés au système, pour cela nous créerons une variable $user et lui assignerons l'exécution de la commande quser.
$user = quser Les malfaiteurs, pour s'ancrer dans le système, peuvent apporter des modifications au démarrage automatique. Pour visualiser les objets dans le démarrage automatique, vous pouvez utiliser la commande Get-ItemProperty.
Créons deux variables : $runUser – pour visualiser le démarrage automatique au nom de l'utilisateur et $runMachine – pour visualiser le démarrage automatique au nom de l'ordinateur.
$runUser = Get-ItemProperty
"HKCU:SoftwareMicrosoftWindowsCurrentVersionRun"
$runMachine = Get-ItemProperty
"HKLM:SoftwareMicrosoftWindowsCurrentVersionRun"Pour que toutes les informations soient enregistrées dans différents fichiers, créons un tableau avec des variables et un tableau avec des noms de fichiers.
$array = $process, $netTCP, $netUDP, $task, $user, $runUser, $runMachine, $job, $ADS
$arrayName = "Processes", "TCPConnect", "UDPConnect", "TaskScheduled", "Users", "RunUser", "RunMachine",
"ScheduledJob", "Alternative Data Stream"Et, en utilisant une boucle for, les données récupérées seront enregistrées dans des fichiers.
for ($w = 0; $w -lt $array.count; $w++){
$name = $arrayName[$w]
$array[$w] >> $path$name.txt
Après l'exécution du script, 9 fichiers texte seront créés, contenant les informations nécessaires.
Actuellement, les spécialistes en cybersécurité peuvent utiliser PowerShell pour enrichir les informations nécessaires à la résolution de diverses tâches dans leur travail. En ajoutant un script au démarrage automatique, il est possible d'obtenir certaines informations sans prendre des dumps, des images, etc.
Source : habr.com
