PowerShell Àr ett ganska vanligt automatiseringsverktyg som ofta anvÀnds av bÄde skadlig programutvecklare och informationssÀkerhetsspecialister.
I denna artikel kommer vi att undersöka hur man anvÀnder PowerShell för att fjÀrrsamla data frÄn slutpunkter vid reaktion pÄ IT-incidenter. För detta krÀvs ett script som körs pÄ slutpunkten och hÀr kommer en detaljerad beskrivning av det scriptet.
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
}
}
}För att börja arbetet skapas en funktion CSIRT, som tar ett argument â en sökvĂ€g för att spara den insamlade informationen. Eftersom de flesta cmdlets arbetar i PowerShell v5 görs en versionkontroll för korrekt funktion.
function CSIRT{
param($path)# vid körning av scriptet mÄste en katalog för lagring anges
if ($psversiontable.psversion.major -ge 5)För enkel navigering bland de skapade filerna initieras tvÄ variabler: $date och $Computer, som fÄr vÀrdena för datornamn och nuvarande 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"Vi fÄr en lista över de processer som körs av den aktuella anvÀndaren pÄ följande sÀtt: vi skapar en variabel $process och tilldelar den cmdlet'en get-ciminstance med klassen win32_process. Genom att anvÀnda cmdlet'en Select-Object kan vi lÀgga till ytterligare utdata parametrar, i vÄrt fall kommer det att vara parentprocessid (förÀlderprocessens identifierare PPID), creationdate (processens skapelsedatum), processed (processens identifierare PID), processname (processens namn), commandline (startkommandot).
$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname, processid, commandline, parentprocessidFör att fÄ en lista över alla TCP- och UDP-anslutningar skapar vi variablerna $netTCP och $netUDP och tilldelar dem cmdlet'arna Get-NetTCPConnection respektive Get-NetUDPEndpoint.
$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state
$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, stateDet Àr ocksÄ viktigt att veta listan över schemalagda uppgifter och jobb. För detta anvÀnder vi cmdlet'arna get-ScheduledTask och Get-ScheduledJob. Vi tilldelar dem variablerna $task och $job, eftersom det redan finns mÄnga schemalagda uppgifter i systemet, sÄ för att identifiera skadlig aktivitet bör vi filtrera ut legitima schemalagda uppgifter. Detta kommer att hjÀlpa oss med cmdlet'en 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 utesluter författare som innehĂ„ller âMicrosoftâ, â*@%systemroot%*â samt âtommaâ författare
$job = Get-ScheduledJobI NTFS-filsystemet finns det ett begrepp som kallas alternativa datastreams (Alternate Data Streams, ADS). Det innebÀr att en fil i NTFS kan kopplas till flera datastreams av godtycklig storlek. Med ADS kan man dölja data som inte syns vid standardkontroller av systemet. Detta gör det möjligt att införa skadlig kod och/eller dölja data.
För att visa alternativa datastreams i PowerShell anvÀnder vi cmdlet'en get-item och det inbyggda Windows-verktyget stream med symbolen * för att visa alla möjliga strömmar, för detta skapar vi en variabel $ADS.
$ADS = get-item * -stream * | where stream -ne ':$Data' Det kan ocksÄ vara nyttigt att veta listan över anvÀndare som Àr inloggade i systemet, för detta skapar vi en variabel $user och tilldelar den resultatet av kommandot quser.
$user = quser Angripare kan göra Àndringar i autostart för att befÀsta sig i systemet. För att visa objekt i autostart kan man anvÀnda cmdlet: Get-ItemProperty.
Vi skapar tvĂ„ variabler: $runUser â för att visa autostart för anvĂ€ndaren och $runMachine â för att visa autostart för datorn.
$runUser = Get-ItemProperty
"HKCU:SoftwareMicrosoftWindowsCurrentVersionRun"
$runMachine = Get-ItemProperty
"HKLM:SoftwareMicrosoftWindowsCurrentVersionRun"För att all information ska sparas i olika filer skapar vi en array med variabler och en array med filnamn.
$array = $process, $netTCP, $netUDP, $task, $user, $runUser, $runMachine, $job, $ADS
$arrayName = "Processes", "TCPConnect", "UDPConnect", "TaskScheduled", "Users", "RunUser", "RunMachine",
"ScheduledJob", "Alternative Data Stream"Och, med hjÀlp av en for-loop, kommer de insamlade uppgifterna att sparas i filer.
for ($w = 0; $w -lt $array.count; $w++){
$name = $arrayName[$w]
$array[$w] >> $path$name.txt
Efter att skriptet har körts kommer 9 textfiler att skapas, som innehÄller nödvÀndig information.
För nÀrvarande kan cybersÀkerhetsspecialister anvÀnda PowerShell för att berika informationen som behövs vid lösning av olika uppgifter i sitt arbete. Genom att lÀgga till skriptet i autostart kan man fÄ viss information utan att ta dumpningar, avbilder osv.
KĂ€lla: habr.com
