Tìm hiểu các số Sequence và số ACK, Destination Port và Source Port trong TCP Header

TCP là một giao thức quan trọng, được dùng để vận chuyển dữ liệu của các giao thức khác. Cặp song sinh với nó là UDP, đơn giản hơn nhiều, bù lại nó có nhiều tính năng hơn. Để làm được nhiều tính năng này TCP có header lớn hơn nhiều và nhiều trường hơn, mỗi trường đảm bảo một chức năng riêng. Trong bài này chúng ta tìm hiểu các trường sau đây trong TCP header: Destination Port, Source Port, Số Sequence và Số ACK và chúng ta tìm hiểu xem hacker đã lợi dụng trường Số Sequence như thế nào để chiếm đoạt kết nối của một máy. Sơ đồ dưới đây cho thấy một gói tin đã đươc bắt giữ và TCP header đã được trãi ra hoàn toàn để cho chúng ta thấy mọi trường chứa đựng bbên trong. Con số nằm bên phải là chiều dài tính theo bit của mỗi trường.




I.Tìm hiểu Destination Port và Source Port

Phần nầy chứa các trường nổi tiếng nhất trong TCP header, số port của máy gởi và của máy đến. Những trường này được dùng để chỉ rõ ứng dụng hay dịch vụ được đề nghị cung cấp trên máy cục bộ hay máy ở xa.
Chúng ta sẽ hiểu các port quan trọng như thế nào và người ta có thể dùng các port này để lấy thông tin của máy ở xa là máy người ta nhắm để tấn công. Chúng ta sẽ đề cập việc giao tiếp giữa các port bằng các ví dụ chi tiết và các sơ đồ đầy màu sắc. Bây giờ chúng ta bắt đầu bằng các điều cơ bản nhất.


Khi một máy cần phát sinh một truy vấn hay gởi dữ liệu, nó đòi hỏi một số thông tin:
-Địa chỉ IP của máy theo ý định mà nó muốn truy vấn hay gởi dữ liệu.
-Số của port mà gói truy vấn hay gói dữ liệu phải gởi tới cho máy ở xa. Trong trường hợp là gói truy vấn, nó cho phép máy gởi chỉ rõ dịch vụ mà nó muốn, chúng ta sẽ phân tích điều này.
1) Địa chỉ IP được dùng để nhận diện duy nhất máy tính theo ý mà mình muốn kết nối. Thông tin này không thấy trong gói tin ở trên vì nó ở trong phần header của IP nằm ngay bên trên header của TCP mà chúng ta đang phân tích. Nếu như chúng ta mở rộng header của IP chắc chắn chúng ta thấy trường địa chỉ IP của máy gởi và của máy nhận trong đó.
2)Một khía cạnh quan trọng khác, số của port, cho phép chúng ta nhận ra dịch vụ hay ứng dụng mà dữ liệu hay truy vấn phải được gởi tới. Khi một máy tính, dù cho nó là một máy thường hay máy chuyên dụng, cung cấp nhiều dịch vụ khác nhau như là HTTP, FPT, TELNET, thì mọi clients kết nối tới nó phải dùng một con số của port để chọn một dịch vụ cụ thể mà chúng muốn sử dụng.
Cách tốt nhất để hiểu khái niệm này là chúng ta thông qua các ví dụ. Chúng ta sẽ bắt đầu từ ví dụ đơn giản và chuyển tới cái hơi phức tạp hơn.

a. Tìm hiểu Destination Port

Chúng ta hãy xem xét trình duyệt web
Khi chúng ta gởi một gói truy vấn HTTP để tải một trang web về, thì gói đó phải được gởi tới đúng web server để nó nhận, xử lý và rồi cho chúng ta thấy trang web mà mình muốn. Điều này hoàn thành được bằng cách nó lấy được đúng địa chỉ IP nhờ DNS phân giải và rồi nó gởi gói truy vấn đến đúng số port của máy ở xa (web server).Giá trị của port trong trường hợp này là truy vấn HTTP thường là 80.
Mỗi khi gói truy vấn đến được web server, nó sẽ kiểm tra gói tin đó có đích thực cho chính nó hay không. Điều này thực hiện được bằng cách nó xem xét địa chỉ IP đến của gói tin mà nó vừa nhận được. Đây chính là chức năng của tầng Network.
Khi mà nó kiểm chứng gói tin quả thực là cho máy cục bộ, nó sẽ xử lý gói tin và thấy rằng số của port đến là 80. Rồi nó nhận ra là phải gởi dữ liệu (hay truy vấn) tới chương trình http đang chờ để phục vụ clients
Bằng cách sử dụng phương pháp này, chúng ta có thể sử dụng các dịch vụ còn lại mà server này ó thể cung cấp. Vì thế, để sử dụng dịch vụ FTP, máy trạm chúng ta ngồi phát sinh ra một gói tin có địa chỉ đến là địa chỉ IP của server, là địa chỉ 200.0.0.1, nhưng lần này với số của port đến là 21.
Sơ đồ dưới đây minh hoạ tiến trình này:

Bây giờ chúng ta có thể hiểu được mục đích của port đến và làm thế nào để có thể chọn được các dịch vụ mà chúng ta muốn máy chủ cung cấp .
Nếu ai để ý thì có thể thấy được từ đầu, trong gói tin mà chúng ta bắt được, còn có một port khác, port nguồn, mà chúng ta xem xét nó ngay dưới đây.

b. Tìm hiểu Source Port

Port nguồn phục vụ tương tự port đến, nhưng nó được dùng bởi máy gởi để giúp theo dõi các kết nối mới đi vào và các dòng dữ liệu hiện có.
Như chúng ta đã biết, trong các giao tiếp dữ liệu sử dụng TCP/UDP, mỗi máy luôn cung cấp số của port đến và của port nguồn. Chúng ta đã phân tích port đến, và làm thế nào mà máy chọn được dịch vụ mà nó cần. Còn port nguồn được cung cấp cho máy ở xa sử dụng, trong trường hợp của ví dụ, đó chính là Server trên Internet, để nó có thể trả lời đúng phiên làm việc mà phía bên kia đã khởi đầu.
Điều này đạt được bằng cách đảo ngược port đến và port nguồn. Khi một máy (trong ví dụ của chúng ta, là Host A) nhận gói này, nó nhận ra gói này là gói trả lời cho gói mà trước đây nó đã gởi:


Khi Host A nhận được trả lời của Iternet Server, tầng Transport sẽ nhận ra các port đã bị đảo ngược và nhận ra rằng đây là gói trả lời cho gói mà nó đã gởi trước đây (gói có mũi tên màu xanh lá cây).
Tầng Transport và tầng Session theo dõi mọi kết nối mới, các kết nối đã được thiết lập, và những kết nối đang trong tiến trình kết thúc. Chính điều này giải thích làm thế nào host A nhớ được rằng nó đang trông chờ một gói trả lời từ Internet Server.
Tất nhiên gói bắt được hiển thị ở đầu trang cho thấy những số port khác nhau với những số port trong sơ đồ này. Trong trường hợp cụ thể này, máy trạm gởi yêu cầu tới máy web proxy server cục bộ chạy với port 8080, bằng cách sử dụng port 3025 làm port nguồn.
Chúng ta cũng nên chú ý TCP sử dụng thêm vài kỹ thuật để có thể theo dõi chính xác các kết nối này. 

II.Số Sequence và Số Acknowledgement

Phần này sẽ xem xét kỹ các số Sequence và Acknowledgement. Lý do chính sự tồn tại của nó liên quan trực tiếp đến sự kiện là mạng Internet, và nói chung cho mọi mạng điện toán, là chuyển gói và vì hầu như mọi lúc, chúng ta gởi và nhận dữ liệu lớn hơn đơn vị truyền (MTU viết tắt của Maximum Transmission Unit) là 1500 Bytes.
Chúng ta hãy nhìn đến trường mà chúng ta sắp phân tích:


Như chúng ta có thể thấy, số Sequence đi trước số Acknowledgement.
Chúng ta sẽ giải thích những số này tăng lên như thế nào, các hệ điều hành khác nhau xử lý một cách khác nhau như thế nào và sau cùng những số này có thể trở thành nguy cơ an toàn như thế nào.

TCP – Giao thức có định hướng nối kết

Trường Sequence và Acknowledgement là hai trong nhiều tính năng giúp chúng ta xếp loại TCP là giao thức có định hướng kết nối. Như vậy, dữ liệu được gởi qua kết nối của TCP thì chúng giúp các máy ở xa theo dõi kết nối đó và đảm bảo rằng không một gói tin nào bị mất trên đường đi tới đích của nó.
TCP sử dụng các gói báo nhận tích cực, thời gian chờ, và truyền lại để đảm bảo việc chuyển dữ liệu của người dùng không bị lỗi, có đánh số thứ tự. Nếu bộ đếm thời gian truyền lại hết hạn chờ trước khi nó nhận được gói báo nhận, dữ liệu được truyền lại khởi đầu tại số byte liền sau số byte đã báo nhận được lần sau cùng trong luồng dữ liệu.
Điểm cần phải đào sâu là sự kiện các số Sequence được phát sinh một cách khác nhau trên mỗi hệ điều hành. Bằng cách sử dụng các thuật toán đặc biệt, hệ điều hành phát sinh ra các số này, được dùng để theo dõi các gói tin được gởi đi và nhận được, và vì cả hai trường Sequence và Acknowledgement là 32 bit thì nó có 2^32=4.294.967.296 khả năng để phát sinh ra một số khác biệt nhau!

Số Sequence đầu tiên (Initial Sequence Number, viết tắt là ISN)

Khi hai máy cần chuyển dữ liệu bằng cách sử dụng giao thức TCP, thì chúng phải tạo một kết nối mới. Điều này bao hàm máy đầu tiên muốn khởi sự kết nối, nó phải phát sinh ra một cái gọi là Số Sequence Khởi đầu (ISN), đây là số sequence đầu tiên mà chúng ta thấy chứa trong trường Sequence, ISN luôn luôn là chủ đề của các vấn đề về an ninh an toàn của máy, vì đây dường như là một cách ưa thích cho hacker đoạt lấy các kết nối TCP.
Việc đoạt một kết nối TCP mới là một điều mà hacker dày kinh nghiệm làm được một cách đáng sợ bằng vài lần làm thử. Căn nguyên của vấn đề an ninh này khởi đầu bởi cách phát sinh ISN .
Mỗi hệ điều hành dùng một thuật toán riêng để phát sinh ISN cho mỗi kết nối mới, vì vậy điều quan trọng mà hacker cần làm là hình dung hay nói đúng hơn là tiên đoán thuật toán nào được dùng bởi một hệ điều hành cụ thể, phát sinh ra một số Sequence được tiên đoán kế tiếp và đặt nó bên trong gói tin rồi gởi tới đầu kia. Nếu kẻ tấn công thành công, máy nhận bị lừa và nghĩ rằng gói tin này là một gói tin hợp lệ đến từ máy khởi đầu kết nối.
Cùng lúc đó, kẻ tấn công sẽ phát động cuộc tấn công ào ạt tới máy khởi đầu kết nốt TCP, làm cho nó bận rộn đến nỗi nó không gởi được một gói tin nào cả tới máy ở xa là máy nó đã cố khởi sự kết nối.
Dưới đây là một hình minh họa của cuộc tấn công nói trên:

Như mô tả, hacker phải tìm ra cho được thuật toán tạo ISN bằng cách lấy mẫu các ISN được sử dụng trong mọi kết nối của máy A. Mỗi khi điều này làm xong và hacker biết được thuật toán và họ sẵn sàng để khởi đầu cuộc tấn công:

Việc tính toán thời gian là điều trọng yếu cho hacker, vì vậy nó gởi gói giả đầu tiên tới Internet Banking Server trong khi đó cùng một lúc khởi đầu tấn công tràn ngập Host A bằng các dữ liệu rác để làm tiêu tốn băng thông và tài nguyên của Host A. Bằng cách làm như thế, Host A không thể nào đối phó được với dữ liệu mà nó đang nhận và sẽ không thể nào gởi được bất kỳ gói tin nào tới Internet Banking Server.
Internet Banking Server sẽ nhận các gói tin giả với các headers hợp lệ, nghĩa là như thể bắt nguồn từ địa chỉ IP của Host A và sẽ gởi tới đúng port của Internet Banking Server đang lắng nghe.
Có rất nhiều bản báo cáo xuất bản trực tuyến nói về phương pháp mà mỗi hệ điều hành dùng để phát sinh ra ISN của nó và tiên đoán chúng nó khó hay dễ để tiên đoán. Bạn đừng có hoảng sợ khi phát hiện ra rằng thuật toán ISN của hệ điều hành Windows cho tới bây giờ là dễ tiên đoán nhất!
Các chương trình như “nmap” thực sự dùng thử nghiệm để xem mức độ khó dễ chừng nào để phát hiện thuật toán ISN được dùng trong mỗi hệ điều hành. Trong đa số trường hợp, trước tiên hacker sẽ lấy mẫu ISN của máy nạn nhân, tìm kiếm mẫu trong các ISN được chọn từ việc triển khai kết nối TCP khi đáp ứng các yêu cầu kết nối.

Ví dụ về các số Sequence và Acknowledgement

Ví dụ dưới đây giúp chúng ta hiểu các trường mới được giới thiệu này để theo dõi các gói tin của một kết nối:
Trước khi tiến hành, chúng ta cần lưu ý là sẽ gặp các thuật ngữ như “ACK flag” hay “SYN flag”; những thuật ngữ này không được lẫn lộn với các số Sequence và Acknowledgement vì chúng là những trường khác bên trong TCP header
Sơ đồ dưới đây cho thấy việc thiết lập một kết nối mới tới một web server- Gateway Server. Ba gói đầu là một phần của tiến trình bắt tay 3 chiều thực hiện bởi TCP trước khi dữ liệu được chuyển qua lại giữa hai máy. Trong lúc đó ô trắng nhỏ dưới sơ đồ là do một chương trình bắt gói tin bắt được.

Bước 1

Host A muốn tải một trang web từ Gateway Server. Điều này đòi hỏi một kết nối mới giữa hai máy phải được thiết lập, vì vậy Host A gởi một gói tin tới Gateway Server. Gói này có SYN flag được bật lên và cũng có chứa ISN mà hệ điều hành Host A phát sinh ra, đó là số 1293909675. Vì Host A khởi đầu kết nối và chưa nhận trả lời từ Gateway Server, số Acknowledgement chưa bật lên (tương ứng với số 0 trong trường Acknowledgement)

Nói tóm lại, Host A nói với Gateway Server như sau: ”Tôi muốn có kết nối với bạn. Số Sequence của tôi là 1293906975”

Bước 2

Gateway Server nhận gói yêu cầu từ Host A và phát sinh gói trả lời chứa ISN do tự nó tạo ra, đó là 3455719727, và số Sequence kế tiếp mà nó mong đợi từ Host A là 1293906976. Gateway Server cũng bật các cờ SYN và ACK lên, ghi nhận các gói trước đây mà nó đã nhận và thông báo cho Host A số Sequence của nó.

Tóm lại, Gateway Server nói với Host A như sau: “tôi ghi nhận số Sequence của bạn và tôi đang mong chờ gói kế tiếp của bạn có số Sequence là 1293906976. Số Sequence của tôi là 3455719727”.

Bước 3

Host A nhận được gói trả lời và cũng biết được số Sequence của Gateway Server.
Nó phát sinh một gói khác để hoàn tất kết nối này. Gói này có cờ ACK được bật lên và cũng chứa số Sequence mà nó mong đợi Gateway Server sẽ sử dụng kế tiếp, số đó là 3455719728.

Nói tóm lại, Host A nói với Gateway Server như sau: “tôi ghi nhận gói mới nhất của bạn. Số Sequence của gói này là 1293906976, là gói mà bạn đang mong chờ. Tôi cũng đang mong chờ gói kế tiếp mà bạn sẽ gởi cho tôi có số Sequence là 3455719728”.
Bây giờ có thể có người mong chờ gói tin kế tiếp từ Gateway Server gởi tới, nhưng lại không đúng như vậy. Chúng ta phải nhớ lại rằng Host A khởi đầu kết nối này vì nó muốn tải trang web từ Gateway Server về. Từ khi bắt tay 3 chiều của TCP hoàn tất, một kết nối ảo tồn tại giữa 2 máy và Gateway Server đang sẵn sàng lắng nghe gói yêu cầu của Host A.

Bước 4

Trong bước này, Host A phát sinh ra một gói có một số dữ liệu và gởi nó cho Gateway Server. Dữ liệu đó bảo Gateway Server gởi cho nó trang web nào.
Chúng ta lưu ý là số Sequence của gói tin trong dòng 4 giống trong dòng 3 vì ACK không chiếm khoảng cách của số Sequence.
Vì vậy chúng ta phải luôn nhớ rằng các gói tin được phát sinh, mà đơn thuần chỉ là gói ghi nhận (nói cách khác, chỉ có cờ ACK được bật lên và không chứa dữ liệu) cho các gói đã nhận được trước đây, thì chúng không bao giờ tăng số Sequence.

Điều cần chú ý

Các số Sequence và ACK còn có các vai trò quan trọng khác nữa khi đã có liên lạc giữa hai máy. Vì các gói tin của TCP (gọi là Segment) di chuyển trong các gói IP (gọi là IP Datagrams), chúng có thể bị mất hay chuyển đến không theo đúng thứ tự, vì vậy máy nhận dùng số Sequence để tái tạo lại thứ tự của các Segments. Máy nhận lấy thông tin từ các Segments đến và tái cấu trúc một bản sao y hệt dòng chảy đã được gởi đi.
Nếu chúng ta nhìn kỹ hơn vào sơ đồ trên, chúng ta sẽ để ý thấy rằng số Acknowledgement chỉ rõ số Sequence của Segment mà máy nhận mong đợi kế tiếp.

Tóm lại

Bài này vừa giới thiệu với các bạn các trường Sequence và Acknowledgement bên trong TCP header. Qua đó chúng ta cũng thấy được hacker chiếm đoạt các kết nối này như thế nào bằng cách phát hiện các thuật toán được dùng để tạo ra ISN và chúng ta cũng đã xem xét từng bước các số Sequence và Acknowledgement tăng lên như thế nào

Post a Comment

Mới hơn Cũ hơn