1. Trang chủ
  2. » Giáo Dục - Đào Tạo

THỰC tập cơ sở CHUYÊN NGÀNH AN TOÀN PHẦN mềm NGHIÊN cứu lỗ HỔNG TRÀN bộ đệm (BUFFER OVERFLOW VULNERABILITY LAB)

27 26 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 27
Dung lượng 1,61 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Lỗ hổng này phát sinh do sự trộn lẫn giữa bộ lưu trữcho dữ liệu ví dụ bộ đệm và bộ lưu trữ cho các điều khiển ví dụ: địa chỉ trả về: phần dữ liệu bị tràn có thể ảnh hưởng đến luồng điều

Trang 1

BAN CƠ YẾU CHÍNH PHỦ HỌC VIỆN KỸ THUẬT MẬT MÃ

KHOA AN TOÀN THÔNG TIN

-II -THỰC TẬP CƠ SỞ CHUYÊN NGÀNH

AN TOÀN PHẦN MỀM NGHIÊN CỨU LỖ HỔNG TRÀN BỘ ĐỆM

(BUFFER OVERFLOW VULNERABILITY LAB)

………

Giảng viên hướng dẫn: PGS.TS Lương Thế Dũng

Sinh viên thực hiện: Võ Minh Sang Lớp: AT15H

Mã số sinh viên: AT150741 Nhóm: 13

Khóa: 2018-2023

TP.Hồ Chí Minh, tháng 11 năm 2021

Trang 2

BAN CƠ YẾU CHÍNH PHỦ HỌC VIỆN KỸ THUẬT MẬT MÃ

KHOA: AN TOÀN THÔNG TIN



THỰC TẬP CƠ SỞ CHUYÊN NGÀNH

AN TOÀN PHẦN MỀM NGHIÊN CỨU LỖ HỔNG TRÀN BỘ ĐỆM

(BUFFER OVERFLOW VULNERABILITY LAB)

Nhận xét của giáo viên hướng dẫn:

Điểm báo cáo:

Xác nhận của giáo viên hướng dẫn:

Trang 3

LỜI CẢM ƠN

Chúng em xin chân thành cảm ơn PGS.TS Lương Thế Dũng–giảng viên trực tiếphướng dẫn, chỉ bảo, tạo mọi điều kiện thuận lợi giúp đỡ chúng em trong quá trình thựchiện đề tài

Để có được thành quả như ngày hôm nay, ngoài sự nỗ lực không ngừng nghỉ củacác thành viên trong nhóm thì một phần không nhỏ đóng góp nên thành công này là nhờ

sự quan tâm, chỉ bảo, giúp đỡ của các thầy cô, các anh chị khóa trên và bạn bè xungquanh

Tuy đã có rất nhiều cố gắng và sự nỗ lực của các thành viên để hoàn thiện đề tài,

nhưng chắc chắn đề tài “NGHIÊN CỨU LỖ HỔNG TRÀN BỘ ĐỆM (BUFFER

OVERFLOW VULNERABILITY LAB)” của chúng em còn nhiều thiếu sót Chúng

em rất mong nhận được sự góp ý từ các thầy giáo để nhóm em có thể hoàn thiện tốt hơncác đề tài nghiên cứu sau

Chúng em xin chân thành cảm ơn!

Trang 4

LỜI MỞ ĐẦU

Ngày nay, với xu hướng chuyển đổi số mạnh mẽ của các doanh nghiệp, công ty, tổchức dẫn đến việc tạo ra những phần mềm quản lý, điều hành và làm việc cũng hết sứcthiết yếu Bên cạnh đó, ảnh hưởng của đại dịch COVID-19 cũng đã thúc đẩy nhanh việcchuyển đổi số Để đảm bảo an toàn cho phần mềm khi tạo ra và vận hành tránh bị kẻ xấutấn công gây thiệt hại nghiêm trọng Đó cũng là lý do để chúng em chọn chuyên đềSoftware Security và đặc biệt là nghiên cứu lỗ hổng Buffer Overflow

Trang 5

MỤC LỤC

LỜI CẢM ƠN 3

LỜI MỞ ĐẦU 4

MỤC LỤC 5

CHƯƠNG I : TỔNG QUAN VỀ LỖ HỔNG TRÀN BỘ ĐỆM (BUFFER OVERFLOW) 6

1 Giới thiệu về Buffer Overflow 6

2 Mục đích bài lab 6

CHƯƠNG II : Cài đặt môi trường trước khi thực hiện 7

1) Cài đặt công cụ Oracle VM Virtual Box 7

2) Cài đặt môi trường ảo Ubuntu v16.04 của SEED Labs 10

CHƯƠNG III: Phân tích và thực hiện BÀI LAB 16

 Bật/tắt một số cơ chế ban đầu 16

Address Space Randomization 16

1 Task 1: Chạy chương trình Shellcode 17

2 Task 2: Khai thác chương trình có lỗ hổng 17

3 Task 3: Đánh bại biện pháp đối phó của Dash 21

4 Task 4: Đánh bại cơ chế Address Randomization 23

5 Task 5: Bật chế độ bảo vệ ngăn xếp (StackGuard Protection) 24

6 Task 6: Bật chế độ ngăn xếp không thực thi (Non-executable Stack Protection) 25

CHƯƠNG IV: KẾT LUẬN 26

TÀI LIỆU THAM KHẢO 27

Trang 6

CHƯƠNG I : TỔNG QUAN VỀ LỖ HỔNG TRÀN BỘ ĐỆM

(BUFFER OVERFLOW)

1 Giới thiệu về Buffer Overflow

Tràn bộ đệm là một lỗi lập trình có thể gây ra một ngoại lệ truy nhập bộ nhớ máytính và chương trình bị kết thúc, hoặc khi người dùng có ý phá hoại, họ có thể lợi dụnglỗi này để phá vỡ an ninh hệ thống

Tràn bộ đệm được định nghĩa là điều kiện trong đó chương trình cố gắng ghi dữliệu vượt ra ngoài ranh giới của bộ đệm có độ dài cố định được cấp phát trước Lỗ hổngnày có thể bị người dùng độc hại lợi dụng để thay đổi kiểm soát luồng của chương trình,thậm chí thực thi các đoạn mã tùy ý Lỗ hổng này phát sinh do sự trộn lẫn giữa bộ lưu trữcho dữ liệu (ví dụ bộ đệm) và bộ lưu trữ cho các điều khiển (ví dụ: địa chỉ trả về): phần

dữ liệu bị tràn có thể ảnh hưởng đến luồng điều khiển của chương trình, vì tràn có thểthay đổi địa chỉ trả về

Ví dụ: username và password được khởi tạo với bộ nhớ lưu trữ là 8 byte Đối vớicác phiên đầu vào lên đến 10 byte thì sẽ dư 2 byte dẫn đến xảy ra lỗi tràn bộ đệm

Mục tiêu học tập của lab này là để sinh viên có được kinh nghiệm trực tiếp về lỗhổng tràn bộ đệm bằng cách đưa những đã học được về lỗ hổng từ lớp học vào thực hành

• Lỗ hổng và cuộc tấn công tràn bộ đệm

• Bố cục ngăn xếp trong một lệnh gọi hàm

• Địa chỉ ngẫu nhiên, ngăn xếp không thực thi và StackGuard

• Mã số

• Cuộc tấn công quay trở lại-libc, nhằm mục đích đánh bại biện pháp đối phó ngănxếp không thực thi được, được đề cập trong một phòng thí nghiệm riêng biệt

Trang 7

CHƯƠNG II : CÀI ĐẶT MÔI TRƯỜNG TRƯỚC KHI THỰC

HIỆN

1) Cài đặt công cụ Oracle VM Virtual Box

Truy cập đường link: https://www.virtualbox.org/wiki/Downloads Để tải và càiđặt

Sau khi tải về thì chạy chương trình để cài đặt vào máy Chọn Next

Trang 8

Tiếp tục , chọn Next và cuối cùng là chọn Install

Trang 9

Chọn Finish để kết thúc quá trình cài đặt Bên dưới là giao diện sau khi cài đặt hoàn tất

Trang 10

2) Cài đặt môi trường ảo Ubuntu v16.04 của SEED Labs

Truy cập vào trang web : https://seedsecuritylabs.org/labsetup.html Chọn version16.04 như hình bên dưới và tải về theo đường dẫn đính kèm

Ở đây em chọn đường dẫn của “Google Drive” Sau khi tải xong chúng ta giải nénfile rar

Trang 11

Quay lại với Oracle VM VirtualBox , Chọn New ,lựa chọn các cài đặt như hìnhbên dưới và chọn Next.

Chọn Next cho đến khi đến phần Hark Disk Chọn vào “Use an exitsting virtualhard disk file” và chọn vào icon được khoanh vùng đen

Chọn Add

Trang 12

Chọn đến đường dẫn lúc nãy vừa giải nén file Ubuntu v16.04 và chọn vào file bêndưới nhấn Open

Sau khi chọn đường dẫn xong sẽ hiện giống như ảnh màn hình sau và click vào

“SEEDUbuntu-16.04-32bit.vmdk” và chọn Choose

Trang 13

Sau đó ấn Create

Chọn Start để tiến hành cài đặt bên trong

Trang 14

Quá trình cài đặt hoàn tất

Trang 15

Hình bên dưới là những file ở chương sau mà chúng ta sẽ thực hành.

Trang 16

CHƯƠNG III: PHÂN TÍCH VÀ THỰC HIỆN BÀI LAB

Bật/tắt một số cơ chế ban đầu.

Trước khi thực hiện tấn công , chúng ta cần phải vô hiệu hóa một số cơ chế để đơn giảnhóa vấn đề

Address Space Randomization : Ubuntu và một số hệ thống dựa trên Linux

khác sử dụng ngẫu nhiên hóa không gian địa chỉ để ngẫu nhiên hóa địa chỉ bắt đầu của heap và stack Điều này làm cho việc đoán các địa chỉ chính xác trở nên khó khăn; đoán địa chỉ là một trong những bước quan trọng của các cuộc tấn công tràn bộ đệm Trong phòng thí nghiệm này, chúng ta cần vô hiệu hóa điều này bằng lệnh dưới đây

Configuring /bin/sh: Thay đổi default shell từ “dash” thành “zsh” để tránh các

biện pháp đối phó được thực hiện trong “bash” cho các chương trình SET-UID

The StackGuard Protection Scheme: Trình biên dịch GCC thực hiện một cơ chế

bảo mật được gọi là Stack Guard để ngăn chặn lỗi tràn bộ đệm Khi có sự bảo vệ này, cáccuộc tấn công tràn bộ đệm sẽ không hoạt động.Chúng ta sẽ tắt tính năng bảo vệ này trongquá trình biên dịch bằng cách sử dụng tùy chọn -fno-stack-protectionor

Non-Executable Stack: Ở cơ chế này chúng ta sẽ cung cấp tham số “-z

execstack” Khi cung cấp tham số này, ngăn xếp trở nên thực thi được, sau đó cho phép

mã của chúng ta được thực thi khi ở trong ngăn xếp Theo mặc định, ngăn xếp là khôngthể thực thi và hệ điều hành biết liệu ngăn xếp có thực thi được hay không bằng một tập

Trang 17

bit nhị phân trong hệ thống Bit này có thể được trình biên dịch thao tác và trình biên dịchgcc đặt ngăn xếp là không thể thực thi (Non-Executable Stack) theo mặc định.

1 Task 1: Chạy chương trình Shellcode

Ở đây , chúng ta có một tệp “call_shellcode.c” khi tải từ trang web về Chúng ta sẽbiên dịch chương trình với tham số là “-z execstack” điều này đảm bảo rằng ngăn xếpđược thực thi để chạy các mã shell của chúng ta và không xảy ra lỗi phân đoạn Chươngtrình sau khi biên dịch có tên là “call_shellcode” và được làm nỗi bật bằng màu xanh Tiếp theo, chúng ta thực thi chương trình đã biên dịch này và như đã thấy, khi nhập shelltài khoản của mình (được biểu thị bằng $) Và không có lỗi, điều này chứng tỏ rằngchương trình đã chạy thành công và chúng ta có quyền truy cập vào ‘/ bin / sh’ Một điểmcần lưu ý là vì nó không phải là chương trình gốc SET-UID, cũng như chúng ta đang ởtrong tài khoản gốc, nên thiết bị đầu cuối thuộc tài khoản của chúng ta chứ không phảigốc

Tiếp đến, chúng ta biên dịch chương trình đang có lỗ hổng ‘stack.c’ đã cho và thựchiện vô hiệu hóa cơ chế Bảo vệ StackGuard và làm cho ngăn xếp có thể thực thi đượcbằng cách chuyển các tham số tương ứng vào lệnh Ngoài ra, chương trình đã biên dịch,được lưu trữ trong tệp ‘stack’, sau đó được tạo thành chương trình gốc SET UID Điềunày có thể được nhìn thấy trong ảnh chụp màn hình sau, trong đó các tệp được đánh dấumàu xanh lá cây có nghĩa là tệp thực thi và tệp được đánh dấu màu đỏ có nghĩa là chươngtrình SET-UID:

2 Task 2: Khai thác chương trình có lỗ hổng

Ở phần việc này, chúng ta sẽ sử dụng chương trình gốc SET-UID để chiếm quyềntruy cập chương trình shell

Trang 18

Vì chúng ta đã tắt cơ chế Address Space Randomization , chúng ta cũng biết đượcchương trình sẽ lưu trữ trong cùng một bộ nhớ bên trong ngăn xếp Để tìm địa chỉ củachương trình đang chạy trong bộ nhớ , chúng ta cần phải biên dịch chương trình ở chế độDebug Debugging sẽ giúp cho chúng ta tiếp được địa chỉ thanh ghi ebp và offset , đểchúng ta có thể xây dựng một buffer payload phù hợp điều này sẽ giúp cho chúng ta chạychương trình chúng ta muốn.

Trước hết , chúng ta cần phải biên dịch chương trình ở chế độ debug bằng tham số

“-g” , vô hiệu hóa cơ chế StackGuard và cho phép cơ chế Executable Stack Sau đó ,chạy chương trình bằng gdb như hình bên dưới:

Tiếp theo , chúng ta đạt một breakpoint tại hàm bof()và thực thi chương trình :

Chương trình sẽ dừng ngay nơi mình đặt breakpoint

Trang 19

Chúng ta sẽ quan tâm đến các giá trị của khung stack trong hàm nhằm mục đíchxây dựng badfile sau này Chúng ta có thể xem được giả trị của buffer và ebp và cũng cóthể xem được sự khác nhau giữa ebp và giá trị khởi đầu của buffer để tìm địa chỉ trả về(address return) như hình bên dưới:

Ở đây, chúng ta thấy rằng con trỏ khung là 0xbfffea18 và do đó địa chỉ trả về phảiđược lưu trữ tại 0xbfffea18 + 4 và địa chỉ đầu tiên chúng ta có thể chuyển đến là0xbfffea18 + 8 Ngoài ra, để địa chỉ trả về trỏ tới mã của chúng ta, chúng ta cần biết vị trí

để lưu trữ địa chỉ trả về trong đầu vào và địa chỉ đó được lưu trữ trong trường địa chỉ trả

về trong ngăn xếp Điều này có thể được tìm ra bằng cách tìm sự khác biệt giữa địa chỉtrả về và địa chỉ bắt đầu bộ đệm, bởi vì đầu vào của chúng ta được sao chép vào bộ đệmngay từ đầu Có thể thấy sự khác biệt giữa ebp và khởi động bộ đệm trong đầu ra và bằngcách bố trí ngăn xếp, chúng ta biết rằng địa chỉ trả về sẽ cao hơn 4 byte nơi ebp trỏ đến

Do đó, khoảng cách giữa địa chỉ trả về và điểm bắt đầu của bộ đệm là 36, và do

đó, địa chỉ trả về nên được lưu trữ trong badfile với độ lệch là 36

Tiếp theo , chúng ta chỉnh sửa tệp “exploit.py” để nhập một hàm trả về mới

Trang 20

Vì code được thực thi trong chế độ debug, ngăn xếp có thể sâu hơn so với khiđược thực thi bình thường, vì gdb có thể đẩy dữ liệu bổ sung vào ngăn xếp Do đó, chúng

ta thêm một giá trị lớn hơn nhiều vào giá trị ebp làm địa chỉ trả về Ở đây ta nhậpBFFFEA18 + 120 = BFFFEA90, làm địa chỉ trả về của khung ngăn xếp, trong mã Ta cẩnthận để không có bất kỳ số 0 nào trong địa chỉ trả hàng của mình Địa chỉ trả về này đượclưu trữ ở vị trí bù như đã tính toán trước đó trong đầu vào

Tiếp theo, trước tiên chúng ta làm cho chương trình python có thể thực thi được vàchạy tệp tin exploit.py để tạo “badfile” Tiếp theo, chúng ta chạy chương trình SET-UID

dễ bị tấn công sử dụng tệp xấu này làm đầu vào và sao chép nội dung của tệp trong ngănxếp, dẫn đến tràn bộ đệm Dấu # chỉ ra rằng chúng ta đã có được đặc quyền root thànhcông bằng cách nhập vào root shell ID người dùng hiệu quả được coi là ID người dùnggốc (0):

Do đó, chúng ta đã thực hiện thành công cuộc tấn công tràn bộ đệm và giành đượcđặc quyền root

Trang 21

Bây giờ, id người dùng (uid) của chúng ta vẫn không bằng id người dùng hiệudụng (euid) Do đó, trong bước tiếp theo, chúng ta chạy chương trình của mình để chuyển

id người dùng thực của chúng ta thành root Chúng ta biên dịch chương trình sau để thayđổi uid của tài khoản thành 0, uid của tài khoản gốc:

Như đã thấy, chúng ta đã biên dịch chương trình và lưu trữ nó trong một tệp có tênmakeitroot Xin lưu ý rằng đây không phải là chương trình gốc SET-UID Tiếp theo,chúng ta chạy chương trình này trong thiết bị đầu cuối gốc để đặt uid là 0 (từ chươngtrình) Vì chúng ta đã có đặc quyền root do cuộc tấn công tràn bộ đệm thành công, chúng

ta có thể thay đổi id người dùng thành 0 mà không gặp bất kỳ sự cố nào Có thể thấy sựthay đổi này:

3 Task 3: Đánh bại biện pháp đối phó của Dash

Đầu tiên chúng ta thay đổi liên kết biểu tưởng /bin/sh trỏ tới /bin/dash trở lại

Tạo tệp “dash_shell_test.c” như hướng dẫn của bài lab

Trang 22

Biên dịch tệp “dash_shell_test.c” trở thành một chương trình root SET-UID như

Như đã thấy, chúng ta nhập root shell và khi kiểm tra user ID, nó là của root

Vì vậy, chúng ta thấy rằng cả hai lần chúng ta có quyền truy cập vào shell, nhưngtrong lần đầu tiên, nó không phải là root vì chương trình bash loại bỏ các đặc quyền củachương trình SET-UID vì id người dùng hiệu quả và id người dùng thực tế là khônggiống nhau Do đó, nó được thực thi như một chương trình với các đặc quyền bìnhthường và không phải root Nhưng bằng cách có lệnh setuid trong chương trình, nó sẽ tạo

ra sự khác biệt vì id người dùng thực tế được đặt thành root và id người dùng hiệu quảcũng bằng 0 do chương trình SET-UID và do đó dấu gạch ngang không giảm bất kỳ đặcquyền nào ở đây, và trình bao gốc được chạy Do đó, lệnh này có thể đánh bại biện phápđối phó của dấu gạch ngang bằng cách đặt uid thành của thư mục gốc cho các chươngtrình gốc SET-UID, cung cấp quyền truy cập thiết bị đầu cuối của thư mục gốc

Tiếp theo, chúng ta cố gắng thực hiện tấn công tràn bộ đệm, giống như cách chúng

ta đã làm trong nhiệm vụ 2, nhưng bây giờ biện pháp đối phó / bin / dash cho các chươngtrình SET-UID hiện diện do liên kết tượng trưng từ /bin/sh đến /bin/dash Chúng ta thêm

Trang 23

ngay cả trước khi chúng ta gọi thực thi () Khi chạy tệp khai thác này, chúng ta xây dựngtệp xấu với mã được cập nhật sẽ được thực thi trong Ngăn xếp, và sau đó chạy chươngtrình gốc SET UID ngăn xếp Kết quả cho thấy rằng chúng ta có thể truy cập vào thiết bịđầu cuối của root và khi kiểm tra id, chúng ta thấy rằng id người dùng (uid) là của root.

Do đó, cuộc tấn công đã được thực hiện thành công và chúng ta có thể vượt qua biệnpháp đối phó dash bằng cách sử dụng lệnh gọi hệ thống setuid () Điều này có thể đượcnhìn thấy trong kết quả sau:

4 Task 4: Đánh bại cơ chế Address Randomization

Đầu tiên , bật lại cơ chế Address Randomization cho cả stack và heap với giá trị là

2 Và khi chúng ta tấn công như ở Task 2 sẽ xuất hiện lỗi phân đoạn Điều này cho thấychúng ta tấn công không thành công

Tiếp theo chúng ta chạy shellscript được cung cấp để chạy chương trình dễ bị tấncông trong vòng lặp Về cơ bản , đây là cách tấn công brute-force để truy cập cùng địachỉ với địa chỉ mà chúng ta đã đặt badfile Tập lệnh shell được lữu trữ trong tệpbruteattack và được tạo thành công chương trình root SET-UID

Trang 24

Kết quả đầu ra hiển thị thời gian thực hiện và nỗ lực thực hiện cuộc tấn công nàyvới Address Randomize và phương pháp tiếp cận Brute-Force Nó dẫn đến tràn bộ đệmthành công sau một khoảng thời gian

Giải thích cho điều này là, trước đây khi phương pháp đối phó Address SpaceRandomize bị tắt, khung ngăn xếp luôn bắt đầu từ cùng một điểm bộ nhớ cho mỗichương trình vì mục đích đơn giản Điều này giúp chúng ta dễ dàng đoán hoặc tìm rađiểm bù, đó là sự khác biệt giữa địa chỉ trả về và điểm bắt đầu của bộ đệm, để đặt mã độchại và địa chỉ trả về tương ứng trong chương trình

Tuy nhiên, khi bật biện pháp đối phó ngẫu nhiên hóa bố cục không gian địa chỉ,thì điểm bắt đầu của khung ngăn xếp luôn được ngẫu nhiên hóa và khác nhau Vì vậy,chúng ta không thể tìm chính xác điểm bắt đầu hoặc điểm bù để thực hiện tràn Lựa chọnduy nhất còn lại là thử càng nhiều thời gian càng tốt, trừ khi chúng ta nhấn vào địa chỉ màchúng ta chỉ định trong mã dễ bị tấn công của chúng ta Khi chạy chương trình bruteforce, chương trình đã chạy cho đến khi nó chạm vào địa chỉ cho phép chương trình shellchạy Như đã thấy, chúng ta nhận được thiết bị đầu cuối gốc (vì nó là chương trình gốcSET-UID), được biểu thị bằng #

5 Task 5: Bật chế độ bảo vệ ngăn xếp (StackGuard Protection)

Đầu tiên, chúng ta vô hiệu hóa biện pháp đối phó ngẫu nhiên hóa địa chỉ Sau đó, chúng

ta biên dịch chương trình ‘stack.c’ với StackGuard Protection (bằng cách không cung cấp-fno-stack-protectionor) và ngăn xếp thực thi (bằng cách cung cấp -z execstack) Sau đó,chúng ta chuyển đổi chương trình đã biên dịch này thành một chương trình gốc SET-UID Sau đây là các nhiệm vụ sau:

Ngày đăng: 28/03/2022, 15:37

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w