test

filtering bad tcp_flags

Trong bài này chúng ta sẽ cùng nhau nghiên cứu, tìm hiểu về cách lọc gói tin TCP dựa trên flags nhé.

Bình thường TCP sẽ sử dụng 6 Flags để control session: URG ACK PSH RST SYN FIN


Trong 3 bước bắt tay TCP thì chúng sẽ sử dụng SYN; SYN-ACK; SYN để bắt đầu mọi session


Trong 3 bước bắt tay TCP, Client và server sẽ đàm phán đưa ra thông số MSS duy nhất theo giá trị của chúng, hỗ trợ cho các tùy chọn SACK hoặc WindowScaling, v.v.

Sau khi phiên TCP được thiết lập thành công thì sẽ có 1 vài cặp TCP_FLAG không bao giờ tồn tại.

Ví dụ như: 

- Một packet với flag SYN sẽ chỉ đến một mình nó hoặc có thêm SYN-ACK, sẽ không thể nào có 1 gói tin với FLAG SYN+FIN
(Ồ cái gì vậy, bạn muốn bắt đầu hay kết thúc 1 session đây???)

- Một packet với cặp flag khác SYN+RST

(Ồ bạn đang muốn bắt đầu và reset luôn 1 session)

Các bạn thấy không. Sẽ có điều gì đó không ổn với 1 gói tin với những TCP FLAGs lạ phải không nào? Không ai muốn nhưng gói tin với FLAGs lạ như vậy truy cập vào hệ thống của mình, đó có thể là hacker đang muốn tấn công hay xâm nhập hệ thống. Vậy tốt nhất là nên chặn toàn bộ những gói tin với FLAGs không giống bình thường như thế. 


Dưới đây là 1 vài ví dụ xây dựng firewall hay ACL để chặn các gói tin như vậy.


(ios)
access-list 101 deny tcp any any syn fin ack   
access-list 101 deny tcp any any ack fin psh rst syn urg   
access-list 101 deny tcp any any rst syn   
access-list 101 deny tcp any any rst syn fin ack
access-list 101 deny tcp any any rst syn fin 
access-list 101 deny tcp any any syn fin   

!
!
!

(ios-xr)
Tue Mar  5 11:04:19.248 GMT
ipv4 access-list badflags
10 deny tcp any any ack fin syn
20 deny tcp any any established fin psh syn urg
30 deny tcp any any rst syn
40 deny tcp any any established fin syn
50 deny tcp any any fin rst syn
60 deny tcp any any fin syn
!

!


(linux) 
  -p TCP --tcp-flags ALL FIN,URG,PSH -j DROP

  -p TCP --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
  -p TCP --tcp-flags SYN,RST SYN,RST -j DROP
  -p TCP --tcp-flags SYN,FIN SYN,FIN -j DROP
  -p TCP --tcp-flags SYN,ACK NONE -j DROP
  -p TCP --tcp-flags RST,FIN RST,FIN -j DROP
  -p TCP --tcp-flags SYN,URG SYN,URG -j DROP
  -p TCP --tcp-flags ALL SYN,PSH -j DROP
  -p TCP --tcp-flags ALL SYN,ACK,PSH -j DROP

(juniper)

 filter bad_flags  {
             
            term badflgs {
                        from {
                                    source-address 0.0.0.0/0;
                                    destination-address 0.0.0.0/0;
                                    protocol tcp;
                                    source-port [ 1024-65535];
                                    destination-port 80;
                                    tcp-flags "fin | syn | rst | push | ack";
                        }
                        then {
                                    count discarded;
                                    discard;
                        }
            }
            term default-rule {
                        /* "from" anything else? */
                        then {
                                    count accepted;
                                    accept;
                        }
            }

}
Như các bạn thấy đó. Toàn bộ các cặp FLAGs không giống như bình thường đều đã bị chặn.

Ghi nhớ các quy tắc về TCP sau nhé:
  • Tất cả gói tin tcp đều có một bộ cờ (không có null_flags)
  • Tương tự, 1 gói tin không thể bật được tất cả các flags
  • Sau khi thiết lập phiên tcp, cờ SYN sẽ không bao giờ được nhìn thấy trong phiên đó nữa, nó chỉ xuất hiện khi khởi tạo phiên tcp
  • Cách duyên dáng để xé một phiên tcp là với FIN + ACK
  • FIN-WAIT không phải là cờ (nó là một trạng thái)
  • MSS (Max Segment Size) là kích thước tối đa của một Segment  trong luồng tcp, nó không được thương lượng lại sau lần bắt đầu đầu tiên của SYN và SYN-ACK của bắt tay 3 bước trong TCP
Chúc các bạn thành công!
filtering bad tcp_flags filtering bad tcp_flags Reviewed by phucvm on tháng 4 13, 2020 Rating: 5

Không có nhận xét nào:

Được tạo bởi Blogger.