Sự phân mảnh
Trong những thời điểm khác nhau, kẻ tấn công sử dụng sự phân mảnh để tạo mặt nạ và tăng cường khả năng thăm dò và phá hoại. Một vài hệ thống dò tìm sự xâm nhập và các thiết bị lọc gói không hỗ trợ việc tập hợp các gói hoặc thực hiện nó một cách chính xác và do đó không phát hiện ra hoặc block được những hoạt động có dấu hiệu của sự chia nhỏ qua nhiều datagram. Tấn công sẵn sàng hoặc từ chối dịch vụ sử dụng một lượng lớn các traffic phân mảnh để làm cạn kiệt tài nguyên hệ thống. Có một vài lý do có thể bạn sẽ muốn học về sự phân mảnh và một vài chủ để được trình bày trong chương này. Bằng cách hiểu khía cạnh này của giao thức IP, bạn sẽ được trang bị để phát hiện và phan tích các traffic bị phân mảnh và nhận ra một sự phân mảnh là bình thường so với sự phân mảnh vì những mục đích khác. Sự phân mảnh có thể là một hiệu ứng xảy ra một cách tự nhiên đi từ qua các mạng khác nhau có những đơn vị truyền tải tối đa khác nhau (MTU khác nhau). Lý thuyết và sự hợp thành của sự phân mảnh bình thường được thảo luận ban đàu ở chương này để bạn làm quen với việc nó hoạt động như thế nào.
Lý thuyết về sự phân mảnh
Sự phân xảy ra khi một gói tin IP đi từ mạng này qua mạng kia có đơn vị truyền tải tối đa (MTU) nhỏ hơn kích thước của gói tin. Ví dụ, MTU của chuẩn Ethernet là 1500 byte. Nếu một gói tin lớn hơn 1500 byte, nó cần phải được chia mảnh bởi router đưa nó đến với mạng Ethernet đó. Sự phân mảnh cũng có thể xảy ra nếu một host cần phải truyền một gói tin vào một mạng mà gói tin đó có kích thướt lơn hơn MTU của mạng. Các phân mảnh tiếp tục đi đến đích của chúng, và khi chúng đến host đích chúng được tập hợp lại. Các phân mảnh có thể đowjc chia nhỏ ra nữa nếu chúng phải đi qua những mạng có MTU nhỏ hơn kích thước của phân mảnh. Mặc dù sự phân mảnh là hoàn toàn hoàn hảo trong tình huống bình thường, người ta có thể phân mảnh một cách thủ công cho mục đích tránh phát hiện bởi các router và các hệ thống thăm dò tấn công mà không được trang bị khả năng giải quyết với sự phân mảnh.
Những thông tin gì gói tin phân mảnh cần phải mang theo để host đích có thể tập hợp chúng lại thành trạng thái ban đầu? Danh sách sau đây trả lời cho câu hỏi đó:
- Tất cả các phân mảnh từ cùng một gói tin phải được gắn với những phân mảnh còn lại bằng cách gắn cho tất cả chúng một số định danh duy nhất. Số này được sao chép từ một trường trong IP header và được biết đến như số định danh IP, hay cũng được gọi là số định danh phân mảnh
- Mỗi phân mảnh mang theo một số offset để cho biết vị trí của nó trong gói tin ban đầu
- Mỗi phân mảnh phải cho biết độ dài phần payload mà nó mang
- Cuối cùng mỗi phân mảnh phải cho biết là có phân mảnh nào đi sau nó nữa hay không? Điều này được thể hiện thông qua cờ MF (More fragments)
Số định danh phân mảnh (hay số định danh IP)
Số định danh IP là một trường có giá trị dài 16 bit được tìm thấy trong phần IP header của tất cả các gói tin. Con số này phân biệt duy nhất mỗi gói tin được gửi bởi một host. Thông thường, con số này được tăng thêm một cho mỗi gói tin được gửi đi từ host đó.
Khi một datagram bị phân mảnh, tất cả các phân mảnh được tạo ra từ datagram này sẽ có cùng một số định danh IP hay cùng một số định danh phân mảnh.
Giả sử ta có một datagram có ID là 202, nếu datagram này bị phân mảnh trong suốt quá trình nó được truyền trên đường tới đích, thì tất cả các phân mảnh của nó được tạo từ datagram này sẽ được gắn ID là 202.
Thông tin về ID được lưu trong phần IP header. IP header một phần trong IP datagram mà theo sau nó là phần bao gói của phân mảnh. Như chúng ta cũng đã biết thì tất cả các traffic TCP/IP phải được đóng gói bởi giao thức IP bởi giao thức IP có nhiệm vụ chuyển gói tin đến đích
Một cái nhìn trực quan về sự phân mảnh
Ở ví dụ này ta sử dụng Ethernet như là một phương tiện liên kết mẫu để demo sự đóng gói của một datagram.
Hình 1 bên dưới cho thấy cấu hình của một data gram không bị phân mảnh. Như ta đã biết trước đó, một datagram trên mạng Ethernet có kích thước MTU là 1500 byte. Mỗi một datagram như vậy phải có một IP header thường ở dạng chuẩn 20 byte, nhưng có thể lớn hơn nếu như những tùy chọn IP khác như là source routing được thêm vào.
Hình 1
Để dễ hiểu ta hãy nhớ lại là một IP header sẽ chứa thông tin về các địa chỉ IP nguồn và đích. Thông tin này được xem như là phần “mạng” của datagram vì nhờ có nó mà các router có thể điều hướng datagram đó đi đến đúng đích. Một số loại dữ liệu khác có thể được đóng gói sau phần IP header, những dữ liệu này có thể ở một trong các giao thức IP như TCP, UDP hay ICMP. Ví dụ nếu dữ liệu này là TCP thì nó có thể bao gồm cả TCP header và TCP data.
Ở hình 2 bên dưới cho ta thấy một datagram có độ lớn 4028 byte, đây là một gói tin ICMP gửi vào một mạng Ethernet có MTU là 1500 byte. Đây là một gói tin ICMP có độ lớn không bình thường như ng được dùng để demo cho sự phân mảnh. Thế thì datagram có độ lớn 4028 byte đó sẽ được chia thành các phân mảnh nhỏ hơn hoặc bằng 1500 byte. Mỗi một phân mảnh 1500 byte này sẽ phải có một IP header 20 byte giống như datagram lúc đầu, như vậy mỗi phân mảnh có tối đa là 1480 byte để chứa dữ liệu.
Ở hình 3 cũng xem xét cùng một datagram nhưng nó cho ta thấy việc sử dụng các byte trên mỗi phân mảnh.
Hình 2
Hình 3
Các phân mảnh nối nhau như các toa tàu
Bây giờ ta tập trung vào phân mảnh ban đầu, trong hình 4. Phần IP header ban đầu sẽ được sao chép để chứa số định danh phân mảnh cho phân mảnh đầu và những phân mảnh theo sau nó.
hình 4
Chỉ có phân mảnh đầu tiên có chứa ICMP header. Phần header này không được sao chép ở những phân mảnh theo sau và khái niệm về phân mảnh đầu tiên một mình nó định ra trạng thái nguyên thủy của phân mảnh là rất quan trọng, chúng ta sẽ được biết đến sau.
Phân mảnh đầu tiên có offset là 0, độ dài là 1480 byte trong đó có 1472 byte dữ liệu và 8 byte dành cho ICMP header, bởi vì có các gói tin khác theo sau nên cờ MF (more fragments) được bật
Ở hình 5 bên dưới sẽ giải thích về cấu hình của phân mảnh đầu tiên trong chuỗi các phân mảnh. Phần 20 byte đầu tiên của 1500 byte là của IP header. 8 byte tiếp theo là ICMP header (Nhớ rằng gói tin ICMP có 8 byte header trong gói tin gốc). Phần còn lại là 1472 byte dữ liệu.
Hình 5
Ngoài những trường bình thường được lưu trong IP header, như là địa chỉ nguồn và địa chỉ IP đích và giao thức (ví dụ trong trường hợp này là ICMP), có những trường khác đặc biệt dành cho sự phân mảnh. Phân mảnh có ID là 21233 là một liên kết chung cho tất cả các phân mảnh trong luồng các phân mảnh. Có một trường được biết đến như cờ MF (more fragments) và cờ này cho biết có còn phân mảnh nào theo sau phân mảnh hiện tại. Trong phân mảnh đầu tiên này, cờ MF được thiết lập là 1, cho biết có nhiều phân mảnh đi theo sau nó. Và offset của dữ liệu chứa trong phân mảnh này so với dữ liệu gốc của datagram ban đầu cũng phải được thiết lập, trong trường hợp này offset của nó là 0, cuối cùng là độ dài của dữ liệu mà nó chứa trong phân mảnh và được biết đến như độ dài phân mảnh – trong trường hợp này là 1480 ( bao gồm 8 byte ICMP header và 1472 byte dữ liệu)
Xem xét mỗi toa tàu của datagram bị phân mảnh.
Xem hình 6 và tập trung vào các phân mảnh tiếp theo của con tàu phân mảnh. Một IP header được nhân bản (sao chép) và từ phần header ban đầu có chứa số định danh phân mảnh (fragment ID) và các thông tin khác của IP header (như địa chỉ nguồn và địa chỉ đích) được tái tạo và gắn thành các header mới cho các phân mảnh mới. Và theo sau phần header mới này là 1480 byte của dữ liệu ICMP. Như ta có thể thấy, phân mảnh thứ 2 sẽ có offset là 1480 và độ dài dữ liệu cũng là 1480 byte; và do có thêm phân mảnh khác theo sau nên cờ MF được bật
Hình 6
Tiếp tục xem xét sự phân mảnh ở hình 7, bạn có thể thấy IP datagram mang theo phân mảnh thứ hai. Cũng giống như tất cả các toa tàu khác trên con tàu các phân mảnh này, nó cần 20 byte cho IP header. Và một lần nữa, giao thức trong header chỉ định giao thức ICMP. Số định danh phân mảnh vẫn là 21223 và cờ MF được bật vì vẫn còn phân mảnh khác theo sau nó. Offset là 1480 byte so với phần dữ liệu chứa trong gói tin ICMP ban đầu. Phân mảnh trước đó đã chứa 1480 byte này. Độ dài dữ liệu của nó cũng là 1480 byte và trong đó chỉ chứa dữ liệu của ICMP
hình 7
Cũng nên nhắc lại là phần header của ICMP chỉ được lưu trong phân mảnh đầu tiên và không được sao chép với phần dữ liệu của ICMP. Điều này có nghĩa là nếu bạn xem xét những phân mảnh này một mình thì bạn không biết được loại của message ICMP – mà trong trường hợp này là một yêu cầu echo request. Điều này gây ra một kết quả không tốt cho các thiết bị lọc gói tin.
Toa cuối (toa bếp) của con tàu phân mảnh
Xem xét phân mảnh cuối cùng của con tàu phân mảnh trong hình 8. Một lần nữa, một IP header được sao chép từ header ban đầu và gắn vào phân mảnh này trong đó có chứa số định danh phân mảnh và những thông tin khác được sao chép. Phần cuối cùng là 1048 byte của phần dữ liệu ICMP được gắn vào sau IP datagram này. Và bạn có thể thấy phân mảnh thứ 3 này có offset là 2960 và có độ dài là 1048 byte. Và vì không có phân mảnh nào theo sau nó nữa, MF được thiết lập là 0
Hình 8
Hình 9 bên dưới mô tả chi tiết dữ liệu bên trong phân mảnh cuối này. Như ta thấy thì 20 byte đầu tiên được sử dụng cho IP header. Phần còn lại là các byte dữ liệu của ICMP được chứa trong phần dữ liệu của phân mảnh này. Định danh phân mảnh là 21223, và cờ MF không được thiết lập vì nó là phân mảnh cuối cùng.
Offset của nó là 2960 ( 1480 + 1480 = 2960) và chỉ có 1048 byte dữ liệu được đemtheo trong phân mảnh này chứa phần còn lại của message ICMP. Phân mảnh này, cũng như những phân mảnh khác, không có ICMP header và do đó không biết được là nó thuộc loại ICMP nào.
hình 9
Sự phân mảnh nguy hiểm
Không có gì mệt mỏi hơn là phải phân tích những gói tin phân mảnh nguy hiểm. Sự phân mảnh xem ra đã cung cấp một mẫu đất màu mở cho giới hacker khai thác với một lượng lớn các loại tấn công khác nhau
Phân mảnh gói tin mở đầu của giao thức TCP (TCP header)
nmap là một công cụ quét xuất sắc chạy trên nhiều hệ UNIX và có thể được tải về tại địa chỉ http://insecure.org/nmap Nó dễ dàng thực hiện việc quét cổng để nhận ra cộng nào đang được mở trên host đích và quét ngầm để tìm những cổng đang mở, nhưng cũng cố gắng để tránh sự phát hiện của các hệ phát hiện xâm nhập (IDS)
Tùy chọn -f của dòng lệnh trong nmap phân mảnh 20 bytes của TCP header trong nhiều phân mảnh để tránh sự phát hiện. Kết quả TCPdump sau được sinh ra bởi lệnh:
câu lệnh này gửi gói tin SYN kết nối đến cổng 53 trên host target.com
Kết quả TCPdump trên cho thấy một sự scan phân mảnh TCP header. Việc scan này được gửi từ fragger.org quét lên cổng 53 của host target.com sử dụng yêu cầu SYN của bộ giao thức TCP chuẩn. Sự scan này không rõ ràng tuy nhiên có các gói tin được phân mảnh trong đó
Quan sát dòng đầu tiên của dữ liệu, bạn sẽ một phân mảnh với 16 bytes với dữ liệu TCP bị làm cắt. Phần header tối thiểu của TCP header phải là 20 bytes. Bởi vì đây không phải là một TCP header hoàn chỉnh, TCPdump sẽ xem cái này như là một truncated-tcp. Trong phần tiếp theo ta sẽ thay 4 bytes tiếp của TCP header được gửi đi. Và có thể một hệ IDS nào đó sẽ không phát hiện được kiểu quét ngầm này.
Tấn công teardrop
Bây giờ bạn đã quen với sự phân mảnh hoạt động thế nào, hãy xem kết quả của TCPdump sau. Xem thử bạn có thể phát hiện được vấn đề đã xảy ra bởi sự phân mảnh sinh ra bởi chương trình có tên là teardrop không?
Phân mảnh đầu tiên được chuyển đi trong một UDP datagram có cờ phân mảnh là 242 và độ dài là 36 byte và có offset là 0;
Bây giờ khi phân mảnh thứ 2 đi cùng. Nó được gắn với định danh phân mảnh là 242 và có độ dài là 4, nó bắt đầu bởi offset 24 trong phần dữ liệu. Như vậy khi được lắp ráp lại thì nó sẽ đề lên từ byte thứ 24 đến byte thứ 27 trong phân mảnh đầu tiên.
Kĩ thuật tấn công teardrop lợi dụng điểm yếu của quá trình lắp ghép các phân mảnh. Chương trình teardrop tạo ra các phân mảnh có các trường offset đè lên nhau. Khi các phân mảnh này được lắp ghép lại tại host đích, một số hệ thống sẽ hỏng hoặc bị treo hay bị khởi động lại. Kiểu tấn công này được báo cáo lần đầu năm 1997, và nó cho ta một ví dụ tốt về việc một sự phân mảnh nguy hại sẽ ảnh hưởng thế nào đến host đích.
Một tập các phân mảnh dị hình hoặc chưa hoàn chỉnh vẫn là vấn đề đối với một số host. Ví dụ gần đây là một chương trình được biết đến như Jolt2 có thể gây ra cuộc tấn công chối dịch vụ thông qua làm cạn kiệt tài nguyên của host chỉ đơn giản bằng cách gửi liên tiếp các fragment có offset khác 0 đến host Windows như windows 2000.
Quá nhiều vấn đề có thể tồn tại bởi vì các host, các routers, các hệ thống phát hiện sự xâm nhập phải đương đầu với quá nhiều khía cạnh khác nhau của sự phân mảnh. Đầu tiên chúng phải đảm bảo tất cả các phân mảnh trong con tàu phân mảnh đều được nhận được; Thứ hai, chúng phải đảm bảo rằng các phân mảnh này đúng định dạng, không có hiện tượng ghi đè, và dung lượng tối đa cho chúng phải là 65535 byte; Và cuối cùng, không có sự đánh lừa nào xảy ra bằng cách phân mảnh phần đầu của giao thức. Những việc này là một yêu cầu lớn vì nó yêu cầu các phân mảnh được lắp ghép chính xác nguyên vẹn. Và để làm được việc này một cách chính xác, cần phải có sử dụng một lượng bộ nhớ và CPU và nếu không được cài đặt một cách chính xác thì nó gây ra hiện tượng từ chối dịch vụ hoặc những vấn đề khác









3 nhận xét (Click vào để comment):
bợ chỗ mô ra ri!
nghiên cứu và dịch từ sách ra chơ mô nữa :)
cám ơn bạn.Bài viết hay quá,tôi rất thích
Post a Comment