PowerShell je poměrně rozšířený nástroj pro automatizaci, který je často používán jak vývojáři malwaru, tak odborníky na informační bezpečnost.
V tomto článku se zaměříme na použití PowerShell pro vzdálené shromažďování dat z koncových zařízení při reakci na incidenty informační bezpečnosti. K tomu bude potřeba napsat skript, který se spustí na koncovém zařízení, a dále bude podrobně popsán tento skript.
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
}
}
}Pro začátek práce se vytváří funkce CSIRT, která přijme argument – cestu pro uložení získaných dat. Vzhledem k tomu, že většina cmdletů pracuje ve verzi Powershell v5, byla provedena kontrola verze PowerShell pro její správnou funkci.
function CSIRT{
param($path)# při spuštění skriptu je nutné uvést adresář pro uložení
if ($psversiontable.psversion.major -ge 5)Pro snadnou navigaci po vytvořených souborech jsou inicializovány dvě proměnné: $date a $Computer, kterým budou přiděleny název počítače a aktuální datum.
$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"Seznam spuštěných procesů pod jménem aktuálního uživatele získáme následujícím způsobem: vytvoříme proměnnou $process, přiřadíme jí cmdlet get-ciminstance s třídou win32_process. Pomocí cmdletu Select-Object můžeme přidat další parametry pro výstup, v našem případě budou parentprocessid (identifikátor rodičovského procesu PPID), creationdate (datum vytvoření procesu), processed (identifikátor procesu PID), processname (název procesu), commandline (spouštěcí příkaz).
$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname, processid, commandline, parentprocessidAbychom získali seznam všech TCP a UDP připojení, vytvoříme proměnné $netTCP a $netUDP a přiřadíme jim cmdlety Get-NetTCPConnection a Get-NetUDPConnection odpovídajícím způsobem.
$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state
$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, stateDůležité bude také zjistit seznam naplánovaných úloh a úkolů. K tomu použijeme cmdlety get-ScheduledTask a Get-ScheduledJob. Přiřadíme jim proměnné $task a $job, protože v systému již existuje mnoho naplánovaných úloh, je dobré filtrovat legitimní naplánované úlohy, abychom odhalili podezřelou činnost. S tím nám pomůže 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 vylučuje autory obsahující „Microsoft“, „*@%systemroot%*“ a také „prázdné“ autory
$job = Get-ScheduledJobV souborovém systému NTFS existuje takový pojem, jako jsou alternativní datové proudy (Alternate Data Streams, ADS). To znamená, že soubor v NTFS může být navíc spojen s několika datovými proudy libovolné velikosti. Pomocí ADS lze skrýt data, která nebudou viditelná standardními kontrolemi systému. Díky tomu lze implantovat malware a/nebo skrýt data.
Pro zobrazení alternativních datových proudů v PowerShellu budeme používat cmdlet get-item a vestavěný nástroj Windows stream s symbolem * pro prohlížení všech možných proudů, k tomu vytvoříme proměnnou $ADS.
$ADS = get-item * -stream * | where stream –ne ':$Data' Užitečné bude také zjistit seznam uživatelů přihlášených do systému, k tomu vytvoříme proměnnou $user a přiřadíme jí provedení programu quser.
$user = quser Útočníci mohou provést změny v autoloadu, aby se usadili v systému. Pro zobrazení položek v autoloadu můžete použít příkaz Get-ItemProperty.
Vytvoříme dvě proměnné: $runUser – pro zobrazení autoloadu jménem uživatele a $runMachine – pro zobrazení autoloadu jménem počítače.
$runUser = Get-ItemProperty
"HKCU:SoftwareMicrosoftWindowsCurrentVersionRun"
$runMachine = Get-ItemProperty
"HKLM:SoftwareMicrosoftWindowsCurrentVersionRun"Aby se všechny informace zapisovaly do různých souborů, vytvoříme pole s proměnnými a pole s názvy souborů.
$array = $process, $netTCP, $netUDP, $task, $user, $runUser, $runMachine, $job, $ADS
$arrayName = "Processes", "TCPConnect", "UDPConnect", "TaskScheduled", "Users", "RunUser", "RunMachine",
"ScheduledJob", "Alternative Data Stream"A pomocí smyčky for se získaná data zapíší do souborů.
for ($w = 0; $w -lt $array.count; $w++){
$name = $arrayName[$w]
$array[$w] >> $path$name.txt
Po spuštění skriptu bude vytvořeno 9 textových souborů, které obsahují potřebné informace.
V současné době mohou odborníci na kybernetickou bezpečnost používat PowerShell pro obohacení informací potřebných k řešení různých úkolů ve své práci. Přidáním skriptu do autoloadu lze získávat určité informace bez vytváření dumpů, obrazů atd.
Zdroj: habr.com
