Utilisation de PowerShell pour collecter des informations sur les incidents

PowerShell est un outil d'automatisation assez courant qui est souvent utilisé à la fois par les développeurs de logiciels malveillants et les spécialistes de la sécurité de l'information.
Cet article examinera l'utilisation de PowerShell pour la collecte à distance de données à partir d'appareils finaux lors de la réponse à des incidents de sécurité des informations. Pour ce faire, vous devez écrire un script qui s'exécutera sur l'appareil final, puis il y aura une description détaillée de ce script.

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 '*Майкрософт*' | 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, créez une fonction Extension CSIRT, qui prendra un argument - le chemin pour enregistrer les données reçues. Étant donné que la plupart des applets de commande fonctionnent dans Powershell v5, une vérification de la version de PowerShell a été effectuée pour un fonctionnement correct.

function CSIRT{
		
param($path)# при запуске скрипта необходимо указать директорию для сохранения
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 courante.

$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 obtenons la liste des processus en cours d'exécution pour le compte de l'utilisateur actuel comme suit : créez la variable $process en lui attribuant l'applet de commande get-ciminstance avec la classe win32_process. À l'aide de l'applet de commande Select-Object, vous pouvez ajouter des paramètres de sortie supplémentaires, dans notre cas, il s'agira de parentprocessid (ID de processus parent PPID), creationdate (date de création du processus), process (ID de processus PID), processname (nom du processus), ligne de commande (commande de démarrage).

$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname, processid, commandline, parentprocessid

Pour obtenir une liste de toutes les connexions TCP et UDP, créez les variables $netTCP et $netUDP en leur attribuant respectivement les applets de commande Get-NetTCPConnection et Get-NetTCPConnection.

$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state

$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state

Il sera important de connaître la liste des tâches et tâches planifiées. Pour ce faire, nous utilisons les applets de commande get-ScheduledTask et Get-ScheduledJob. Affectons-leur les variables $task et $job, car Au départ, il y a beaucoup de tâches planifiées dans le système, puis afin d'identifier les activités malveillantes, il vaut la peine de filtrer les tâches planifiées légitimes. L'applet de commande Select-Object nous y aidera.

$task = get-ScheduledTask | Select-Object author, actions, triggers, state, description, taskname| where author -notlike '*Майкрософт*' | where author -ne $null | where author -notlike '*@%systemroot%*' | where author -notlike '*microsoft*' # $task исключает авторов, содержащих “Майкрософт”, “Microsoft”, “*@%systemroot%*”, а также «пустых» авторов
$job = Get-ScheduledJob

Dans le système de fichiers NTFS, il existe des flux de données alternatifs (Alternate Data Streams, ADS). Cela signifie qu'un fichier sur NTFS peut en outre être associé à plusieurs flux de données de taille arbitraire. Avec ADS, vous pouvez masquer des données qui ne seront pas visibles par les vérifications système standard. Cela peut injecter du code malveillant et/ou masquer des données.

Pour afficher des flux de données alternatifs dans PowerShell, nous utiliserons l'applet de commande get-item et l'outil de flux Windows intégré avec le symbole * pour afficher tous les flux possibles, pour cela nous allons créer la variable $ADS.

$ADS = get-item * -stream * | where stream –ne ':$Data' 

Il sera utile de connaître la liste des utilisateurs connectés au système, pour cela nous allons créer une variable $user et lui attribuer l'exécution du programme quser.

$user = quser

Afin de prendre pied dans le système, les attaquants peuvent apporter des modifications à l'exécution automatique. Vous pouvez utiliser l'applet de commande Get-ItemProperty pour afficher les éléments en lecture automatique.
Créons deux variables : $runUser - pour afficher le chargement automatique au nom de l'utilisateur et $runMachine - pour afficher le chargement automatique au nom de l'ordinateur.

$runUser = Get-ItemProperty 
"HKCU:SoftwareMicrosoftWindowsCurrentVersionRun"
$runMachine = Get-ItemProperty 
"HKLM:SoftwareMicrosoftWindowsCurrentVersionRun"

Pour que toutes les informations soient écrites dans différents fichiers, nous 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ésultantes seront écrites 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.

Aujourd'hui, les professionnels de la cybersécurité peuvent utiliser PowerShell pour enrichir les informations dont ils ont besoin pour résoudre diverses tâches dans leur travail. En ajoutant un script à chargement automatique, vous pouvez obtenir des informations sans vidage, images, etc.

Source: habr.com

Ajouter un commentaire