跳转到帖子

游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

TheHackerWorld官方

hyperscan在IDS和IPS产品中的应用

精选回复

发布于

hyperscan在IDS和IPS产品中的应用

5ffa722c604fd.png

hypercan简介

hyperscan是基于intel的高速正则表达式匹配引擎,这个基于状态机(Automata)的引擎经过了多年开发经过不断优化与完善,效率非常之高,虽然没有pcre等对正则语法支持全面,但非常适用于网络设备。用户可以在网络设备数据面(Data Plane)使用hyperscan进行规则匹配,实现高性能DPI/lPS/IDS等应用

开源代码:https://github.com/01org/hyperscan

环境要求

GCC, v4.8.1 or higher

Clang, v3.4 or higher (with libstdc++ or libc++)

Intel C++ Compiler v15 or higher

依赖的库

DependencyVersionNotes
CMake>=2.8.11
Ragel6.9
Python2.7
Boost>=1.57Boost headers required
Pcap>=0.8Optional: needed for example code only

gcc 版本必须大于v4.8.1

下载 wget ftp://gcc.gnu.org/pub/gcc/releases/gcc-4.8.2/gcc-4.8.2.tar.bz2下载源码包

# tar -jxvf gcc-4.8.2.tar.bz

# cd gcc-4.8.2.tar.bz2

# ./contrib/download_prerequisites     执行中会下载3个包,mpfr、gmp、mpc,

编译安装gmp

# cd gmp &&  mkdir build &&  cd build/

#  ../configure --prefix=/usr/local/gcc/gmp-4.3.2  &&  make && make install

编译安装mpfr

#  cd ../../mpfr && mkdir build && cd build/

# ../configure --prefix=/usr/local/gcc/mpfr-2.4.2 --with-gmp=/usr/local/gcc/gmp-4.3.2 && make&&make install

编译安装mpc

# cd ../../mpc && mkdir build && cd build

# ../configure --prefix=/usr/local/gcc/mpc-0.8.1 --with-mpfr=/usr/local/gcc/mpfr-2.4.2 --with-gmp=/usr/local/gcc/gmp-4.3.2 && make && make install

添加共享库路径

# vim /etc/ls.do.conf    加入如下内容

/usr/local/gcc/gmp-4.3.2/lib

/usr/local/gcc/mpfr-2.4.2/lib

/usr/local/gcc/mpc-0.8.1/lib

保存退出,执行ldconfig

编译gcc

# cd ../../

# mkdir build

# cd build

# ../configure --prefix=/usr/local/gcc --enable-threads=posix --disable-checking --enable-languages=c,c++ --disable-multilib

# make && make install

# yum remove gcc gcc-c++ && updatedb 卸载旧版本

# 链接到新版本

# cd /usr/bin && ln -s /usr/local/gcc/bin/gcc gcc  && ln -s /usr/local/gcc/bin/g++ g++

Cmake安装

可以查看是否安装cmake

# rpm -qa | grep cmake

cmake-2.8.12.2-4.el6.x86_64

ragel安装

下载并安装ragel

#tar zxvf ragel-6.9.tar.gz && cd ragel-6.9  &&  ./configure &&  make && make install

python版本升级(编译boost的时候需要2.7版本的python)

升级python至2.7

# wget http://www.python.org/ftp/python/2.7.3/Python-2.7.2.tgz

# mkdir /usr/local/python-2.7.2,之后编译安装,指定prefix为新建目录。

# ./configure --prefix=/usr/local/python-2.7.2

# make && make install

# mv /usr/bin/python /usr/bin/python_old

# ln -s /usr/local/python-2.7.2/bin/python2.7 /usr/bin/python

# python -V    验证版本是否正确2.7.2

pcap安装

查看系统是否安装pcap

# rpm -qa | grep pcap

libpcap-1.0.0-6.20091201git117cb5.el6.x86_64

boost安装

下载安装包

# tar -xvf  boost_1_60_0.tar && cd boost_1_60_0

#  ./bootstrap.sh    ## 生成了bjam 和b2 安装工具

#  ./b2

#  ./b2 install

hyperscan安装

# wget https://codeload.github.com/01org/hyperscan/tar.gz/v4.3.0

# tar xvzf v4.3.0  && cd hyperscan-4.3.0/ && mkdir hs_build  &&cd hs_build

# cmake ../../hyperscan-4.3.0

#  cmake --build .

#  make install

hyperscan验证

# ./bin/unit-hyperscan   验证hyperscan,提示libstdc版本问题。

#  ./bin/unit-hyperscan: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ./bin/unit-hyperscan)

# 解决方法

# find / -name libstdc++.so.6

/usr/local/gcc/lib64/libstdc++.so.6

/usr/lib64/libstdc++.so.6

# cd /usr/lib64/ && mv libstdc++.so.6 libstdc++.so.6_bak

# cp /usr/local/gcc/lib64/libstdc++.so.6.0.18 /usr/lib64

# ln libstdc++.so.6.0.18 libstdc++.so.6

#运行测试程序./bin/unit-hyperscan  OK出现下面的提示

1607307003_5fcd8efbdd192d03e3fd1.png!small

hyperscan设计目标

高性能,包括正常应用场景和边界条件下

较小的database(正则表达式编译后形成的数据)

运行于流模式时,较小的流状态数据(stream state) 。这种模式下每条流都要维护自己的流状态。

另外,还有一些设计要求或限制:

运行库必须以C实现,因为一些数据面环境不支持C++

不可以在运行时任意请求内存,用到的内存仅包 括database、匹配临时数据(scratch)和流状态(在流模式下)。

database必须是平面化(flat)的内存布局,以便可以序列化/反序列化,或者可以内存中的一处移动到另一处(这意味着内部不能含有指针)

重要概念

编译:就是将多个正则表达式编译为hyperscan database,调用编译接口时可以传入一些flags和mode等参数,控制匹配行为和运行模式,主要API:

hs_compile()

hs_compile_multi()

hs_compile_ext_multi()

匹配:就是基于编译好的database,对数据进行匹配,并得到匹配结果。

hyperscan在进行匹配时需要有一个临时数据(scratch),这块数据需要在数据面运行前就分配(不在运行时分配和释放,保证性能),且需要保 证同一时刻仅有一个匹配过程在使用同一块临时数据。

如果使用流模式,还需要预先为每个流分配流状态数据。

运行模式主要有3个:BLOCK、STREAM和VECTORED。

BLOCK模式就是对多个数据块分别进行匹配;

STREAM模式 将特定的一组数据库视为一个STREAM,为每一个STREAM维护状态信息,它可以跨数据块进行匹配;

VECTORED模式可以一次匹配多个数据块。使 用不同模式参数编译的database在匹配时不能混用。

匹配的API主要有

hs_scan()

hs_scan_vector()

hs_scan_stream()

1607307045_5fcd8f257526696b12c79.png!small

配置文件

后台配置文件hyperscan.conf 举例:

-desc this is a config file of pcre rule

-name pcre_rule

-offset 1

-depth 10

-min_payload 100

-relation 1

-action 13

-pattern ^01aa*

参数说明

desc合法字符串正则防护规则的描述
name合法字符串正则防护规则的名称
offset整型匹配报文payload的偏移(tcp头以后的偏移)
depth整型正则匹配的长度,即从offset处开始匹配的长度
min_payload整型最小的payload长度
relation整型防护组的ID??
pattern合法正则表达式字符串正则表达式,注意每一个防护组最多配置5个正则规则
action整型匹配了正则需要执行的动作:SC_FW_DROP,SC_FW_ACCEPT,ACL_DROP_ADDBLACK,ACL_DROP_SENDRST

1607307122_5fcd8f725566be58f3297.png!small

IPS/IDS防护引擎中的应用

正则扫描范围

TCP报文基于tcp头之后的特定偏移开始扫描正则匹配

基于防护组配置正则规则

每个防护组单独编译数据库

支持基于字符串和十六进制字节流2种匹配方式

匹配的要素

offset

depth

pattern

min_payload

action

性能相关

按照官方给出的测试实例pcapscan

测试例子:

报文2,261,924个报文,配置正则规则10000条

Streaming mode:

database compiled in 0.170277 seconds.

Total matches: 0

Match rate:    0.0000 matches/kilobyte

Throughput (with stream overhead): 674.86 megabits/sec

Throughput (no stream overhead):   674.89 megabits/sec

Block mode:

database compiled in 0.588633 seconds.

Total matches: 0

Match rate:    0.0000 matches/kilobyte

Throughput:    1074.08 megabits/sec

1607307163_5fcd8f9b218d5e6a6b332.png!small1607307189_5fcd8fb53706a79676d0b.png!small

创建帐户或登录后发表意见

最近浏览 0

  • 没有会员查看此页面。