PowerShell-ը բավականին տարածված ավտոմատացման գործիք է, որը հաճախ օգտագործում են ինչպես չարագործ ծրագրերի մշակողները, այնպես էլ տեղեկատվական անվտանգության մասնագետները։
Այս հոդվածում կքննարկվի PowerShell-ի օգտագործման տարբերակը հեռակայում տվյալների հավաքման համար վերջնական սարքերից տեղեկատվական անվտանգության միջադեպերին արձագանքելու ընթացքում։ Դրա համար անհրաժեշտ է գրել սցենար, որը կաշխատի վերջնական սարքում, և ավելի մանրամասն տեղեկատվություն կտրամադրվի այս սցենարի մասին։
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
}
}
}Աշխատանքային գործընթացը սկսելու համար ստեղծվում է ֆունկցիա CSIRT, որը կստանան արգումենտ - տվյալների չփոխանցելու ճանապարը։ Քանի որ մեծամասնության PowerShell-ի կոմանդլետներ աշխատում են PowerShell v5-ում, այդ պատճառով աշխատունակության համար ստուգում է կատարվում PowerShell-ի տարբերակի համար:
function CSIRT{
param($path)# սցենարը սկսելիս անհրաժեշտ է նշել այն ֆոլդերը, ուր տվյալները պահպանվեն
if ($psversiontable.psversion.major -ge 5)Հեշտ հարմարեցման համար ստեղծվում են երկու փոփոխական՝ $date և $Computer, որոնց կհատկացվի համակարգչի անունը և ներկայիս ամսաթիվը:
$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"Առաջին օգտագործողի կողմից գործող Processes-ի ցուցակ ստեղծելու համար մենք ստեղծում ենք $process փոփոխականը, ինչը $process- ին հատկացնում է get-ciminstance կոմանդլետը win32_process դասից։ Select-Object կոմանդլետի օգնությամբ կարող ենք ավելացնել լրացված պարամետրեր, մեր դեպքում դրանք կլինեն parentprocessid (հայր պրոցեսի նույնականացման համար PPID), creationdate (պրոցեսի ստեղծման ամսաթիվը), processed (պրոցեսի նույնականացման համար PID), processname (պրոցեսի անունը), commandline (թույլտվությունն օգտագործելու հրամանը):
$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname, processid, commandline, parentprocessidՀոլեղ TCP և UDP կապերի ցուցակը ստանալու համար ստեղծում ենք $netTCP և $netUDP փոփոխականները, որոնք պատկանում են Get-NetTCPConnection և 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, stateԿարևոր է ստանալ պլանավորված առաջադրանքների և աշխատանքների ցուցակը։ Bunun համար օգտագործելու ենք get-ScheduledTask և Get-ScheduledJob հրամաններն իր $task և $job փոփոխականներին։ Որպեսզի համակարգում շատ տ予定 առաջադրանքներ չլինեն, հարկավոր է ֆիլտրել օրինական պլանավորված առաջադրանքները։ Այս գործում մեզ կօգնի 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 բացառում է հեղինակներին, որոնք պարունակում են “Microsoft”, “*@%systemroot%*”, ինչպես նաև « դատարկ » հեղինակներ
$job = Get-ScheduledJobNTFS ֆայլային համակարգում գոյություն ունի տվյալների այլընտրանքային հոսքերի գաղափարը (Alternate Data Streams, ADS)։ Սա նշանակում է, որ NTFS ֆայլը կարող է լրացուցիչ կապված լինել հսկայական չափերով տվյալների մի քանի հոսքերի։ ADS-ի միջոցով կարելի է թաքցնել տվյալներ, որոնք չեն լինում տեսանելի համակարգի ստանդարտ ստուգումների ժամանակ։ Դա հնարավորություն է տալիս ներմուծել վնասակար կոդ և/կամ թաքցնել տվյալներ։
PowerShell-ում այլընտրանքային տվյալների հոսքերին հասնելու համար օգտագործելու ենք get-item հրամանը և Windows-ի կառուցվածքային գործիքը, որը *, խորհրդանշանից է առաջին, որպեսզի դիտենք բոլոր հնարավոր հոսքերը, hierfür ստեղծում ենք $ADS փոփոխական։
$ADS = get-item * -stream * | where stream –ne ':$Data' Պետք է օգտակար լինի նաև համակարգում ներմուծված օգտվողների ցուցակը ստանալ։ Bunun համար ստեղծում ենք $user փոփոխական և տալիս նրան quser ծրագիրն աշխատելու։
$user = quser Նպաստողներ, որպեսզի համակարգում մնան կարող են փոփոխություններ կատարել ավտոմատ մեկնարկում։ Ինչպես դիտենք ավտոմատ մեկնարկում ունեցող տարրերը, կարելի է օգտվել Get-ItemProperty հրամանից։
Ստեղծենք երկու փոփոխական՝ $runUser՝ օգտվողի անունով ավտոմատ մեկնարկի դիտման համար և $runMachine՝ համակարգչի անունով ավտոմատ մեկնարկի դիտման համար։
$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", "Alternative Data Stream"Եվ օգտագործելով for ցիկլը, ստացված տվյալները կգրանցվեն ֆայլերում։
for ($w = 0; $w -lt $array.count; $w++){
$name = $arrayName[$w]
$array[$w] >> $path$name.txt
Սցենարի կատարման արդյունքում կստեղծվի 9 տեքստային ֆայլ, որոնք պարունակելու են անհրաժեշտ տեղեկատվությունը։
Այս պահին կիբեռանվտանգության մասնագետները կարող են օգտագործել PowerShell-ը իրենց աշխատանքում տարբեր խնդիրների լուծման համար անհրաժեշտ տեղեկատվությունը հարստացնելու համար։ Ավելացնելով սցենարը ավտոմատ մեկնարկում, կարելի է ստանալ որոշ տեղեկություններ առանց դամպերի, պատկերների և այլն։
Ընտանիք: habr.com
