Tấn công UDP Flood hoặc SYN Flood

Tác giả NetworkEngineer, T.Hai 04, 2021, 10:41:31 SÁNG

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 2 Khách đang xem chủ đề.

Tấn công UDP Flood hoặc SYN Flood


1. Giới thiệu.

Gần đây, mình đã phải chịu một cuộc tấn công tràn ngập UDP trên máy chủ riêng ảo (VPS) nhỏ của mình và nghĩ rằng mình sẽ mô tả các bước mình đã trải qua để phát hiện và khắc phục sự cố.

2. Các triệu chứng.

Định kỳ máy chủ của mình sẽ bị đình trệ và không phản hồi. Các sự kiện đình trệ này sẽ kéo dài từ 5-20 phút và sau đó máy chủ sẽ hoạt động trở lại. Nhìn vào biểu đồ Munin của mình cho mình biết rằng giao diện Ethernet của mình (eth0) đang bị tràn ngập. Đây là một ngày đặc biệt tồi tệ.


Và đây là sau khi mình đã giới hạn tốc độ eth0 đến 2mbits/giây bằng cách sử dụng tc (nhiều hơn về Traffic Control một chút). Việc sử dụng CPU và eth0 cũng tăng đột biến. Vì vậy, một cái gì đó đã tràn ngập eth0 và làm máy chủ bị đình trệ.

3. Khám phá.

Để bắt đầu, mình không biết điều gì đã gây ra sự tăng đột biến lớn về lưu lượng truy cập, mặc dù đó là lưu lượng outbound, mà lẽ ra phải là manh mối đầu tiên của mình. Mình không thể thấy gì trong bất kỳ tập tin nhật ký nào của mình như Apache hoặc bất cứ thứ gì khác (cũng gần như vậy) mà lẽ ra phải là một manh mối khác. Những gì mình muốn là một cách để bắt đầu nắm bắt các gói tin trong những sự kiện cao điểm này để mình có thể thấy chính xác những gì đang xảy ra trên eth0 khi eth0 tăng đột biến.

Mình đã tìm thấy tập lệnh bash rất thú vị này tại Server Fault và có thể bắt đầu bắt các gói mạng với tcpdump bất cứ khi nào tốc độ gói trên eth0 vượt quá tốc độ gói được xác định trên giây của mình. Tuy nhiên, tập lệnh này đang giám sát các gói nhận được trên '/proc/net/dev'. Mình đã thấy các tcpdumps thú vị bằng cách sử dụng tập lệnh theo cách này, nhưng khi sự kiện tiếp theo xảy ra, không có gì trong các tập tin kết xuất. Vì vậy, mình đã chuyển sang giám sát các gói được truyền đi. Đây là tập lệnh hoàn chỉnh.

Mã nguồn [Chọn]
#!/bin/bash

HOST=`hostname`
INTERFACE=eth0
DUMPDIR=~/dump/
SUBJECT="WARNING:Packet alert on $HOST"
EMAIL="[email protected]"
EMAILMESSAGE="~/dump/emailmessage.txt"

# print $2 for inbound packets, $10 for outbound

while /bin/true; do
  pkt_old=`grep $INTERFACE: /proc/net/dev | cut -d :  -f2 | awk '{ print $10 }'`
  sleep 1
  pkt_new=`grep $INTERFACE: /proc/net/dev | cut -d :  -f2 | awk '{ print $10 }'`

  pkt=$(( $pkt_new - $pkt_old ))
  echo -ne "\r$pkt outbound packets/s\033[0K"

  if [ $pkt -gt 250 ]; then
    echo -e "\n`date` Peak rate exceeded, dumping packets."
    tcpdump -n -s0 -c 2000 -w $DUMPDIR/dump.`date +"%Y%m%d-%H%M%S"`.cap
    echo "`date` Packets dumped, sleeping now."
    echo "Packet rate was $pkt packets/s at `date`"  > $EMAILMESSAGE
    /usr/bin/mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE
    sleep 150
  fi
done

Và chắc chắn nó đã hoạt động. Đây là ảnh chụp màn hình Wirehsark của lưu lượng truy cập trên eth0 ngay trước khi máy chủ bị đình trệ.


Có một khối lượng rất lớn các gói UDP đến từ máy chủ của mình. Tập tin chụp gói hiện được lọc cho địa chỉ IP đích và mặc dù bạn chỉ có thể thấy một cổng nguồn trong ảnh chụp màn hình, các cổng nguồn là ngẫu nhiên. Địa chỉ IP đích là một trang web đáng ngờ và các cổng nguồn ngẫu nhiên cho thấy máy chủ của mình đang được sử dụng làm proxy. Căn cứ vào tỷ lệ UDP (và hiệu quả cuối cùng nó đã có trên máy chủ của mình), đây là không chính xác hành vi proxy. Đó là một cuộc tấn công tràn ngập UDP, đến từ máy chủ của mình, hướng đến một trang web khác. Tại thời điểm này, mình đã lang thang tìm kiếm phần mềm độc hại trên máy chủ của mình, chạy ClamAV và rkhunter (hơi muộn đối với rkhunter, tốt nhất là chạy trên bản cài đặt sạch), và mình không tìm thấy gì. Sau đó, mình đã tìm kiếm một chút về UDP Flood và nhận thấy rằng có một hàm PHP khá đơn giản có thể được sử dụng để thực hiện chính xác điều này. Mình đang lưu trữ một số blog WordPress và vì vậy bắt đầu nghi ngờ về một tập lệnh PHP rouge. Hàm PHP để tạo một socket (kết nối mạng) là fsockopen. UDP có thể được chỉ định bằng tiền tố lược đồ và vì vậy mình đã thực hiện tìm kiếm grep sau trên tất cả các thư mục được lưu trữ của mình (tất cả đều nằm trong các tài khoản người dùng riêng biệt bên dưới thư mục chính của máy chủ).

Mã nguồn [Chọn]
grep -ir 'fsockopen.*udp' /home/
Thao tác này sẽ tìm kiếm tất cả các tập tin fsockopen theo sau bởi bất kỳ ký tự nào, cho bất kỳ số lần nào trên cùng một dòng với udp. Tìm kiếm không phân biệt chữ hoa chữ thường và có tính đệ quy. Chắc chắn, có một đoạn mã PHP nhỏ khó chịu nằm trong thư mục giao diện của một trang web mà mình đã thử nghiệm vài tháng trước. Giao diện có một lỗi được công khai hóa trong đó cho phép kẻ tấn công tải một tập lệnh thực thi lên máy chủ. Sau đó, tập lệnh có thể được gọi từ một yêu cầu Web thông thường, chuyển đến máy chủ đích và thời lượng cho cuộc tấn công UDP Flood.

4. Sửa chữa.

Mình đã xóa tập lệnh, vá giao diện và tắt trang web thử nghiệm (vì mình không còn sử dụng nó nữa). Mình cũng đã đọc thêm một chút về cách bảo vệ chống lại tấn công UDP Flood, cũng như SYN Flood và cập nhật cài đặt tường lửa Iptables của mình cho phù hợp. Dưới đây là tập lệnh cơ sở cho tường lửa Iptables của mình. Mình không tin rằng đây là một tập lệnh Iptables toàn diện và hoàn chỉnh để bảo mật máy chủ Linux nhưng đó là một bước khởi đầu và tính năng bảo vệ tấn công UDP Flood dường như đã hoạt động sau một vài thử nghiệm.

Mã nguồn [Chọn]
#!/bin/sh
echo "Flushing iptables and allowing everything..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

echo "Applying iptables baseline rules..."
# Deny everything on the default INPUT chain
iptables -P INPUT DROP

# Allow connections that are already connected to the server.
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

# #########################
# Outbound UDP Flood protection in a user defined chain.
iptables -N udp-flood
iptables -A OUTPUT -p udp -j udp-flood
iptables -A udp-flood -p udp -m limit --limit 200/s -j RETURN
iptables -A udp-flood -j LOG --log-level 4 --log-prefix 'UDP-flood attempt: '
iptables -A udp-flood -j DROP

# #########################
# SYN-Flood protection in a user defined chain
iptables -N syn-flood
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -A syn-flood -m limit --limit 30/s --limit-burst 60 -j RETURN
iptables -A syn-flood -j LOG --log-level 4 --log-prefix 'SYN-flood attempt: '
iptables -A syn-flood -j DROP

# #########################
# SSH
# Rate limit SSH on 57328
iptables -A INPUT -p tcp --dport 57328 -m state --state NEW -m recent --set --name SSH-LIMIT
iptables -A INPUT -p tcp --dport 57328 -m state --state NEW -m recent --update --rttl --seconds 60 --hitcount 20 -j REJECT --reject-with tcp-reset --name SSH-LIMIT
# Allow SSH on 57328 port
iptables -A INPUT -p tcp --dport 57328 -j ACCEPT

# #########################
# HTTP
# Allow HTTP and HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# If we made it this far the packet will be dropped - so log it as denied.
iptables -A INPUT -j LOG --log-level 4 --log-prefix 'Denied: '

Và cuối cùng mình đã cài đặt và chạy tập lệnh kiểm tra tốc độ gói cao nhất tcpdump của mình, để nếu có bất kỳ điều gì bất thường xảy ra trên máy chủ, mình sẽ có cơ hội xem xét nó và quyết định xem đó là sự kiện bình thường hay điều gì khác.

5. Bài học kinh nghiệm.

Một vài điều: Thứ nhất - điều khiển lưu lượng và định hình lưu lượng với tc là rất tuyệt. Đây là một bài giới thiệu và cách làm hay về tc. Nếu bạn đang lưu trữ một VPS trên đường truyền chất lượng cao tại một trong những dịch vụ lưu trữ tốt hơn, bạn cần phải duy trì các kỷ luật về tc và xếp hàng, vì sự gia tăng lớn về việc sử dụng băng tần có thể sẽ khiến bạn mất $$$. Thứ hai - tường lửa I ptablescũng rất tuyệt và là bước bắt buộc đầu tiên trong việc bảo mật máy chủ Linux của bạn. Thứ ba - các công cụ như grep, find, ps, netstat, lsof, v.v. đều là một phần của các công cụ của sysadmin. Mình không khẳng định sysadmin giống Fu bằng bất kỳ phương tiện nào, nhưng thật tuyệt vời những gì bạn có thể đạt được với danh sách dài các công cụ nhỏ nằm trong bộ sưu tập ứng dụng không gian người dùng GNU miễn phí và miễn phí với mọi cài đặt GNU/Linux. Thứ tư - Linux rất thú vị.