免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6938 | 回复: 10
打印 上一主题 下一主题

请教:奇怪!snort 的 TCP Stream reassembly 似乎没有实现? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-02 10:38 |只看该作者 |倒序浏览
TCP Stream reassembly是snort 预处理中 stream5 的一部分,按理说这块应该由两块组成:流监视、流重组。通过学习代码,我发现流的监视部分调用是在 detect.c 文件的 Preprocess函数中,如下图:

图中 PreprocEvalFuncNode *idx = policy->preproc_eval_funcs; 为获得所有预处理模块入口函数的链表头,idx->func(p, idx->context);对于 TCP stream来说实际的函数为 Stream5Process

接下来就是应该是 reassembly 部分了,似乎这部分调用,如下图:

重组部分的原理类似,监视跟踪部分,可是我怎么也找不到 rpkt_idx->func(); 的实际定义在什么地方实现的,以及好几天了,还是找不到 reassembly 的实现代码,是我代码理解错了还是什么?熟悉这里的朋友能否帮个忙,万分感谢呀?

还有,snort.conf 中似乎也没有与 reassembly 相关的配置选项呀,看资料中 stream4 的 snort.conf 是有 stream_reassembly 的配置关键字的,stream5 为什么没有了?

我分析的版本是 snort-2.8.6,stream5。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2011-11-02 11:06 |只看该作者
回复 1# Tom8341

看一下插件初始化的代码吧。

此外,你也可以打一下调试信息,看看这个成员指针是否有效啊

论坛徽章:
0
3 [报告]
发表于 2011-11-02 12:32 |只看该作者
初始化部分有对函数的注册,但是仅仅是注册,还有就是函数的调用和定义,但是没有实现代码。
从调试的情况看,重组部分就没有执行,重组部分开头有个 if 条件判断就不成立,所以没有执行,且重组需要的链表为 NULL, 真不清楚是怎么回事?所以我才怀疑难道没有实现?或者需要什么配置参数才能启用TCP的reassembly 预处理?我给 snort 开发团队发过邮件询问此事,得到的回复是:“没有使用外部库,如果你是学习的话,你因该可以找到”,这叫哪门子答复吗,一定责任心都没有。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2011-11-02 14:01 |只看该作者
回复 3# Tom8341
snort 的配置文件是怎么写的。

预处理插件中有这个吗?

论坛徽章:
0
5 [报告]
发表于 2011-11-02 14:14 |只看该作者
回复  Tom8341
snort 的配置文件是怎么写的。

预处理插件中有这个吗?
Godbach 发表于 2011-11-02 14:01


1、stream5 中的配置文件中,关于 TCP stream 的关键字只有 stream5_global 和 stream5_tcp,而据相关文档,stream4 中是有 stream_reassembly 的,文档和代码都验证过。
2、snort 中有 stream5 预处理模块,这在其文档 (README.stream5)中有说明 ,据文档上讲,stream5 的功能就是对流进行检测和记录、然后在重组,重组后再 detect

论坛徽章:
0
6 [报告]
发表于 2011-11-02 14:41 |只看该作者
你看下这个函数,貌似是这里:
CheckFlushPolicyOnData --》flush_to_seq----->_flush_to_seq_4---->FlushStream--->SafeMemcpy 这里貌似是把所有的tcp流拷贝到一起来重组的。

论坛徽章:
0
7 [报告]
发表于 2011-11-02 15:07 |只看该作者
你看下这个函数,貌似是这里:
CheckFlushPolicyOnData --》flush_to_seq----->_flush_to_seq_4---->Flush ...
shank941 发表于 2011-11-02 14:41



    这个应该不是 2.8.6 的代码部分,我找不到相关定义,我查一下2.9.1再说,总之还是非常的谢谢你。

论坛徽章:
0
8 [报告]
发表于 2011-11-02 16:28 |只看该作者
回复 6# shank941

再次感谢,你给的分析虽然不是 snort-2.8.6 的,但是启发了我,现在已经找到实现部分了,对于snort-2.8.6来说,reassembly 关键是 _flush_ackd 函数,之前我分析的地方有误,之前认为的重组地方压根就不执行,现在也不清楚干什么用的。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2013-02-21 14:14 |只看该作者
没看明白。。。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2013-02-21 14:17 |只看该作者
本帖最后由 chishanmingshen 于 2013-02-21 14:17 编辑

from 2.9.4

  1. static inline int CheckFlushPolicyOnData(
  2.     TcpSession *tcpssn, StreamTracker *talker,
  3.     StreamTracker *listener, TcpDataBlock *tdb, Packet *p)
  4. {
  5.     uint32_t flushed = 0;
  6.     uint32_t avail;

  7.     STREAM5_DEBUG_WRAP(DebugMessage(DEBUG_STREAM_STATE,
  8.                 "In CheckFlushPolicyOnData\n"););
  9.     STREAM5_DEBUG_WRAP(DebugMessage(DEBUG_STREAM_STATE,
  10.                 "Talker flush policy: %s\n",
  11.                 flush_policy_names[talker->flush_mgr.flush_policy]););
  12.     STREAM5_DEBUG_WRAP(DebugMessage(DEBUG_STREAM_STATE,
  13.                 "Listener flush policy: %s\n",
  14.                 flush_policy_names[listener->flush_mgr.flush_policy]););

  15.     switch(listener->flush_mgr.flush_policy)
  16.     {
  17.         case STREAM_FLPOLICY_IGNORE:
  18.             STREAM5_DEBUG_WRAP(DebugMessage(DEBUG_STREAM_STATE,
  19.                         "STREAM_FLPOLICY_IGNORE\n"););
  20.             return 0;

  21.         case STREAM_FLPOLICY_FOOTPRINT_IPS:
  22.         {
  23.             int coerce;
  24.             STREAM5_DEBUG_WRAP(DebugMessage(DEBUG_STREAM_STATE,
  25.                         "STREAM_FLPOLICY_FOOTPRINT-IPS\n"););

  26.             avail = get_q_sequenced(listener);
  27.             coerce = CheckFlushCoercion(
  28.                 p, &listener->flush_mgr, listener->tcp_policy->flush_factor);

  29.             if (
  30.                 (avail > 0) &&
  31.                 (coerce || (avail >= listener->flush_mgr.flush_pt) ||
  32.                 (avail && talker->s_mgr.state == TCP_STATE_FIN_WAIT_1))
  33.             ) {
  34.                 uint32_t dir = GetForwardDir(p);

  35.                 if ( talker->s_mgr.state == TCP_STATE_FIN_WAIT_1 )
  36.                     listener->flags |= TF_FORCE_FLUSH;

  37.                 flushed = flush_to_seq(
  38.                     tcpssn, listener, avail, p,
  39.                     GET_SRC_IP(p), GET_DST_IP(p),
  40.                     p->tcph->th_sport, p->tcph->th_dport, dir);
  41.             }
  42.         }
  43.         break;

  44.         case STREAM_FLPOLICY_PROTOCOL_IPS:
  45.         {
  46.             uint32_t flags = GetForwardDir(p);
  47.             uint32_t flush_amt = flush_pdu_ips(tcpssn, listener, p, &flags);
  48.             uint32_t this_flush;

  49.             while ( flush_amt > 0 )
  50.             {
  51.                 // if this payload is exactly one pdu, don't
  52.                 // actually flush, just use the raw packet
  53.                 if ( (tdb->seq == listener->seglist->seq) &&
  54.                      (flush_amt == listener->seglist->size) &&
  55.                      (flush_amt == p->dsize) )
  56.                 {
  57.                     this_flush = flush_amt;
  58.                     listener->seglist->buffered = SL_BUF_FLUSHED;
  59.                     listener->flush_count++;
  60.                     p->packet_flags |= PKT_PDU_FULL;
  61.                     ShowRebuiltPacket(p);
  62.                 }
  63.                 else
  64.                 {
  65.                     this_flush = flush_to_seq(
  66.                         tcpssn, listener, flush_amt, p,
  67.                         GET_SRC_IP(p), GET_DST_IP(p),
  68.                         p->tcph->th_sport, p->tcph->th_dport, flags);
  69.                 }
  70.                 // if we didn't flush as expected, bail
  71.                 if ( this_flush != flush_amt )
  72.                     break;

  73.                 flushed += this_flush;
  74.                 flags = GetForwardDir(p);
  75.                 flush_amt = flush_pdu_ips(tcpssn, listener, p, &flags);
  76.             }
  77.             if ( !flags )
  78.             {
  79.                 if ( AutoDisable(listener, talker) )
  80.                     return 0;

  81.                 listener->flush_mgr.flush_policy = STREAM_FLPOLICY_FOOTPRINT_IPS;
  82.                 listener->flush_mgr.flush_pt += ScPafMax();
  83.                 listener->flush_mgr.flush_type = S5_FT_PAF_MAX;

  84.                 return CheckFlushPolicyOnData(tcpssn, talker, listener, tdb, p);
  85.             }
  86.         }
  87.         break;
  88.     }
  89.     return flushed;
  90. }
复制代码
应该是这里,没错。
但是网上说,重组时用的hash和树的形式处理的。奇怪,我没看出来。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP