1. Đặt vấn đề
Khi mới bước chân vào phân tích lỗ hổng đã được công bố (1-day), một trong những công việc cần thực hiện là so sánh hai phiên bản của cùng một file thực thi để tìm ra những đoạn code được patch. Điều này yêu cầu tìm lại được phiên bản cũ của file mục tiêu. Có các cách khác nhau để thực hiện điều này:
- Cài đặt hai bản cập nhật (KBxxx) liền kề nhau, thực hiện trích xuất file sau mỗi bản cập nhật:
Cách làm này rất đơn giản, dễ hiểu nhưng có một nhược điểm lớn: cần rất nhiều thời gian do thời gian mỗi lần cập nhật Windows là khá lâu. - Tải file cần thiết từ Microsoft thông qua công cụ winbindex:
Cách làm này hiệu quả với hầu hết các file, nhưng khi Microsoft quyết định thu hồi các phiên bản cũ của một file, chúng ta sẽ không thể tải xuống (VD: bạn đọc hãy thử tải về bất kỳ entry nào trong danh sách file bootmgr.efi đã bị Microsoft thu hồi sau sự xuất hiện của mã độc BlackLotus).
Có thể thấy các cách trên có thể đơn giản nhưng không hiệu quả và toàn diện. Trong bài viết này, chúng ta cùng tìm hiểu về phương pháp để thu thập các file cần thiết cho việc phân tích thông qua việc trích xuất thủ công các bản vá cho hệ điều hành Windows. Tóm tắt: Chúng ta sẽ mô phỏng lại quá trình Windows cập nhật, nhưng chỉ thực hiện trên một file cụ thể.
Các nội dung chính sẽ được trình bày:
- Giới thiệu về "patch tuesday" - thời điểm Microsoft cập nhật các sản phẩm của mình
- Giới thiệu về "cumulative update" - cách Microsoft cập nhật hệ điều hành Windows
- Phương pháp trích xuất file trước và sau bản cập nhật
- Phương pháp so sánh hai phiên bản của cùng một file - trước và sau khi cập nhật
Bài viết này hướng đến đối tượng bạn đọc quan tâm đến phân tích lỗ hổng của HĐH Windows và có kiến thức nền về dịch ngược phần mềm.
2. Giới thiệu về "patch tuesday" - thời điểm Microsoft cập nhật hệ điều hành Windows
Trước hết chúng ta nói nhanh về khái niệm "patch tuesday". Với bạn đọc chưa biết: cụm từ này nói đến thời điểm Microsoft tung ra bản vá cho hệ điều hành Windows trên toàn thế giới - vào ngày thứ ba thứ hai của tháng. Vào ngày này, các hacker sẽ tập trung review các bản vá của Microsoft, qua đó phân tích các thành phần dính lỗ hổng và viết poc. Bạn đọc có thể tìm đến các bài review trên ZDI để có cái nhìn tổng quát về những lỗ hổng mới được phát hiện. Ví dụ về bài review mới nhất - tháng 6/2023: https://www.zerodayinitiative.com/blog/2023/6/13/the-june-2023-security-update-review.
3. Giới thiệu về "quality update" - cách Microsoft đang cập nhật hệ điều hành Windows
Trước đây, Microsoft cung cấp ba phương pháp cập nhật cho các hệ điều hành Windows:
- Full update: Tải xuống toàn bộ các file đã thay đổi kể từ khi release phiên bản Windows đang được cài đặt trên hệ thống. Điều này đảm bảo có thể update từ mọi bản cập nhật lên bản cập nhật mới nhất.
- Delta udpate: Tải xuống tất cả các file cần cập nhật, thay thế các file cần thay thế từ bản cập nhật trước đó.
- Express update: Giống full update nhưng yêu cầu client cung cấp danh sách các file cần cập nhật trước, sau đó mới tải về.
Có thể thấy nhược điểm chung của cả ba phương pháp trên là chúng yêu cầu tải về bộ cài khá nặng - 1GB. Nhưng từ đầu năm 2019, Microsoft chuyển sang sử dụng phương pháp mới có tên gọi "quality update". Phương pháp này khắc phục hạn chế kích thước gói cập nhật quá lớn của các phương pháp cũ. Những bước thực hiện với từng file cần cập nhật bao gồm:
- Đảo ngược phiên bản hiện tại của file cần cập nhật về phiên bản ban đầu (phiên bản ngay sau khi cài đặt Windows).
- Patch phiên bản ban đầu được tạo ra sau bước 1 thành phiên bản mới nhất.
Minh họa:
Để tải bộ cài về, trước hết cần lấy mã của bản cập nhật từ release note của Microsoft (ví dụ của tháng 04/2023 là "KB5025221"), sau đó tải về bộ cài tại Microsoft Update Catalog
Mô tả về thư mục bản cập nhật cho Microsoft:
- Bản cập nhật cho Windows được phân phối dưới dạng file MSU. File này thực chất là một file ZIP. Nếu click đúp chuột vào file MSU này, Windows sẽ giải nén các file bên trong và thực hiện cập nhật tất cả các file có mặt trong bộ cập nhật. Bên trong tệp tin lưu trữ này có cấu trúc:
- Có các thành phần chính trong một bản cập nhật:
- Cập nhật bảo mật:
Đây là thành phần chúng ta quan tâm. Giải nén file này đến khi thu được thư mục như sau:
Đây là thư mục của các thành phần của Windows sẽ được cập nhật. - Cập nhật tính năng cập nhật:
Chúng ta không cần quan tâm đến thành phần này.
- Cập nhật bảo mật:
Mỗi dịch vụ cần được cập nhật sẽ có một thư mục tương ứng trong thư mục Cab_1_for_KB5025221_PSFX
. Trong thư mục đó sẽ có 2 thư mục nhỏ hơn, tên là "f" và"r". Thư mục "r" viết tắt của "reverse" và chứa file để kết hợp với file được cập nhật tạo ra file ban đầu. Thư mục "f" viết tắt của "forward" và chứa file forward để kết hợp với file ban đầu tạo ra file được cập nhật.
Ví dụ:
- Trong thư mục chứa bản cập nhật của dịch vụ
msmq
trong gói cài đặt tháng 04/2023: - Trong mỗi thư mục "f" và "r" sẽ có các file để cập nhật:
4. Demo phương pháp trích xuất file trước và sau bản cập nhật
4.1. Các bước thực hiện
Mục tiêu của chúng ta: Trích xuất một file cụ thể từ bản cập nhật. Để chọn được file mục tiêu, có thể phân tích phần mềm mục tiêu, liệt kê các file nhị phân được sử dụng, sau đó tìm kiếm trong thư mục bản cập nhật xem file nào nằm trong danh sách đó. Trong bài viết này chúng ta cùng trích xuất file mqqm.dll
được sử dụng bởi tiến trình mqsvc
của dịch vụ "Windows Message Queueing". Phiên bản trước cập nhật tháng 4/2023 của chương trình này có chứa lỗ hổng CVE-2023-21554 có điểm CVSS 9.8.
Từ giải thích về cách Microsoft cập nhật hệ điều hành Windows, chúng ta có thể hình dung ra cách thực hiện:
- Thu thập phiên bản hiện tại của file mục tiêu.
- Thu thập file
r
tương ứng với phiên bản hiện tại của file mục tiêu. - Thu thập file
f
tương ứng với file mục tiêu từ bản cập nhật. - Tái tạo lại file cơ bản.
- Tạo file sau khi cập nhật.
4.2. Thu thập phiên bản hiện tại của file mục tiêu
Bước này khá đơn giản. Chỉ cần đi đến thư mục hiện tại của file mục tiêu. Trong trường hợp này là đường dẫn C:\Windows\System32\
.
4.3. Thu thập file r
File r
tương ứng của file mục tiêu phiên bản hiện tại nằm ở hai nơi:
- Trong bộ cài (file MSU) của bản cập nhật tương ứng.
- Thư mục
C:\Windows\WinSxS\
.
Cách nhanh nhất là lấy từ trong thư mục C:\Windows\WinSxS\
. Sử dụng câu lệnh powershell:
Get-ChildItem -Recurse C:\Windows\WinSxS\ | ? {$_.Name -eq "mqqm.dll"}
Kết quả:
Nếu muốn thu thập từ bản cập nhật hiện tại, cần biết mã bản cập nhật. Chạy câu lệnh systeminfo
trên CMD để lấy được mã bản cập nhật mới nhất:
Sau đó tải về bản tương ứng từ Microsoft Catalog Update.
4.4. Thu thập file f
Để lấy ra file f
, chỉ cần tìm tên file mục tiêu trong thư mục bộ cài bản cập nhật:
4.5. Tạo file được cập nhật sử dụng file r
và f
Lúc này chúng ta đã có đủ nguyên liệu, chỉ cần ráp các thành phần với nhau sẽ tạo được file mục tiêu. Có hai cách để thực hiện:
- Tự viết code sử dụng thư viện của win32. Xem hướng dẫn tại đây.
- Sử dụng công cụ patch_extract. Câu lệnh:
python delta_patch.py -i <chosen_file> -o <output_file> <reverse_file_of_input_file> <forward_file_of_output_file>
Cách thứ hai tiện hơn và vẫn còn hoạt động với cách cập nhật mới nhất dành cho Windows vì vậy nên được ưu tiên sử dụng.
Kết quả:
5. So sánh hai phiên bản của file mục tiêu - trước và sau khi cập nhật
Diff hai phiên bản của mqqm.dll
sử dụng công cụ BinDiff trong môi trường IDA Pro:
6. Tổng kết
Như vậy chúng ta đã lắp ráp thành công file mục tiêu một cách thủ công. Cách làm này tuy cần nhiều công sức nhưng đảm bảo thành công và có thể thực hiện tự động với số lượng lớn. Bước tiếp theo của chúng ta có thể là tự động hóa quá trình trích xuất file được patch và tự động phân tích patch sử dụng bindiff qua đó tập trung hơn vào việc phân tích lỗ hổng.
Bạn đọc nếu có câu hỏi/ý kiến góp ý xin hãy comment để chúng ta cùng thảo luận ạ!
7. Tham khảo
- https://wumb0.in/extracting-and-diffing-ms-patches-in-2020.html - Một trong các giảng viên tại SANS institute viết về việc tạo file được patch từ bản cập nhật.
- https://kienmanowar.wordpress.com/2019/10/07/reversing-with-ida-from-scratch-p22/ - bài viết của chuyên gia Kiên Manowar về cách sử dụng các công cụ diffing.
- https://www.coresecurity.com/core-labs/articles/how-deal-microsoft-monthly-updates-reverse-engineering-binary-patches - chuyên gia Ricardo Narvaja hướng dẫn cách thực hiện
- https://learn.microsoft.com/en-us/windows/deployment/update/psfxwhitepaper - Tài liệu chính thức của Microsoft về quy trình thực hiện cập nhật.
- https://devblogs.microsoft.com/oldnewthing/20200210-00/?p=103426 - chuyên gia Raymond Chen giải thích về phương pháp phân phối bản vá cho Windows.
- https://cve-north-stars.github.io/docs/Security-Patches - một phần của "CVE-north-star", một khóa học miễn phí khá bổ ích về chủ đề phân tích one-day.
- https://www.youtube.com/watch?v=p9Ls9rOEgBk&ab_channel=BSidesCharm - Stephen Sims - một trong các giảng viên tại SANS institute trình bày về chủ đề phân tích patch.