Die Verwendung von PowerShell zur Erfassung von Vorfallinformationen

PowerShell ist ein weit verbreitetes Automatisierungstool, das sowohl von Malware-Entwicklern als auch von Fachleuten für Informationssicherheit häufig verwendet wird.
In diesem Artikel wird ein Anwendungsbeispiel von PowerShell für die Fernbereitstellung von Daten von Endgeräten bei der Reaktion auf IT-Sicherheitsvorfälle betrachtet. Dazu ist es erforderlich, ein Skript zu schreiben, das auf dem Endgerät ausgeführt wird, und es wird eine detaillierte Beschreibung dieses Skripts folgen.

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 mit der Arbeit zu beginnen, wird eine Funktion erstellt CSIRT, die ein Argument entgegennimmt – den Pfad zum Speichern der erhaltenen Daten. Da die meisten Cmdlets in PowerShell v5 funktionieren, wurde eine Versionsüberprüfung für eine korrekte Ausführung implementiert.

function CSIRT{
		
param($path) # Beim Starten des Skripts muss ein Verzeichnis zum Speichern angegeben werden
if ($psversiontable.psversion.major -ge 5)

Zur erleichterten Navigation durch die erstellten Dateien werden 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"

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

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

Um eine Liste aller TCP- und UDP-Verbindungen zu erhalten, erstellen wir die Variablen $netTCP und $netUDP und weisen ihnen die Cmdlets Get-NetTCPConnection und Get-NetUDPEndpoint 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

Ebenso wichtig ist es, die Liste der geplanten Aufgaben und Jobs zu erfahren. Dazu verwenden wir die Cmdlets get-ScheduledTask und Get-ScheduledJob. Wir weisen ihnen die Variablen $task und $job zu, da im System von Anfang an viele geplante Aufgaben existieren. Um böswillige Aktivitäten zu identifizieren, ist es sinnvoll, legitime geplante Aufgaben herauszufiltern. Dabei 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", "Microsoft", "*@%systemroot%*" enthalten sowie "leere" Autoren
$job = Get-ScheduledJob

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

Um alternative Datenströme in PowerShell anzuzeigen, verwenden wir das Cmdlet get-item und das integrierte Windows-Werkzeug stream mit dem Zeichen * zur Anzeige aller möglichen Ströme. Dazu erstellen wir die Variable $ADS.

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

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

$user = quser

Um sich im System festzusetzen, können Angreifer Änderungen an der Autostartkonfiguration vornehmen. Um die Objekte im Autostart anzuzeigen, kann das Cmdlet Get-ItemProperty verwendet werden.
Wir erstellen zwei Variablen: $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, indem wir eine for-Schleife verwenden, werden die gesammelten Daten in Dateien geschrieben.

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

Nach Ausführung des Skripts werden 9 Textdateien erstellt, die die erforderlichen Informationen enthalten.

Aktuell können Cybersecurity-Spezialisten PowerShell nutzen, um Informationen zu bereichern, die für die Lösung verschiedener Aufgaben in ihrer Arbeit erforderlich sind. Durch das Hinzufügen des Skripts zum Autostart können bestimmte Informationen ohne das Erstellen von Dummydaten oder Images usw. abgerufen werden.

Quelle: habr.com

Zuverlässiges Hosting für Websites mit DDoS-Schutz kaufen, VPS VDS Server 🔥 Zuverlässiges Hosting für Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster