Javascript ctf bị xáo trộn

Gần đây tôi thấy javascript bị xáo trộn trong một thử thách CTF nhất định. Vì vậy, tôi đã cố gắng tìm ra cách giải mã nó. Tôi viết phương pháp này như dưới đây

–  Cách xáo trộn mã javascript

Phương pháp obfuscation nổi tiếng là như thế này

  • jjencode. http. //utf-8. jp/công khai/jjencode. html
  • aaencode. http. //utf-8. jp/công khai/aaencode. html
  • người đóng gói. http. //trưởng khoa. edward. tên/người đóng gói/
  • giải mã. http. // sanya. song ca ngọt ngào. thông tin/unyaencode/

và hơn thế nữa…

– Cách khử nhiễu

– Sử dụng tài liệu. viết phương pháp

eval[function[p,a,c,k,e,r]{e=String;if[!''.replace[/^/,String]]{while[c--]r[c]=k[c]||c;k=[function[e]{return r[e]}];e=function[]{return'\\w+'};c=1};while[c--]if[k[c]]p=p.replace[new RegExp['\\b'+e[c]+'\\b','g'],k[c]];return p}['0["1, 2"]',3,3,'alert|Hello|JavaScript'.split['|'],0,{}]]

change to below

document.write[function[p,a,c,k,e,r]{e=String;if[!''.replace[/^/,String]]{while[c--]r[c]=k[c]||c;k=[function[e]{return r[e]}];e=function[]{return'\\w+'};c=1};while[c--]if[k[c]]p=p.replace[new RegExp['\\b'+e[c]+'\\b','g'],k[c]];return p}['0["1, 2"]',3,3,'alert|Hello|JavaScript'.split['|'],0,{}]]

lưu ý. nếu mã được khử nhiễu có thẻ html như “trình kiểm tra [trường hợp của firefox]

Ngày nay, một trong những kỹ thuật được sử dụng nhiều nhất để phát tán phần mềm độc hại trên hệ thống windows là sử dụng JavaScript [js] dropper. Trong hầu hết các tình huống tấn công, js dropper đại diện cho giai đoạn đầu tiên của quá trình lây nhiễm phần mềm độc hại

Nó xảy ra vì các hệ thống Windows cho phép thực thi nhiều ngôn ngữ kịch bản khác nhau bằng Windows Script Host [WScript]. Điều này có nghĩa là, thông qua JavaScript, nó có thể được thực thi một lệnh gọi hệ thống tới hệ điều hành bên dưới

Sử dụng trình nhỏ giọt js làm giai đoạn đầu tiên của quá trình lây nhiễm phần mềm độc hại là phương pháp cho phép tác giả phần mềm độc hại vượt qua NIDS, HIDS và phần mềm chống phần mềm độc hại điểm cuối dễ dàng hơn so với việc loại bỏ một tệp nhị phân duy nhất chứa toàn bộ logic độc hại. Đồng thời, mã hóa JavaScript dễ thực hiện hơn nhiều so với mã hóa nhị phân. Hơn nữa, khó phát hiện một mẫu che giấu để tạo chữ ký cho trình nhỏ giọt độc hại do tính năng động của ngôn ngữ kịch bản

Xem xét điều đó, các kỹ thuật xáo trộn js tương tự cũng được sử dụng để khai thác xáo trộn cho các trình duyệt và để ngăn chặn hành vi trộm cắp và tái sử dụng mã. Trong bài viết này, tôi sẽ chỉ ra các kỹ thuật làm xáo trộn khác nhau và một ví dụ thực tế để hiểu tầm quan trọng của việc biết cách đảo ngược một ống nhỏ giọt js bị xáo trộn vì hầu hết thời gian chúng bị xáo trộn bởi một chuỗi gồm một hoặc nhiều kỹ thuật

Kỹ thuật che giấu mã JavaScript

Làm xáo trộn mã JavaScript sẽ làm phức tạp quá trình phân tích tĩnh của mã độc. Mục đích chính của obfuscation là làm cho việc hiểu logic mã khó hơn trong khi vẫn giữ nguyên hành vi của mã

Thông qua phân tích động, bạn có thể quan sát hành vi độc hại của mã, nhưng chỉ khi một số điều kiện là đúng. Nếu những điều kiện đó không bao giờ được đáp ứng, bạn không thể phát hiện hành vi độc hại của mã bằng phân tích động. Một điều kiện có thể là kiểm tra xem môi trường thực thi thực tế không được ảo hóa hay không và nếu điều kiện này sai, mã sẽ không thực thi. Điều này đã xảy ra với ống nhỏ giọt js mà tôi đã phân tích. Hãy xem chi tiết hơn

Đảo ngược thủ công trở nên quan trọng khi phân tích động không thể giúp nhà phân tích

Theo nghiên cứu đó [1], có thể xác định các kỹ thuật che giấu JavaScript cơ bản được phân loại như sau

  • Làm xáo trộn ngẫu nhiên

Trong kiểu che giấu này, một số phần tử của mã JavaScript được chèn hoặc thay đổi mà không làm thay đổi ngữ nghĩa của mã

Các kỹ thuật phổ biến được sử dụng trong danh mục này là ngẫu nhiên hóa khoảng trắng, ngẫu nhiên hóa nhận xét và ngẫu nhiên hóa biến và tên

Mục đích chính của các kỹ thuật này là chuyển đổi các giá trị biến hoặc hằng số thành kết quả tính toán của một hoặc các biến hoặc hằng số máy chủ.

    • Hai kỹ thuật chính thuộc loại này. tách chuỗi và thay thế từ khóa
    • Tách chuỗi bao gồm việc chuyển đổi một chuỗi thành một chuỗi nối của một số chuỗi con
    • Thay thế từ khóa bao gồm đặt một từ khóa JavaScript trong một biến và sau đó sử dụng biến đó thay vì từ khóa JavaScript

Thông thường, có ba cách để mã hóa mã gốc. Cách đầu tiên là chuyển đổi mã thành các ký tự ASCII thoát, Unicode hoặc biểu diễn thập lục phân. Phương pháp thứ hai sử dụng các chức năng mã hóa tùy chỉnh, trong đó những kẻ tấn công thường sử dụng một chức năng mã hóa để tạo mã bị xáo trộn và đính kèm một chức năng giải mã để giải mã nó trong quá trình thực thi

Ngoài ra, một số phương pháp mã hóa và giải mã tiêu chuẩn có thể được sử dụng để thực hiện mã hóa JavaScript. Ví dụ, JScript. Encode là một phương pháp do Microsoft tạo ra để mã hóa mã JavaScript. Nó có thể được sử dụng để bảo vệ mã nguồn cũng như tránh bị phát hiện

Loại kỹ thuật che giấu này là để điều khiển luồng thực thi của mã JavaScript bằng cách thay đổi cấu trúc logic mà không ảnh hưởng đến ngữ nghĩa ban đầu. Có hai cách để thực hiện xáo trộn cấu trúc logic. Một cách là chèn một số hướng dẫn độc lập với chức năng. Cách khác là thêm hoặc thay đổi một số nhánh điều kiện, chẳng hạn như if…else, switch…case, for, while, v.v.

Sức mạnh của những kỹ thuật đó có được khi chúng được kết hợp với nhau, việc giải mã từng kỹ thuật riêng biệt có thể dễ dàng đối với nhà phân tích. Thay vào đó, nếu chúng được kết nối với nhau và cũng có các tham số động trong chuỗi, chúng có thể khó phân tích

Tình huống thực tế

Gần đây, tôi đã có cơ hội phân tích một trình nhỏ giọt js đã sử dụng một số chức năng che giấu tùy chỉnh làm xáo trộn một kỹ thuật che giấu phân tách chuỗi phổ biến [Chuỗi. fromCharCode] và tham số động cần thiết này để lần lượt thực thi đúng cách. Nó cũng có chức năng che giấu mã hóa cho tên biến và chức năng che giấu tùy chỉnh chứa rất nhiều mã rác

Để triển khai tập lệnh gỡ mã nguồn, bạn có thể chọn bất kỳ ngôn ngữ tập lệnh nào có thể hỗ trợ regex, trong trường hợp này, tôi đã sử dụng Python

ống nhỏ giọt đã được gửi trong một. kho lưu trữ rar, bên trong. rar tôi đã có. jse ống nhỏ giọt

Hàm băm SHA256 của. rar là

0d72340c876292dcdc8dfa5b3b1cc7b6010902a2d28b5b15c8c35a3a284e7d35

Hàm băm SHA256 của. jse là

652566914671a9d5fb5ad0b75b6c9023fa8c9cff2c2d2254daad78ba40c14e0b

Bước 1. Giải mã kịch bản

khai trương. jse, tôi nhanh chóng nhận ra rằng nó được mã hóa bằng JScript. Chức năng mã hóa do Microsoft cung cấp, theo mã ví dụ

Tôi đã sử dụng tệp nhị phân tìm thấy trực tuyến để giải mã tập lệnh [2] trong. js và tôi đã giải mã được trình nhỏ giọt bị xáo trộn

Bước 2. Gỡ rối mã hóa obfuscation

Để tìm ra kỹ thuật làm xáo trộn được sử dụng trong ống nhỏ giọt là gì, tôi cần làm đẹp mã thông qua một số công cụ làm đẹp trực tuyến [3], bởi vì ống nhỏ giọt ban đầu chứa nửa triệu ký tự trên một dòng, kết quả là một đoạn mã nhỏ

Lưu ý rằng tất cả các bước gỡ rối mã nguồn đều được thực hiện trên js dropper ban đầu chứ không phải trên mã được làm đẹp. Mã đẹp được sử dụng chỉ để có khả năng đọc tốt hơn

Như bạn có thể thấy, kỹ thuật che giấu đầu tiên được sử dụng là che giấu mã hóa bằng ký hiệu Unicode

Để giải mã nó ở định dạng dễ đọc hơn, tôi đã sử dụng biểu thức chính quy sau để phân tích các ký tự

[u0d{3}]+

Tôi đã xác định chức năng gọi lại để thay thế mỗi lần xuất hiện. Tôi đã sử dụng chức năng gọi lại để thay thế vì tôi cần thay thế động dựa trên dữ liệu được phân tích cú pháp, theo mã Python

Mã hóa utf-8 của nó sẽ thay thế mọi lần xuất hiện của trận đấu

Lưu ý rằng mã hóa không phải là mã hóa;

Bước 3. Gỡ mã nguồn cho mẫu mã nguồn chính

Do đó, tôi bắt đầu nhìn xung quanh và cố gắng xác định chuỗi các kỹ thuật che giấu cơ bản. Đó không phải là một nhiệm vụ dễ dàng bởi vì. js chứa hơn 16 nghìn dòng mã. Sau đây là một ví dụ về mã

Khi xử lý ống nhỏ giọt bị xáo trộn khổng lồ này, không thể xác định từng kỹ thuật che giấu và thay thế thủ công

Vì vậy, để gỡ rối mã nguồn, tôi cần hiểu logic mẫu mã hóa mã nguồn và viết một tập lệnh có thể tự động giải mã mã nguồn

Chuỗi của một hoặc nhiều kỹ thuật che giấu sẽ tạo ra một mẫu che giấu

Các kỹ thuật che giấu được sử dụng trong các mẫu che giấu là các kỹ thuật cơ bản mà tôi đã giải thích trong Chương 2

Sau một thời gian dành cho việc gỡ lỗi mã ở trên, tôi nhận thấy rằng các hàm được sử dụng là một phiên bản bị xáo trộn của hàm “chuỗi trả về [từCharCode [staticParam, dynamicParam]]”

Đây là một triển khai của kỹ thuật xáo trộn dữ liệu tách chuỗi

Sau đó, tôi tập trung vào việc tìm kiếm mẫu obfuscation để tự động hóa quá trình gỡ mã nguồn thông qua tập lệnh Python. Cuối cùng, tôi đã tìm thấy mô hình obfuscation sau

Vì vậy, chỉ để đưa ra một ví dụ, ký tự 'c' được biểu thị bằng mã này

Như bạn có thể thấy, mẫu che giấu này có các lớp che giấu khác nhau

Xác định mẫu che mã nguồn là một bước quan trọng trong việc đảo ngược mã mã JavaScript bị xáo trộn bởi vì một khi xác định được nó, bạn đã hoàn thành 80% nhiệm vụ giải mã mã nguồn. Đây là hoạt động tốn nhiều thời gian nhất, nhưng nó đáng giá cho quá trình tự động hóa

Sau đó, tôi chỉ cần triển khai một tập lệnh để phân tích mẫu che giấu và thay thế các mã khi cần

Vì vậy, từ thời điểm này trở đi, vấn đề chỉ là tạo một biểu thức làm việc thông thường có thể phân tích cú pháp mẫu che giấu mà tôi đã xác định

Nó không phải là một nhiệm vụ khó khăn, nhưng nó chỉ cần một chút thời gian và thử nghiệm. Trong trường hợp của tôi, tôi đã sử dụng trình soạn thảo văn bản [Notepad++[4]] để gỡ lỗi biểu thức chính quy mà tôi đang tạo trước khi thực thi nó trong tập lệnh Python

Cuối cùng, tôi đã có biểu thức chính quy sau để phân tích mẫu che giấu

[. x27x27+]{w+. *?,[A-Za-z0-9]+. [A-Za-z0-9]+,[A-Za-z0-9]+. chức năng[. *?]{. *?}. *?}[. *?][. *?x27Codex27,d{1,3}]]

Quan sát mẫu mã hóa được xác định, bạn có thể thấy rằng hàm bị xáo trộn data_obfuscation. string_splitting[staticParam1 + dynamicParam1]] có hai tham số mà tôi cần phân tích cú pháp để gỡ mã nguồn dữ liệu. Hai tham số sẽ là 2 số, một số tĩnh và số còn lại sẽ động. Cái đầu tiên có thể được tìm thấy gần các tham số trả về của hàm, vì vậy, ví dụ trong đoạn mã trên sẽ là 96 và cái thứ hai được truyền dưới dạng đối số trong lệnh gọi hàm và nó là 3. 96+3=99 là mã thập phân ASCII cho ký tự 'c. ’

Để phân tích tham số tĩnh, tôi đã sử dụng biểu thức chính quy sau

lợi nhuậnString. *[[d{1,3}]+pi];

Thay vào đó, để phân tích tham số động tôi đã sử dụng

]. *?,x27Codex27,[d{1,3}]]

Để phân tích cú pháp chính xác, tôi đã sử dụng các chức năng của nhóm chụp trong Python và tôi có đoạn mã sau

Bước 4. Điều chỉnh kịch bản

Như mọi lập trình viên đều biết, mọi tập lệnh được viết phải được điều chỉnh để hoạt động như bạn mong đợi

Trên thực tế, việc chạy tập lệnh trên đã không giải mã được dữ liệu với khả năng đọc tốt nhất mà tôi muốn đạt được với tư cách là một nhà phân tích

Điều này xảy ra vì biểu thức chính quy chỉ khớp với trường hợp trung bình của phân tích cú pháp khối

Gỡ lỗi tập lệnh, tôi nhận thấy rằng khối mã của mẫu che giấu đã được sử dụng ở những nơi khác nhau [tôi. e. giữa các câu lệnh if, trong các khối try catch, trong các vòng lặp while và trong các định nghĩa biến]. Mỗi cái kết thúc bằng dấu ngoặc đơn hoặc dấu chấm câu khác nhau và một số trong số chúng, ít phổ biến hơn và tôi không nhận thấy, đã phá vỡ kết hợp regex. Vì vậy, để điều chỉnh tập lệnh của mình, tôi chỉ cần cải thiện biểu thức chính quy gốc và khôi phục ký tự kết thúc của mọi trường hợp khớp

Biểu thức chính quy mới để phân tích tất cả sự xuất hiện của mẫu che giấu đã trở thành

[. x27x27+]{w+. *?,[A-Za-z0-9]+. [A-Za-z0-9]+,[A-Za-z0-9]+. chức năng[. *?]{. *?}. *?}[. *?][. *?x27Codex27,d{1,3}][=. ]. ,. *. ]. +. s. ;]

Hơn nữa, tôi cũng cần thay đổi chức năng gọi lại cho các quy trình thay thế bao gồm tất cả các trường hợp kết thúc. Sau đó, tôi đã có kịch bản sau

Cuối cùng, khi chạy tập lệnh đã điều chỉnh, tôi nhận được một phiên bản trình nhỏ giọt có thể đọc được và giải mã nguồn tốt chứa 241 dòng mã, theo sau một hình ảnh có một đoạn mã

Bước 5. Phân tích mẫu

Trong bước này, tôi đã phân tích mã rõ ràng và dễ đọc, đó chỉ là vấn đề hiểu biết về JavaScript

Tôi tập trung vào việc xác định các chức năng độc hại tiềm ẩn để trích xuất các IOC có ý nghĩa

Trong phiên bản đã giải mã nguồn, tôi nhanh chóng phát hiện ra một số IOC hữu ích có thể ngăn chặn mối đe dọa này lây lan [và cũng để phát hiện mối đe dọa sau khi chạy], chẳng hạn như hai tệp. exe và. gop được thả vào đĩa trong thư mục %TEMP%

Hơn nữa, việc giữ tất cả các tên tệp được tìm thấy trên mọi đĩa có sẵn với một phần mở rộng cụ thể trong một tệp có tên “saymyname. txt” trong thư mục %TEMP%

Hơn nữa, một máy chủ c2 nơi tải trọng chính sẽ được tải xuống

Chúng có thể đại diện cho một bộ IOC tốt để sử dụng nhằm ngăn chặn mối đe dọa lan rộng khắp mạng nội bộ của bạn

Tuy nhiên, tôi muốn đi sâu hơn và hiểu hai khía cạnh. đầu tiên, tại sao mẫu không chạy trong máy ảo của tôi? . người cũ?

Tìm trong mã, tôi thấy một chữ “nếu” đáng ngờ với các điều kiện thú vị, hãy làm theo mã

Từ đoạn mã trên, tôi thấy rằng trình nhỏ giọt kiểm tra tên quy trình cụ thể đang chạy và chủ sở hữu cụ thể của quy trình

Đầu tiên, nó liệt kê các tiến trình đang chạy và sau đó nó lưu trữ một số thông tin trong một mảng. Thông tin được giữ bởi mảng này sẽ là tên quy trình, đường dẫn thực thi, miền sở hữu và tên sở hữu

Sau đó, nó sẽ kiểm tra xem trong mảng được tạo có chứa một số chuỗi có thể có nghĩa là môi trường thực thi là VM, hộp cát hoặc máy kỹ thuật đảo ngược hay không

Đó là lý do mà ống nhỏ giọt này không chạy trong máy ảo của tôi

Để trả lời nghi ngờ thứ hai của mình, tôi đã thử truy cập trang máy chủ c2 mà tôi tìm thấy, nhưng rõ ràng,. exe sẽ không được phục vụ một cách dễ dàng

Sau đó, tôi quyết định tìm cuộc gọi kết nối HTTP trong mã. Tôi nhận thấy rằng URL chứa một số tham số động được tạo thông qua một số thủ thuật lặp "cho", tuân theo toàn bộ mã

URL cuối cùng phải được định dạng như trên nếu không máy chủ c2 sẽ không phục vụ tải trọng nhị phân. Biến “hashere” cần thiết làm tham số thứ ba của trang PHP được tạo động bằng cách sử dụng thủ thuật for để phân tích phức tạp. Nếu tham số này sai, tải trọng được phân phối sẽ không giải nén và thực thi vì nó sẽ bỏ lỡ tham số cho quy trình giải nén của tải trọng nhị phân. Một số tham số khác là tĩnh [i. e. “param_1“] và những thứ khác là ngẫu nhiên [tôi. e. “Thông số cuối cùng“]

Cuối cùng, nhận xét mã cho kết nối HTTP và thêm chức năng in gỡ lỗi, tôi có thể nhận được một URL có thể cho phép tải xuống tải trọng nhị phân có thể chạy được

Chạy tập lệnh này trong cscript sẽ in URL

Điều hướng đến trang đó, tôi đã tải xuống tải trọng nhị phân chính được mã hóa bằng base64, hàm băm SHA256. 1572b8cc6dc1af0403bf91e24b20f9c39f6722258329b0bafa89f300989393f5

Tệp nhị phân được tải xuống dường như là một biến thể của Trojan ngân hàng Zusy [còn được gọi là Tinba]

Phần kết luận

Tóm lại, tôi muốn nói rằng việc biết cách xử lý JavaScript dropper bị xáo trộn có thể giúp nhà phân tích bảo mật cung cấp các IOC hiệu quả để ngăn chặn hoặc phát hiện các mối đe dọa. Nó chỉ cần một kiến ​​thức tốt về biểu thức chính quy, kiến ​​thức tốt về ngôn ngữ kịch bản và tất nhiên là cả kiến ​​thức về JavaScript;

Như bạn đã nhận thấy, không có nhiều bộ giải mã js có sẵn trực tuyến. Đó là bởi vì thực sự rất khó để viết một bộ giải mã chung có thể giải mã mọi thứ do tính năng động của ngôn ngữ

Mặt khác, với tư cách là một nhà phân tích, bạn không thể chỉ dựa vào phân tích động vì đôi khi nó không giúp được gì.

Chủ Đề