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 '*Майкрософт*' | 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 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"Списък на активните процеси от името на текущия потребител можем да получим по следния начин: създаваме променлива $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Не по-малко важно е да разберем списъка на планираните задачи и задания. За тази цел ще използваме командлетите get-ScheduledTask и Get-ScheduledJob. Присвояваме им променливи $task и $job, тъй като в системата вече съществуват множество планирани задачи, е важно да филтрираме легитимните планирани задачи, за да идентифицираме злонамерена активност. В това ще ни помогне командлетът 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В файловата система NTFS съществува концепцията за алтернативни потоци данни (Alternate Data Streams, ADS). Това означава, че файл в NTFS може да бъде допълнително свързан с множество потоци данни с произволен размер. Чрез ADS можем да скрием данни, които няма да бъдат видими при стандартни проверки на системата. Чрез това можем да внедрим зловреден код и/или да скрием данни.
За извеждане на алтернативни потоци данни в PowerShell ще използваме командлета get-item и вградения инструмент Windows stream с символа * за преглед на всички възможни потоци, за това ще създадем променлива $ADS.
$ADS = get-item * -stream * | where stream –ne ':$Data' Полезно би било да разберем и списъка на потребителите, влезли в системата, за това ще създадем променлива $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
