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ซึ่งจะใช้อาร์กิวเมนต์ - เส้นทางในการบันทึกข้อมูลที่ได้รับ เนื่องจาก cmdlets ส่วนใหญ่ทำงานใน 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 cmdlet ด้วยคลาส win32_process การใช้ Select-Object cmdlet คุณสามารถเพิ่มพารามิเตอร์เอาต์พุตเพิ่มเติมได้ ในกรณีของเรา สิ่งเหล่านี้จะเป็น parentprocessid (PPID กระบวนการหลัก), วันที่สร้าง (วันที่สร้างกระบวนการ), ประมวลผล (ID กระบวนการ PID), ชื่อกระบวนการ (ชื่อกระบวนการ), commandline ( เรียกใช้คำสั่ง)
$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname, processid, commandline, parentprocessid
หากต้องการรับรายการการเชื่อมต่อ TCP และ UDP ทั้งหมด ให้สร้างตัวแปร $netTCP และ $netUDP โดยกำหนด Get-NetTCPConnection และ Get-NetTCPConnection cmdlets ตามลำดับ
$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state
$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state
การค้นหารายการงานและการมอบหมายที่วางแผนไว้เป็นสิ่งสำคัญ เมื่อต้องการทำเช่นนี้ เราใช้ cmdlets get-ScheduledTask และ Get-ScheduledJob มากำหนดตัวแปร $task และ $job ให้พวกเขากันดีกว่า เริ่มแรก มีงานที่กำหนดเวลาไว้จำนวนมากในระบบ ดังนั้นเพื่อระบุกิจกรรมที่เป็นอันตราย จึงควรกรองงานที่กำหนดเวลาไว้ที่ถูกต้องออก Select-Object cmdlet จะช่วยเราในเรื่องนี้
$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 มีสิ่งที่เรียกว่าสตรีมข้อมูลทางเลือก (ADS) ซึ่งหมายความว่าไฟล์ใน NTFS สามารถเลือกเชื่อมโยงกับสตรีมข้อมูลหลายขนาดตามต้องการได้ เมื่อใช้ ADS คุณสามารถซ่อนข้อมูลที่ไม่สามารถมองเห็นได้ผ่านการตรวจสอบระบบมาตรฐาน ทำให้สามารถแทรกโค้ดที่เป็นอันตรายและ/หรือซ่อนข้อมูลได้
ในการแสดงสตรีมข้อมูลทางเลือกใน PowerShell เราจะใช้ get-item cmdlet และเครื่องมือสตรีม Windows ในตัวที่มีสัญลักษณ์ * เพื่อดูสตรีมที่เป็นไปได้ทั้งหมด สำหรับสิ่งนี้ เราจะสร้างตัวแปร $ADS
$ADS = get-item * -stream * | where stream –ne ':$Data'
มันจะมีประโยชน์ในการค้นหารายชื่อผู้ใช้ที่เข้าสู่ระบบ สำหรับสิ่งนี้ เราจะสร้างตัวแปร $user และกำหนดให้กับการทำงานของโปรแกรม quser
$user = quser
ผู้โจมตีสามารถทำการเปลี่ยนแปลงการทำงานอัตโนมัติเพื่อตั้งหลักในระบบ เมื่อต้องการดูวัตถุเริ่มต้น คุณสามารถใช้ Get-ItemProperty cmdlet
มาสร้างตัวแปรสองตัวกัน: $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 loop ข้อมูลที่ได้รับจะถูกเขียนลงไฟล์
for ($w = 0; $w -lt $array.count; $w++){
$name = $arrayName[$w]
$array[$w] >> $path$name.txt
หลังจากรันสคริปต์แล้ว ไฟล์ข้อความ 9 ไฟล์จะถูกสร้างขึ้นซึ่งมีข้อมูลที่จำเป็น
ปัจจุบัน ผู้เชี่ยวชาญด้านความปลอดภัยทางไซเบอร์สามารถใช้ PowerShell เพื่อเพิ่มข้อมูลที่จำเป็นสำหรับการแก้ปัญหางานต่างๆ ในงานของตนได้ ด้วยการเพิ่มสคริปต์ในการเริ่มต้น คุณสามารถรับข้อมูลบางอย่างได้โดยไม่ต้องลบดัมพ์ รูปภาพ ฯลฯ
ที่มา: will.com