Verwenden von PowerShell zum Sammeln von Vorfallinformationen

PowerShell ist ein weit verbreitetes Automatisierungstool, das häufig sowohl von Malware-Entwicklern als auch von Spezialisten für Informationssicherheit verwendet wird.
In diesem Artikel wird die Verwendung von PowerShell für die Remote-Erfassung von Daten von Endgeräten bei der Reaktion auf Informationssicherheitsvorfälle betrachtet. Dazu müssen Sie ein Skript schreiben, das auf dem Endgerät ausgeführt wird, und anschließend eine detaillierte Beschreibung dieses Skripts erhalten.

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
		}

	}

}

Erstellen Sie zunächst eine Funktion CSIRT-Erweiterung, das ein Argument annimmt – den Pfad zum Speichern der empfangenen Daten. Da die meisten Cmdlets in Powershell v5 funktionieren, wurde eine Überprüfung der PowerShell-Version auf korrekte Funktion durchgeführt.

function CSIRT{
		
param($path)# при запуске скрипта необходимо указать директорию для сохранения
if ($psversiontable.psversion.major -ge 5)

Um die Navigation durch die erstellten Dateien zu erleichtern, 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: Erstellen Sie die Variable $process, indem Sie ihr das Cmdlet get-ciminstance mit der Klasse win32_process zuweisen. Mit dem Cmdlet „Select-Object“ können Sie zusätzliche Ausgabeparameter hinzufügen. In unserem Fall sind dies „parentprocessid“ (PPID des übergeordneten Prozesses), „creationdate“ (Erstellungsdatum des Prozesses), „processed“ (PID-Prozess-ID), „processname“ (Prozessname) und „commandline“. (Startbefehl).

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

Um eine Liste aller TCP- und UDP-Verbindungen zu erhalten, erstellen Sie die Variablen $netTCP und $netUDP, indem Sie ihnen die Cmdlets Get-NetTCPConnection bzw. Get-NetTCPConnection zuweisen.

$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 Aufgaben zu kennen. Dazu verwenden wir die Cmdlets get-ScheduledTask und Get-ScheduledJob. Weisen wir ihnen die Variablen $task und $job zu, weil Zunächst gibt es viele geplante Aufgaben im System. Um dann böswillige Aktivitäten zu identifizieren, lohnt es sich, 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 '*Майкрософт*' | where author -ne $null | where author -notlike '*@%systemroot%*' | where author -notlike '*microsoft*' # $task исключает авторов, содержащих “Майкрософт”, “Microsoft”, “*@%systemroot%*”, а также «пустых» авторов
$job = Get-ScheduledJob

Im NTFS-Dateisystem gibt es so etwas wie alternative Datenströme (Alternate Data Streams, ADS). Dies bedeutet, dass einer Datei auf NTFS weiterhin mehrere Datenströme beliebiger Größe zugeordnet werden können. Mit ADS können Sie Daten ausblenden, die bei Standardsystemprüfungen nicht sichtbar sind. Dies kann bösartigen Code einschleusen und/oder Daten verbergen.

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

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

Es wird nützlich sein, die Liste der im System angemeldeten Benutzer zu kennen. Dazu erstellen wir eine $user-Variable und weisen ihr die Ausführung des quser-Programms zu.

$user = quser

Um im System Fuß zu fassen, können Angreifer Änderungen am Autorun vornehmen. Sie können das Cmdlet Get-ItemProperty verwenden, um die Elemente in der automatischen Wiedergabe anzuzeigen.
Erstellen wir zwei Variablen: $runUser – um das automatische Laden im Namen des Benutzers anzuzeigen, und $runMachine – um das automatische Laden im Namen des Computers anzuzeigen.

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

Damit alle Informationen in verschiedene Dateien geschrieben werden können, 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"

Mithilfe einer for-Schleife werden die resultierenden 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 notwendigen Informationen enthalten.

Heutzutage können Cybersicherheitsexperten PowerShell verwenden, um die Informationen anzureichern, die sie zur Lösung einer Vielzahl von Aufgaben in ihrer Arbeit benötigen. Durch das Hinzufügen eines Skripts zum automatischen Laden können Sie einige Informationen ohne Dumping, Bilder usw. abrufen.

Source: habr.com

Kommentar hinzufügen