- Chia sẻ trải nghiệm trong quá trình phát triển defendnot, một công cụ vô hiệu hóa Windows Defender bằng cách trực tiếp tận dụng Windows Security Center(WSC) service API
- Dự án bắt đầu từ quá trình vượt qua những giới hạn kỹ thuật và vấn đề pháp lý của dự án no-defender trước đó
- Tiến hành reverse engineering và debugging giữa hàng loạt trở ngại như môi trường đặc biệt (MacBook arm64, debug từ xa, độ trễ cao)
- Phân tích cơ chế vượt đăng ký Defender và cơ chế xác minh tiến trình, rồi sau nhiều lần thất bại và thử nghiệm đã cải thiện để công cụ hoạt động ổn định
- Cuối cùng hoàn thành cả tính năng tự động chạy, đồng thời nhìn lại và thừa nhận những khó khăn của cả quá trình
Giới thiệu
- Chia sẻ hành trình hiện thực hóa công cụ defendnot để vô hiệu hóa Windows Defender
- Bài viết được sắp xếp chủ yếu xoay quanh những vấn đề thực tế và các pha mò mẫm/vật lộn khi làm trong môi trường thật, thay vì đi sâu vào chi tiết kỹ thuật chính
- Tài liệu hóa chính thức và phần giải thích kỹ thuật sẽ được công bố riêng sau
Nhìn lại 1 năm trước
- Khoảng một năm trước, tác giả đã công bố dự án no-defender, tận dụng cơ chế khiến Windows Defender bị vô hiệu hóa thông qua WSC API
- Dự án này tham chiếu mã của bên thứ ba từ một nhà cung cấp antivirus, qua đó đánh lừa hệ thống như thể đã có một antivirus khác được đăng ký
- Sau khi phát hành, dự án nhận được nhiều chú ý và khoảng 1.500 Star, nhưng do yêu cầu gỡ bỏ theo DMCA từ công ty antivirus liên quan nên tác giả quyết định xóa mã nguồn và kết thúc dự án
Lý do bắt đầu dự án
- Ở thời điểm viết bài, tác giả đang ở Seoul và lưu trú tại Airbnb
- Môi trường phát triển chính là M4Pro MacBook, và không mang theo thiết bị riêng cần thiết cho reverse engineering x86
- Do lịch thi CTF và lịch trình du lịch, tác giả buộc phải làm việc mà không có thiết bị x86
- Cùng với việc xem xét khả năng hiện thực hóa no-defender theo cách “chuẩn hơn”, tác giả bắt đầu khám phá xem liệu có thể triển khai độc lập, không phụ thuộc AV hay không
Khảo sát ban đầu (Ngày 1)
- Nhờ sự giúp đỡ của một người bạn, tác giả có được wsc binary và thử tái hiện việc đăng ký WSC theo cấu trúc tương tự dự án trước
- Đã triển khai bằng COM API của WSC nhưng gặp lỗi Access Denied
- Tác giả xác định nguyên nhân đến từ việc WSC kiểm tra chữ ký và xác thực tiến trình gọi API
- Khi thử inject module vào một tiến trình AV để đăng ký, AV đã được đăng ký thành công
Thay thế AV binary và các thử nghiệm bổ sung (Ngày 1)
- Tác giả thử chạy công cụ thông qua các tiến trình hệ thống đã ký (như cmd.exe), nhưng thất bại ở bước kiểm tra PPL(Protected Process Light)
- Sau đó tạm dừng để hẹn sẽ phân tích disassembly và trace chi tiết hơn
Thiết lập môi trường (Ngày 2)
- Do giới hạn của MacBook arm64, việc debug Windows x86 là cực kỳ khó khăn
- Tác giả dùng PC của một người bạn ở Mỹ từ xa (Parasec, Anydesk, v.v.) để debug và thử nghiệm trong môi trường độ trễ cao
- Quá trình build code và debug VM đan xen phức tạp khiến tốc độ chậm lại và gây nhiều bối rối
Debug WSC service (Ngày 2)
- Xác nhận rằng WSC service có cấu trúc DLL được svchost chạy
- Để gỡ bảo vệ PPL, tác giả áp dụng cách vòng qua bằng driver đặc biệt rồi dùng debugger để xác nhận đã đi vào hàm
- Tác giả phát hiện bên trong service có bước kiểm tra token WinDefend SID
- Từ đó hình thành giả thuyết rằng có thể vượt qua quy trình xác thực bằng cách mô phỏng một tiến trình mang WinDefend SID
Mô phỏng WinDefend SID (Ngày 2)
- Tác giả học thêm về cấu trúc token và nguyên lý hoạt động của Windows
- Sau khi hiện thực và chạy mã mô phỏng WinDefend SID, mọi lời gọi COM đều trả về SUCCESS, nhưng trên thực tế AV vẫn không được đăng ký
Tái dựng thuật toán xác minh (Ngày 3)
- Tác giả phân tích lại thật cẩn thận trong AV binary để xem bước kiểm tra SID có thực sự được vượt qua hay không
- Khi kiểm tra SID không vượt qua, service còn kiểm tra thêm trạng thái nâng quyền, chữ ký binary và cờ DllCharacteristics (ForceIntegrity) của PE
- Tác giả tái tạo hàm thực hiện cấu trúc này và thử nghiệm trên các binary lõi trong hệ thống
Tận dụng tiến trình Taskmgr (Ngày 3)
- Tác giả thử lại với Taskmgr.exe làm tiến trình mục tiêu, nhưng WSC từ chối yêu cầu do lỗi trong quá trình truyền tên và bug IPC
- Sau khi cải thiện cách suy luận đường dẫn file và cơ chế truyền tên AV, hệ thống hoạt động bình thường
Dọn dẹp mã (Ngày 3)
- Tác giả sắp xếp lại chức năng và thử hiện thực tính năng tự động chạy (autorun)
- Trong quá trình quản lý tự động chạy, có những lần thất bại ngắt quãng, buộc tác giả lặp đi lặp lại việc kiểm tra mã và môi trường để tìm nguyên nhân
Hiện thực tự động chạy (Ngày 4)
- Tác giả xác nhận nguyên nhân là trong các tùy chọn của Task Scheduler có bật checkbox khiến tác vụ không chạy khi laptop không cắm nguồn AC
- Sau khi bỏ thiết lập này, tính năng tự động chạy hoạt động bình thường
- Cuối cùng, tác giả dọn dẹp mã và kiểm thử
Kết luận
- Công việc reverse engineering trong môi trường hạn chế và bất tiện là một trải nghiệm cực kỳ mệt mỏi cả về tâm lý lẫn thể chất
- Tài liệu chi tiết hơn về cách hiện thực WSC sẽ được công bố riêng sau
Lời cảm ơn
- Pindos: người bạn đã cho mượn PC vào ban đêm để hỗ trợ debug và sưởi ấm căn phòng
- MrBruh: đồng nghiệp đã tạo động lực bắt đầu đào sâu dự án và đưa ra phản hồi ý tưởng
- Cảm ơn những người quen đã giữ liên lạc và tiếp thêm tinh thần trong suốt dự án
- Tác giả thừa nhận tình yêu dành cho kimchi
- Cảm ơn cả người nghệ sĩ đã để lại graffiti trên bức tường của chúng ta
1 bình luận
Ý kiến trên Hacker News
C:\ProgramData\Microsoft\Windows Defender, rồi tạo một tệp trống ở đúng vị trí đópowervirus. Tôi không thích bị ai đó giám sát kiểu như bảo rằng không được dùngnetcat.exe