DFIR

IR 103: Remote Triage Tools

category
DFIR
date
Dec 25, 2021
slug
ir-102-remote-triage-tools
author
status
Public
tags
incident response
summary
Remote Triage thì dùng tools gì để vừa ngon, bổ, lại còn rẻ? Hiểu rõ cách thức hoạt động bên dưới của những tools này.
type
Post
thumbnail
updatedAt
Mar 1, 2023 08:53 AM
 
Các cuộc tấn công đánh cắp thông tin xác thực ngày càng được sử dụng nhiều bởi những kẻ tấn công ngày nay. Các công cụ như BloodHound (), DeathStar () giúp hacker tự động hóa quá trình tìm kiếm, xác định các thông tin đăng nhập trên hệ thống. Sau khi thu đạt được đặc quyền cao hơn, hacker sẽ dễ dàng “di chuyển” hơn bên trong môi trường của nạn nhân. Bài trước đã đề cập đến những rủi ro cao với Interactive Logons, phần này sẽ trình bày những cơ chế khác để truy cập các hệ thống từ xa theo cách không tương tác.

1. Công cụ Quản lý và Truy vấn hệ thống

💡
Windows Management Instrumentation Command-Line Utility
Windows Management Instrumentation (WMI) cho phép Quản trị viên, người tham gia Incident Response có thể thực hiện các thao tác và truy xuất vào hệ thống thông qua các lớp WMI. Microsoft tạo ra một công cụ dòng lệnh gọi là Windows Management Instrumentation Command-line utility - WMIC để tương tác với các lớp WMI.
DMTF (Distributed Management Task Force) trước đây đã tạo ra Common Information Model (CIM), CIM cung cấp tiêu chuẩn mở để mô tả các tài nguyên CNTT đều là các đối tượng, người dùng truy vấn, cấu hình tài nguyên thông qua việc tương tác với các đối tượng. Microsoft đã triển khai CIM dưới dạng WMI, nó sử dụng mô hình Remote Procedure Call/Distributed Component Object Model (RPC/DCOM) để thiết lập các kết nối từ xa đến các hệ thống được quản lý hoặc được truy vấn. Hiện nay Microsoft đã triển khai Windows Management Infrastructure (MI) có tính tương thích ngược với WMI, MI tận dụng Windows Remote Management (WinRM) là một triển khai của Web Services for Management (WS-Management). WS-Management sử dụng giao thức SOAP (Simple Object Access Protocol) qua HTTP/HTTPS để dễ dàng cho việc truy vấn và quản lý tài nguyên mạng từ xa.
Như vậy để có thể tương tác với các lớp WMI có thể thông qua RPC/DCOM là cách truyền thống hoặc thông qua WinRM là MI. Bài này sẽ tập chung vào sử dụng WMIC để tương tác với các lớp WMI trên các kết nối RPC/DCOM truyền thống. Cuối cùng, cũng sẽ trình bày về Powershell.

1.1. Tìm hiểu về WMI và cú pháp WMIC

💡
Understanding WMI and the WMIC Syntax
WMI cung cấp một lượng lớn các tùy chọn để tương tác với hệ thống Windows, điều đó cũng đồng nghĩa nó cũng phức tạp. Đối với công việc của người làm IR thì không cần phải thông thạo tất cả mà chỉ một phần chức năng của WMI là đã đủ để thực hiện các yêu cầu. WMIC là công cụ dòng lệnh, đơn giản hóa việc truy cập vào WMI thông qua một tập hợp các aliases cho phép chúng ta tạo ra các lệnh tương đối đơn giản sau đó nó được WMIC chuyển đổi thành cú pháp cần thiết đê truy vấn WMI.
WMIC có thể được chạy ở 2 chế độ:
  • Chế độ tương tác trực tiếp: Thông qua một WMI-aware shell
  • Chế độ không tương tác: Thông qua lệnh wmic ở cửa sổ dòng lệnh và WMI Query Language (WQL) để lọc kết quả đầu ra (Khuyên dùng)
Ví dụ minh họa chạy WMIC ở chế độ không tương tác:
C:\>wmic /node:"server1" process where name="svchost.exe" get name, processid, parentprocessid, commandline CommandLine Name ParentProcessId ProcessId C:\Windows\system32\svchost.exe -k DcomLaunch -p svchost.exe 868 1008 C:\Windows\system32\svchost.exe -k RPCSS -p svchost.exe 868 924 C:\Windows\system32\svchost.exe -k DcomLaunch -p -s LSM svchost.exe 868 1088 C:\Windows\System32\svchost.exe -k netsvcs -p -s BDESVC svchost.exe 868 1224 C:\Windows\System32\svchost.exe -k LocalSystemNetworkRestricted -p -s NcbService svchost.exe 868 1304 C:\Windows\system32\svchost.exe -k LocalServiceNetworkRestricted -p -s TimeBrokerSvc svchost.exe 868 1312 C:\Windows\system32\svchost.exe -k LocalSystemNetworkRestricted -p -s hidserv svchost.exe 868 1400 C:\Windows\System32\svchost.exe -k LocalServiceNetworkRestricted -p -s EventLog svchost.exe 868 1488 C:\Windows\system32\svchost.exe -k LocalService -p svchost.exe 868 1532 ...
Giải thích cú pháp:
  • Tham số /node:"server1" cho biết đây là một truy vấn đến hệ thống từ xa không phải cục bộ
  • Theo sau là process cho biết đây là một aliases (bí danh) đề cập đến lớp của WMI mà chúng ta muốn tương tác. Trong trường hợp này là lớp Win32_Process
  • Tiếp theo where name="svchost.exe" đây là cú pháp của WQL dùng để lọc kết quả trả về, thuộc tính Name của các đối tượng Win32_Process được chỉ định bằng svchost.exe
  • Cuối cùng get name, processid, parentprocessid, commandline là danh sách các thuộc tính của đối tượng, được phân cách bằng dấu ,
Một thách thức đối với WMIC đó là hiểu cấu trúc của các đối tượng hay chính là các thuộc tính của các lớp WMI. Cố gắng ghi nhớ tất cả thông tin này sẽ tốn thời gian, với vai trò tham gia ứng phó sự cố thì chúng ta chỉ cần một số ít đối tượng và thuộc tính liên quan của chúng. Sử dụng wmic /? để tìm hiểu thêm, ngoài ra cũng có thể tham khảo các tài liệu sau:
Ví dụ cho lớp Win32_Process
class Win32_Process : CIM_Process { string   CreationClassName; string   Caption; string   CommandLine; datetime CreationDate; string   CSCreationClassName; string   CSName; string   Description; string   ExecutablePath; uint16   ExecutionState; string   Handle; uint32   HandleCount; datetime InstallDate; uint64   KernelModeTime; uint32   MaximumWorkingSetSize; uint32   MinimumWorkingSetSize; string   Name; string   OSCreationClassName; string   OSName; uint64   OtherOperationCount; uint64   OtherTransferCount; uint32   PageFaults; uint32   PageFileUsage; uint32   ParentProcessId; uint32   PeakPageFileUsage; uint64   PeakVirtualSize; uint32   PeakWorkingSetSize; uint32   Priority = NULL; uint64   PrivatePageCount; uint32   ProcessId; uint32   QuotaNonPagedPoolUsage; uint32   QuotaPagedPoolUsage; uint32   QuotaPeakNonPagedPoolUsage; uint32   QuotaPeakPagedPoolUsage; uint64   ReadOperationCount; uint64   ReadTransferCount; uint32   SessionId; string   Status; datetime TerminationDate; uint32   ThreadCount; uint64   UserModeTime; uint64   VirtualSize; string   WindowsVersion; uint64   WorkingSetSize; uint64   WriteOperationCount; uint64   WriteTransferCount; };
Mặc dù WMI Namespace có thể phức tạp nhưng nó rất mạnh mẽ và hiệu quả trong thu thập thông tin về tài nguyên mạng, tài nguyên hệ thống. WMIC có thể tạo các kết nối từ xa thông qua RPC/DCOM, khiến nó trở thành công cụ cực kỳ hữu ích để ứng phó sự cố.
Các hệ thống trong quá trình hoạt động thì luôn thay đổi, khi tham gia ứng phó sự cố sẽ phải tương tác với hệ thống dẫn đến thay đổi bằng chứng số dù ít hay nhiều, nên cần phải được ghi lại và khuyến khích thực hiện các hành động này từ xa.

1.2. Một số tùy chọn của WMIC

💡
WMIC and WQL Elements
/node Sử dụng tên máy chủ hoặc địa chỉ IP. Dưới đây là một số tùy chọn hữu ích khác:
WMIC switches
WMIC switches
aliases cung cấp các bí danh, giúp dễ nhớ hơn khi truy cập vào các lớp WMI
Common WMIC aliases
Common WMIC aliases
Các kết quả từ WMIC có thể rất nhiều và khó hiểu, lúc này có thể sử dụng Management Instrumentation Query Language (WQL) một dạng ngôn ngữ truy vấn tương tự như Structured Query Language (SQL) để lọc dữ liệu.
Common where clause WQL operators
Common where clause WQL operators
Ví dụ sử dụng toán tử LIKE. Lưu ý là các toán tử của WQL không phân biệt chữ hoa-thường. Sử dụng các cặp nháy đơn, nháy kép lồng nhau hoặc ngoặc đơn sao cho phù hợp.
$ wmic process where "Name like 'svchost%'" get name, processid, parentprocessid, commandline $ wmic process where 'Name like "svchost%"' get name, processid, parentprocessid, commandline $ wmic process where (Name like "svchost%") get name, processid, parentprocessid, commandline
Một tùy chọn hữu ích khác nữa là /format/output để quy định đầu ra của kết quả
$ wmic computersystem list /format:csv > output.csv $ wmic /output:output.csv computersystem list /format:csv

1.3. Một số ví dụ về WMIC

💡
Example WMIC Commands
Các lệnh này có thể được chạy trước khi một sự cố xảy ra nhằm tạo CSDL cho các hệ thống, các lệnh nên được chạy hàng tuần là tốt nhất và kết quả được lưu ra tệp tin, ngoài việc nó giúp quản trị viên biết được hệ thống hoạt động ở trạng thái bình thường ra sao thì khi có sự cố xảy ra nó lại cực kì hữu dụng. Ví dụ lệnh sau chạy trên một hệ thống cục bộ và kết quả được lưu trữ vào một nơi có thể chia sẻ với người khác:
$ wmic environment list brief /format:list > \\server1\BaselineData\Client2\environment.txt
Ví dụ truy vấn đến một hệ thống từ xa, kết quả lưu vào một tệp txt tại hệ thống cục bộ:
$ wmic /node:server1 /output:processes.txt process get name, processid, parentprocessid, threadcount, handlecount, commandline $ wmic /node:"server1" /output:processes.txt process get name, processid, parentprocessid, threadcount, handlecount, commandline /format:list
Ví dụ giả sử bạn đã xác định được tiến trình độc hại và muốn dừng nó:
$ wmic /node:"server1" process where name="CRACKME.EXE" delete Deleting instance \\server1\ROOT\CIMV2:Win32_Process.Handle="2764" Instance deletion successful.
Ví dụ liệt kê các tiến trình được chạy từ một vị trí (đường dẫn) chứa chuỗi Download:
$ wmic process where (ExecutablePath LIKE "%Download%") get name, executablepath ExecutablePath Name C:\Program Files (x86)\Internet Download Manager\IDMan.exe IDMan.exe C:\Program Files (x86)\Internet Download Manager\IDMIntegrator64.exe IDMIntegrator64.exe ...
Ví dụ sử dụng toán tử NOT để lọc các tiến trình có đường dẫn không chứa chuỗi Windows:
$ wmic process where (NOT ExecutablePath LIKE "%Windows%") get name, executablepath, parentprocessid ExecutablePath Name ParentProcessId C:\Program Files\Common Files\Microsoft Shared\ClickToRun\OfficeClickToRun.exe OfficeClickToRun.exe 836 C:\Program Files\Microsoft SQL Server\90\Shared\sqlwriter.exe sqlwriter.exe 836 C:\Program Files\Canon\Canon MF Network Scanner Selector\CMFNSS6.EXE CMFNSS6.EXE 8028 C:\Program Files\Google\Chrome\Application\chrome.exe chrome.exe 9824 ...
Ví dụ sử dụng WMIC để khởi tạo tiến trình từ xa:
$ wmic /node:"server1" process call create "calc" Executing (Win32_Process)->Create() Method execution successful. Out Parameters: instance of __PARAMETERS { ProcessId = 6184; ReturnValue = 0; };
$ wmic /node:"server1" process where (Name LIKE "%Calc%") get name, processid, parentprocessid, commandline CommandLine Name ParentProcessId ProcessId "C:\Program Files\WindowsApps\Microsoft.WindowsCalculator_10.2103.8.0_x64__8wekyb3d8bbwe\Calculator.exe" -ServerName:App.AppXsm3pg4n7er43kdh1qp4e79f1j7am68r8.mca Calculator.exe 1008 11660
Ví dụ xác định địa chỉ IP, MAC, cấu hình mạng, sử dụng alias nicconfig:
$ wmic nicconfig get MACAddress, DefaultIPGateway, IPAddress, DNSHostName DefaultIPGateway DNSHostName IPAddress MACAddress {"192.168.10.1"} server1 {"192.168.10.116", "f88c::d559:1201:df56:b6c4"} 00:61:96:DF:F4:3E ...
Ví dụ xác định các thư mục đang được chia sẻ:
$ wmic /node:"server1" share list brief Description Name Path Remote Admin ADMIN$ C:\Windows Default share C$ C:\ Default share D$ D:\ Default share E$ E:\ Default share F$ F:\ Remote IPC IPC$
# Exclude Default Share $ wmic /node:"server1" share where (NOT Name LIKE "%$") list brief No Instance(s) Available.
Ví dụ xác định cách services, tham số /user chỉ định tên username đăng nhập, không có tham số /password nên khi chạy lệnh sẽ bật ra một prompted yêu cầu nhập password. Đầu ra có thể lưu ra file csv bằng > hoặc >> hoặc dùng tham số /output
$ wmic /node:server1 /user: administrator@company.demo service get Name, Caption, State, StartMode, pathname /format:csv $ wmic /node:"server1" service get Name, Caption, State, StartMode, pathname /format:csv Node,Caption,Name,PathName,StartMode,State server1,Base Filtering Engine,BFE,C:\Windows\system32\svchost.exe -k LocalServiceNoNetworkFirewall -p,Auto,Running server1,AllJoyn Router Service,AJRouter,C:\Windows\system32\svchost.exe -k LocalServiceNetworkRestricted -p,Manual,Stopped server1,Application Layer Gateway Service,ALG,C:\Windows\System32\alg.exe,Manual,Stopped server1,Application Host Helper Service,AppHostSvc,C:\Windows\system32\svchost.exe -k apphost,Auto,Running ...
$ wmic /node:"server1" service get Name, Caption, State, StartMode, pathname /format:list Caption=Application Layer Gateway Service Name=ALG PathName=C:\Windows\System32\alg.exe StartMode=Manual State=Stopped Caption=AppX Deployment Service (AppXSVC) Name=AppXSvc PathName=C:\Windows\system32\svchost.exe -k wsappx -p StartMode=Manual State=Running Caption=DHCP Client Name=Dhcp PathName=C:\Windows\system32\svchost.exe -k LocalServiceNetworkRestricted -p StartMode=Auto State=Running ...
Ví dụ xác định các bản vá hệ thống (Hotfixs), hữu dụng khi hacker đang chủ đích nhắm vào một lỗ hổng cụ thể, cần xác định xem hệ thống nào đã vá hoặc chưa vá lỗ hổng đó. Giả sử tệp Systems.txt chứa danh sách Computername, mỗi tên đặt trên một dòng.
# Systems.txt DC1 DC2 SERVER1 SERVER2 CLIENT1 CLIENT2
$ wmic /node:@Systems.txt qfe get csname, description, FixComments, HotFixID, InstalledBy,InstalledOn,ServicePackInEffect $ wmic /node:"server1" qfe get csname, description, FixComments, HotFixID, InstalledBy,InstalledOn,ServicePackInEffect CSName Description FixComments HotFixID InstalledBy InstalledOn ServicePackInEffect server1 Update KB5007289 NT AUTHORITY\SYSTEM 11/27/2021 server1 Update KB5000736 4/9/2021 server1 Update KB5003791 NT AUTHORITY\SYSTEM 11/27/2021 ...
Khi truy cập vào các node, nếu không truy cập được sẽ xuất hiện lỗi RPC Server not available. Trường hợp phải kết nối để truy vấn một lượng lớn các máy chủ, để giảm thời gian kết nối sử dụng tham số /failfast:on. Nếu sử dụng tham số /output để chỉ định đầu ra thì trong tệp kết quả sẽ không xuất hiện lỗi mà nó chỉ xuất hiên ở màn hình console. Có thể sử dụng kiểu xuất kết quả sau để lưu kết quả ra một tệp, lỗi ra một tệp: 1>results.txt 2>errors.txt
$ wmic /node:@Systems.txt /failfast:on qfe get csname, description, FixComments, HotFixID, InstalledBy,InstalledOn,ServicePackInEffect 1>results.txt 2>errors.txt
Ví dụ sử dụng vòng lặp để chạy nhiều lệnh:
# Hosts.txt DC1 DC2 SERVER1 SERVER2
$ for /F %i in (Hosts.txt) do @echo scanning %i & wmic /node:%i process get name, processid, parentprocessid, threadcount, handlecount >> %i.txt & wmic /node:%i environment list brief >> %i.txt & wmic /node:%i nicconfig get MACAddress, DefaultIPGateway, IPAddress, IPSubnet, DNSHostName, DNSDomain >> %i.txt & wmic /node:%i service get Name, Caption, State, ServiceType, StartMode, pathname >> %i.txt & wmic /node:%i qfe get description, FixComments, HotFixID, InstalledBy, InstalledOn, ServicePackInEffect >> %i.txt # Example, run in local, for one machine $ echo scanning %computername% & wmic /node:"%computername%" process get name, processid, parentprocessid, threadcount, handlecount >> %computername%.txt & wmic /node:"%computername%" environment list brief >> %computername%.txt & wmic /node:"%computername%" nicconfig get MACAddress, DefaultIPGateway, IPAddress, IPSubnet, DNSHostName, DNSDomain >> %computername%.txt & wmic /node:"%computername%" service get Name, Caption, State, ServiceType, StartMode, pathname >> %computername%.txt & wmic /node:"%computername%" qfe get description, FixComments, HotFixID, InstalledBy, InstalledOn, ServicePackInEffect >> %computername%.txt
Ký tự & đại diện cho bắt đầu một lệnh mới. Cần thu thập định kỳ các thông tin này để sử dụng như là một CSDL mẫu (Thu thập theo ngày, format lại theo ngày tránh bị trùng tên: %i%date:˜-4,4%%date:˜-7,2%%date:˜-10,2%.txt). Khi sự cố xuất hiện, với cùng một lệnh chạy có thể kết quả sẽ khác biệt so với CSDL trước đó, lúc này tiến hành đối chiếu để xác định sự bất thường.
WMIC có từ Windows XP, nó đã cung cấp cho quản trị viên và những người làm Ứng phó sự cố với một công cụ mạnh mẽ. Tuy nhiên với Powershell, chúng ta sẽ còn có một công cụ mạnh mẽ hơn, trong phần tiếp theo chúng ta sẽ tìm hiểu Powershell và cả những cách thức để truy cập WMI thông qua Powershell.

2. PowerShell

Powershell đã cải thiện khái niệm về command-line interface rất nhiều. Chúng ta đã nói về Common Information Model (CIM) để mô tả các tài nguyên CNTT như là các đối tượng. Đối tượng thì sẽ có các thuộc tính và các phương thức như là các hành động của đối tượng đó. Ví dụ: Một đối tượng của lớp Process sẽ có các thuộc tính như ProcessID, ProcessName, ParentProcessID, ProcessPath và các phương thức: Create, Delete. Sức mạnh đằng thực sự đằng sau Powershell xuất phát từ thực tế là khi bạn thực hiện một yêu cầu với Powershell, kết quả bạn nhận được không chỉ đơn giản là văn bản mà còn là đối tượng. Ví dụ: Đối tượng đại diện cho tiến trình với các thuộc tính và phương thức đi kèm. Trong các Shell truyền thống, khi bạn chuyển đầu ra của một lệnh làm đầu vào của lệnh khác (PIPE) thì nó chỉ đơn giản là chuyển văn bản. Nhưng với Powershell, bạn đang chuyển các đối tượng xuống đường ống (Pipeline) đi kèm với các thuộc tính và phương thức.
Powershell sử dụng các CmdLets để nhận các lệnh từ người dùng hoặc scripts. Các CmdLets bao gồm một động từ và một danh từ và nối với nhau bằng một dấu gạch. VD: Get-Process là một CmdLet lấy thông tin về các tiến trình trên hệ thống. Động từ trong trường hợp này là Get và danh từ là Process
Một CmdLet rất mạnh mẽ và quan trọng để hỗ trợ bạn trong quá trình sử dụng Powershell là Get-Help. Ví dụ: Get-Help Get-Process -Examples sẽ cung cấp các ví dụ mẫu về các sử dụng cũng như cú pháp của Get-Process CmdLet:
$ Get-Help Get-Process -Detailed
Ngoài việc cung cấp một công cụ dòng lệnh là powershell.exe thì nó cũng cung cấp một công cụ gọi là PowerShell ISE (powershell_ise.exe) cung cấp một môi trường để tạo và kiểm tra các tập lệnh Powershell, tương tác với hệ thống cục bộ hoặc từ xa. Lợi thế khi sử dụng Powershell ISE là tính năng IntelliSense (nhắc code).
PowerShell ISE IntelliSense feature at work as the user types
PowerShell ISE IntelliSense feature at work as the user types
Một CmdLet cũng sẽ có các tham số, nó được chỉ định bằng một dấu gạch ngang đằng trước. VD: Get-Help Get-Process -ShowWindow sẽ bật lên một cửa sổ hiển thị trợ giúp cho Get-Process.
Ngoài Get-Help thì Powershell cũng có một CmdLet hỗ trợ khác là Get-Command dùng trong trường hợp bạn không muốn nhớ tên các CmdLets, nó sẽ hiện kết quả gợi ý. Ví dụ:
$ Get-Command *process* CommandType Name Version Source ----------- ---- ------- ------ Function Get-AppvVirtualProcess 1.0.0.0 AppvClient Function Start-AppvVirtualProcess 1.0.0.0 AppvClient Cmdlet ConvertTo-ProcessMitigationPolicy 1.0.12 ProcessMitigations Cmdlet Debug-Process 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Enter-PSHostProcess 3.0.0.0 Microsoft.PowerShell.Core Application qprocess.exe 10.0.19... C:\Windows\system32\qprocess.exe ...

2.1. Powershell và các CmdLet cơ bản

💡
Basic PowerShell Cmdlets
Thực hiện truy vấn với các CmdLet có thể sẽ trả về nhiều kết quả, ở đây có thể là các đối tượng đi cùng với các thuộc tính và phương thức. Sử dụng CmdLet Get-Member để xem thông tin về một CmdLet khác bao gồm các: Thuộc tính, Phương thức, Alias,.v.v.. Ví dụ muốn xem mô tả về CmdLets Get-Process:
$ Get-Process | Get-Member TypeName: System.Diagnostics.Process Name MemberType Definition ---- ---------- ---------- Handles AliasProperty Handles = Handlecount Name AliasProperty Name = ProcessName Disposed Event System.EventHandler Disposed(System.Object, System.EventArgs) Kill Method void Kill() Start Method bool Start() __NounName NoteProperty string __NounName=Process BasePriority Property int BasePriority {get;} Container Property System.ComponentModel.IContainer Container {get;} EnableRaisingEvents Property bool EnableRaisingEvents {get;set;} Company ScriptProperty System.Object Company {get=$this.Mainmodule.FileVersionInfo.CompanyName;} CPU ScriptProperty System.Object CPU {get=$this.TotalProcessorTime.TotalSeconds;} ...
Sử dụng Cmdlet Select-Object với tham số -Property để hiển thị bất kỳ thuộc tính nào chúng ta chọn, giống như get với WMIC. Ví dụ:
Get-Process | Select-Object -Property ProcessName, ID, StartTime ProcessName Id StartTime ----------- -- --------- ApplicationFrameHost 2176 18/12/2021 8:23:09 AM audiodg 8084 20/12/2021 9:16:49 AM backgroundTaskHost 8476 20/12/2021 10:51:19 AM Calculator 11344 18/12/2021 8:25:16 AM chrome 664 20/12/2021 9:35:11 AM ...
Một CmdLet có thể có nhiều Alias khác với cú pháp ngắn hơn. Ví dụ với CmdLet Get-ChildItem có alias là dir (cmd.exe), ls (*nix shell) gci (viết tắt cho Get-ChildItem). Nên sử dụng cú pháp đầy đủ và rõ ràng, tránh sử dụng các alias gây khó hiểu mặc dù nó có ưu điểm là ngắn gọn.
$ Get-ChildItem $ ls $ dir $ gci $ Get-Process | Select-Object -Property ProcessName, ID, StartTime $ gps | select name, ID, starttime
Ngoài việc sử dụng CmdLet Select-Object để chọn các thuộc tính, chúng ta cũng có thể sử dụng Cmdlet Where-Object để chọn các thuộc tính, với Where-Object hỗ trợ chúng ta cú pháp giống như truy vấn WQL của WMIC. Ví dụ:
$ Get-Process -Name "powers*" $ Get-Process | Where-Object -Property name -Like power* Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName ------- ------ ----- ----- ------ -- -- ----------- 500 26 63336 73664 0.58 11152 1 powershell 906 53 166044 185112 62.95 11788 1 powershell
Lưu ý: WMIC sử dụng % làm ký tự đại diện còn Powershell sử dụng * cho cùng mục đích. Các phép so sánh trong Powershell được bắt đầu bằng -, ví dụ: -eq, -ne, -like. Có thể sử dụng một số CmdLets để sắp xếp kết quả với Sort-Object, nhóm các kết quả với Group-Object, đếm hoặc đo lường kết quả với Measure-Object. Tương tự như WMIC, Powershell cũng cung cấp nhiều CmdLet để định dạng dữ liệu như dạng bảng, danh sách, hay nhiều dạng khác: Format-Table, Format-List, Out-GridView, Export-Csv.
$ Get-Process | Format-Table -Property ProcessName, Id ProcessName Id ----------- -- ApplicationFrameHost 2176 audiodg 14168 Calculator 11344 chrome 664 ...
Bảng dưới đây liệt kê một số các CmdLets hữu ích và hay dùng thực hiện Remote Triage.
CMDLET
DESCRIPTION
Get-ADComputer
Truy vấn Active Directory thông tin tài khoản máy tính. CmdLet này được tìm thấy trên Domain Controller hoặc có thể được thêm thủ công vào một máy trạm.
Get-ADUser
Truy vấn Active Directory thông tin tài khoản người dùng Domain. Cmdlet này được tự động tải xuống trên Domain Controller; Nó có thể được thêm vào thủ công vào một máy trạm
Get-ChildItem
Liệt kê các items trong một thư mục, một registry hoặc một vị trí nào đó
Get-CimInstance
Truy cập vào các CIM Instances từ máy chủ CIM. Đây là một cách được sử dụng để truy cập vào các lớp WMI/MI.
Get-Content
Lấy nội dung của một đối tượng, ví dụ một tệp tin
Get-EventLog
Truy cập vào Windows Event Logs. Có thể sử dụng Get-WinEvent để thay thế.
Get-HotFix
Lấy thông tin các bản cập nhật hệ thống
Get-ItemProperty
Lấy thuộc tính của một item, bao gồm cả các registry key.
Get-LocalUser
Lấy thông tin về tài khoản người dùng cục bộ.
Get-NetTCPConnection
Thông tin các kết nối mạng. Giao thức TCP
Get-NetUDPEndpoint
Thông tin các kết nối mạng. Giao thức UDP
Get-Process
Lấy thông tin các tiến trình đang chạy
Get-Service
Lấy thông tin các dịch vụ trên hệ thống
Get-WinEvent
Lấy thông tin về các Event Logs
Get-WmiObject
Truy cập các đối tượng WMI. Có thể sử dụng Get-CimInstance để thay thế
ForEach-Object
Lặp, duyệt các phần tử trong một danh sách
Start-Transcript
Ghi/Lưu lại một loạt các lệnh Powershell
Stop-Transcript
Dừng ghi/lưu lại các lệnh Powershell ở phiên trước đó.
Danh sách trên chỉ là một phần nhỏ trong số rất nhiều các CmdLets của Powershell, mục đích để chúng ta dễ dàng tiếp cận.

2.2. Quản trị từ xa với Powershell

💡
PowerShell Remoting
Một tính năng mạnh mẽ khác của Powershell đó là Remoting. Powershell đôi khi được mô tả như là C#, nó cung cấp giao diện dòng lệnh có quyền truy cập vào các lớp .NET và WMI. Với Powershell Remoting, bạn có thể tương tác, sửa đổi các hệ thống từ xa một cách an toàn, người thực hiện ứng phó sự cố có thể tận dụng Powershell để đơn giản hóa công việc cũng như sử dụng trong quá trình phòng thủ hệ thống. Do những đặc tính của Powershell, nó còn được các attacker lợi dụng để sử dụng công cụ này để tấn công hệ thống, đặc biệt trong các pha Lateral MovementPost-Exploitation.
Powershell là một chủ đề rộng và bài này không thể trình bày hết được, tôi khuyến khích người đọc chủ động tìm hiểu thêm về Powershell, công nghệ này rất mạnh mẽ được cho là tương lai của Windows, kể từ Powershell Core 6, nó không còn chỉ là chạy trên Windows mà đã xuất hiện ở cả Linux và macOS.
Powershell Remoting tận dụng WinRM, điều này cung cấp một cơ chế dựa trên SOAP để tương tác với các hệ thống từ xa thông qua kết nối HTTP. Mặc định, WinRM hoạt động thông qua cổng TCP 5895, với HTTPS nó hoạt động thông qua cổng TCP 5896. Trong môi trường Domain thì cổng 5895 được sử dụng là tiêu chuẩn cho WinRM và Powershell Remoting khi trao đổi Kerberos có thể xác thực cả 2 bên. Sử dụng HTTPS thông qua cổng 5896 với các hệ thống không được liên kết với Domain và yêu cầu phải có chứng chỉ SSL/TLS để xác định danh tính.
Powershell Remoting sử dụng mã hóa AES-256 để giao tiếp cho dù bạn sử dụng HTTP hay HTTPS. Tham khảo: https://docs.microsoft.com/en-us/powershell/scripting/learn/remoting/winrmsecurity
Có 2 tùy chọn chính để sử dụng Powershell Remoting là sử dụng các CmdLets:
  • Enter-PSSession: Kết nối từ xa kiểu 1-1 tương tự như SSH
  • Invoke-Command: Kết nối từ xa kiểu 1-n, cho phép các lệnh được chạy trên nhiều hệ thống song song
Các CmdLets này đều hỗ trợ tham số -ComputerName để chỉ định hệ thống từ xa muốn kết nối, nhưng có một số khác biệt:
  • Enter-PSSession: Chỉ chấp nhận tên của một máy tính ở một thời điểm
  • Invoke-Command: Chấp nhận nhiều tên máy tính ở một thời điểm
Trong cả hai trường hợp, ComputerName phải ở dạng NetBIOS hoặc Domain Name. Kể từ khi Powershell sử dụng xác thực dựa trên Kerberos theo mặc định thì nó không còn sử dụng trực tiếp các địa chỉ IP nữa. Các địa chỉ IP được dùng riêng cho trường hợp các máy đó ko phải là một phần của Active Directory.
Ví dụ sử dụng CmdLet Enter-PSSession để khởi tạo một phiên kết nối đến máy có tên DC1. Tham số -Credential sẽ bật lên một hộp thoại nhập mật khẩu cho người dùng, để thoát khỏi phiên sử dụng lệnh exit:
$ Enter-PSSession -ComputerName DC1 -Credential administrator@company.demo
Ví dụ sử dụng CmdLet Invoke-Command để khởi tạo nhiều phiên kết nối đồng thời, sử dụng trong trường hợp cần quét cùng lúc một lượng lớn các máy chủ trong hệ thống.
$ Invoke-Command -ComputerName dc1, dc2, dc3, dc4 -ScriptBlock {Get-Process | Where-Object -Property name -eq chrome} Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName PSComputerName ------- ------ ----- ----- ------ -- -- ----------- -------------- 405 20 114040 165372 105.72 1232 1 chrome dc1 276 17 28112 65400 9.64 2656 1 chrome dc2 274 17 21996 48112 0.58 7176 1 chrome dc3 288 22 53204 94308 2.28 7304 1 chrome dc4
Tham số ComputerName chỉ ra tên các máy chủ sẽ kết nối đến và tham số ScriptBlock là lệnh sẽ thực thi trên các máy đích từ xa, lệnh này sẽ liệt kê các tiến trình và lọc kết quả có tên “chrome”.
Cũng lưu ý là với Invoke-Command, nó thực hiện khởi tạo phiên kết nối và thực thi lệnh trong ScriptBlock, lấy kết quả và phiên kết nối bị hủy ngay sau đó. Ngoài ra có một tham số cần chú ý là ThrottleLimit chỉ định số kết nối đồng thời, theo mặc định giá trị này là 32.

2.3. Truy cập vào các lớp WMI/MI/CIM với Powershell

💡
Accessing WMI/MI/CIM with PowerShell
Ở các phần trước đã giới thiệu về Windows Management Instrumentation (WMI), Windows Management Infrastructure (MI) và Common Information Model (CIM). MI được Microsoft gọi là thế hệ tiếp theo của WMI, nó tương thích ngược với WMI và nó phù hợp hơn với tiêu chuẩn CIM hiện đại.
Powershell có một CmdLet để tương tác với WMI đó là Get-WmiObject, nó tương tự như công cụ dòng lệnh WMIC, nó cũng giao tiếp thông qua RPC/DCOM. CmdLet này cũng đã hỗ trợ tham số ComputerName, tuy nhiên nó không giống với các CmdLet của Powershell Remoting: Các CmdLet của nó như Enter-PSSession, Invoke-Command đều giao tiếp thông qua WinRM.
Một CmdLet mới hơn đó là Get-CimInstance dùng để truy cập vào các lớp WMI/MI. CmdLet này tận dụng được các tùy chọn tìm kiếm và định dạng mà Powershell hỗ trợ. Ví dụ sau sử dụng Get-CimInstance truy cập vào lớp WMI thông qua định danh cũ vấn thường sử dụng với WMIC trước đó:
$ Get-CimInstance -ClassName Win32_Process
Điểm khác biệt khi sử dụng Powershell truy cập vào các lớp này so với việc sử dụng WMIC đó là kết quả trả về là các đối tượng, chúng có những phương thức và thuộc tính, trường hợp này đối tượng của lớp System.Diagnostics.Process
$ Get-Process | Get-Member TypeName: System.Diagnostics.Process Name MemberType Definition ---- ---------- ---------- Handles AliasProperty Handles = Handlecount Name AliasProperty Name = ProcessName .. Disposed Event System.EventHandler Disposed(System.Object, System.EventArgs) ErrorDataReceived Event System.Diagnostics.DataReceivedEventHandler ErrorDataReceived(System.Object, System.D... .. BeginErrorReadLine Method void BeginErrorReadLine() BeginOutputReadLine Method void BeginOutputReadLine() .. BasePriority Property int BasePriority {get;} Container Property System.ComponentModel.IContainer Container {get;} .. PSConfiguration PropertySet PSConfiguration {Name, Id, PriorityClass, FileVersion} PSResources PropertySet PSResources {Name, Id, Handlecount, WorkingSet, NonPagedMemorySize, PagedMemorySize, ... ..
$ Get-CimInstance -ClassName Win32_Process | Get-Member TypeName: Microsoft.Management.Infrastructure.CimInstance#root/cimv2/Win32_Process Name MemberType Definition ---- ---------- ---------- Handles AliasProperty Handles = Handlecount ProcessName AliasProperty ProcessName = Name .. Clone Method System.Object ICloneable.Clone() Dispose Method void Dispose(), void IDisposable.Dispose() .. Caption Property string Caption {get;} CommandLine Property string CommandLine {get;} .. Path ScriptProperty System.Object Path {get=$this.ExecutablePath;}
Sử dụng kết hợp với các CmdLets lọc dữ liệu khác của Powershell như: Where-Object, Select-Object, Format-Table, Format-List,.v.v..
$ Get-CimInstance -ClassName Win32_Process | Format-Table -Property Name, ProcessId, ParentProcessId, CommandLine Name ProcessId ParentProcessId CommandLine ---- --------- --------------- ----------- System Idle Process 0 0 System 4 0 Registry 124 4 smss.exe 484 4 csrss.exe 656 644 wininit.exe 748 644 csrss.exe 756 740 services.exe 820 748 lsass.exe 840 748 C:\Windows\system32\lsass.exe winlogon.exe 916 740 winlogon.exe svchost.exe 496 820 C:\Windows\system32\svchost.exe -k DcomLaunch -p fontdrvhost.exe 584 748 "fontdrvhost.exe" fontdrvhost.exe 596 916 "fontdrvhost.exe" svchost.exe 868 820 C:\Windows\system32\svchost.exe -k RPCSS -p svchost.exe 1044 820 C:\Windows\system32\svchost.exe -k DcomLaunch -p -s LSM dwm.exe 1112 916 "dwm.exe" ...
Như vậy, Powershell cung cấp một công cụ linh hoạt, mềm dẻo, có tính mở rộng cao, hỗ trợ thực thi từ xa một cách an toàn, bảo mật. Ở các bài sau sẽ nói về cách mà Powershell hỗ trợ truy vấn các EventLog của Windows.

3. Một số Incident Response Framework

Các framework được thiết kế để tự động hóa và nâng cao hiệu quả của quá trình Incident Response:
KANSA - A Powershell incident response framework
  • Nhiều modules thu thập thông tin từ xa: ASEP, Configuration, Disk, IOC, Log, Memory, Net, và Process.
  • Dễ dàng tùy biến, chỉnh sửa mã nguồn để phù hợp với yêu cầu
  • Hoạt động tốt nhất trên Powershell 3.0 hoặc mới hơn
  • Kết hợp với công cụ khác để tăng hiệu quả. VD: Autorunsc ⇒ Thực chất là nó copy tệp thực thi lên các hệ thống từ xa sau đó thực thi và lấy kết quả về.
  • Hỗ trợ phân tích, so sánh, tương quan các kết quả sau đó tìm ra sự khác biệt ⇒ VD: Một phòng ban có 20 máy, do đặc thù chung bộ phận nên các máy cài đặt phần mềm giống nhau ⇒ Kh thực hiện truy vấn các máy tính nếu máy nào xuất hiện tiến trình lạ không xác định ⇒ dễ dàng biết được nó khác với các máy còn lại.
TheHive - A Scalable, Open Source and Free Security Incident Response Platform
  • Được mô tả là 4 trong 1
  • Tích hợp với MISP
  • Hoạt động với Elasticsearch để lưu trữ và trực quan hóa dữ liệu
GRR Rapid Response: remote live forensics for incident response
  • Phát triển bởi một nhóm tại Google, viết bằng Python
  • Hoạt động theo mô hình Client-Server. Phía Server sẽ tương tác với các hệ thống được cài đặt Agent
  • Thực hiện phân tích bộ nhớ từ xa, tích hợp YARA rules, tìm kiếm tệp tin, truy vấn hệ thống
Velociraptor - Endpoint visibility and collection tool
  • Tác giả là một trong những người đóng góp chính cho dự án GRR Rapid Response và Rekall
  • Được thiết kế giảm đi sự “cồng kềnh” so với GRR nhưng vẫn phải mạnh mẽ trong ứng phó sự cố
  • Công cụ này viết bằng Golang
Restrea2r - Collecting & Hunting for IOCs with gusto and style
  • Tương tác với AV Console
  • Xử lý và thu thập các artifacts từ xa: memory dump, prefetch, browser history, .v.v..
  • Tích hợp YARA rules để quét các tệp hoặc memory
  • Kết hợp với các công cụ khác trong bộ Sysinternal suite để tăng hiệu quả.
Fenrir - Simple Bash IOC Scanner
  • Quét hệ thống với các IOCs đã biết
  • Nó tương tự như THOR và LOKI
  • Hỗ trợ Linux, macOS
Kolide Fleet/FleetDM - open-source Osquery Fleet Manager
  • Truy vấn thông tin hệ thống dựa trên OSQuery
  • Tương tự như việc truy vấn WMI/MI và còn nhiều hơn thế nữa.
OSSEC - Host Intrusion Detection System
  • Hệ thống phát hiện xâm nhập dựa trên host
  • Cảnh báo tại các endpoint, giám sát toàn vẹn tệp tin, được sử dụng bởi Alientvault
  • OSSEC có cộng đồng sử dụng khá lớn.
Wazuh - The Open Source Security Platform
  • Một giải pháp giám sát điểm cuối mới, đang dần phổ biến gần đây
  • Agent của nó được fork ra từ OSSEC và phát triển thêm các tính năng khác
  • Giải pháp này tuy miễn phí nguồn mở nhưng lại hỗ trợ khá nhiều tính năng và có thể kết hợp với nhiều hệ thống
Hệ thống CNTT của mỗi tổ chức là không giống nhau, tùy thuộc vào điều kiện, chiến lược và nhu cầu của tổ chức mà quyết định những giải pháp nguồn mở hay thương mại nào được sử dụng. Với bất kỳ sản phẩm bảo mật nào trước khi triển khai cũng cần được đánh giá, thử nghiệm kỹ lưỡng.

4. Kết luận

💡
Conclusion
Đối với người làm Incident Response, chỉ phân tích trên một hệ thống quy mô nhỏ là chưa đủ, bạn cần phải có những kỹ năng phân tích, đánh giá, xử lý trên một lượng lớn nhiều máy tính. Các công cụ như WMIC và Powershell sẽ giúp bạn trả lời những câu hỏi trong quá trình ứng phó sự cố ngay cả khi không có những công cụ/giải pháp ứng phó sự cố. Với giải pháp miễn phí nguồn mở như Kansa là đủ để giúp bạn tự động hóa các bước ứng phó sự cố trên hàng ngàn máy tính. Ngoài ra các giải pháp Agent-base rất có lợi thế khi cần xử lý một lượng lớn máy tính.

5. Tham khảo

  • Steve Anson (2020). Applied Incident Response, John Wiley & Sons, Inc