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

60GB SSD 8Gb DDR4