Table of Contents
Ubuntu - Networking - Finding DDOS attacks
Some useful commands to check during DDOS attack.
NOTE: The netstat command has been superseeded by the ss command.
But if your system is old, and ss does not work, then simply use netstat in place of ss.
List the connections to the target IPs
ss -alpn | grep :80 | awk '{print $4}' |awk -F: '{print $(NF-1)}' |sort |uniq -c | sort -n
returns:
1 511
List connections from source IPs
netstat -alpn | grep :80 | awk '{print $5}' |awk -F: '{print $(NF-1)}' |sort |uniq -c | sort -n
returns:
1 1 0.0.0.0 1 123.123.123.123 1 234.234.234.234
See the state of each connection
ss -an|grep ":80"|awk '/tcp/ {print $6}'|sort| uniq -c
returns:
1 [::]:* 1 0.0.0.0:* 1 123.123.123.123:56360
Identify the attacker
tcpdump -c -n -i eth0 -p host IP_Address
returns:
tcpdump -c 100 -i br0 -p host 192.168.1.2 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on br0, link-type EN10MB (Ethernet), capture size 262144 bytes 12:39:23.239478 IP server1.sharewiz.net.ssh > peter.sharewiz.net.51864: Flags [P.], seq 829605160:829605348, ack 3653010571, win 62780, length 188 12:39:23.239694 IP peter.sharewiz.net.51864 > server1.sharewiz.net.ssh: Flags [.], ack 188, win 65535, length 0 12:39:23.240455 IP server1.sharewiz.net.ssh > peter.sharewiz.net.51864: Flags [P.], seq 188:488, ack 1, win 62780, length 300 12:39:23.240518 IP server1.sharewiz.net.ssh > peter.sharewiz.net.51864: Flags [P.], seq 488:652, ack 1, win 62780, length 164 12:39:23.240572 IP server1.sharewiz.net.ssh > peter.sharewiz.net.51864: Flags [P.], seq 652:816, ack 1, win 62780, length 164 12:39:23.240645 IP server1.sharewiz.net.ssh > peter.sharewiz.net.51864: Flags [P.], seq 816:980, ack 1, win 62780, length 164 12:39:23.240734 IP server1.sharewiz.net.ssh > peter.sharewiz.net.51864: Flags [P.], seq 980:1144, ack 1, win 62780, length 164 12:39:23.240794 IP server1.sharewiz.net.ssh > peter.sharewiz.net.51864: Flags [P.], seq 1144:1308, ack 1, win 62780, length 164 12:39:23.240821 IP peter.sharewiz.net.51864 > server1.sharewiz.net.ssh: Flags [.], ack 488, win 65535, length 0 12:39:23.240845 IP peter.sharewiz.net.51864 > server1.sharewiz.net.ssh: Flags [.], ack 652, win 65535, length 0 12:39:23.240853 IP server1.sharewiz.net.ssh > peter.sharewiz.net.51864: Flags [P.], seq 1308:1472, ack 1, win 62780, length 164 12:39:23.240862 IP peter.sharewiz.net.51864 > server1.sharewiz.net.ssh: Flags [.], ack 816, win 65535, length 0 12:39:23.240870 IP peter.sharewiz.net.51864 > server1.sharewiz.net.ssh: Flags [.], ack 980, win 65535, length 0 12:39:23.240959 IP server1.sharewiz.net.ssh > peter.sharewiz.net.51864: Flags [P.], seq 1472:1732, ack 1, win 62780, length 260 ...
Check if a server is under a DoS attack
ss -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n|wc -l
returns:
2
NOTE: If the output returns a result like 2000 or 3000 connections!, then it is very likely the server is under a DoS attack.
Colourful Output
ss -ntu|awk '{print $5}'|cut -d: -f1 -s|sort|uniq -c|sort -nk1 -r | while IFS= read -r line; do if [[ `echo $line | cut -d' ' -f 2` =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo -e "\033[0;31m$line"; else echo -e "\033[0;34m$line"; fi; done
returns:
21 192.168.1.69 4 127.0.0.1 2 [fd42
Detect a SYN flood
ss -nap | grep SYN | wc -l
returns:
0
NOTE: If the output returns a high value, say over a thousand, this could mean the server is under attack.
This figure will vary depending on usage of the server. A system may intentionally have many thousand users, so a high value here does not always mean there is an SYN Flooding attack.
Check for a UDP Denial of Service
ss -nap | grep 'udp' | awk '{print $5}' | cut -d: -f1 | sort |uniq -c |sort -n
returns:
1 0.0.0.0%virbr0 1 127.0.0.1 1 127.0.0.53%lo 2 0.0.0.0 2 172.17.255.255 2 192.168.0.255 2 192.168.123.255 2 192.168.1.255 3 172.17.0.1 3 192.168.0.2 4 192.168.123.1 13 192.168.1.2
NOTE: The above command will list information concerning possible UDP DoS.
The command can easily be accustomed also to check for both possible TCP and UDP denial of service, like so :
ss -anp |grep 'tcp\|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
returns:
1 * 1 0.0.0.0%virbr0 2 127.0.0.53%lo 2 172.17.255.255 2 192.168.0.255 2 192.168.123.255 2 192.168.1.255 4 172.17.0.1 4 192.168.0.2 5 [ 5 192.168.123.1 9 127.0.0.1 12 0.0.0.0 23 192.168.1.2
NOTE: If a specific IP has too many connections to the server; it is almost certainly a DoS host; so suggestion is to filter this IP.
Remove hosts to not be able to route packets to the server
ip route add blackhole 123.123.123.123.
or
route add 123.123.123.123 reject
The above command would null route the access of IP 123.123.123.123 to my server.
To check the routing for this IP is null:
ip route |grep -i 123.123.123.123
Useful commands
1. tcpdump -i igb1 -nnn -c 10 dst port 80 host
This is for freebsd cmd where “igb1” is the netwok interface name
2. time tcpdump -i igb1 -nnn -c 1000 dst port 80 host 192.168.0.5 | tail
3. tail -1000 /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -b -k1 -n | tail
4. netstat -n | awk '{ print $5 }' | cut -d “:” -f 1 | grep “[1-9]” | sort | uniq -c | sort -n
5. awk '{print $5}' /proc/net/ip_conntrack|sort |uniq -c |sort -rn |head -25 | column -t
6. netstat -nt | grep :80 | wc -l
7. tcpdump -A dst 192.168.1.14 -s 500 | grep -i refer
8. tcpdump -i eth0 -vvv -nn -s 1700 -w ddos
tcpdump -nn -vv -r ddos | awk '{print $18}' | awk -F\. '{print $1“.”$2“.”$3“.”$4}' | sort | uniq -c | sort -rn | head -25
9. /usr/local/apache/bin/apachectl fullstatus