TCP Sequence & Acknowledgement Numbers

Giới thiệu
Bài viết này sẽ đi sâu vào Sequence Number và Acknowledgement Number. Sự tồn tại của chúng có liên quan đến 1 thực tế rằng Internet và hầu hết các mạng nói chung đều là mạng chuyển mạch gói và bởi vì chúng ta gần như luôn nhận và gửi dữ liệu có kích thước lớn hơn so với MTU (đơn vị truyền dẫn tối đa) là 1500 trên hầu hết các mạng ngày nay.
Hãy thử nhìn vào các trường mà chúng ta chuẩn bị phân tích:


Chúng ta sẽ giải thích những con số này tăng bằng cách nào và chúng có ý nghĩa gì, làm thế nào để các hệ điều hành khác nhau có thể xử lý chúng bằng những cách khác nhau và cuối cùng, vì sao những con số này có thể trở thành mối nguy hiểm an ninh cho những người yêu cầu 1 mạng lưới vững mạnh và an toàn.


TCP - Giao thức hướng kết nối
Các trường Sequence Number và Acknowledgement Number là 2 trong số những đặc điểm giúp chúng ta phân loại được TCP là 1 giao thức hướng kết nối. Như vậy, khi dữ liệu được gửi thông qua 1 kết nối TCP, các trường đó sẽ giúp các máy chủ từ xa theo dõi kết nối và đảm bảo rằng không gói tin nào bị mất trên đường đến đích.
TCP sử dụng thông báo nhận (ACK), khoảng thời gian time out, và việc truyền lại để đảm bảo không có gói tin bị lỗi, dữ liệu của người dùng đến đúng theo thứ tự. Khi hết thời gian time out mà không nhận được ACK thì dữ liệu sẽ được gửi lại bắt đầu từ byte ngay phía sau byte đã nhận được ACK.
Một điểm đáng chú ý nữa là trên thực tế Sequence Number được tạo ra theo những cách khác nhau trên mỗi 1 hệ điều hành. Sử dụng các thuật toán đặc biệt, 1 hệ điều hành sẽ tạo ra những con số này, là những số được sử dụng để đánh dấu các gói tin được gửi hoặc nhận được. Và từ 2 trường Seq và Ack là 32 bit, chúng ta có tổng cộng 2^32 = 4.294.967.296 số khác nhau có thể được sinh ra.

Initial Sequence Number (ISN)
Khi 2 máy cần truyền dữ liệu bằng cách sử dụng giao thức vận chuyển TCP thì 1 kết nối mới được thiết lập. Điều này liên quan đến máy đầu tiên yêu cầu kết nối, nó sẽ sinh ra 1 số gọi là Initial Sequence Number (ISN), nó cơ bản là Sequence Number đầu tiên trong trường Sequence mà chúng ta đang bàn luận đến. ISN luôn là vấn đề trong bảo mật TCP, và có vẻ như các hacker ưa thích sử dụng nó để tấn công các kết nối TCP (TCP hijacking).
Việc chiếm quyền điều khiển kết nối TCP là rất đơn giản đối với những hacker có kinh nghiệm. Vấn đề nằm ở cách ISN được sinh ra.
Mỗi hệ điều hành sử dụng thuật toán riêng của mình để tạo ra ISN cho các kết nối mới. Vậy các hacker cần tìm ra hay nói đúng hơn là phải biết được hệ điều hành nào sử dụng thuật toán nào để tạo ra ISN và dự đoán số thứ tự tiếp theo của ISN, rồi đặt nó vào 1 gói tin và gửi đi. Nếu tấn công thành công, bên nhận sẽ nghĩ rằng gói tin kia là hợp lệ từ máy kết nối lúc ban đầu.
Đồng thời, kẻ tấn công sẽ thực hiện 1 cuộc tấn công flood attack đến máy bắt đầu kết nối TCP, giữ cho nó luôn bận rộn và nó sẽ không gửi 1 gói tin nào nữa đến máy mà nó đã cố gắng kết nối trước đó.
Hình vẽ dưới đây minh họa ngắn gọn về cuộc tấn công nói trên:


Như đã mô tả, các hacker phải tìm ra thuật toán ISN bằng cách lấy mẫu các số ISN trong tất cả các kết nối mới mà máy A sử dụng để kết nối đến Server. Một khi việc đó hoàn thành, hacker biết được thuật toán và họ sẵn sàng bắt đầu cuộc tấn công.


Thời gian rất quan trọng đối với hacker. Hacker gửi gói tin giả mạo đầu tiên đến Internet Banking Server trong khi cùng lúc bắt đầu làm ngập lụt Host A để tiêu thụ băng thông và tài nguyên của Host A. Bằng cách đấy, Host A không có khả năng xử lý dữ liệu mà nó nhận được và sẽ không gửi bất kỳ một gói tin nào cho Internet Banking Server.
Các gói tin giả mạo gửi đến Internet Banking Server sẽ chứa Header hợp lệ, điều đó có nghĩa là nó như được gửi đến từ địa chỉ IP của Host A và gửi đến chính xác cổng mà Internet Banking Server đang lắng nghe.
Đã có nhiều tài liệu được công bố về các thuật toán mà các hệ điều hành sử dụng để tạo ra ISN và đừng ngạc nhiên là thuật toán mà Windows đang sử dụng là thuật toán dễ đoán nhất.

Ví dụ về Sequence Number và Acknowledgement Number
Ví dụ dưới đây sẽ giúp bạn hiểu được làm thế nào 2 trường Sequence và ACK được sử dụng để theo dõi các gói tin của 1 kết nối.
Trước khi tiếp tục, chúng ta nên hiểu về cờ ACK và cờ SYN. Không nên nhầm lẫn với Sequence Number và Acknowledgement Number, chúng là các trường khác nhau trong TCP Header. Hình sau sẽ giúp các bạn hiểu điều đó:


Bạn có thể thấy 2 trường Sequence Number và Acknowledgement Number, tiếp theo đó là các cờ TCP. Các cờ TCP sẽ được đi sâu hơn trong bài viết khác, nhưng vì chúng ta làm việc với chúng để kiểm tra cách thức làm việc của Seq Number và Ack Number nên sẽ cần lưu ý đến các cờ TCP.
Hình tiếp theo sẽ cho chúng ta thấy quá trình thiết lập 1 kết nối đến Web Server - ở hình là Gateway Server. Ba gói tin đầu tiên là 1 phần của quá trình bắt tay 3 bước của giao thức TCP trước khi bất kỳ dữ liệu nào được truyền giữa 2 máy.


Tôi sẽ phân tích ví dụ trên theo từng bước một.
Bước 1: Host A muốn tải 1 trang web từ Gateway Server. Một yêu cầu kết nối mới được thiết lập và Host A gửi yêu cầu đó cho Gateway Server. Gói tin có cờ SYN được bật và bao gồm ISN được sinh ra bởi hệ điều hành của Host A, đó là 1293906975. Khi Host A là máy bắt đầu 1 kết nối và chưa nhận được trả lời từ Gateway Server thì Ack Number được đặt bằng 0.


Trong hình, Host A muốn nói với Gateway Server là: "Tôi muốn bắt đầu kết nối với bạn, ISN của tôi là 1293906975".
Bước 2: Gateway Server nhận được yêu cầu từ Host A và tạo ra gói tin chứa ISN của chính mình, đó là 3455719727, và Seq Number tiếp theo mà Server mong chờ từ Host A đó là 1293906976. Hơn nữa Server bật cờ SYN và cờ ACK, Ack Number của gói tin trước và thông báo cho Host A biết Seq Number của mình.


Trong hình, Gateway Server muốn nói với Host A rằng: "Tôi vừa nhận được Sequence Number của bạn và chờ đợi gói tin tiếp theo của bạn với Sequence Number là 1293906976, Sequence Number của tôi là 3455719727".
Bước 3: Host A nhận được trả lời từ Gateway Server và biết được Sequence Number của Gateway Server. Nó tạo ra 1 gói tin khác hoàn thành kết nối. Gói tin này có cờ ACK được bật và chứa Sequence Number tiếp theo sau Sequence Number mà trước đó Gateway Server đã sử dụng, đó là 3455719728.


Trong hình, Host A muốn nói với Gateway Server là: "Tôi đã nhận được gói tin vừa rồi của bạn, Sequence Number của gói tin là 1293906976, đó đúng là Sequence Number mà tôi mong đợi. Tôi sẽ đợi gói tin tiếp theo mà bạn gửi cho tôi có Sequence Number là 3455719728".
Bây giờ, 1 máy nào đó có thể mong đợi các gói tin từ Gateway Server. Bạn hãy nhớ rằng Host A là máy bắt đầu kết nối bởi vì nó muốn tải về 1 trang web từ Gateway Server. Quá trình bắt tay 3 bước TCP hoàn thành, 1 kết nối ảo được tạo ra giữa Host A và Gateway Server, và Gateway Server sẵn sàng lắng nghe các yêu cầu từ Host A. Bây giờ là thời gian để Host A yêu cầu trang web mà nó mong muốn, tiếp theo chúng ta tới bước 4.
Bước 4: Trong bước này, Host A tạo ra 1 gói tin với 1 vài dữ liệu được gửi tới cho Gateway Server. Dữ liệu nói với Gateway Server trang web nó muốn tải về.


Chú ý rằng Sequence Number của TCP Segment ở dòng thứ 4 giống với dòng thứ 3 bởi vì ACK không chiếm không gian của Sequence Number.
Vì vậy hãy nhớ rằng bất kỳ gói tin nào được tạo ra chỉ đơn thuần là gói tin ACK (gói tin có cờ ACK được bật và không chứa dữ liệu) đến các gói tin đã nhận trước đó thì Sequence Number không bao giờ tăng lên.

Chú ý: Sequence Number và Acknowledgement Number có vai trò rất quan trọng trong quá trình truyền dữ liệu giữa 2 máy. Bởi vì Segment hay Packer trong IP datagram có thể bị mất hoặc không theo thứ tự. Do đó, máy nhận sử dụng Sequence Number để sắp xếp lại các Segment, thu thập các phân mảnh dữ liệu rồi tái cấu trúc lại chính xác những gì đã được gửi đi.

Lược dịch từ bài gốc: Click Here

Bài tiếp theo: TCP Header Lenght Analysis









1 nhận xét: