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, parentprocessidUm 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, stateEbenso 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-ScheduledJobIm 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
