<html dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" id="owaParaStyle"></style>
</head>
<body fpstyle="1" ocsi="0">
<div style="direction: ltr;font-family: Tahoma;color: #000000;font-size: 10pt;">Thanks for sharing your solution.  XFF and other extra data is supported only for unified2 output at present.  Not sure where your patch might apply in the current version but we
 don't want to do the HTTP inspection twice.  I've opened an internal bug to investigate further.
<div><br>
<div style="font-family: Times New Roman; color: #000000; font-size: 16px">
<hr tabindex="-1">
<div id="divRpF315224" style="direction: ltr;"><font face="Tahoma" size="2" color="#000000"><b>From:</b> Shane Boissevain [shaneboissevain@...300.....2499...]<br>
<b>Sent:</b> Thursday, December 18, 2014 11:31 AM<br>
<b>To:</b> snort-devel@lists.sourceforge.net<br>
<b>Subject:</b> [Snort-devel] First packet X-Forwarded-For information and sending to a Unix Socket (Snort 2.9.2.1)<br>
</font><br>
</div>
<div></div>
<div>
<div dir="ltr">
<div><b>Problem:</b><br>
</div>
<div>    When Snort 2.9.2.1 is configured to alert on the packet that contains the X-Forwarded-For information, as with the following rule, the X-Forwarded-For information is not available at the time of logging to the Unix Socket. 
<div><br>
</div>
<div><b>Testing Rule:</b></div>
<div>    alert tcp any any -> any any (msg:"X-Forwarded-For Data Found"; content:"X-Forwarded-For"; classtype:misc-activity; sid:8000000; rev:1;)<br>
</div>
<div><br>
</div>
</div>
<div><b>Methodology:</b></div>
<div>    I modified the <font face="monospace">output-plugins/spo_alert_unixsock.c</font> file to append the X-Forwarded-For Extra Data (referred to as the true_ip in the Snort code) to the socket, and modified what was reading from the socket to grab the additional
 4 bytes. I then sent a few packets through a proxy and tripped the alerts, and found that while the Unified 2 file and Barnyard2 received a copy of the extra-data, the socket I was interested in was not. I traced this down to the function
<font face="monospace">SnortHttpInspect</font><font face="arial, helvetica, sans-serif"> within</font> <font face="monospace">preprocessors/snort_httpinspect.c</font>. </div>
<div>    On line 3465, <font face="monospace">Detect(p)</font> is called, BEFORE the
<font face="monospace">HttpSessionData</font> is defined, and had a chance to extract the X-Forwarded-For information. The alert is generated, and the socket written to; by now it is too late to append additional information. By defining the
<font face="monospace">HttpSessionData</font> early, the <font face="monospace">hi_mi_mode_inspection</font> function can be called, which trails down into the call for the <font face="monospace">extract_http_xff</font> method in
<font face="monospace">preprocessors/HttpInspect/client/hi_client.c</font>, which sets the true_ip for the session. The following change has eliminated my problem:</div>
<div><br>
</div>
<div>File: <font face="monospace">/preprocessors/snort_httpinspect.c</font></div>
<div><br>
</div>
<div><font face="monospace">3440a3441,3442</font></div>
<div><font face="monospace">>     hsd = GetHttpSessionData(p);</font></div>
<div><font face="monospace">></font></div>
<div><font face="monospace">3464a3467,3478</font></div>
<div><font face="monospace">></font></div>
<div><font face="monospace">>         /*Ensure that HttpSessionData exists, so that the XFF data can be set.*/</font></div>
<div><font face="monospace">>         if (hsd == NULL)</font></div>
<div><font face="monospace">>             hsd = SetNewHttpSessionData(p, (void *)Session);</font></div>
<div><font face="monospace">>         else</font></div>
<div><font face="monospace">>         {</font></div>
<div><font face="monospace">>             /* Gzip data should not be logged with all the packets of the session.*/</font></div>
<div><font face="monospace">>             hsd->log_flags &= ~HTTP_LOG_GZIP_DATA;</font></div>
<div><font face="monospace">>             hsd->log_flags &= ~HTTP_LOG_JSNORM_DATA;</font></div>
<div><font face="monospace">>         }</font></div>
<div><font face="monospace">>         hi_mi_mode_inspection(Session, iInspectMode, p, hsd);</font></div>
<div><font face="monospace">></font></div>
<div><font face="monospace">3469a3484</font></div>
<div><font face="monospace">></font></div>
<div><font face="monospace">3474d3488</font></div>
<div><font face="monospace"><     hsd = GetHttpSessionData(p);</font></div>
<div><font face="monospace">3507a3522</font></div>
<div><font face="monospace">></font></div>
<div><font face="monospace"><br>
</font></div>
<div><b><font face="arial, helvetica, sans-serif">Standing questions:</font></b></div>
<div><font face="arial, helvetica, sans-serif">    For my purposes, I required the http session data earlier for output to the Unix Socket. This seems to be the most logical way to accomplish that, but I wanted to check with the community to ensure that:</font></div>
<div><font face="arial, helvetica, sans-serif">    1) There was not a simpler way to do this.</font></div>
<div><font face="arial, helvetica, sans-serif">    2) A reason it was not done this way to begin with.</font></div>
<div><font face="monospace"><br>
</font></div>
<div>Thank you, if you've gotten this far. Also, I apologize if this is not the correct media to present this, however I did want to publish this incase anyone else hits a similar issue or desire (even though this is a old version of snort).</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>