Sy40r3n

@Wh04m1

CTF Player , Malware Researcher, University Student

Joined on Jun 27, 2023

  • Mở đầu Xin chào các hacker, là mình Syaoren đây! Bài viết hôm nay sẽ không tập trung vào bất kỳ kỹ thuật nào cả, thay vào đó mình muốn giới thiệu về hai khái niệm quan trọng là Import Address Table (IAT) và Export Address Table (EAT). Lý do cho việc thực hiện bài viết này là vì IAT và EAT là những khái niệm quan trọng cần phải nắm bắt để hiểu rõ các kỹ thuật nâng cao mà mình sẽ giới thiệu trong các bài viết sau. Chính vì vậy, mình quyết định dành riêng một bài viết để giới thiệu về IAT và EAT. Bạn đọc cần phải có kiến thức về Portable Executable (PE) format trước khi đọc bài viết này, mình đã viết một bài về PE format tại đây, bạn có thể tham khảo nó trước khi bắt đầu. Không vòng vo nữa, vào vấn đề chính thôi! :smiling_imp: Import Address Table (IAT) Khi nhìn vào hình dưới đây, ta có thể dễ dàng nhận thấy rằng IAT được sử dụng để làm gì rồi đúng không? Yah, nó được sử dụng để lưu trữ địa chỉ của các API mà chương trình gọi trong lúc thực thi. API trong Windows thật sự đóng vai trò rất quan trọng, nhờ có nó mà chương trình mới có thể truy cập vào các tài nguyên của hệ thống một cách dễ dàng. Vì lý do đó, địa chỉ của API được sắp xếp trong một bảng có cấu trúc là IAT, điều này giúp quản lý thuận tiện hơn so với việc lưu trữ các địa chỉ này một cách rời rạc. :dog: Ngoài ra, như ta đã biết, các API mà chương trình sử dụng có thể được định nghĩa trong nhiều DLL khác nhau. Cho nên, để quản lý các địa chỉ một cách hiệu quả, chương trình sẽ tạo một IAT riêng cho mỗi DLL mà nó import vào. Ví dụ, chương trình của ta sẽ có một IAT dành riêng cho kernel32.dll và một IAT riêng cho ntdll.dll. image
     Like  Bookmark
  • Mở đầu Gần đây, mình có nghiên cứu source code của BlackLotus, một UEFI bootkit được rao bán ở các chợ đen trên Darknet với giá 5,000 USD. Tuy nhiên, vì một lý do nào đó, nó đã được công khai trên GitHub :smile:. Trong quá trình nghiên cứu source code, mình nhận thấy BlackLotus sử dụng một kỹ thuật code injection rất độc đáo. Vì lý do này, mình muốn triển khai lại kỹ thuật này và chia sẻ các kết quả đạt được với độc giả trong bài viết này. Bắt đầu vào bài viết thôi! :smiling_imp: Các bước thực hiện Dưới đây là các bước chi tiết khi thực hiện kỹ thuật code injection này: 1. Tạo mới target process: injector thực hiện việc tạo mới target process để bắt đầu quá trình injection. Tuy nhiên, cũng có thể sử dụng một process có sẵn thay vì tạo mới.
     Like  Bookmark
  • Mở đầu Xin chào các độc giả, mình là Syaoren! Trong bài viết trước, mình đã chia sẻ cách thực hiện cơ chế persistence và privilege escalation thông qua executable service. Tiếp nối bài viết đó, hôm nay mình sẽ hướng dẫn cách sử dụng DLL service để triển khai cơ chế persistence và privilege escalation. Trước khi bắt đầu đọc bài viết này, bạn có thể tham khảo bài viết trước của mình tại đây để nắm rõ các khái niệm cơ bản về service. :alien: Cơ sở lý thuyết Services không chỉ có thể được triển khai dưới dạng các tập tin thực thi độc lập mà còn có thể được triển khai dưới dạng các tập tin DLL. DLL service được triển khai thông qua process svchost.exe, nó sẽ nạp các DLL service vào bộ nhớ của mình. Điều này có nghĩa là svchost.exe là một process được dùng để triển khai nhiều service đồng thời, với mỗi service tương ứng với một tập tin DLL. Thông thường, svchost.exe sẽ triển khai các service có đặc điểm tương tự nhau, chẳng hạn như các service liên quan đến mạng sẽ được nhóm lại và nạp cùng một lúc trong process svchost.exe. Cách triển khai này mang lại nhiều lợi ích như quản lý dễ dàng hơn và sử dụng ít bộ nhớ hơn so với việc triển khai từng service dưới dạng các process riêng biệt. Tuy nhiên, nếu một service trong svchost.exe gặp lỗi, toàn bộ các service khác do cùng một svchost.exe quản lý có thể cũng bị ảnh hưởng do chúng dùng chung một process. Việc lựa chọn giữa DLL service hoặc executable service sẽ phụ thuộc vào mục đích cụ thể của từng người sử dụng.
     Like  Bookmark
  • Mở đầu Xin chào các độc giả, lại là mình Syaoren đây! Trong bài viết này, mình sẽ chia sẻ một số kết quả nghiên cứu của mình khi thực hiện persistence và privilege escalation thông qua executable service. Cùng đi vào bài viết thôi! :alien: Cơ sở lý thuyết Trước khi bắt đầu sử dụng service để triển khai cơ chế persistence và privilege escalation, ta cần phải hiểu rõ về khái niệm service. Về cơ bản, một service có thể hiểu như là một process hoạt động ngầm để thực hiện các tác vụ của hệ thống như kiểm soát lưu lượng mạng, quản lý DNS cache, và nhiều tác vụ khác. Service thường có quyền SYSTEM, việc này cho phép nó có thể thực thi các tác vụ với mức độ quyền cao. :dog: Một điểm đáng chú ý là service có thể tự động chạy ở session 0 trước khi người dùng đăng nhập vào hệ thống. Ngoài ra, nếu service gặp lỗi trong quá trình thực thi, nó có khả năng tự khởi động lại để đảm bảo luôn hoạt động liên tục. Hình bên mô tả session và quyền hạn của process svchost.exe, một process đại diện cho một nhóm các service.
     Like 1 Bookmark
  • Mở đầu Xin chào các độc giả, lại là mình Syaoren đây! Trong bài viết này, mình sẽ giới thiệu một kỹ thuật code injection thực hiện thông qua Kernel Callback Table mà mình nghiên cứu gần đây. Không vòng vo nữa, vào vấn đề chính thôi! :kissing: Cơ sở lý thuyết Dựa trên nghiên cứu của mình thì kernel callback table là một cấu trúc dữ liệu trong hệ điều hành Windows, bao gồm nhiều entry, mỗi entry chứa địa chỉ của một hàm callback. Các hàm callback này sẽ được kích hoạt khi có một sự kiện nào đó xảy ra trong hệ thống, có thể đến từ kernel hoặc user. Một điều đặc biệt là ta có thể truy cập kernel callback table từ user space thông qua cấu trúc PEB (Process Environment Block), và thậm chí có thể thay đổi giá trị của các entry trong bảng này. Dựa vào tính chất này, ta có thể thay đổi giá trị của một entry trong kernel callback table sao cho nó trỏ đến shellcode mà ta kiểm soát. Do đó, để thực thi shellcode, ta đơn giản chỉ cần tạo ra một sự kiện để kích hoạt entry mà ta đã thay đổi là được. Hình bên dưới minh họa chi tiết về kernel callback table.
     Like  Bookmark
  • Mở đầu Ở bài viết trước, mình đã giới thiệu chi tiết về cách triển khai kỹ thuật Process Hollowing, bạn đọc có thể đọc bài viết đó tại đây. Trong bài viết này, mình sẽ triển khai Process Hollowing thông qua cơ chế file mapping. Yah, bắt đầu thôi! :smile: Các bước thực hiện Dưới đây là các bước cụ thể để thực hiện kỹ thuật Process Hollowing thông qua cơ chế file mapping: 1. Tạo mới process: injector tiến hành tạo target process ở trạng thái tạm dừng bằng API CreateProcess() với cờ CREATE_SUSPENDED.
     Like  Bookmark
  • Mở đầu Trong bài viết trước, mình đã giới thiệu chi tiết về cách triển khai kỹ thuật Process Hollowing, bạn đọc có thể đọc bài viết đó tại đây. Trong bài viết này, mình sẽ triển khai Process Hollowing theo một cách khác thông qua cơ chế section. Yah, bắt đầu thôi :smile:! Các bước thực hiện Dưới đây là các bước cụ thể để thực hiện kỹ thuật Process Hollowing thông qua cơ chế section: 1. Tạo mới process: injector tiến hành tạo target process ở trạng thái tạm dừng bằng API CreateProcess() với cờ CREATE_SUSPENDED. image
     Like  Bookmark
  • Mở Đầu Yah, lại là mình đây! Đã một thời gian khá dài mình chưa có bài viết mới vì mình đang bận làm khóa luận tốt nghiệp và đồng thời cũng đang tìm việc làm nữa :sweat_smile:. Hiện tại, mình đã có thời gian rảnh rỗi nên quyết định bắt đầu lại series. Trong bài viết này, mình muốn giới thiệu về kỹ thuật Process Hollowing, một phương pháp code injection được sử dụng rộng rãi trong malware. Cùng bắt đầu bài viết thôi :smiling_face_with_smiling_eyes_and_hand_covering_mouth:. Quá Trình Tạo Process Trước khi đi sâu vào kỹ thuật Process Hollowing, điều quan trọng ta cần làm là hiểu rõ các bước cụ thể khi một process được tạo ra. Hình ảnh dưới đây sẽ giúp ta hiểu rõ hơn về quá trình này. image
     Like 1 Bookmark
  • Mở đầu Chào mừng các bạn đến với bài viết thứ năm trong loạt bài về phát triển malware của mình! Trong bài viết này, mình sẽ đề cập đến kỹ thuật Section Code Injection. Đây là một kỹ thuật code injection, nó thực hiện việc chèn shellcode để thực hiện chức năng độc hại thông qua cơ chế memory section trong Windows. Không chần chừ nữa, cùng mình bắt đầu ngay bài viết ngay thôi! :smiley: Đôi Chút Lý Thuyết Trong một hệ thống Windows, mỗi section object đại diện cho một phần nhỏ của bộ nhớ có thể được chia sẻ. Process có thể sử dụng section object để chia sẻ một phần của không gian bộ nhớ của nó với các process khác hoặc để ánh xạ nội dung từ một tệp vào bộ nhớ của nó. Mỗi phần nhỏ bộ nhớ, được gọi là memory section, có một hoặc nhiều view. Một view là một phần cụ thể của memory section mà một process có thể thấy được. Việc tạo ra một view của một memory section được gọi là ánh xạ một view của section đó. Mỗi process có thể có view riêng của một memory section, và cũng có thể có nhiều views khác nhau cho cùng một hoặc các memory sections khác nhau. Hình dưới mô tả việc Process 1 và Process 2 chia sẻ chung bộ nhớ với nhau thông qua cơ chế memory section.
     Like 1 Bookmark
  • Mở Đầu Chào mừng các bạn đến với series phát triển malware của mình! Trong bài viết này, mình sẽ đề cập đến một số kỹ thuật APC Queue Injection, các kỹ thuật này được triển khai dựa vào cơ chế Asynchronous Procedure Call (APC). Không chần chừ nữa, cùng mình bắt đầu ngay bài viết ngay thôi! ## Đôi Chút Lý Thuyết Trong hệ điều hành Windows, có một khái niệm quan trọng được gọi là Asynchronous Procedure Call (APC). Về cơ bản, APC là cách để thực hiện hàm một cách không đồng bộ trong context của một thread cụ thể. Mỗi thread đều có một hàng đợi APC riêng, và các thread sẽ thực hiện các APC có trong hàng đợi khi chúng tiến vào trạng thái alertable. Một thread sẽ tiến vào trạng thái alertable khi nó gọi API SleepEx(), SignalObjectAndWait(), MsgWaitForMultipleObjectsEx(), WaitForMultipleObjectsEx(), hoặc WaitForSingleObjectEx(). Một process có thể chèn APC vào hàng đợi của một thread khác bằng cách sử dụng API QueueUserAPC(). Vậy thì tại sao APC lại được sử dụng trong hệ điều hành Windows? Nó mang lại những lợi ích gì? :thinking_face:
     Like 1 Bookmark
  • Mở Đầu :rocket: Chào mừng các bạn đến với bài viết thứ ba trong loạt bài về phát triển malware của mình! Trong bài viết này, mình sẽ đề cập đến kỹ thuật Classical Shellcode Injection. Đây là một kỹ thuật code injection, nó thực hiện việc chèn shellcode để thực hiện chức năng độc hại. Không chần chừ nữa, cùng mình bắt đầu ngay bài viết ngay thôi! :smiley: Đôi Chút Lý Thuyết Trong bài viết trước, mình đã giới thiệu về cách hoạt động của classical DLL injection và cũng đề cập đến một số nhược điểm của nó, bao gồm việc sử dụng LoadLibrary() để nạp DLL và cần phải lưu trữ DLL trên ổ cứng máy tính trước khi nạp, điều này có thể thu hút sự chú ý của các trình antivirus (AV). image Để khắc phục những nhược điểm này, ta có thể sử dụng kỹ thuật classical shellcode injection. Thay vì chèn một DLL, kỹ thuật này lại chèn trực tiếp shellcode vào target process. Vậy lợi ích của việc chèn shellcode thay vì DLL là gì? :thinking_face:
     Like 1 Bookmark
  • Mở Đầu :rocket: Chào mừng các bạn đến với bài viết thứ hai trong loạt bài về phát triển malware của mình! Trong bài viết này, mình sẽ giới thiệu một trong những kỹ thuật phổ biến nhất trong hacking, đó là Classical DLL Injection. Đây là một kỹ thuật cơ bản và là nền tảng cho nhiều kỹ thuật tấn công nâng cao hơn, vì vậy mình muốn giới thiệu nó đầu tiên. Không vòng vo nữa, bắt đầu ngay bài viết ngay thôi! :smiley: Đôi Chút Lý Thuyết Như ta đã biết, malware thường được cấu tạo từ nhiều thành phần, trong đó, thành phần quan trọng nhất thường là downloader/loader. Nhiệm vụ chính của nó là tải xuống các thành phần bổ sung từ C&C server về máy tính đã bị lây nhiễm. Các thành phần này có thể bao gồm các tập tin thực thi PE hoặc các tập tin DLL, được sử dụng để triển khai quá trình lây nhiễm. Ngoài việc tải các DLL từ C&C server, các DLL cũng có thể được lưu trữ sẵn trong resource section của downloader/loader. :smiling_face_with_smiling_eyes_and_hand_covering_mouth: Nếu thành phần bổ sung được tải về là một tập tin thực thi PE thì việc chạy nó trên máy victim trở nên đơn giản :grin:. Tuy nhiên, nhưng đối với tập tin DLL thì đây lại là một câu chuyện khác. Ta cẩn phải lưu ý rằng tập tin DLL không thể tự chạy độc lập, chúng chỉ có thể chạy khi được nạp bởi một process nào đó trên hệ thống :alien:.
     Like 2 Bookmark
  • Mở đầu :rocket: Chào mừng bạn đến với bài viết đầu tiên trong series về phát triển malware của mình! Trong bài viết này, chúng ta sẽ tập trung vào hai kỹ thuật quan trọng trong lĩnh vực hacking: reverse shell và bind shell. Nó không chỉ là kiến thức cơ bản mà còn là nền tảng quan trọng cho nhiều kỹ thuật tấn công mà mình sẽ giới thiệu trong các bài viết tiếp theo. Hiểu rõ về reverse shell và bind shell sẽ giúp bạn nắm bắt cách malware tương tác với hệ thống mục tiêu, mở đầu cho sự hiểu biết sâu rộng về các kỹ thuật tấn công trong lĩnh vực hacking. Không còn thời gian chần chừ, chúng ta sẽ bắt đầu tìm hiểu về malware từ bài viết mở đầu này! :kissing: Cơ bản về Reverse Shell và Bind Shell :question: Reverse shell là gì ? Reverse shell là một dạng remote shell được khởi tạo từ máy victim bằng cách kết nối trở lại máy attacker và tạo ra một bản shell của máy victim trên máy attacker. Thông thường, kỹ thuật này được sử dụng trong quá trình khai thác để kiểm soát máy từ xa.
     Like 4 Bookmark
  • 1. Chi Tiết Kỹ Thuật Reflective DLL Injection :diamond_shape_with_a_dot_inside: Nhược Điểm Của Classical DLL Injection và APC Queue DLL Injection Là Gì :question: :::info Như ta đã biết, malware có rất nhiều thành phần nhưng thành phần chính của nó thường là downloader/loader, nó có chức năng tải các thành phần khác từ C&C server về máy tính bị lẫy nhiễm. Các thành phần này có thể là các PE file như là EXE hoặc DLL được sử dụng cho quá trình lây nhiễm. Ngoài việc nhận các DLL được gửi từ C&C server, các DLL cũng có thể có sẵn trong resource section của downloader/loader để sử dụng cho quá trình injection. Nếu ta dùng kỹ thuật classical dll injection hoặc apc queue dll injection thì ta đều phải sử dụng DLL có sẵn trên disk. Việc này có nghĩa rằng ta phải ghi DLL nhận từ C&C server hoặc có trong resource section vào disk trước khi tải nó vào target process bằng API LoadLibrary(), nhưng việc này rất dễ bị phát hiện và làm cho malware mất đi tính steath (tàng hình). Yah, vậy ta có thể khắc phục điều này bằng cách nào? :thinking_face: ::: :diamond_shape_with_a_dot_inside: Reflective DLL Injection Có Thể Khắc Phục Được Nhược Điểm Trên :question: :::info
     Like 1 Bookmark
  • 1. Phishing Mô hình tổng thể trải dài từ giai đoạn Phishing máy tính của nạn nhân cho đến giai đoạn máy tính nạn nhân thực thi mã độc rồi mã độc sẽ tự duy trì việc kiểm soát máy tính nạn nhân, sau đó thiết lập kết nối đến C2 Server của Attacker và Attacker sẽ thao tác với máy tính nạn nhân nhằm đánh cắp dữ liệu và các hành vi độc hại khác thông qua C2 Server được kết nối tới máy tính nạn nhân. image Chi tiết về từng bước hoạt động trong mô hình tổng thể của mình được đề cập ở trên như sau:Đầu tiên, Attacker sẽ gửi một email phishing chứa đường link dẫn tới file Malware cho victim từ bên ngoài internet. Sau khi Victim nhận được mail, tải file Malware về và thực thi file Malware trên máy tính, Malware sẽ yêu cầu kết nối đến C2 Server của Attacker và C2 Server sẽ thiết lập một session kết nối đến máy victim thông qua thông tin về máy Victim mà Malware lấy được bằng Win32API (Địa chỉ IP, Host name, …). Sau khi thiết lập kết nối thành công, Attacker sẽ điều khiển máy victim gián tiếp bằng việc gửi lệnh đến cho C2 Server. 2. EXE :diamond_shape_with_a_dot_inside: Check Mutant
     Like 3 Bookmark
  • Anti-Sandbox 1. Anti-Sanbox With GlobalMemoryStatusEx() MEMORYSTATUSEX msx = { sizeof(msx) }; GlobalMemoryStatusEx(&msx); printf("[+] Available virtual memory: %.5f\n", msx.ullAvailVirtual*1.0/1024/1024/1024); printf("[+] Available physical memory: %.5f\n", msx.ullAvailPhys*1.0/1024/1024/1024); printf("[+] Total virtual memory: %.5f\n", msx.ullTotalVirtual*1.0/1024/1024/1024); printf("[+] Total physical memory: %.5f\n", msx.ullTotalPhys*1.0/1024/1024/1024); :::success
     Like  Bookmark
  • Chào mừng các bạn đến với bài viết thứ 6 trong chuỗi bài viết về phát triển mã độc của mình! Trong bài viết này, chúng ta sẽ nói về file Portable Executable (PE), đây là định dạng file thực thi chủ yếu được sử dụng trong hệ điều hành Windows. Việc hiểu rõ về định dạng file PE đóng vai trò quan trọng trong việc nghiên cứu và phát triển mã độc. Yah, bắt đầu bài viết thôi! :face_with_cowboy_hat: Portable Executable File Như các bạn đã biết, các file như Word, PowerPoint và Excel đều có định dạng riêng của nó. Định dạng này quy định cách thức dữ liệu được lưu trữ trong file. Thông thường, cấu trúc của một file được xác định bởi các phần đầu được gọi là header. Để lấy dữ liệu từ một file cụ thể, ta thường phải phân tích các giá trị trong header của file đó. Trong phần header của một file, thường sẽ chứa các giá trị được gọi là magic byte. Về cơ bản, magic byte là một dãy các giá trị byte, đóng vai trò như signature (chữ ký) để nhận diện loại file đó. Hình dưới là mô tả tổng quát về định dạng của một file. :alien: image Để thực tế, mình sử dụng công cụ CFF Explorer để thử mở một file ZIP. Như các bạn có thể thấy, file ZIP này bắt đầu bằng hai kí tự PK, đây chính là hai magic byte của file ZIP.
     Like  Bookmark
  • nope :::info Đầu tiên, mình kiểm tra thông tin của binary và chạy nó. Kết quả cũng không thu được gì hay ho :grin:. ::: :::info Đây là hàm main() mình thu được khi dùng ghidra. Chức năng của nó là thực hiện so sánh kích thước của tham số đầu vào vàlocal_28 có bằng nhau hay không và nếu thỏa mãn thì gọi hàm FUN_00101251(), lưu ý là local_28 có kích thước là 23 byte. Còn chức năng của FUN_00101251() khả năng cao là để xử lý tham số đầu vào, mình đoán vậy :grin:. Sau khi FUN_00101251() hoàn thành, nếu như tham số đầu vào sau khi được xử lý giống như local_28 thì ta sẽ thu được flag. :::
     Like  Bookmark
  • 1. Bối Cảnh :::success Trong quá trình dạo chơi với rootkit ở windows thì mình cũng đã có kha khá kiến thức về lập trình driver :smiling_face_with_smiling_eyes_and_hand_covering_mouth:. Hôm nay mình tình cờ lướt qua reversing.kr thì mình thấy rằng có 1 bài liên quan đến window kernel nên làm thử và kết quả là bị dập cho sấp mặt :slightly_smiling_face:. Sau 1 buổi chiều loay hoay làm thì mình đã làm ra và học được khá nhiều thứ :smiling_face_with_smiling_eyes_and_hand_covering_mouth:. Giờ thì bắt đầu thôi. ::: 2. Phân Tích Bài Toán :diamond_shape_with_a_dot_inside: Phân tích file thực thi :::info
     Like 1 Bookmark
  • Đôi Lời Muốn Nói :::success Chuyện là mình vừa thi cuối kỳ thực hành môn lập trình an toàn và khai thác lỗ hổng phần mềm vừa xong. Kết quả là nhóm mình là nhóm duy nhất được 10 điểm bài thực hành này :smiling_face_with_smiling_eyes_and_hand_covering_mouth:. Nói thật thì mình là người giải full hết challenge của bài thi và 2 đứa bạn mình chỉ ngồi chơi thôi :smile:. Nhưng bù lại 2 đứa bạn nó gánh mình môn quản trị mạng và hệ thống :neutral_face:. Thì bởi vì mình là người tốt bụng nên mình quyết định viết writeup các challenghe của đề bài để chia sẻ cách làm cho các bạn trong lớp :smiling_face_with_smiling_eyes_and_hand_covering_mouth:. ::: Stack_architect :::info
     Like 2 Bookmark