Verwendung von PowerShell zur Informationsbeschaffung über ein Vorfall

PowerShell ist ein weit verbreitetes Automatisierungstool, das sowohl von Malware-Entwicklern als auch von IT-Sicherheitsspezialisten häufig genutzt wird.
In diesem Artikel wird eine Methode zur Verwendung von PowerShell zum Remote-Datensammeln von Endgeräten im Rahmen der Reaktion auf Sicherheitsvorfälle beschrieben. Dazu müssen Sie ein Skript erstellen, das auf dem Endgerät ausgeführt wird, und im Folgenden finden Sie eine detaillierte Beschreibung dieses Skripts.

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
		}

	}

}

Um zu beginnen, wird eine Funktion erstellt CSIRT, die ein Argument – den Pfad zum Speichern der erhaltenen Daten – entgegennimmt. Da die meisten Cmdlets in PowerShell v5 arbeiten, wurde eine Versionsprüfung von PowerShell zur korrekten Ausführung implementiert.

funktion CSIRT{
		
param($path)# Beim Ausführen des Skripts muss das Verzeichnis angegeben werden, in dem gespeichert werden soll
if ($psversiontable.psversion.major -ge 5)

Zur einfacheren Navigation durch die erstellten Dateien wurden zwei Variablen initialisiert: $date und $Computer, denen der Computername und das aktuelle Datum zugewiesen werden.

$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"

Die Liste der laufenden Prozesse im Namen des aktuellen Benutzers erhalten wir wie folgt: Wir erstellen die Variable $process und weisen ihr das Cmdlet get-ciminstance mit der Klasse win32_process zu. Mit dem Cmdlet Select-Object können zusätzliche Ausgabewerte hinzugefügt werden; in unserem Fall sind das parentprocessid (ID des übergeordneten Prozesses PPID), creationdate (Erstellungsdatum des Prozesses), processed (Prozess-ID PID), processname (Prozessname), commandline (Startbefehl).

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

Um alle TCP- und UDP-Verbindungen zu erhalten, erstellen wir die Variablen $netTCP und $netUDP und weisen ihnen die Cmdlets Get-NetTCPConnection und Get-NetUDPConnection zu.

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

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

Es ist wichtig, die Liste der geplanten Aufgaben und Jobs zu kennen. Dafür verwenden wir die Cmdlets get-ScheduledTask und Get-ScheduledJob. Wir weisen ihnen die Variablen $task und $job zu, da es anfangs eine Vielzahl geplanter Aufgaben im System gibt. Um bösartige Aktivitäten zu identifizieren, sollten wir die legitimen geplanten Aufgaben filtern. Dafür hilft uns das Cmdlet Select-Object.

$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 schließt Autoren aus, die “Microsoft”, “*@%systemroot%*” oder leere Autoren enthalten
$job = Get-ScheduledJob

Im NTFS-Dateisystem gibt es das Konzept der alternativen Datenströme (Alternate Data Streams, ADS). Dies bedeutet, dass eine Datei in NTFS zusätzlich mit mehreren Datenströmen beliebiger Größe verknüpft sein kann. Mit ADS können Daten versteckt werden, die bei standardmäßigen Systemprüfungen nicht sichtbar sind. Dadurch kann bösartiger Code eingefügt und/oder Daten verborgen werden.

Um alternative Datenströme in PowerShell anzuzeigen, verwenden wir das Cmdlet get-item und das integrierte Windows-Tool stream mit dem Symbol *, um alle möglichen Ströme anzuzeigen. Dazu erstellen wir die Variable $ADS.

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

Es ist auch hilfreich, die Liste der Benutzer, die im System angemeldet sind, zu kennen. Dazu erstellen wir die Variable $user und weisen ihr die Ausführung des Programms quser zu.

$user = quser

Angreifer können Änderungen am Autostart vornehmen, um im System Fuß zu fassen. Um die Objekte im Autostart anzuzeigen, verwenden wir das Cmdlet Get-ItemProperty.
Lass uns zwei Variablen erstellen: $runUser – um den Autostart im Namen des Benutzers anzuzeigen, und $runMachine – um den Autostart im Namen des Computers anzuzeigen.

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

Um alle Informationen in verschiedene Dateien zu schreiben, erstellen wir ein Array mit Variablen und ein Array mit Dateinamen.


$array = $process, $netTCP, $netUDP, $task, $user, $runUser, $runMachine, $job, $ADS
$arrayName = "Processes", "TCPConnect", "UDPConnect", "TaskScheduled", "Users", "RunUser", "RunMachine",
"ScheduledJob", "Alternative Data Stream"

Und mit einer for-Schleife werden die erhaltenen Daten in Dateien geschrieben.

for ($w = 0; $w -lt $array.count; $w++){
	$name = $arrayName[$w]
	$array[$w] >> $path$name.txt

Nach der Ausführung des Skripts werden 9 Textdateien erstellt, die die benötigten Informationen enthalten.

Derzeit können Cybersecurity-Spezialisten PowerShell nutzen, um die Informationen zu bereichern, die für die Lösung vielfältiger Aufgaben in ihrer Arbeit erforderlich sind. Durch das Hinzufügen des Skripts zur Autostart können einige Informationen ohne das Erstellen von Dumps, Images usw. erhalten werden.

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster