![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
suricata
文章平均质量分 92
高晓伟_Steven
wx_cangying1988的博客
展开
-
suricata 3.1 源码分析36 (dns解析获取相关内容)
在app-layer-dns-udp.c文件的DNSUDPRequestParse函数中调用DNSStoreQueryInState函数,该函数在app-layer-dns-common.c文件中。DNSStoreQueryInState中会取dns信息,包括type, class, name(可以是要查询的host)fqdn指向dns中的name,fqdn_len为name的长度。附dns正文结...原创 2018-03-02 17:37:56 · 1575 阅读 · 2 评论 -
suricata 3.1 源码分析34 (FlowWorker处理流程3 - 流重用)
上一章提到了一个流重用的概念,这里主要说一下。根据code,所谓流重用仅仅重用了流的thread_id。其他内容都是新建流得来的,具体threa_id有什么作用以后看到了再分析,今天就说一下什么样的流可以被重用。//这就是判断包所属的流是否能重用的函数int TcpSessionPacketSsnReuse(const Packet *p, const Flow *f, const void *t原创 2016-12-30 16:08:59 · 1933 阅读 · 1 评论 -
suricata 3.1 源码分析33 (FlowWorker处理流程2 - FlowHandlePacket)
void FlowHandlePacket(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p){ /* Get this packet's flow from the hash. FlowHandlePacket() will setup * a new flow if nescesary. If we get NULL, we'r原创 2016-12-27 13:59:48 · 2448 阅读 · 2 评论 -
suricata 3.1 源码分析32 (FlowWorker处理流程1)
TmEcode FlowWorker(ThreadVars *tv, Packet *p, void *data, PacketQueue *preq, PacketQueue *unused){ FlowWorkerThreadData *fw = data;/*FlowWorkerThreadInit中初始化,包含大量stats统计指标,decode指标在DecodeThreadV原创 2016-10-18 17:54:14 · 3267 阅读 · 2 评论 -
suricata 3.1 源码分析25 (数据包以太层解码)
int DecodeEthernet(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint16_t len, PacketQueue *pq){ StatsIncr(tv, dtv->counter_eth); if (unlikely(len < ETHERNE原创 2016-09-30 13:55:48 · 1929 阅读 · 0 评论 -
suricata 3.1 源码分析24 (数据包解码模块执行)
/** * \brief This function passes off to link type decoders. * * DecodePcap reads packets from the PacketQueue and passes * them off to the proper link type decoder. * * \param t pointer to Threa原创 2016-09-29 10:40:14 · 1987 阅读 · 0 评论 -
suricata 3.1 源码分析31 (RespondReject)
简介 RespondReject工作在worker线程,在FlowWorker模块之后对数据包进行处理。此处主要的作用是直接对符合过滤规则的数据包进行阻断并回复,从而使得数据包不会流入后续的操作模块。个人理解这点在IPS模式时会十分有用,可以阻断网络攻击、爬虫等。原码分析 函数RespondRejectFunc只支持IPv4和IPv6的数据包回复,因此其中只调用了4个函数:RejectSendI原创 2016-10-14 16:09:09 · 1992 阅读 · 0 评论 -
suricata 3.1 源码分析30 (packet_pool处理流程)
简介suricata中的packet_poo是专门用于存放receive线程抓到的数据包的。 receive线程初始化时在TmThreadsSlotPktAcqLoop中调用PacketPoolInit来初始化它的packet_pool,并为packet_pool划分内存空间。默认是申请1024个packet结构大小的空间,以链表的开示存储。这里的packet_pool被记为“my_pool”,也原创 2016-10-13 18:07:08 · 3687 阅读 · 1 评论 -
suricata 3.1 源码分析23 (数据包解码模块注册及初始化)
简介 Suricata的解码模块与数据包获取模块是一一对应的,例如DecodePcap对应ReceivePcap,DecodeAFP对应ReceiveAFP。 然而,我们知道数据包格式都是协议规定的,因此核心的数据包解码流程一定会是固定的。例如,对于常规的以太网包IPV4包TCP包,无非是DecodeEthernet->DecodeIPV4->DecodeTCP->… 那么,这里为什么需要设置原创 2016-09-28 09:37:16 · 1892 阅读 · 2 评论 -
suricata 3.1 源码分析18 (模块注册及初始化)
Suricata支持多种数据包源:pcap(实时/文件)、nfq、ipfw、mpipe、af-packet、pfring、dag(实时/文件)、napatech。 每种数据包源的支持都对应于一个线程模块(Thread Module),得益于这种其模块化的架构,增加一个新的数据源支持只需要添加一个新的线程模块即可。 这里,我将主要记录最常见的pcap实时数据源的实现细节,包括相关数据结构、运行流程原创 2016-09-21 09:16:37 · 2383 阅读 · 0 评论 -
suricata 3.1 源码分析17 (流管理2)
TmThreadsManagementstatic void *TmThreadsManagement(void *td){ /* block usr2. usr2 to be handled by the main thread only */ UtilSignalBlock(SIGUSR2); ThreadVars *tv = (ThreadVars *)td;//流原创 2016-09-20 10:50:10 · 1666 阅读 · 0 评论 -
suricata 3.1 源码分析16 (流管理1)
在suricata.c的main函数执行完RunModeDispatch之后会在判断是否使用UNIX_SOCKET中调用FlowManagerThreadSpawn创建流管理线程。/** \brief spawn the flow manager thread */void FlowManagerThreadSpawn(){#ifdef AFLFUZZ_DISABLE_MGTTHREADS原创 2016-09-19 14:38:42 · 2079 阅读 · 0 评论 -
suricata 3.1 源码分析35 (FlowWorker处理流程4 - 流重用函数)
static Flow *TcpReuseReplace(ThreadVars *tv, DecodeThreadVars *dtv, FlowBucket *fb, Flow *old_f, const uint32_t hash, const Packet *p){ /*原创 2016-12-30 16:33:20 · 1504 阅读 · 1 评论 -
suricata在netmap模式无法抓包的原因
问题描述suricata在很早就支持了netmap,但最近在用的时候却发现开启netmap抓包后总是获取不到数据包。 使用netmap自带的pke-gen工具测试,结果证明不是netmap的问题。 只能去suricata源码里查原因了。问题定位问题出在source-netmap.c文件的NetmapOpen函数中,具体位置如下: if (ioctl(pring->fd, NIOCR原创 2017-03-22 15:05:18 · 2240 阅读 · 2 评论 -
suricata 3.1 源码分析12
int engine_retval = EXIT_SUCCESS; while(1) { if (sigterm_count) { suricata_ctl_flags |= SURICATA_KILL; } else if (sigint_count) { suricat原创 2016-09-12 15:03:49 · 1964 阅读 · 0 评论 -
suricata 3.1 源码分析11
/* Wait till all the threads have been initialized */ if (TmThreadWaitOnThreadInit() == TM_ECODE_FAILED) { SCLogError(SC_ERR_INITIALIZATION, "Engine initialization failed, "原创 2016-09-09 08:58:04 · 1512 阅读 · 0 评论 -
suricata 3.1 源码分析10
/* In Unix socket runmode, Flow manager is started on demand */ if (suri.run_mode != RUNMODE_UNIX_SOCKET) { /* Spawn the unix socket manager thread */ int unix_socket =原创 2016-09-08 17:21:36 · 2145 阅读 · 0 评论 -
suricata 3.1 源码分析9
RunModeDispatch(suri.run_mode, suri.runmode_custom_mode)初始化运行模式。首先,根据配置文件和程序中的默认值来配置运行模式(single、auto这些),而运行模式类 型(PCAP_DEV、PCAPFILE这些)也在之前已经确定了,因此运行模式已经固定下来,可以从runmodes表中获取到特定的RunMode 了,接着就调用RunMode中的Ru原创 2016-09-07 08:52:12 · 1879 阅读 · 0 评论 -
suricata 3.1 源码分析8
CSetStartTime(&suri);设置记录开始时间 SCDropMainThreadCaps(suri.userid, suri.groupid);去除主线程的权限。这个是通过libcap-ng实现的,首先调用capng_clear清空所有权限,然后根据运行模式添加一些必要权限(主要是为了抓包),最后调用capng_change_id设置新的uid和gid。主线程的权限应该会被新建原创 2016-09-06 13:24:15 · 1558 阅读 · 0 评论 -
suricata 3.1 源码分析4
GlobalInits();初始化全局变量。包括:数据包队列trans_q、数据队列data_queues(干嘛的?)、对应的mutex和cond、建立小写字母表。TimeInit();初始化时间。包括:获取当前时间所用的spin lock,以及设置时区(调用tzset()即可)。SupportFastPatternForSigMatchTypes();为快速模式匹配注册关键字。调用Suppor原创 2016-08-31 09:31:03 · 2737 阅读 · 0 评论 -
suricata 3.1 源码分析3
继续main函数下面的内容。/* By default use IDS mode, but if nfq or ipfw * are specified, IPS mode will overwrite this */EngineModeSetIDS();初始化引擎模式为IDS模式,字面上是这么理解。反正这个模式只有IPS和IDS两种,如果不清楚可以上网查。我这里就说一下主要区原创 2016-08-30 09:23:13 · 2850 阅读 · 0 评论 -
suricata 3.1 源码分析2
这次要说的是一个十分重要的函数RunModeRegisterRunModes();主要是完成运行模式的注册,我们添加的所有运行模式都要通过这个函数注册。下面是它的内部实现。 void RunModeRegisterRunModes(void) { memset(runmodes, 0, sizeof(runmodes));RunModeIdsPcapRegister();原创 2016-08-29 16:53:01 · 2883 阅读 · 0 评论 -
suricata 3.1 源码分析1
首先进入main函数int main(int argc, char **argv){ SCInstance suri; SCInstanceInit(&suri); SCInstance类型的suri变量用来保存程序当前的一些状态、标志等上下文环境,通常是用来作为参数传递给各个模块的子函数,因此为了更好的封装性而放到一个结构体变量中,而不是使用零散的长串参数或一堆全局变量。 SC原创 2016-08-26 10:33:41 · 4214 阅读 · 2 评论 -
suricata 3.2 源码分析(IP数据包分片重组流程)
在网络通信中如果发送的IP包超过MTU值就会将IP包拆分成多个包发送。那么在suricata中对于这种拆分开得IP包又是如何处理的呢?下面我们一步一步来分析。判断数据包是不是分片包是在DecedeIPV4这个函数中做的,具体位置是在 数据包解析模块->DecodeEthernet->DecedeIPV4在DecedeIPV4这个函数中有如下一段代码: /* If a fragment, pa原创 2017-07-11 17:24:17 · 3411 阅读 · 10 评论 -
suricata 3.1 源码分析5
if (PostConfLoadedSetup(&suri) != TM_ECODE_OK) { exit(EXIT_FAILURE);}执行PostConfLoadedSetup,即运行那些需要在配置载入完成后就立马执行的函数。这里面涉及的流程和函数非常多 /** * This function is meant to contain code that原创 2016-09-01 08:57:07 · 4122 阅读 · 0 评论 -
suricata 3.1 源码分析15 (流更新)
流更新通过FlowWorker线程函数中调用FlowUpdate,FlowUpdate中又调用了FlowHandlePacketUpdate来更新流。 在获取到包所属的流后,接下来将根据这个包对流进行更新。/** \brief Update Packet and Flow * * Updates packet and flow based on the new packet. * *原创 2016-09-18 11:36:26 · 1655 阅读 · 2 评论 -
suricata 3.1 源码分析14 (流查找分配)
流查找/分配通过FlowWorker线程函数中调用FlowHandlePacket来找到流。 下面将按照FlowHandlePacket的流程,分析flow engine对于新送入的解码后的数据包是如何处理的。 对于一个Packet,首先在流表中查找其所属的流是否已经存在,若存在,则直接返回该流的引用即可,否则就需要分配一个新流。 该过程的实现由FlowGetFlowFromHash完成,函数原创 2016-09-14 10:47:53 · 1870 阅读 · 0 评论 -
suricata 3.1 源码分析13 (流初始化)
简介Suricata中用于管理和维护流的模块称为Flow Engine,主要由两部分实现,第一部分的入口点是FlowHandlePacket函数,用于为新数据包进行流查找/分配,另一部分是FlowManagerThread线程,用于对超时的流进行删除。初始化 初始化在FlowInitConfig中完成,与之相关的配置结构体为FlowConfig,其字段含义如下: 字段含义hash_rand用于随原创 2016-09-13 14:08:43 · 2328 阅读 · 0 评论 -
iprobe安装文档
1. 由于iprobe基于suricata所以要先安装suricata的所有依赖库 sudo yum -y install gcc libpcap-devel pcre-devel libyaml-devel file-devel \ zlib-devel jansson-devel nss-devel libcap-ng-devel libnet-devel tar make \原创 2016-04-14 10:09:59 · 1433 阅读 · 2 评论 -
What is Suricata 翻译
h1. What is Suricata H1。什么是SuricataThe Suricata Engine is an Open Source Next Generation Intrusion Detection and Prevention Engine. This engine is not intended to just replace or emulate the e翻译 2016-03-11 11:48:03 · 1070 阅读 · 0 评论 -
suricata Quick Start Guide 启动手册
Step one 第一步When starting using Suricata, you first of all need to go to the Suricata Installation guide. Decide whether you want the latest code or not. If you do want the latest code, follow翻译 2016-03-11 11:31:21 · 1667 阅读 · 0 评论 -
Suricata配置文件说明2
本文接上一篇配置文件说明1,是了解suricata配置文件的第二篇。threadingSuricata是一个多线程的程序,当它在拥有多核CPU的计算机上运行时会产生多线程以同时处理多个网络流量。在前一篇文章中介绍过suricata其实是有thread,thread-module和queue组成,而thread-module按照功能分为数据包获取、解码数据包和应用层流信息、检测、输出四种模块转载 2016-03-10 18:32:08 · 1850 阅读 · 0 评论 -
Suricata配置文件说明1
本系列文章是Suricata官方文档的翻译加上自己对其的理解,部分图片也是来自那篇文章,当然由于初学,很多方面的理解不够透彻,随着深入后面会对本文进行一定的修正和完善。Suricata使用Yaml作为其配置文件的格式,关于Yaml可以参考YAML-维基百科。其中Suricata默认的配置文件是suricata.yaml,以硬编码的形式写在源代码中,当然也可以在执行的时候添加-c+指定位置的ya转载 2016-03-10 18:31:04 · 5773 阅读 · 0 评论 -
Suricata规则编写——数据包头部关键字
1.简介本文介绍suricata支持的IP、TCP、ICMP三种协议的数据包头关键字,http协议由于比较常用,关键字也比较多所以后面单独介绍,而其他应用层协议暂无特定的关键字。2.IP协议关键字首先需要对IP协议有一定的了解,网际协议-维基百科,RFC 791,IPv4-维基百科。IPv4协议的格式如下: 0 1转载 2016-03-10 17:18:00 · 3830 阅读 · 0 评论 -
Suricata规则编写——常用关键字
1.简介现在的NIDS领域snort一枝独秀,而suricata是完全兼容snort规则的多线程IDS,无论在效率还是性能上都超过原有的snort,这个系列主要针对suricata的规则中的一些关键字进行了解和学习,参考suricata的文档,链接为为:https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Surica转载 2016-03-10 17:15:07 · 1995 阅读 · 0 评论 -
Suricata之源代码(三)
Yaml文件的构造 在准备说下面代码所干的事情之前,我准备介绍一下suricata.yaml文件。介绍引用自百度百科Yaml概念 YAML(IPA: /ˈjæməl/,尾音类似camel骆驼)是一个可读性高,用来表达资料序列的编程语言, YAML是一种很简单的类似于XML的数据描述语言,语法比XML简单很多。诞生 YAML参考了其他多种转载 2016-03-08 11:48:17 · 2361 阅读 · 0 评论 -
Suricata之源代码(二)
在前面的代码主要是运行模式的一些初始化工作。接下来Suricata中的代码主要是完成对命令行的命令[cpp] view plain copyprint?"font-size:18px;"> ConfInit(); struct option long_opts[] = { {"dump-config", 0, &dump转载 2016-03-08 11:46:59 · 1464 阅读 · 0 评论 -
Suricata之源代码(一)
第一次系统性的写blog,写的不好,请大家多多包涵。 在介绍Suricata源代码之前,大致介绍一下Suricata的工作流程。在suricata中主要使用了回调函数将所有的模块连接起来的。最后是通过DetectEngineCtx *global_de_ctx这个结构体启动起来的。整个的启动过程我用鞭炮来进行比喻,回调函数就好像鞭炮的引线一样,将所有的小的鞭炮连接起来,连接起来之转载 2016-03-08 11:45:59 · 2739 阅读 · 0 评论 -
Suricata规则编写——常用关键字
1.简介现在的NIDS领域snort一枝独秀,而suricata是完全兼容snort规则的多线程IDS,无论在效率还是性能上都超过原有的snort,这个系列主要针对suricata的规则中的一些关键字进行了解和学习,参考suricata的文档,链接为为:https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Surica转载 2016-03-18 14:41:15 · 3712 阅读 · 0 评论 -
懒人学习automake, Makefile.am,configure.ac
已经存在Makefile.am,如何生成Makefile?步骤:[plain] view plain copy [root@localhost hello]# autoscan .///在当前文件夹中搜索 [root@localhost hello]# cp configure.scan configure.ac //复制文件 [root@loc转载 2016-05-17 20:52:17 · 2274 阅读 · 0 评论