Tấn công TCP Syn Flood
TCP là viết tắt của Transmission Control Protocol để chỉ ra rằng nó thực hiện kết nối kiểm soát việc truyền dữ liệu một cách đáng tin cậy. Nhưng nó vẫn có lỗ hổng cho hacker có thể lợi dụng tấn công từ chối dịch vụ với máy chủ (DoS — Denial-of-Service attack).
Trước khi bắt đầu, cùng tìm hiểu cơ chế 3-way handshake của TCP. Bình thường, một kết nối TCP được thể hiện quy trình 3 bước riêng biệt để tạo được sự kết nối như sau:
Bước 1: máy Client gửi 1 packet tin SYN đến Server để yêu cầu kết nối.Bước 2: Sau khi tiếp nhận packet SYN, Server phản hồi lại Client bằng một packet SYN/ACK để xác nhận.Bước 3: Client nhận được packet tin SYN/ACK thì sẽ trả lời Server bằng packet tin ACK, từ đây kết nối đã được thiết lập và sẵn sàng trao đổi dữ liệu.
Nhưng với kỹ thuật tấn công SYN Flood thì Client lại tạo ra một số lượng lớn các kết nối TCP nhưng sẽ không hoàn thành các kết nối này. Cụ thể:
Bước 1: Kẻ tấn công sẽ gửi một khối lượng lớn các packet tin SYN đến Server được nhắm là mục tiêu và thường là các địa chỉ IP giả mạo.Bước 2: Sau đó, Server sẽ phản hồi lại từng yêu cầu kết nối, để lại 1 cổng mở sẵn sàng tiếp nhận và phản hồi.Bước 3: Trong khi Server chờ nhận packet ACK từ Client (packet mà không bao giờ đến), kẻ tấn công tiếp tục gửi thêm các packet SYN mới. Sự xuất hiện các packet SYN này khiến Server tạm thời duy trì kết nối cổng mở trong một thời gian nhất định cho đến khi timeout.
Kĩ thuật này sẽ khiến Server tốn tài nguyên cho các kết nối vô định, dẫn đến ngập lụt mà không thể xử lý các kết nối khác.
Triển khai với Python
Bây giờ chúng ta hãy giả lập cách tấn công này bằng Python. Trước hết, cần cài đặt công cụ Scapy:
$ pip3 install scapy
Sau đó thêm một đoạn script ngắn để gửi liên tiếp packet SYN
đến server đích (ở đây tôi chọn tinhte.vn):
Chạy đoạn script trên tới IP của tinhte.vn:
$ sudo python main.py -h 125.212.247.216 -p 455 -c 10Sending from 200.73.140.122:8936 -> 125.212.247.216:455
Sending from 12.103.60.242:8420 -> 125.212.247.216:455
Sending from 91.64.212.23:8045 -> 125.212.247.216:455
Sending from 183.51.241.199:8121 -> 125.212.247.216:455
Sending from 41.112.186.60:8364 -> 125.212.247.216:455
Sending from 16.230.42.208:8404 -> 125.212.247.216:455
Sending from 156.104.205.115:8346 -> 125.212.247.216:455
Sending from 150.15.237.75:8102 -> 125.212.247.216:455
Sending from 222.152.243.10:8102 -> 125.212.247.216:455
Sending from 166.248.241.166:8737 -> 125.212.247.216:455Packets sent: 10
Sau đó theo dõi gói tin đã gửi qua công cụ sniff có sẵn của macOS là tcpdump
(lưu ýen0
là network interface của mạng không dây, tương tự với en1
hoặc en2
, còn ethernet sẽ là eth0
. Có thể dùng lệnh networksetup -listallhardwareports
để list up tất cả interfaces trên máy):
$ sudo tcpdump -i en0 -n | grep 125.212.247.216
Hoặc để trực quan bạn có thể dùng phần mềm WireShark
Một kết nối TCP thông thường sẽ giống như sau (bao gồm đủ SYN,
SYN/ACK
và ACK)
:
Cuối cùng, bạn có thể tham khảo source code tại đây.