Sử dụng PowerShell để thu thập thông tin sự cố

PowerShell là một công cụ tự động hóa khá phổ biến thường được cả nhà phát triển phần mềm độc hại và chuyên gia bảo mật thông tin sử dụng.
Bài viết này sẽ thảo luận về tùy chọn sử dụng PowerShell để thu thập dữ liệu từ xa từ các thiết bị cuối khi ứng phó với các sự cố bảo mật thông tin. Để làm điều này, bạn sẽ cần viết một tập lệnh chạy trên thiết bị cuối và sau đó sẽ có mô tả chi tiết về tập lệnh này.

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
		}

	}

}

Để bắt đầu, hãy tạo một hàm mở rộng CSIRT, sẽ lấy một đối số - đường dẫn để lưu dữ liệu đã nhận. Do hầu hết các lệnh ghép ngắn đều hoạt động trong Powershell v5 nên phiên bản PowerShell đã được kiểm tra để đảm bảo hoạt động chính xác.

function CSIRT{
		
param($path)# при запуске скрипта необходимо указать директорию для сохранения
if ($psversiontable.psversion.major -ge 5)

Để dễ dàng điều hướng qua các tệp đã tạo, hai biến được khởi tạo: $date và $Computer, sẽ được gán tên máy tính và ngày hiện tại.

$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"

Chúng tôi nhận được danh sách các tiến trình đang chạy thay mặt cho người dùng hiện tại như sau: tạo một biến $process, gán cho nó lệnh ghép ngắn get-ciminstance với lớp win32_process. Bằng cách sử dụng lệnh ghép ngắn Select-Object, bạn có thể thêm các tham số đầu ra bổ sung, trong trường hợp của chúng tôi, chúng sẽ là parentprocessid (ID tiến trình gốc PPID), ngày tạo (ngày tạo quy trình), được xử lý (ID tiến trình PID), tên tiến trình (tên tiến trình), dòng lệnh ( lệnh chạy).

$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname, processid, commandline, parentprocessid

Để có danh sách tất cả các kết nối TCP và UDP, hãy tạo các biến $netTCP và $netUDP bằng cách gán cho chúng các lệnh ghép ngắn Get-NetTCPConnection và Get-NetTCPConnection tương ứng.

$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state

$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state

Điều quan trọng là phải tìm ra danh sách các nhiệm vụ và nhiệm vụ đã lên kế hoạch. Để thực hiện việc này, chúng tôi sử dụng các lệnh ghép ngắn get-ScheduledTask và Get-ScheduledJob. Hãy gán cho chúng các biến $task và $job, bởi vì Ban đầu, có rất nhiều tác vụ được lên lịch trong hệ thống, sau đó để xác định hoạt động độc hại, cần lọc ra các tác vụ được lên lịch hợp pháp. Lệnh ghép ngắn Select-Object sẽ giúp chúng ta điều này.

$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

Trong hệ thống tệp NTFS có một thứ gọi là luồng dữ liệu thay thế (ADS). Điều này có nghĩa là một tệp ở dạng NTFS có thể được liên kết tùy ý với nhiều luồng dữ liệu có kích thước tùy ý. Bằng cách sử dụng ADS, bạn có thể ẩn dữ liệu không thể hiển thị thông qua quá trình kiểm tra hệ thống tiêu chuẩn. Điều này giúp có thể tiêm mã độc và/hoặc ẩn dữ liệu.

Để hiển thị các luồng dữ liệu thay thế trong PowerShell, chúng tôi sẽ sử dụng lệnh ghép ngắn get-item và công cụ luồng Windows tích hợp có ký hiệu * để xem tất cả các luồng có thể có, để làm điều này, chúng tôi sẽ tạo biến $ADS.

$ADS = get-item * -stream * | where stream –ne ':$Data' 

Sẽ rất hữu ích khi tìm ra danh sách người dùng đã đăng nhập vào hệ thống; để làm điều này, chúng tôi sẽ tạo một biến $user và gán nó để thực thi chương trình quser.

$user = quser

Những kẻ tấn công có thể thực hiện các thay đổi đối với chế độ tự động chạy để giành được chỗ đứng trong hệ thống. Để xem các đối tượng khởi động, bạn có thể sử dụng lệnh ghép ngắn Get-ItemProperty.
Hãy tạo hai biến: $runUser - để xem quá trình khởi động thay mặt cho người dùng và $runMachine - để xem quá trình khởi động thay mặt cho máy tính.

$runUser = Get-ItemProperty 
"HKCU:SoftwareMicrosoftWindowsCurrentVersionRun"
$runMachine = Get-ItemProperty 
"HKLM:SoftwareMicrosoftWindowsCurrentVersionRun"

Để tất cả thông tin được ghi vào các tệp khác nhau, chúng tôi tạo một mảng có các biến và một mảng có tên tệp.


$array = $process, $netTCP, $netUDP, $task, $user, $runUser, $runMachine, $job, $ADS
$arrayName = "Processes", "TCPConnect", "UDPConnect" "TaskScheduled", "Users", "RunUser", "RunMachine",
"ScheduledJob", "Alternative Data Stream"

Và bằng cách sử dụng vòng lặp for, dữ liệu nhận được sẽ được ghi vào tệp.

for ($w = 0; $w -lt $array.count; $w++){
	$name = $arrayName[$w]
	$array[$w] >> $path$name.txt

Sau khi thực thi tập lệnh, 9 tệp văn bản sẽ được tạo chứa thông tin cần thiết.

Ngày nay, các chuyên gia an ninh mạng có thể sử dụng PowerShell để làm phong phú thêm thông tin họ cần để giải quyết nhiều nhiệm vụ khác nhau trong công việc. Bằng cách thêm tập lệnh vào quá trình khởi động, bạn có thể nhận được một số thông tin mà không cần xóa kết xuất, hình ảnh, v.v.

Nguồn: www.habr.com

Thêm một lời nhận xét