In message <2e902de2-3a99-4a5e-bad6-6d765ec01...@rmws.net>,
J Carvalho writes:

>I'd like to watch the traffic on my virtual interfaces. Being the  
>interface traffic never actually touches the physical device, I can't  
>use pcap to grab it.
>I'm using ipf/ipmon to look for tcp syn fin, ackfin, etc, and I'd like  
>to correlate the events to a conversation, date/time-length, size.

Ok, so you have the info:

  source ip
  source port
  dest ip
  dest port

Also you can identify the opening/first packet/event and the last
packet/event.
 
>Does this look to be an exercise in futility?

No, not futile at all.

>As always, your time and effort are appreciated.
>
>Here's a sample of the traffic:
>Jul 26 04:04:32 10.50.12.32 ipmon[137]: [local2.info] [ID 702911  
>local2.info] 04:04:31.438987 e1000g0 @-1:-1 L 10.50.12.32,10050 ->  
>10.50.13.2,45380 PR tcp len 20 55 -AFP OUT
>Jul 26 04:04:32 10.50.12.32 ipmon[137]: [local2.info] [ID 702911  
>local2.info] 04:04:31.439524 e1000g0 @-1:-1 L 10.50.13.2,45380 ->  
>10.50.12.32,10050 PR tcp len 20 40 -AF IN
>Jul 26 04:06:35 10.50.12.32 ipmon[137]: [local2.info] [ID 702911  
>local2.info] 04:06:34.912206 e1000g0 @-1:-1 L 10.50.13.2,59290 ->  
>10.50.12.32,10050 PR tcp len 20 52 -S IN

Your example seems to have multiple flows mixed together, so I am not
quite sure where the sequence you want to find begins/ends but
assuming "-S" identifies the original opening salvo of the flow.

For the inital packet you use the rule:

  type = single
  desc = recognize opening syn packet of new flow
  ptype = regexp
  pattern = e1000g0 ........ ([0-9.]+),([0-9]+) -> ([0-9.]+),([0-9]+).*-S
  context = !flow_$1_$2_$3_$4 && !flow_$3_$4_$1_$2
  action = create flow_$1_$2_$3_$4; \
           alias flow_$1_$2_$3_$4 flow_$3_$4_$1_$2; \
           add flow_$1_$2_$3_$4 $0

This creates a unique context based on src IP/port and dest IP/port
number. This 4-ple uniquely identifies the flow. Then it aliases the
context using a name that is unique to the dest IP/port and src
IP/port so that the return traffic (i.e. the current destination
becomes the source) is placed into the same context.

Then a rule like:

  type = single
  desc = accumulate events associated with existing flow
  ptype = regexp
  pattern = e000g1 ........ ([0-9.]+),([0-9]+) -> ([0-9.]+),([0-9]+)
  context = flow_$1_$2_$3_$4 && flow_$3_$4_$1_$2
  action = add flow_$1_$2_$3_$4 $0

accumulates all the events for a particular flow. Note that this
supports flows in either direction since the flow_$1_$2_$3_$4 and
flow_$3_$42_$1_$2 are the same context because of the alias in the
prior rule. That is also why we require both flows to be defined (by
the context expression) before this rule is executed.

Then when the flow ends (I assume the -AFP means ack/fin packet?) use:

  type = single
  desc = recognize fin/ack of existing flow
  ptype = regexp
  pattern = e1000g0 ........ ([0-9.]+),([0-9]+) -> ([0-9.]+),([0-9]+).*-AFP
  context = flow_$1_$2_$3_$4 && flow_$3_$4_$1_$2
  action = add flow_$1_$2_$3_$4 $0 ; \
           report flow_$1_$2_$3_$4 /bin/Mail -s \
               "flow data between $1,$2 and $3,$4" r...@example.com ; \
           delete flow_$1_$2_$3_$4;

which detects the close of the session and reports it. Now this
doesn't handle the case where one side has done a fin/ack and the
other side is still waiting to send the ack. Since the completion
usually occurs quickly, you could instead tell the context to time out
in say 30 seconds and report when it times out using:

  action = set flow_$1_$2_$3_$4 30 (report flow_$1_$2_$3_$4 /bin/Mail -s \
              "flow data between $1,$2 and $3,$4" r...@example.com )

to replace the report action in the -AFP. This way the accumulate rule
will still accumulate for another 30 seconds after this packet. Then
the context lifetime on flow_$1_$2_$3_$4 will expire, the report will
be done and all the aliases to the flow_$1_$2_$3_$4 context and the
context itself will be deleted.

There are a few corner cases you may also want to look at:

The accumulate rule will only work if both contexts exist. Do you want
to add a new rule similar to the syn recognition rule that will create
the contexts even if no syn was seen? E.G. something like

  type = single
  desc = recognize previously unseen flow whenre no syn packet seen
  ptype = regexp
  pattern = e1000g0 ........ ([0-9.]+),([0-9]+) -> ([0-9.]+),([0-9]+).*
  context = !flow_$1_$2_$3_$4 && !flow_$3_$4_$1_$2
  action = create flow_$1_$2_$3_$4; \
           alias flow_$1_$2_$3_$4 flow_$3_$4_$1_$2; \
           add flow_$1_$2_$3_$4 $0;
           pipe '$0' /bin/Mail -s "New flow w/o syn recognized" \
               r...@example.com

Rather than using single rules, you could use pair rules.  I have had
issues getting them to work well when there are multiple possible
matches for the ending (pattern2) condition. You can do it by having
the inital syn activate all the pair rules by setting

   continue = takenext

on all the pair rules but the last. That opens some number of pair
correlations each recognizing a different end condition. You have to
reset all pair correlations when any one of them recognizes the end of
flow condition. I have found that to be messier than a set of single
rules linked with contexts.

Make sure to add catchall rules at the end of your rules to forward
any unhandled events:

  type = single
  desc = catchall
  ptype = regexp
  pattern = e1000g0 ........ ([0-9.]+),([0-9]+) -> ([0-9.]+),([0-9]+).*
  context = catchall
  action = add catachall $0

  type = single
  desc = catchall
  ptype = regexp
  pattern = e1000g0 ........ ([0-9.]+),([0-9]+) -> ([0-9.]+),([0-9]+).*
  context = !catchall
  action = create catchall 5 (report catchall /bin/Mail -s \
              "flow data between $1,$2 and $3,$4" r...@example.com ); \
           add catchall $0;

so you can revise your rules to handle them.

Hopefully this has given you some ideas.

If you get a working rule set that handles this I would love to see it
along with some sample inputs. I think this would make a good supplimentary
example for my SEC log analysis class.

--
                                -- rouilj
John Rouillard
===========================================================================
My employers don't acknowledge my existence much less my opinions.

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Simple-evcorr-users mailing list
Simple-evcorr-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/simple-evcorr-users

Reply via email to