《深入解析:DOS检测的技术原理与方法》
DDOS入侵检测与防御
一、实现Linux下DDOS的入侵检测与防御
利用Python编程实现对wrk的泛洪攻击检测,并让程序触发调用Linux命令实现防御:
1、泛洪攻击的检测,可以考虑使用的命令,这些命令可以通过Python进行调用和分析
(1) netstat -ant | wc -l
(2) netstat -ant | grep SYN_RECV
(3) netstat -s | grep overflowed
(4) netstat -s | grep dropped
(5) top -n 1 获取CPU的使用率
以上操作过程的命令,允许使用管道和AWK等技术提取数据,也可以直接使用Python进行数据提取。
2、防御措施可以选择以下几种
(1) 修改系统配置参数,来增加系统的TCP连接数 (2) 直接结束某些消耗CPU的进程,或者停止Apache的服务 (3) 开启防火墙,将目标IP地址进行封锁 (4) 自行查阅资料,进行其他可行的操作
上述Python代码实现的核心就是调用系统命令,再通过Python进行分析,触发命令的执行等。建议在Linux上安装Python3.7及以上的版本。
3、基本步骤
1、确保在Linux上可以正常运行Python3,而CentOS内置的是Python 2.7。 2、做基本的调研,明确对于DOS的入侵检测,需要使用哪些方法或命令。 3、将可以使用的命令通过Python来运行,并进行调试,确保Python+命令可以正常工作。可以直接使用命令提取数据,如使用grep,awk或sort等,也可以直接使用python解析字符串提取数据。 4、想办法找到连接数最多的攻击源IP地址,驱动Linux的防火墙进行入侵防御。5、最后进行整合,测试,再模拟攻击,来确保脚本本身可以正常检测。
二、理解各个命令的含义
1、uptime
uptime命令用于查看主机的开机时长,用户连接数量,以及在1、5、15分钟三段时间内,CPU的负载情况。
2、netstat
netstat命令用来打印Linux中网络系统的状态信息,可让你得知整个Linux操作系统的网络情况。需要注意的是在Windows和Linux上的参数会略有不同。
1. 以数字方式列出所有TCP连接情况:netstat -ant
2. 以数字方式列出所有UDP连接情况:netstat -anu
3. 以数字方式列出所有TCP和UDP处理监听状态的情况:netstat -anult
4. 显示所有端口的统计信息:netstat -s
5. 显示TCP端口的统计信息:netstat -st
6. 显示核心路由信息:netstat -r
7. 显示所有连接的进程信息:netstat -ap
3、ss
用来显示处于活动状态的套接字信息。ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。
1. 显示监听状态下的队列情况:ss -lnt
2. 显示非监听状态下的连接详情:ss -nt
3. 显示socket摘要信息:ss -s
LISTEN状态:Recv-Q表示的当前等待服务端调用accept完成三次握手的listen backlog数值,也就是说,当客户端通过connect()去连接正在listen()的服务端时,这些连接会一直处于这个queue里面直到被服务端accept();Send-Q表示的则是最大的listen backlog数值,这就是上面提到的min(backlog, somaxconn)的值。
非LISTEN状态:Recv-Q表示receive queue中的bytes数量;Send-Q表示send queue中的bytes数值,该数值意义不大,更多关注连接的数量和状态即可。
4. firewall-cmd
1. 关闭防火墙: `systemctl stop firewalld`
2. 添加允许端口: `firewall-cmd --add-port=80/tcp`
3. 列出防火墙规则: `firewall-cmd --list-all`
4. 禁止IP地方访问80端口: `firewall-cmd --add-rich-rule='rule family="ipv4 source address=192.168.112.148 port port=80 protocol=tcp reject'`(解封只需要把add——remove)
5. 让配置永久生效: 添加允许端口: `firewall-cmd --add-port=80/tcp --permanent`
5. sysctl
sysctl命令用于运行时配置内核参数,这些参数位于/proc/sys目录下。sysctl配置与显示在/proc/sys目录中的内核参数。可以用sysctl来设置或重新设置联网功能,如IP转发、IP碎片去除以及源路由检查等。用户只需要编辑/etc/sysctl.conf文件,即可手工或自动执行由sysctl控制的功能。
1. 显示所有系统参数: `sysctl -a`
2. 使用cat查看指定参数: `cat /proc/sys/net/ipv4/ip_forward`,除/proc/sys外,后面的路径与参数名称一致,换成/即可
3. 临时改变某个指定参数的值,如: `sysctl -w net.ipv4.ip_forward=1`,也可以: `echo 1 > /proc/sys/net/ipv4/ip_forward`
4. 如果想永久保留配置,可以修改/etc/sysctl.conf文件
快速修改部分参数,优化性能:
1. net.ipv4.tcp_syncookies:
是否打开SYN COOKIES的功能,“1”为打开,“2”关闭。
2. net.ipv4.tcp_max_syn_backlog:
SYN队列的长度,加大队列长度可以容纳更多等待连接的网络连接数。
3. net.ipv4.tcp_synack_retries 和 net.ipv4.tcp_syn_retries:
定义SYN重试次数,默认为5,建议为2。
4. net.ipv4.sack=0
其他参数的说明: https://www.cnblogs.com/feiyun126/p/8646989.html
一些优化方案: https://blog.csdn.net/wangshuminjava/article/details/80935792
三、DOS的实现
1,python解析字符串
kali:vi dos.py(需要安装python3环境)
import os
import time
from collections import Counter
def get_cpu_load():
# 第一步:先采集跟DOS攻击关联度较高的数据
# 1、采集cpu数据的平均负载
uptime = os.popen('uptime').read()
# print(uptime)
uptime = uptime.replace(": ", ",")
float(uptime.split(",")[-3])
# print(cpu_load)
# print(type(cpu_load))
# 利用awk命令来提取数据
cpu_load = os.popen("uptime | awk -F ': ' '{print $2}' | awk -F ',' '{print $1}'").read()
# print(cpu_load)
# print(type(cpu_load))
cpu_load = float(cpu_load)
# print(type(cpu_load))
# print(cpu_load)
# 返回数据
return cpu_load
# 采集netstat -ant的连接数量
def get_conn_count():
netstat = os.popen('netstat -ant | wc -l').read()
return int(netstat)
# 3、采集队列长度
def get_queue_size():
# ss -lnt | grep :80 | awk '{print $3}'
sslnt = os.popen("ss -lnt | grep :80").read()
recvq = int(sslnt.split()[1])
sendq = int(sslnt.split()[2])
return recvq, sendq
# 4、采集连接数据最多的IP地址
def get_most_ip():
result = os.popen('netstat -ant | grep :80').read()
line_list = result.split('\n')
ip_list = []
for line in line_list:
try:
temp_list = line.split()
ip = temp_list[-2].split(':')[0]
ip_list.append(ip)
except:
pass
dict = Counter(ip_list)
most_ip = dict.most_common(3)
return most_ip[0][0]
# 5、调用firewall -cmd防火墙命令封锁被攻击IP地址
def firewall_ip(ip):
result = os.popen(f"firewall-cmd --add-rich-rule='rule family=ipv4 source address={ip} port port=80 protocol=tcp reject'").read()
if 'success' in result:
print(f"已成功封禁可疑{ip}")
else:
print(f"对可疑攻击{ip}封锁失败")
if __name__ == '__main__':
while True:
cpu = get_cpu_load()
conn = get_conn_count()
recvq, sendq = get_queue_size()
most_ip = get_most_ip()
print(f"cpu_load:{cpu},TCP_Conn:{conn},TCP_Queue:{recvq, sendq}")
# 对采集到的数据进行判断,并进行预警提醒
if cpu > 50 and conn > 500 and recvq > sendq - 10:
print(f"当前系统TCP连接负载过重,CPU使用率过高,存在DOS攻击的可能性,可疑IP地址为:{most_ip}")
firewall_ip(most_ip)
time.sleep(5)
2,命令行提取数据
uptime | awk -F ": " '{print $2}'
uptime | awk -F ": " '{print $2}' | awk -F "," '{print $1}'