行为检测IDS

其实准确的说这不一定算是“IDS”,但功能十分相似,姑且认为是IDS吧~
需求很简单,当你开VPS的时候,总有些人恶意利用VPS对外扫描、流量攻击等。
那么问题来了,这种用户一般都是直接封机不退款,但如何有效抓住这些用户呢?
如果我们能写一个小工具,抓取网卡数据包,分析后自动报警,那么这群用户不就可以秒BAN了(๑•̀ㅂ•́)و✧
好嘛,我们今天就来做这个东西ww~


工作原理

首先,想到抓取数据包,那么如果把这个东西安装在路由器上,将能够最大范围内抓取所有出网的数据包,这当然毫无疑问啦qwq
那么,知道了这一点,我们就需要分析一下恶意扫描的流量和正常的流量有什么不同的地方。
首先我们观察一下TCP连接的三次握手建立过程:

  1. 本地发送SYN请求
  2. 对方回复ACK请求
  3. 本地回复SYN+ACK,连接建立成功

这里这个SYN => ACK => SYN+ACK的三次握手,建立了一个正常的TCP连接。
那恶意扫描呢?当然也是这么一个TCP流程,而恶意扫描因为需要对全网所有IP的特定端口进行探测,往往会对外发送大量的SYN请求,尝试让对方回复ACK,以判断对方是否存在这个端口。
那么问题来了,在正常使用中,我们很少遇到大连接数的情况。即使是十分极限的情况,也可以保证10秒内绝对不会超过3000个新建连接。
好了,到这里是不是有点头绪了~ 没错,我们抓取本地发送的第一个SYN,通过判断SYN的数量,就可以实现一个十分简单的流量分析系统 |・ω・`)
喵喵喵呜呜,好简单呀是不是w~


Python编写

再来看标题,这次的问题是如何在一天的时间内写出一个这样的系统。
那么为了开发效率兼可靠性,我们当然是首选脚本语言~ Python写这样一个系统很不错w
但是如何使用Python进行抓包呢? 当然是使用scapy库。因为我们的路由器是openwrt的,因此在路由器上部署这样一个Python程序并不是很难的事情。当然,还是要先对路由器进行一下环境配置~

# 安装python
opkg install python
# 安装pip
opkg install python-pip
# 安装scapy
pip install scapy
# 安装tcpdump,此项为scapy依赖使用
opkg install tcpdump

好了,我们接下来主要精力要放在如何用Python抓包上面。
我们先来看一下scapy抓包的核心函数sniff吧:

from scapy.all import *
# ...
# ...
# class定义以及其它无关函数部分略过
# ...
# ...
def run(self):
    try:
        self.isRun = True
        while(not self.isStop):
            self.packages = [] # 清空数据包列表
            sniff(iface=self.iface, count=0, prn=self.pack_callback, filter=self.filterstr, store = 0, timeout = 10) # 使用sniff函数抓包10秒,每到达一个数据包,执行self.pack_callback的回调函数
            self.analyse() # 10秒后,调用分析函数分析所有的数据包
            self.warn() # 对分析结果进行报警
    except Exception, e:
        L.error('Error while running capture ' + self.iface + ', error: ' + str(e))
        traceback.print_exc()
    finally:
        self.isRun = False
        L.info('Capture ' + self.iface + ' stopped')

这样就完成了抓包部分的核心代码。其他部分就变成了简单的数据统计即可啦w
(因项目原因,本项目当前不开源,不方便展示全部源代码)
最终效果如下~




后记

比较遗憾的是,这个项目由于一些原因不方便开源,也无法大面积展示其他部分的代码……
其实在实际运营VPS服务器的时候,这种被用于扫爆的情况比比皆是,很大一部分最后的结果是被机房投诉过来。
甚至有一些案例最后都直接被网监警告了(╯‵□′)╯︵┻━┻ 天哪噜
但是奈何人家有钱呀,封一台换个号继续再买一台,而且一般都是只有被投诉了才知道原来有人在利用VPS搞坏事qwq
那么我们这次给他们来个秒BAN吧! 等待后期的实战效果~