Tải bản đầy đủ (.pdf) (32 trang)

Kỹ thuật tấn công BUFFER OVERFLOW

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.3 MB, 32 trang )

Người thực hiện: Lê Long Bảo Ngành : Mạng Máy Tính Lớp : MM03A
CHƯƠNG 17 : BUFFER OVERFLOW
1
Lỗi “zero day” vượt qua sự kiểm soát của người sử dụng
Window
Sự tràn bộ nhớ đệm là thủ thuật đánh lừa hệ điều hành của
Microsoft để hệ thống cấp quyền riêng cho kẻ tấn công
Nhiều phiên bản của hệ điều hành Microsoft dễ bị tổn
thương, nhưng trước tới nay chưa được tiết lộ, việc tràn bộ đệm do
lỗi “zero day” có nguy cơ bị tổn thương mà qua đó cho phép một
kẻ tấn công chiếm được quyền của hệ thống và kiểm soát máy
tính.
Theo nghiên cứu của công ty bảo mật Vupen, vấn đề này
gây ra bởi một lỗi tràn bộ đệm trong bộ xử lý ‘win32k.sys’ khi lưu
trữ các giá trị registry đã được xử lý với ‘reg_binary’, mà qua đó
có thể cho phép người dùng không có đặc quyền phá bỏ sự quản
lý của hệ thống hoặc thực thi mã nhị phân với hạt nhân (hệ thống)
đặc quyền, bằng cách thay đổi các giá trị registry liên quan tới
người dùng cuối được xác định bằng ký tự (EUDC) qua các mã.
Theo tổ chức nghiên cứu an ninh Chester Wisniewski tại
Sophos, một kẻ tấn công có thể sử dụng mã khóa liên quan tới
EUDC “để mạo danh tài khoản hệ thống, và có quyền truy cập gần
như không giới hạn cho tất cả các thành phần của hệ thống
Windows”.
2
Tràn bộ nhớ
đệm là gì
Tràn bộ nhớ
đệm trên ngăn
xếp
Tràn bộ nhớ


đệm trên heap
Điều khiển
ngăn xếp
Các bước tràn
bộ nhớ đệm
Cách thức tấn
công 1 chương
trình thực
Sự phá vỡ ngăn
xếp
Khai thác sự
biến đổi của
tràn bộ nhớ
đệm
Cách xác định
tràn bộ nhớ
đệm
Điều khiển,
kiểm tra tràn
bộ nhớ đệm
Công cụ phát
hiện tràn bộ
nhớ đệm
Các bước
kiểm tra tràn
bộ nhớ đệm
3
Phòng chống
và công cụ đối
phó

4
 Lỗi tràn bộ đệm tổng quát xảy ra khi một bộ nhớ đệm đã được phân chia cho một
không gian lưu trữ cụ thể có chứa nhiều dữ liệu được sao chép vào lớn hơn mức mà
nó có thể xử lý.
 Khi chương trình được biên dịch và chạy, nó sẽ chỉ định một phần của bộ nhớ có độ
dài 11 bytes để chứa chuỗi tấn công.
 Hàm Strcpy sẽ sao chép chuỗi “DDDDDDDDDDDDDD” vào chuỗi tấn công, lúc
này bộ đệm sẽ vượt quá kích thước 11 bytes, dẫn tới tràn bộ đệm.
5
Đây là loại dễ bị tổn
thương trong hệ thống
dựa trên UNIX và NT.
6
Các chức năng trong ngôn ngữ lập trình C : strcat(), strcpy(),
sprintf(), vsprintf(), bcopy(), gets() và scanf() có thể bị khai thác
vì các hàm này không kiểm tra kích thước của bộ đệm.
Các lập trình viên thường không tuân thủ đúng
theo các chuẩn đã đặt ra khi tạo 1 phần mềm
Các ngôn ngữ lập trình như C thường chứa
những lỗ hổng
Các bước kiểm tra phần mềm thường không
được thực hiện đầy đủ, trong nhiều trường hợp
chúng bị bỏ qua hoàn toàn
7
Bộ đệm 2
(Biến cục bộ 2)
Bộ đệm 1
(Biến cục bộ 1)
Quay lại con trỏ
Hàm gọi các

tham số
Phần dưới
của bộ nhớ
Phần trên
của bộ nhớ
Thanh ghi
dùng để ghi
địa chỉ bên
trong stack
Các
điểm
SP nằm
ở đây
Hướng
tăng
dần của
stack
Hướng
đi vào
+ Stack truy xuất các phần tử theo
kiểu LIFO (Last in First out) sử
dụng hàm chức năng , và tham
chiếu tới các biến cục bộ.
+ Nó hoạt động như một bộ đệm,
giữ các thông tin mà hàm cần
+ Được tạo ra vào thời điểm bắt
đầu của hàm và giải phóng lúc kết
thúc hàm
+SP là một thanh ghi lưu giữ địa
chỉ trỏ đến ô nhớ hiện tại của vùng

nhớ stack.
 Sự tràn bộ đệm trên stack xảy ra khi không gian bộ đệm trong stack
không còn trống.
 Kẻ tấn công truyền các mã độc hại lên stack và khi sự tràn bộ đệm
xảy ra các mã độc hại này liền ghi đè lên các mã trước đó, các con
trỏ phải trỏ lại để điều khiển mã độc hại.
Một stack bình thường
Stack khi bị kẻ tấn
công gọi chức năng
Stack khi một chức năng nào
đó bị phá hoại
9
 Heap là một khu vực của bộ nhớ được sử dụng bởi một ứng dụng và
được cấp phát động tại thời gian chạy của các hàm, chẳng hạn như
malloc().
 Các biến tĩnh được lưu trữ trên stack cùng với dữ liệu được giao sử
dụng giao diện malloc.
 Heap lưu trữ tất cả các trường hoặc thuộc tính, hàm tạo và phương
thức của một lớp hoặc một đối tượng.
Khung nhớ Heap
10
 Nếu một ứng dụng sao chép dữ liệu mà không kiểm tra mặc dù nó phù
hợp với nơi được sao chép tới, thì kẻ tấn công có thể cung cấp một
lượng lớn dữ liệu cho ứng dụng đó, thực hiện ghi đè lên thông tin
quản lý của heap.
 Kẻ tấn công làm một bộ nhớ đệm bị tràn lên phần dưới của heap, ghi
đè lên các biến động khác gây nên các biến đổi bất ngờ và không
mong muốn.
 lưu ý: trong hầu hết các trường hợp, điều này sẽ cho phép kẻ tấn công
kiểm soát được việc thực hiện của chương trình

11
12
Shellcode là một mã nhỏ được sử dụng trong việc khai thác lỗ hổng của
một phần mềm.
Bộ đệm là mục tiêu mềm cho các kẻ tấn công vì chúng rất dễ tràn nếu có
điều kiện phù hợp.
I
II
Shellcode gây tràn bộ đệm, viết bằng hợp ngữ, khai thác các lỗ hổng trong
ngăn xếp và bộ nhớ quản lí heap.
III
13
+ Hầu hết các CPU đều
có một lệnh No
Operation (Không hoạt
động) – nó không làm
gì nhưng thúc đẩy lệnh
con trỏ.
+Thông thường, bạn có
thể đặt một trong số
chúng trước chương
trình của bạn (trong
chuỗi).
+Hầu hết các hệ thống
phát hiện xâm nhập
(IDSs) bằng cách tìm
kiếm ký hiệu của NOP.
+Kẻ tấn công làm tràn
bộ đệm với các lệnh dài
của NOP , lúc này CPU

sẽ không làm gì cả cho
tới khi nó nhận được
“sự kiện chính” (trước
con trỏ quay về).
+ ADMutate (bởi K2)
chấp nhận một lỗi tràn
bộ đệm nhằm khai thác
như là đầu vào và ngẫu
nhiên tạo ra một phiên
bản có chức năng tương
đương (đa hình).
14
Hiểu biết về tiến
trình, bộ nhớ stack
và heap.
Hiểu biết về cách
hệ thống gọi các
công việc ở cấp độ
mã máy.
Quen với các công cụ
biên dịch và sửa lỗi
như gdb.
Kiến thức về lắp
ráp và ngôn ngữ
máy.
Kiến thức ngôn
ngữ lập trình C và
Perl.
15
Tìm sự hiện diện và

vị trí của lỗ hổng
tràn bộ đệm
Ghi nhiều dữ liệu
vào bộ đệm hơn
mức nó có thể xử lý
Ghi đè lên địa chỉ
quay về của hàm
Thay đổi luồng thực
thi bằng mã được
hacker chèn vào
I
II
III
IV
16
Giả sử rằng một hàm chuỗi bị khai thác, kẻ tấn
công có thể gửi một chuỗi dài đầu vào.
Con trỏ trả về của hàm tiến hành ghi đè, và kẻ
tấn công thành công trong việc thay đổi luồng
thực hiện lệnh.
Nếu người sử dụng chèn vào mã đầu vào, anh
ta hoặc cô ta biết chính xác địa chỉ và kích thước
của ngăn xếp và làm con trỏ trở về hướng tới
đoạn mã của anh ta để thực hiện chỉ thị.
Trong C, xét ví dụ của
chuỗi định dạng có vấn đề.
Int func(char *user)
{
Fprintf ( stdout, user);
}

Có vấn đề nếu người dùng
nhập
=“%%%%%%%%%%%”
+ Chương trình có thể bị lỗi .
+ Nếu không, chương trình
sẽ in nội dung bộ nhớ
+ Lúc này khai thác hoàn
toàn có thể xảy ra bằng cách
sử dụng user =“%n”
Hình thức đúng
Int func (char *user)
{
Fprintf ( stdout,
“%s”, user) ; }
18
Trong C, xét ví dụ của BoF sử dụng
chuỗi định dạng
Như thế nào nếu user = %500stràn
bộ đệm sẽ xảy ra
19
Ý tưởng chung là gây ra
tràn một bộ đệm để sau
đó ghi đè lên địa chỉ trả
về
Khi hàm được thực hiện
xong nó sẽ nhảy tới bất
kỳ địa chỉ nào trên ngăn
xếp.
Đặt một số mã trong bộ
đệm và thiết lập địa chỉ

trở về.
Tràn bộ nhớ đệm cho
phép chúng ta thay đổi
địa chỉ trả về của một
hàm.
 Một khi lỗ hổng bị phát hiện và bị phá vỡ bởi hacker, hacker
có thể có đặc quyền tương tự và có thể điều khiển truy cập
bình thường.
 Sau đó anh ta hoặc cô ta có thể khai thác một lỗi tràn bộ đệm
cục bộ để đạt được quyền truy cập của siêu người dùng.
 Sau khi chiếm được, kẻ tấn công có thể dùng backdoor làm
cửa sau để tạo lại kết nối cho lần sau
20
21
Bof():/*gọi các chức năng của chúng ta*/
/*in ra một tin nhắn ngắn, việc thực thi sẽ không
thể tiến hành được vì thời điểm này bộ đệm bị
tràn*/
/*sao chép 20 bytes của A và bộ đệm*/
Return 1; /*quay trở lại, điều này sẽ gây ra một
truy cập trái phép do việc các ngăn xếp bị mất
Ví dụ của việc tràn ngăn xếp không thể kiểm
soát.
/*Đây là một chương trình cho thấy một lỗi tràn
không thể kiểm soát đơn giản trên ngăn xếp*/
Ví dụ của việc tràn heap không thể kiểm soát
22
Điều đầu tiên của bất kì chương
trình nào là khai báo hai chuỗi biến và
cấp phát bộ nhớ cho chúng.

Tên biến sẽ lấy 10 byte của bộ nhớ
(mà sẽ cho phép nó giữ một chuỗi 10
ký tự).
Các lệnh nguy hiểm sẽ cho biến có
bộ nhớ 128 byte.
Bạn phải hiều rằng trong C, khối bộ
nhớ cho các biến sẽ được đặt trực tiếp
bên cạnh nhau trong không gian bộ
nhớ ảo dành cho chương trình.
23
 “mã nhận được”, được đọc từ chuỗi đầu vào, chúng được đưa lên bộ
nhớ, và không quy định về độ dài chuỗi
 Điều này có nghĩa là nó sẽ đọc các ký tự mà nó thấy cần thiết đến khi
kết thúc dòng, ngay cả khi nó vượt qua vị trí cuối cùng được phân bổ
của bộ nhớ.
 Biết được điều này, một kẻ tấn công có thể gây tràn bộ nhớ lên các
lệnh nguy hiểm, và chạy bất kỳ lệnh nào mà anh ấy hay cô ấy muốn.
24
Ngẫu nhiên thay thế
các NOPs với các
phân đoạn chức năng
tương đương của mã
(e.g.: x++; x-; ?NOP
NOP)
Đối với NOP
Áp dụng XOR để kết
hợp mã với một khóa
khó hiểu,ngẫu nhiên
cho IDS. Các mã
CPU cũng phải giải

mã các mã không
hiểu được,trong thời
gian chạy chương
trình giải mã. Bởi thế,
bộ giải mã trở thành
đa hình và rất khó để
phát hiện.
Đối với sự kiện
chính
Ngẫu nhiên chỉnh sửa
LSB của con trỏ
hướng tới khu vực
NOP.
Đối với Con trỏ quay
về
Chạy máy chủ Web trên
máy cục bộ
25
Bước 1
Phát yêu cầu với mọi thẻ
dài kết thúc =
“$$$$$$$$”
Bước 2
Nếu máy chủ web bị
treo, tìm kiếm $$$$$$$”
để biết vị trí tràn
Bước 3
Sử dụng các công cụ
phát hiện tràn bộ đệm
Bước 4

Sử dụng bộ phận, phân
tách trình gỡ lỗi
Bước 5
Sử dụng IDA-Pro để xây
dụng lại chỗ bị khai thác
Bước 6

×