Danh mục

KỸ THUẬT KHAI THÁC LỖI TRÀN BỘ ĐỆM (Phần 2)

Số trang: 10      Loại file: pdf      Dung lượng: 270.92 KB      Lượt xem: 16      Lượt tải: 0    
10.10.2023

Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

Quyền root và chương trình setuid/setgid 2. Chương trình bị tràn bộ đệm 3. Tổ chức shellcode trên bộ nhớ 4. Xác định địa chỉ shellcode 5. Viết chương trình khai thác lỗi tràn bộ đệm o 5.1. Truyền shellcode qua bộ đệm o 5.2. Truyền shellcode qua biến môi trường 6. Kết luận Tài liệu tham khảo Liên kết.
Nội dung trích xuất từ tài liệu:
KỸ THUẬT KHAI THÁC LỖI TRÀN BỘ ĐỆM (Phần 2)KỸ THUẬT KHAI THÁC LỖI TRÀN BỘ ĐỆM (Phần 2)Phần 2: Kỹ thuật khai thác lỗi tràn bộ đệmMục lục  1. Quyền root và chương trình setuid/setgid  2. Chương trình bị tràn bộ đệm  3. Tổ chức shellcode trên bộ nhớ  4. Xác định địa chỉ sh ellcode  5. Viết chương trình khai thác lỗi tràn bộ đệm o 5.1. Truyền shellcode qua bộ đệm o 5.2. Truyền shellcode qua biến môi trường  6. Kết luận  Tài liệu tham khảo  Liên kết1. Quyền root và chương trình setuid/setgidTrên các hệ điều hành đa người dùng nói chung và UNIX nói riêng, thiết kế truyền thống cho phép userroot (superuser) có quyền tối cao có thể thực hiện mọi thao tác trên hệ thống. Hơn nữa, có một số thao tácđòi hỏi buộc phải có quyền root mới có thể thực hiện được, ví dụ thay đổi mật khẩu (phải cập nhật file/etc/passwd). Để người dùng bình thường có thể thực hiện được các thao tác này, hệ thống UNIX cungcấp một cơ ch ế thiết lập quyền thực tế của tiến trình đang thực thi thông qua các hàm thiết lập quyền nhưsetuid()/setgid(), seteuid()/setegid(), setruid()/setrgid(). Quyền thực tế sẽ được hệ thống tự độngthiết lập thông qua bit thuộc tính suid/sgid của file chương trình. Ví dụ ch ương trình passwd được suidroot: -r-s--x--x 1 root root 12244 Feb 8 2000 /usr/bin/passwdKhi u ser bình thường thực thi ch ương trình, quyền thực tế có được sẽ là quyền của người sở hữu (owner)file, ở đây là root. Do yêu cầu sử dụng, trên hệ thống UNIX th ường có nhiều file chương trình được thiết lậpthu ộc tính suid (cho owner, group). Ví dụ sau sẽ minh hoạ rõ hơn điều này: /* suidsh.c */ void main() { setuid(0); system(/bin/sh); } [SkZ0@gamma bof]$ gcc -o suidsh suidsh.c [SkZ0@gamma bof]$ su Password: # chown root.root suidsh # chmod 4755 suidsh # exit [SkZ0@gamma bof]$ ls -l suidsh -rwsr-xr-x 1 root root 13637 Mar 26 15:54 suidsh [SkZ0@gamma bof]$ id uid=501(SkZ0) gid=501(SkZ0) groups=501(SkZ0) [SkZ0@gamma bof]$ ./suidsh bash# id uid=0(root) gid=501(SkZ0) groups=501(SkZ0)Có th ể thấy, nếu chương trình suid/sgid bị lỗi bảo mật, hacker sẽ tận dụng điều này để điều khiển chươngtrình thực hiện mã lệnh bất kỳ trên hệ thống với quyền cao hơn và thậm chí với quyền cao nhất root. Đóchính là mục đích của việc khai thác các lỗ hổng bảo mật trên máy tại chỗ (local).2. Chương trình bị tràn bộ đệmĐể minh hoạ cách tổ chức và chèn shellcode vào chương trình bị lỗi, ta sẽ sửa lại một chút ch ương trìnhvuln.c đã ví dụ ở phần 1: /* vuln1.c */ int main(int argc, char **argv) { char buf[500]; if (argc>1) { strcpy(buf, argv[1]); printf(%s , buf); } }Kích thước của bộ đệm buf là 500 byte. Từ những trình bày ở phần trước, để khai thác lỗi tràn bộ đệmtrong chương trình vuln1.c chúng ta chỉ cần ghi đè giá trị của con trỏ lệnh bảo lưu (saved instructionpointer) được lưu trên stack bằng địa chỉ mã lệnh mong muốn, ở đây chính là địa chỉ bắt đầu của shellcode.Như vậy chúng ta cần phải sắp xếp shellcode ở đâu đó trên bộ nhớ stack và xác định địa chỉ bắt đầu củanó.3. Tổ chức shellcode trên bộ nhớVấn đề của việc tổ chức shellcode trên bộ nhớ là làm thế nào để chương trình khai thác lỗi có thể xác địnhđược địa chỉ bắt đầu của bộ đệm chứa shellcode bên trong ch ương trình bị lỗi. Thông thường, ta không thểbiết một cách chính xác địa chỉ của bộ đệm trong chương trình bị lỗi (phụ thuộc vào biến môi trường, thamsố khi thực thi), do đó ta sẽ xác định một cách gần đúng. Điều này có nghĩa chúng ta phải tổ chức bộ đệmchứa shellcode sao cho khi bắt đầu ở một địa chỉ có thể lệch so với địa chỉ chính xác mà shellcode vẫn thựcthi không hề bị ảnh hưởng. Lệnh máy NOP (No OPeration) giúp ta đạt được điều này. Khi gặp một lệnhNOP, CPU sẽ không làm gì cả ngoài việc tăng con trỏ lệnh đến lệnh kế tiếp.Như vậy, chúng ta sẽ lấp đầy phần đầu của bộ đệm bằng các lệnh NOP, kế đó là shellcode. Hơn n ữa, đểkhông ph ải tính toán chính xác vị trí lưu con trỏ lệnh bảo lưu trên stack, chúng ta sẽ chỉ đặt shellcode ởkhoảng giữa của bộ đệm, phần còn lại sẽ chứa toàn các giá trị địa chỉ bắt đầu của shellcode. Cuối cùng, bộđệm chứa shellcode sẽ có dạng: Hình 1: Tổ chức shellcode trên bộ nhớ The link ed image cannot be display ed. The file may hav e b een mov ed, renamed, or ...

Tài liệu được xem nhiều: