/* Copyright (C) 2007-2011 Open Information Security Foundation
*
* You can copy , redistribute or modify this Program under the terms of
* the GNU General Public License version 2 as published by the Free
* Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* version 2 along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA
* 02110 - 1301 , USA .
*/
/**
* \ ingroup httplayer
*
* @ {
*/
/**
* \ file
*
* \ author Anoop Saldanha < anoopsaldanha @ gmail . com >
* \ author Victor Julien < victor @ inliniac . net >
*
* Implements support for the http_server_body keyword
*/
# include "suricata-common.h"
# include "threads.h"
# include "decode.h"
# include "detect.h"
# include "detect-parse.h"
# include "detect-engine.h"
# include "detect-engine-mpm.h"
# include "detect-engine-state.h"
# include "detect-content.h"
# include "detect-pcre.h"
# include "flow.h"
# include "flow-var.h"
# include "flow-util.h"
# include "util-debug.h"
# include "util-unittest.h"
# include "util-unittest-helper.h"
# include "util-spm.h"
# include "app-layer.h"
# include <htp/htp.h>
# include "app-layer-htp.h"
# include "detect-http-server-body.h"
# include "stream-tcp.h"
int DetectHttpServerBodySetup ( DetectEngineCtx * , Signature * , char * ) ;
void DetectHttpServerBodyRegisterTests ( void ) ;
void DetectHttpServerBodyFree ( void * ) ;
/**
* \ brief Registers the keyword handlers for the " http_server_body " keyword .
*/
void DetectHttpServerBodyRegister ( void )
{
sigmatch_table [ DETECT_AL_HTTP_SERVER_BODY ] . name = " http_server_body " ;
sigmatch_table [ DETECT_AL_HTTP_SERVER_BODY ] . Match = NULL ;
sigmatch_table [ DETECT_AL_HTTP_SERVER_BODY ] . AppLayerMatch = NULL ;
sigmatch_table [ DETECT_AL_HTTP_SERVER_BODY ] . Setup = DetectHttpServerBodySetup ;
sigmatch_table [ DETECT_AL_HTTP_SERVER_BODY ] . Free = DetectHttpServerBodyFree ;
sigmatch_table [ DETECT_AL_HTTP_SERVER_BODY ] . RegisterTests = DetectHttpServerBodyRegisterTests ;
sigmatch_table [ DETECT_AL_HTTP_SERVER_BODY ] . alproto = ALPROTO_HTTP ;
sigmatch_table [ DETECT_AL_HTTP_SERVER_BODY ] . flags | = SIGMATCH_PAYLOAD ;
}
/**
* \ brief The setup function for the http_server_body keyword for a signature .
*
* \ param de_ctx Pointer to the detection engine context .
* \ param s Pointer to signature for the current Signature being parsed
* from the rules .
* \ param m Pointer to the head of the SigMatchs for the current rule
* being parsed .
* \ param arg Pointer to the string holding the keyword value .
*
* \ retval 0 On success
* \ retval - 1 On failure
*/
int DetectHttpServerBodySetup ( DetectEngineCtx * de_ctx , Signature * s , char * arg )
{
DetectContentData * cd = NULL ;
SigMatch * sm = NULL ;
if ( arg ! = NULL & & strcmp ( arg , " " ) ! = 0 ) {
SCLogError ( SC_ERR_INVALID_ARGUMENT , " http_server_body supplied with args " ) ;
return - 1 ;
}
sm = DetectContentGetLastPattern ( s - > sm_lists_tail [ DETECT_SM_LIST_PMATCH ] ) ;
/* if still we are unable to find any content previous keywords, it is an
* invalid rule */
if ( sm = = NULL ) {
SCLogError ( SC_ERR_INVALID_SIGNATURE , " \" http_server_body \" keyword "
" found inside the rule without a content context. "
" Please use a \" content \" keyword before using the "
" \" http_server_body \" keyword " ) ;
return - 1 ;
}
cd = ( DetectContentData * ) sm - > ctx ;
/* http_server_body should not be used with the rawbytes rule */
if ( cd - > flags & DETECT_CONTENT_RAWBYTES ) {
SCLogError ( SC_ERR_INVALID_SIGNATURE , " http_server_body rule can not "
" be used with the rawbytes rule keyword " ) ;
return - 1 ;
}
if ( s - > alproto ! = ALPROTO_UNKNOWN & & s - > alproto ! = ALPROTO_HTTP ) {
SCLogError ( SC_ERR_CONFLICTING_RULE_KEYWORDS , " rule contains a non http "
" alproto set " ) ;
goto error ;
}
if ( cd - > flags & DETECT_CONTENT_WITHIN | | cd - > flags & DETECT_CONTENT_DISTANCE ) {
SigMatch * pm = SigMatchGetLastSMFromLists ( s , 4 ,
DETECT_CONTENT , sm - > prev ,
DETECT_PCRE , sm - > prev ) ;
/* pm can be NULL now. To accomodate parsing sigs like -
* content : one ; http_modifier ; content : two ; distance : 0 ; http_modifier */
if ( pm ! = NULL ) {
if ( pm - > type = = DETECT_CONTENT ) {
DetectContentData * tmp_cd = ( DetectContentData * ) pm - > ctx ;
tmp_cd - > flags & = ~ DETECT_CONTENT_RELATIVE_NEXT ;
} else {
DetectPcreData * tmp_pd = ( DetectPcreData * ) pm - > ctx ;
tmp_pd - > flags & = ~ DETECT_PCRE_RELATIVE_NEXT ;
}
} /* if (pm != NULL) */
/* reassigning pm */
pm = SigMatchGetLastSMFromLists ( s , 4 ,
DETECT_AL_HTTP_SERVER_BODY , s - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] ,
DETECT_PCRE , s - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] ) ;
if ( pm = = NULL ) {
SCLogError ( SC_ERR_INVALID_SIGNATURE , " http_server_body seen with a "
" distance or within without a previous http_server_body "
" content. Invalidating signature. " ) ;
goto error ;
}
if ( pm - > type = = DETECT_PCRE ) {
DetectPcreData * tmp_pd = ( DetectPcreData * ) pm - > ctx ;
tmp_pd - > flags | = DETECT_PCRE_RELATIVE_NEXT ;
} else {
DetectContentData * tmp_cd = ( DetectContentData * ) pm - > ctx ;
tmp_cd - > flags | = DETECT_CONTENT_RELATIVE_NEXT ;
}
}
cd - > id = DetectPatternGetId ( de_ctx - > mpm_pattern_id_store , cd , DETECT_AL_HTTP_SERVER_BODY ) ;
sm - > type = DETECT_AL_HTTP_SERVER_BODY ;
/* transfer the sm from the pmatch list to hsbdmatch list */
SigMatchTransferSigMatchAcrossLists ( sm ,
& s - > sm_lists [ DETECT_SM_LIST_PMATCH ] ,
& s - > sm_lists_tail [ DETECT_SM_LIST_PMATCH ] ,
& s - > sm_lists [ DETECT_SM_LIST_HSBDMATCH ] ,
& s - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] ) ;
/* flag the signature to indicate that we scan the app layer data */
s - > flags | = SIG_FLAG_APPLAYER ;
s - > alproto = ALPROTO_HTTP ;
/* enable http request body callback in the http app layer parser */
AppLayerHtpEnableResponseBodyCallback ( ) ;
return 0 ;
error :
//if (cd != NULL)
// DetectHttpServerBodyFree(cd);
//if (sm != NULL)
// SCFree(sm);
return - 1 ;
}
/**
* \ brief The function to free the http_server_body data .
*
* \ param ptr Pointer to the http_server_body .
*/
void DetectHttpServerBodyFree ( void * ptr )
{
SCEnter ( ) ;
DetectContentData * hsbd = ( DetectContentData * ) ptr ;
if ( hsbd = = NULL )
SCReturn ;
if ( hsbd - > content ! = NULL )
SCFree ( hsbd - > content ) ;
BoyerMooreCtxDeInit ( hsbd - > bm_ctx ) ;
SCFree ( hsbd ) ;
SCReturn ;
}
/************************************Unittests*********************************/
# ifdef UNITTESTS
# include "stream-tcp-reassemble.h"
/**
* \ test Test that a signature containting a http_server_body is correctly parsed
* and the keyword is registered .
*/
static int DetectHttpServerBodyTest01 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
SigMatch * sm = NULL ;
de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert tcp any any -> any any "
" (msg: \" Testing http_server_body \" ; "
" content: \" one \" ; http_server_body; sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL ) {
goto end ;
}
/* sm should not be in the MATCH list */
sm = de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_MATCH ] ;
if ( sm ! = NULL ) {
goto end ;
}
sm = de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_HSBDMATCH ] ;
if ( sm = = NULL ) {
goto end ;
}
if ( sm - > type ! = DETECT_AL_HTTP_SERVER_BODY ) {
printf ( " sm type not DETECT_AL_HTTP_SERVER_BODY: " ) ;
goto end ;
}
if ( sm - > next ! = NULL ) {
goto end ;
}
result = 1 ;
end :
SigGroupCleanup ( de_ctx ) ;
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
/**
* \ test Test that a signature containing an valid http_server_body entry is
* parsed .
*/
static int DetectHttpServerBodyTest02 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert tcp any any -> any any "
" (msg: \" Testing http_server_body \" ; "
" content: \" one \" ; http_server_body:; sid:1;) " ) ;
if ( de_ctx - > sig_list ! = NULL )
result = 1 ;
end :
SigGroupCleanup ( de_ctx ) ;
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
/**
* \ test Test that an invalid signature containing no content but a http_server_body
* is invalidated .
*/
static int DetectHttpServerBodyTest03 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert tcp any any -> any any "
" (msg: \" Testing http_server_body \" ; "
" http_server_body; sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL )
result = 1 ;
end :
SigGroupCleanup ( de_ctx ) ;
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
/**
* \ test Test that an invalid signature containing a rawbytes along with a
* http_server_body is invalidated .
*/
static int DetectHttpServerBodyTest04 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert tcp any any -> any any "
" (msg: \" Testing http_server_body \" ; "
" content: \" one \" ; rawbytes; http_server_body; sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL )
result = 1 ;
end :
SigGroupCleanup ( de_ctx ) ;
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
/**
* \ test Test that an invalid signature containing a rawbytes along with a
* http_server_body is invalidated .
*/
static int DetectHttpServerBodyTest05 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert tcp any any -> any any "
" (msg: \" Testing http_server_body \" ; "
" content: \" one \" ; http_server_body; nocase; sid:1;) " ) ;
if ( de_ctx - > sig_list ! = NULL )
result = 1 ;
end :
SigGroupCleanup ( de_ctx ) ;
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
/**
* \ test Test that the http_server_body content matches against a http request
* which holds the content .
*/
static int DetectHttpServerBodyTest06 ( void )
{
TcpSession ssn ;
Packet * p = NULL ;
ThreadVars th_v ;
DetectEngineCtx * de_ctx = NULL ;
DetectEngineThreadCtx * det_ctx = NULL ;
HtpState * http_state = NULL ;
Flow f ;
uint8_t http_buf [ ] =
" GET /index.html HTTP/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 \r \n "
" \r \n " ;
uint32_t http_len = sizeof ( http_buf ) - 1 ;
uint8_t http_buf2 [ ] =
" HTTP/1.0 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 7 \r \n "
" \r \n "
" message " ;
uint32_t http_len2 = sizeof ( http_buf2 ) - 1 ;
int result = 0 ;
memset ( & th_v , 0 , sizeof ( th_v ) ) ;
memset ( & f , 0 , sizeof ( f ) ) ;
memset ( & ssn , 0 , sizeof ( ssn ) ) ;
p = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
FLOW_INITIALIZE ( & f ) ;
f . protoctx = ( void * ) & ssn ;
f . flags | = FLOW_IPV4 ;
p - > flow = & f ;
p - > flowflags | = FLOW_PKT_TOCLIENT ;
p - > flowflags | = FLOW_PKT_ESTABLISHED ;
p - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
f . alproto = ALPROTO_HTTP ;
StreamTcpInitConfig ( TRUE ) ;
de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert http any any -> any any "
" (msg: \" http server body test \" ; "
" content: \" message \" ; http_server_body; "
" sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL )
goto end ;
SigGroupBuild ( de_ctx ) ;
DetectEngineThreadCtxInit ( & th_v , ( void * ) de_ctx , ( void * ) & det_ctx ) ;
int r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER | STREAM_START | STREAM_EOF , http_buf , http_len ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_START | STREAM_EOF , http_buf2 , http_len2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
http_state = f . alstate ;
if ( http_state = = NULL ) {
printf ( " no http state: \n " ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p ) ;
if ( ! ( PacketAlertCheck ( p , 1 ) ) ) {
printf ( " sid 1 didn't match but should have: " ) ;
goto end ;
}
result = 1 ;
end :
if ( de_ctx ! = NULL )
SigGroupCleanup ( de_ctx ) ;
if ( de_ctx ! = NULL )
SigCleanSignatures ( de_ctx ) ;
if ( de_ctx ! = NULL )
DetectEngineCtxFree ( de_ctx ) ;
StreamTcpFreeConfig ( TRUE ) ;
FLOW_DESTROY ( & f ) ;
UTHFreePackets ( & p , 1 ) ;
return result ;
}
/**
* \ test Test that the http_server_body content matches against a http request
* which holds the content .
*/
static int DetectHttpServerBodyTest07 ( void )
{
TcpSession ssn ;
Packet * p1 = NULL ;
Packet * p2 = NULL ;
ThreadVars th_v ;
DetectEngineCtx * de_ctx = NULL ;
DetectEngineThreadCtx * det_ctx = NULL ;
HtpState * http_state = NULL ;
Flow f ;
uint8_t http_buf1 [ ] =
" GET /index.html HTTP/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 \r \n "
" \r \n " ;
uint32_t http_len1 = sizeof ( http_buf1 ) - 1 ;
uint8_t http_buf2 [ ] =
" HTTP/1.0 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 14 \r \n "
" \r \n "
" message " ;
uint32_t http_len2 = sizeof ( http_buf2 ) - 1 ;
uint8_t http_buf3 [ ] =
" message " ;
uint32_t http_len3 = sizeof ( http_buf3 ) - 1 ;
int result = 0 ;
memset ( & th_v , 0 , sizeof ( th_v ) ) ;
memset ( & f , 0 , sizeof ( f ) ) ;
memset ( & ssn , 0 , sizeof ( ssn ) ) ;
p1 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
p2 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
FLOW_INITIALIZE ( & f ) ;
f . protoctx = ( void * ) & ssn ;
f . flags | = FLOW_IPV4 ;
p1 - > flow = & f ;
p1 - > flowflags | = FLOW_PKT_TOCLIENT ;
p1 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p1 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
p2 - > flow = & f ;
p2 - > flowflags | = FLOW_PKT_TOCLIENT ;
p2 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p2 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
f . alproto = ALPROTO_HTTP ;
StreamTcpInitConfig ( TRUE ) ;
de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert http any any -> any any "
" (msg: \" http server body test \" ; "
" content: \" message \" ; http_server_body; "
" sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL )
goto end ;
SigGroupBuild ( de_ctx ) ;
DetectEngineThreadCtxInit ( & th_v , ( void * ) de_ctx , ( void * ) & det_ctx ) ;
int r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER | STREAM_START | STREAM_EOF , http_buf1 , http_len1 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_START , http_buf2 , http_len2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 2 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
http_state = f . alstate ;
if ( http_state = = NULL ) {
printf ( " no http state: " ) ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p1 ) ;
if ( ! ( PacketAlertCheck ( p1 , 1 ) ) ) {
printf ( " sid 1 didn't match on p1 but should have: " ) ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_EOF , http_buf3 , http_len3 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 3 returned % " PRId32 " , expected 0: " , r ) ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p2 ) ;
if ( PacketAlertCheck ( p2 , 1 ) ) {
printf ( " sid 1 matched on p2 but shouldn't have: " ) ;
goto end ;
}
result = 1 ;
end :
if ( de_ctx ! = NULL )
SigGroupCleanup ( de_ctx ) ;
if ( de_ctx ! = NULL )
SigCleanSignatures ( de_ctx ) ;
if ( de_ctx ! = NULL )
DetectEngineCtxFree ( de_ctx ) ;
StreamTcpFreeConfig ( TRUE ) ;
FLOW_DESTROY ( & f ) ;
UTHFreePackets ( & p1 , 1 ) ;
UTHFreePackets ( & p2 , 1 ) ;
return result ;
}
/**
* \ test Test that the http_server_body content matches against a http request
* which holds the content .
*/
static int DetectHttpServerBodyTest08 ( void )
{
TcpSession ssn ;
Packet * p1 = NULL ;
Packet * p2 = NULL ;
ThreadVars th_v ;
DetectEngineCtx * de_ctx = NULL ;
DetectEngineThreadCtx * det_ctx = NULL ;
HtpState * http_state = NULL ;
Flow f ;
uint8_t http_buf1 [ ] =
" GET /index.html HTTP/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 \r \n "
" \r \n " ;
uint32_t http_len1 = sizeof ( http_buf1 ) - 1 ;
uint8_t http_buf2 [ ] =
" HTTP/1.0 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 14 \r \n "
" \r \n "
" bigmes " ;
uint32_t http_len2 = sizeof ( http_buf2 ) - 1 ;
uint8_t http_buf3 [ ] =
" sage4u!! " ;
uint32_t http_len3 = sizeof ( http_buf3 ) - 1 ;
int result = 0 ;
memset ( & th_v , 0 , sizeof ( th_v ) ) ;
memset ( & f , 0 , sizeof ( f ) ) ;
memset ( & ssn , 0 , sizeof ( ssn ) ) ;
p1 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
p2 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
FLOW_INITIALIZE ( & f ) ;
f . protoctx = ( void * ) & ssn ;
f . flags | = FLOW_IPV4 ;
p1 - > flow = & f ;
p1 - > flowflags | = FLOW_PKT_TOCLIENT ;
p1 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p1 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
p2 - > flow = & f ;
p2 - > flowflags | = FLOW_PKT_TOCLIENT ;
p2 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p2 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
f . alproto = ALPROTO_HTTP ;
StreamTcpInitConfig ( TRUE ) ;
de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert http any any -> any any "
" (msg: \" http client body test \" ; "
" content: \" message \" ; http_server_body; "
" sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL )
goto end ;
SigGroupBuild ( de_ctx ) ;
DetectEngineThreadCtxInit ( & th_v , ( void * ) de_ctx , ( void * ) & det_ctx ) ;
int r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER | STREAM_START , http_buf1 , http_len1 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
http_state = f . alstate ;
if ( http_state = = NULL ) {
printf ( " no http state: " ) ;
result = 0 ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_START , http_buf2 , http_len2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p1 ) ;
if ( ( PacketAlertCheck ( p1 , 1 ) ) ) {
printf ( " sid 1 matched but shouldn't have: " ) ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_EOF , http_buf3 , http_len3 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p2 ) ;
if ( ! ( PacketAlertCheck ( p2 , 1 ) ) ) {
printf ( " sid 1 didn't match but should have: " ) ;
goto end ;
}
result = 1 ;
end :
if ( de_ctx ! = NULL )
SigGroupCleanup ( de_ctx ) ;
if ( de_ctx ! = NULL )
SigCleanSignatures ( de_ctx ) ;
if ( de_ctx ! = NULL )
DetectEngineCtxFree ( de_ctx ) ;
StreamTcpFreeConfig ( TRUE ) ;
FLOW_DESTROY ( & f ) ;
UTHFreePackets ( & p1 , 1 ) ;
UTHFreePackets ( & p2 , 1 ) ;
return result ;
}
/**
* \ test Test that the http_server_body content matches against a http request
* which holds the content .
*/
static int DetectHttpServerBodyTest09 ( void )
{
TcpSession ssn ;
Packet * p1 = NULL ;
Packet * p2 = NULL ;
ThreadVars th_v ;
DetectEngineCtx * de_ctx = NULL ;
DetectEngineThreadCtx * det_ctx = NULL ;
HtpState * http_state = NULL ;
Flow f ;
uint8_t http_buf1 [ ] =
" GET /index.html HTTP/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 \r \n "
" \r \n " ;
uint32_t http_len1 = sizeof ( http_buf1 ) - 1 ;
uint8_t http_buf2 [ ] =
" HTTP/1.0 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 14 \r \n "
" \r \n "
" bigmes " ;
uint32_t http_len2 = sizeof ( http_buf2 ) - 1 ;
uint8_t http_buf3 [ ] =
" sag " ;
uint32_t http_len3 = sizeof ( http_buf3 ) - 1 ;
uint8_t http_buf4 [ ] =
" e4u!! " ;
uint32_t http_len4 = sizeof ( http_buf4 ) - 1 ;
int result = 0 ;
memset ( & th_v , 0 , sizeof ( th_v ) ) ;
memset ( & f , 0 , sizeof ( f ) ) ;
memset ( & ssn , 0 , sizeof ( ssn ) ) ;
p1 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
p2 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
FLOW_INITIALIZE ( & f ) ;
f . protoctx = ( void * ) & ssn ;
f . flags | = FLOW_IPV4 ;
p1 - > flow = & f ;
p1 - > flowflags | = FLOW_PKT_TOCLIENT ;
p1 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p1 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
p2 - > flow = & f ;
p2 - > flowflags | = FLOW_PKT_TOCLIENT ;
p2 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p2 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
f . alproto = ALPROTO_HTTP ;
StreamTcpInitConfig ( TRUE ) ;
de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert http any any -> any any "
" (msg: \" http client body test \" ; "
" content: \" message \" ; http_server_body; "
" sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL )
goto end ;
SigGroupBuild ( de_ctx ) ;
DetectEngineThreadCtxInit ( & th_v , ( void * ) de_ctx , ( void * ) & det_ctx ) ;
int r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER | STREAM_START , http_buf1 , http_len1 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
http_state = f . alstate ;
if ( http_state = = NULL ) {
printf ( " no http state: " ) ;
result = 0 ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_START , http_buf2 , http_len2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p1 ) ;
if ( ( PacketAlertCheck ( p1 , 1 ) ) ) {
printf ( " sid 1 matched but shouldn't have: " ) ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_EOF , http_buf3 , http_len3 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_EOF , http_buf4 , http_len4 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p2 ) ;
if ( ! ( PacketAlertCheck ( p2 , 1 ) ) ) {
printf ( " sid 1 didn't match but should have: " ) ;
goto end ;
}
result = 1 ;
end :
if ( de_ctx ! = NULL )
SigGroupCleanup ( de_ctx ) ;
if ( de_ctx ! = NULL )
SigCleanSignatures ( de_ctx ) ;
if ( de_ctx ! = NULL )
DetectEngineCtxFree ( de_ctx ) ;
StreamTcpFreeConfig ( TRUE ) ;
FLOW_DESTROY ( & f ) ;
UTHFreePackets ( & p1 , 1 ) ;
UTHFreePackets ( & p2 , 1 ) ;
return result ;
}
/**
* \ test Test that the http_server_body content matches against a http request
* which holds the content . Case insensitve .
*/
static int DetectHttpServerBodyTest10 ( void )
{
TcpSession ssn ;
Packet * p1 = NULL ;
Packet * p2 = NULL ;
ThreadVars th_v ;
DetectEngineCtx * de_ctx = NULL ;
DetectEngineThreadCtx * det_ctx = NULL ;
HtpState * http_state = NULL ;
Flow f ;
uint8_t http_buf1 [ ] =
" GET /index.html HTTP/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 \r \n "
" \r \n " ;
uint32_t http_len1 = sizeof ( http_buf1 ) - 1 ;
uint8_t http_buf2 [ ] =
" HTTP/1.0 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 14 \r \n "
" \r \n "
" bigmes " ;
uint32_t http_len2 = sizeof ( http_buf2 ) - 1 ;
uint8_t http_buf3 [ ] =
" sag " ;
uint32_t http_len3 = sizeof ( http_buf3 ) - 1 ;
uint8_t http_buf4 [ ] =
" e4u!! " ;
uint32_t http_len4 = sizeof ( http_buf4 ) - 1 ;
int result = 0 ;
memset ( & th_v , 0 , sizeof ( th_v ) ) ;
memset ( & f , 0 , sizeof ( f ) ) ;
memset ( & ssn , 0 , sizeof ( ssn ) ) ;
p1 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
p2 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
FLOW_INITIALIZE ( & f ) ;
f . protoctx = ( void * ) & ssn ;
f . flags | = FLOW_IPV4 ;
p1 - > flow = & f ;
p1 - > flowflags | = FLOW_PKT_TOCLIENT ;
p1 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p1 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
p2 - > flow = & f ;
p2 - > flowflags | = FLOW_PKT_TOCLIENT ;
p2 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p2 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
f . alproto = ALPROTO_HTTP ;
StreamTcpInitConfig ( TRUE ) ;
de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert http any any -> any any "
" (msg: \" http client body test \" ; "
" content: \" MeSSaGE \" ; http_server_body; nocase; "
" sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL )
goto end ;
SigGroupBuild ( de_ctx ) ;
DetectEngineThreadCtxInit ( & th_v , ( void * ) de_ctx , ( void * ) & det_ctx ) ;
int r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER | STREAM_START , http_buf1 , http_len1 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
http_state = f . alstate ;
if ( http_state = = NULL ) {
printf ( " no http state: " ) ;
result = 0 ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_START , http_buf2 , http_len2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p1 ) ;
if ( ( PacketAlertCheck ( p1 , 1 ) ) ) {
printf ( " sid 1 matched but shouldn't have: " ) ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_EOF , http_buf3 , http_len3 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_EOF , http_buf4 , http_len4 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p2 ) ;
if ( ! ( PacketAlertCheck ( p2 , 1 ) ) ) {
printf ( " sid 1 didn't match but should have: " ) ;
goto end ;
}
result = 1 ;
end :
if ( de_ctx ! = NULL )
SigGroupCleanup ( de_ctx ) ;
if ( de_ctx ! = NULL )
SigCleanSignatures ( de_ctx ) ;
if ( de_ctx ! = NULL )
DetectEngineCtxFree ( de_ctx ) ;
StreamTcpFreeConfig ( TRUE ) ;
FLOW_DESTROY ( & f ) ;
UTHFreePackets ( & p1 , 1 ) ;
UTHFreePackets ( & p2 , 1 ) ;
return result ;
}
/**
* \ test Test that the http_server_body content matches against a http request
* which holds the content . Negated match .
*/
static int DetectHttpServerBodyTest11 ( void )
{
TcpSession ssn ;
Packet * p1 = NULL ;
Packet * p2 = NULL ;
ThreadVars th_v ;
DetectEngineCtx * de_ctx = NULL ;
DetectEngineThreadCtx * det_ctx = NULL ;
HtpState * http_state = NULL ;
Flow f ;
uint8_t http_buf1 [ ] =
" GET /index.html HTTP/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 \r \n "
" \r \n " ;
uint32_t http_len1 = sizeof ( http_buf1 ) - 1 ;
uint8_t http_buf2 [ ] =
" HTTP/1.0 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 14 \r \n "
" \r \n " ;
uint32_t http_len2 = sizeof ( http_buf2 ) - 1 ;
uint8_t http_buf3 [ ] =
" bigmessage4u!! " ;
uint32_t http_len3 = sizeof ( http_buf3 ) - 1 ;
int result = 0 ;
memset ( & th_v , 0 , sizeof ( th_v ) ) ;
memset ( & f , 0 , sizeof ( f ) ) ;
memset ( & ssn , 0 , sizeof ( ssn ) ) ;
p1 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
p2 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
FLOW_INITIALIZE ( & f ) ;
f . protoctx = ( void * ) & ssn ;
f . flags | = FLOW_IPV4 ;
p1 - > flow = & f ;
p1 - > flowflags | = FLOW_PKT_TOCLIENT ;
p1 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p1 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
p2 - > flow = & f ;
p2 - > flowflags | = FLOW_PKT_TOCLIENT ;
p2 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p2 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
f . alproto = ALPROTO_HTTP ;
StreamTcpInitConfig ( TRUE ) ;
de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert http any any -> any any "
" (msg: \" http client body test \" ; "
" content:! \" MaSSaGE \" ; http_server_body; nocase; "
" sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL )
goto end ;
SigGroupBuild ( de_ctx ) ;
DetectEngineThreadCtxInit ( & th_v , ( void * ) de_ctx , ( void * ) & det_ctx ) ;
int r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER | STREAM_START , http_buf1 , http_len1 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
http_state = f . alstate ;
if ( http_state = = NULL ) {
printf ( " no http state: " ) ;
result = 0 ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_START , http_buf2 , http_len2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p1 ) ;
if ( PacketAlertCheck ( p1 , 1 ) ) {
printf ( " sid 1 matched but shouldn't have (p1): " ) ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_EOF , http_buf3 , http_len3 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p2 ) ;
if ( ! ( PacketAlertCheck ( p2 , 1 ) ) ) {
printf ( " sid 1 didn't match but should have (p2): " ) ;
goto end ;
}
result = 1 ;
end :
if ( de_ctx ! = NULL )
SigGroupCleanup ( de_ctx ) ;
if ( de_ctx ! = NULL )
SigCleanSignatures ( de_ctx ) ;
if ( de_ctx ! = NULL )
DetectEngineCtxFree ( de_ctx ) ;
StreamTcpFreeConfig ( TRUE ) ;
FLOW_DESTROY ( & f ) ;
UTHFreePackets ( & p1 , 1 ) ;
UTHFreePackets ( & p2 , 1 ) ;
return result ;
}
/**
* \ test Test that the http_server_body content matches against a http request
* which holds the content . Negated match .
*/
static int DetectHttpServerBodyTest12 ( void )
{
TcpSession ssn ;
Packet * p1 = NULL ;
Packet * p2 = NULL ;
ThreadVars th_v ;
DetectEngineCtx * de_ctx = NULL ;
DetectEngineThreadCtx * det_ctx = NULL ;
HtpState * http_state = NULL ;
Flow f ;
uint8_t http_buf1 [ ] =
" GET /index.html HTTP/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 \r \n "
" \r \n " ;
uint32_t http_len1 = sizeof ( http_buf1 ) - 1 ;
uint8_t http_buf2 [ ] =
" HTTP/1.0 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 14 \r \n "
" \r \n " ;
uint32_t http_len2 = sizeof ( http_buf2 ) - 1 ;
uint8_t http_buf3 [ ] =
" bigmessage4u!! " ;
uint32_t http_len3 = sizeof ( http_buf3 ) - 1 ;
int result = 0 ;
memset ( & th_v , 0 , sizeof ( th_v ) ) ;
memset ( & f , 0 , sizeof ( f ) ) ;
memset ( & ssn , 0 , sizeof ( ssn ) ) ;
p1 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
p2 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
FLOW_INITIALIZE ( & f ) ;
f . protoctx = ( void * ) & ssn ;
f . flags | = FLOW_IPV4 ;
p1 - > flow = & f ;
p1 - > flowflags | = FLOW_PKT_TOCLIENT ;
p1 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p1 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
p2 - > flow = & f ;
p2 - > flowflags | = FLOW_PKT_TOCLIENT ;
p2 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p2 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
f . alproto = ALPROTO_HTTP ;
StreamTcpInitConfig ( TRUE ) ;
de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert http any any -> any any "
" (msg: \" http client body test \" ; "
" content:! \" MeSSaGE \" ; http_server_body; nocase; "
" sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL )
goto end ;
SigGroupBuild ( de_ctx ) ;
DetectEngineThreadCtxInit ( & th_v , ( void * ) de_ctx , ( void * ) & det_ctx ) ;
int r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER | STREAM_START , http_buf1 , http_len1 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
http_state = f . alstate ;
if ( http_state = = NULL ) {
printf ( " no http state: " ) ;
result = 0 ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_START , http_buf2 , http_len2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p1 ) ;
if ( PacketAlertCheck ( p1 , 1 ) ) {
printf ( " sid 1 matched but shouldn't have (p1): " ) ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_EOF , http_buf3 , http_len3 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p2 ) ;
if ( PacketAlertCheck ( p2 , 1 ) ) {
printf ( " sid 1 matched but shouldn't have (p2): " ) ;
goto end ;
}
result = 1 ;
end :
if ( de_ctx ! = NULL )
SigGroupCleanup ( de_ctx ) ;
if ( de_ctx ! = NULL )
SigCleanSignatures ( de_ctx ) ;
if ( de_ctx ! = NULL )
DetectEngineCtxFree ( de_ctx ) ;
StreamTcpFreeConfig ( TRUE ) ;
FLOW_DESTROY ( & f ) ;
UTHFreePackets ( & p1 , 1 ) ;
UTHFreePackets ( & p2 , 1 ) ;
return result ;
}
static int DetectHttpServerBodyTest13 ( void )
{
TcpSession ssn ;
Packet * p = NULL ;
ThreadVars th_v ;
DetectEngineCtx * de_ctx = NULL ;
DetectEngineThreadCtx * det_ctx = NULL ;
HtpState * http_state = NULL ;
Flow f ;
uint8_t http_buf [ ] =
" GET /index.html HTTP/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 \r \n "
" \r \n " ;
uint32_t http_len = sizeof ( http_buf ) - 1 ;
uint8_t http_buf2 [ ] =
" HTTP/1.0 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 55 \r \n "
" \r \n "
" longbufferabcdefghijklmnopqrstuvwxyz0123456789bufferend " ;
uint32_t http_len2 = sizeof ( http_buf2 ) - 1 ;
int result = 0 ;
memset ( & th_v , 0 , sizeof ( th_v ) ) ;
memset ( & f , 0 , sizeof ( f ) ) ;
memset ( & ssn , 0 , sizeof ( ssn ) ) ;
p = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
FLOW_INITIALIZE ( & f ) ;
f . protoctx = ( void * ) & ssn ;
f . flags | = FLOW_IPV4 ;
p - > flow = & f ;
p - > flowflags | = FLOW_PKT_TOCLIENT ;
p - > flowflags | = FLOW_PKT_ESTABLISHED ;
p - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
f . alproto = ALPROTO_HTTP ;
StreamTcpInitConfig ( TRUE ) ;
de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert http any any -> any any "
" (msg: \" http server body test \" ; "
" content: \" longbufferabcdefghijklmnopqrstuvwxyz0123456789bufferend \" ; http_server_body; "
" sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL )
goto end ;
SigGroupBuild ( de_ctx ) ;
DetectEngineThreadCtxInit ( & th_v , ( void * ) de_ctx , ( void * ) & det_ctx ) ;
int r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER | STREAM_START | STREAM_EOF , http_buf , http_len ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_START | STREAM_EOF , http_buf2 , http_len2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
http_state = f . alstate ;
if ( http_state = = NULL ) {
printf ( " no http state: \n " ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p ) ;
if ( ! ( PacketAlertCheck ( p , 1 ) ) ) {
printf ( " sid 1 didn't match but should have: " ) ;
goto end ;
}
result = 1 ;
end :
if ( de_ctx ! = NULL )
SigGroupCleanup ( de_ctx ) ;
if ( de_ctx ! = NULL )
SigCleanSignatures ( de_ctx ) ;
if ( de_ctx ! = NULL )
DetectEngineCtxFree ( de_ctx ) ;
StreamTcpFreeConfig ( TRUE ) ;
FLOW_DESTROY ( & f ) ;
UTHFreePackets ( & p , 1 ) ;
return result ;
}
/** \test multiple http transactions and body chunks of request handling */
static int DetectHttpServerBodyTest14 ( void ) {
int result = 0 ;
Signature * s = NULL ;
DetectEngineThreadCtx * det_ctx = NULL ;
ThreadVars th_v ;
Flow f ;
TcpSession ssn ;
Packet * p = NULL ;
uint8_t httpbuf1 [ ] = " GET /index1.html HTTP/1.1 \r \n "
" User-Agent: Mozilla/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" Connection: keep-alive \r \n "
" Cookie: dummy1 \r \n \r \n " ;
uint32_t httplen1 = sizeof ( httpbuf1 ) - 1 ; /* minus the \0 */
uint8_t httpbuf2 [ ] = " HTTP/1.1 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 3 \r \n "
" \r \n "
" one " ;
uint32_t httplen2 = sizeof ( httpbuf2 ) - 1 ; /* minus the \0 */
uint8_t httpbuf3 [ ] = " GET /index2.html HTTP/1.1 \r \n "
" User-Agent: Firefox/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" Connection: keep-alive \r \n "
" Cookie: dummy2 \r \n \r \n " ;
uint32_t httplen3 = sizeof ( httpbuf3 ) - 1 ; /* minus the \0 */
uint8_t httpbuf4 [ ] = " HTTP/1.1 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 3 \r \n "
" \r \n "
" two " ;
uint32_t httplen4 = sizeof ( httpbuf4 ) - 1 ; /* minus the \0 */
memset ( & th_v , 0 , sizeof ( th_v ) ) ;
memset ( & f , 0 , sizeof ( f ) ) ;
memset ( & ssn , 0 , sizeof ( ssn ) ) ;
p = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
FLOW_INITIALIZE ( & f ) ;
f . protoctx = ( void * ) & ssn ;
f . proto = IPPROTO_TCP ;
f . flags | = FLOW_IPV4 ;
p - > flow = & f ;
p - > flowflags | = FLOW_PKT_TOSERVER ;
p - > flowflags | = FLOW_PKT_ESTABLISHED ;
p - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
f . alproto = ALPROTO_HTTP ;
StreamTcpInitConfig ( TRUE ) ;
DetectEngineCtx * de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL ) {
goto end ;
}
de_ctx - > flags | = DE_QUIET ;
s = DetectEngineAppendSig ( de_ctx , " alert tcp any any -> any any (content: \" GET \" ; http_method; content: \" Mozilla \" ; http_header; content: \" dummy1 \" ; http_cookie; content: \" one \" ; http_server_body; sid:1; rev:1;) " ) ;
if ( s = = NULL ) {
printf ( " sig parse failed: " ) ;
goto end ;
}
s = DetectEngineAppendSig ( de_ctx , " alert tcp any any -> any any (content: \" GET \" ; http_method; content: \" Firefox \" ; http_header; content: \" dummy2 \" ; http_cookie; content: \" two \" ; http_server_body; sid:2; rev:1;) " ) ;
if ( s = = NULL ) {
printf ( " sig2 parse failed: " ) ;
goto end ;
}
SigGroupBuild ( de_ctx ) ;
DetectEngineThreadCtxInit ( & th_v , ( void * ) de_ctx , ( void * ) & det_ctx ) ;
int r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER | STREAM_START , httpbuf1 , httplen1 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p ) ;
if ( PacketAlertCheck ( p , 1 ) ) {
printf ( " sig 1 alerted (tx 1): " ) ;
goto end ;
}
p - > alerts . cnt = 0 ;
p - > flowflags & = ~ FLOW_PKT_TOSERVER ;
p - > flowflags | = FLOW_PKT_TOCLIENT ;
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT , httpbuf2 , httplen2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 2 returned % " PRId32 " , expected 0: " , r ) ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p ) ;
if ( ! ( PacketAlertCheck ( p , 1 ) ) ) {
printf ( " sig 1 didn't alert (tx 1): " ) ;
goto end ;
}
p - > alerts . cnt = 0 ;
p - > flowflags & = ~ FLOW_PKT_TOCLIENT ;
p - > flowflags | = FLOW_PKT_TOSERVER ;
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER , httpbuf3 , httplen3 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 3 returned % " PRId32 " , expected 0: " , r ) ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p ) ;
if ( PacketAlertCheck ( p , 1 ) ) {
printf ( " sig 1 matched, but shouldn't have (tx 2): " ) ;
goto end ;
}
if ( ( PacketAlertCheck ( p , 2 ) ) ) {
printf ( " sig 2 alerted (tx 2): " ) ;
goto end ;
}
p - > alerts . cnt = 0 ;
p - > flowflags & = ~ FLOW_PKT_TOSERVER ;
p - > flowflags | = FLOW_PKT_TOCLIENT ;
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_EOF , httpbuf4 , httplen4 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 4 returned % " PRId32 " , expected 0: " , r ) ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p ) ;
if ( ( PacketAlertCheck ( p , 1 ) ) ) {
printf ( " sig 1 alerted (tx 2): " ) ;
goto end ;
}
if ( ! ( PacketAlertCheck ( p , 2 ) ) ) {
printf ( " sig 2 didn't alert (tx 2): " ) ;
goto end ;
}
p - > alerts . cnt = 0 ;
HtpState * htp_state = f . alstate ;
if ( htp_state = = NULL ) {
printf ( " no http state: " ) ;
goto end ;
}
if ( list_size ( htp_state - > connp - > conn - > transactions ) ! = 2 ) {
printf ( " The http app layer doesn't have 2 transactions, but it should: " ) ;
goto end ;
}
result = 1 ;
end :
if ( det_ctx ! = NULL ) {
DetectEngineThreadCtxDeinit ( & th_v , ( void * ) det_ctx ) ;
}
if ( de_ctx ! = NULL ) {
SigGroupCleanup ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
}
StreamTcpFreeConfig ( TRUE ) ;
FLOW_DESTROY ( & f ) ;
UTHFreePacket ( p ) ;
return result ;
}
static int DetectHttpServerBodyTest15 ( void ) {
int result = 0 ;
Signature * s = NULL ;
DetectEngineThreadCtx * det_ctx = NULL ;
ThreadVars th_v ;
Flow f ;
TcpSession ssn ;
Packet * p = NULL ;
uint8_t httpbuf1 [ ] = " GET /index1.html HTTP/1.1 \r \n "
" User-Agent: Mozilla/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" Connection: keep-alive \r \n "
" Cookie: dummy1 \r \n \r \n " ;
uint32_t httplen1 = sizeof ( httpbuf1 ) - 1 ; /* minus the \0 */
uint8_t httpbuf2 [ ] = " HTTP/1.1 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 3 \r \n "
" \r \n "
" one " ;
uint32_t httplen2 = sizeof ( httpbuf2 ) - 1 ; /* minus the \0 */
uint8_t httpbuf3 [ ] = " GET /index2.html HTTP/1.1 \r \n "
" User-Agent: Firefox/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" Connection: keep-alive \r \n "
" Cookie: dummy2 \r \n \r \n " ;
uint32_t httplen3 = sizeof ( httpbuf3 ) - 1 ; /* minus the \0 */
uint8_t httpbuf4 [ ] = " HTTP/1.1 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 3 \r \n "
" \r \n "
" two " ;
uint32_t httplen4 = sizeof ( httpbuf4 ) - 1 ; /* minus the \0 */
memset ( & th_v , 0 , sizeof ( th_v ) ) ;
memset ( & f , 0 , sizeof ( f ) ) ;
memset ( & ssn , 0 , sizeof ( ssn ) ) ;
p = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
FLOW_INITIALIZE ( & f ) ;
f . protoctx = ( void * ) & ssn ;
f . proto = IPPROTO_TCP ;
f . flags | = FLOW_IPV4 ;
p - > flow = & f ;
p - > flowflags | = FLOW_PKT_TOSERVER ;
p - > flowflags | = FLOW_PKT_ESTABLISHED ;
p - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
f . alproto = ALPROTO_HTTP ;
StreamTcpInitConfig ( TRUE ) ;
DetectEngineCtx * de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL ) {
goto end ;
}
de_ctx - > flags | = DE_QUIET ;
s = DetectEngineAppendSig ( de_ctx , " alert tcp any any -> any any (content: \" GET \" ; http_method; content: \" index1 \" ; http_uri; content: \" Mozilla \" ; http_header; content: \" dummy1 \" ; http_cookie; content: \" one \" ; http_server_body; sid:1; rev:1;) " ) ;
if ( s = = NULL ) {
printf ( " sig parse failed: " ) ;
goto end ;
}
s = DetectEngineAppendSig ( de_ctx , " alert tcp any any -> any any (content: \" GET \" ; http_method; content: \" index2 \" ; http_uri; content: \" Firefox \" ; http_header; content: \" dummy2 \" ; http_cookie; content: \" two \" ; http_server_body; sid:2; rev:1;) " ) ;
if ( s = = NULL ) {
printf ( " sig2 parse failed: " ) ;
goto end ;
}
SigGroupBuild ( de_ctx ) ;
DetectEngineThreadCtxInit ( & th_v , ( void * ) de_ctx , ( void * ) & det_ctx ) ;
int r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER | STREAM_START , httpbuf1 , httplen1 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p ) ;
if ( PacketAlertCheck ( p , 1 ) ) {
printf ( " sig 1 alerted (tx 1): " ) ;
goto end ;
}
p - > alerts . cnt = 0 ;
p - > flowflags & = ~ FLOW_PKT_TOSERVER ;
p - > flowflags | = FLOW_PKT_TOCLIENT ;
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT , httpbuf2 , httplen2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 2 returned % " PRId32 " , expected 0: " , r ) ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p ) ;
if ( ! ( PacketAlertCheck ( p , 1 ) ) ) {
printf ( " sig 1 didn't alert (tx 1): " ) ;
goto end ;
}
p - > alerts . cnt = 0 ;
p - > flowflags & = ~ FLOW_PKT_TOCLIENT ;
p - > flowflags | = FLOW_PKT_TOSERVER ;
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER , httpbuf3 , httplen3 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 3 returned % " PRId32 " , expected 0: " , r ) ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p ) ;
if ( PacketAlertCheck ( p , 1 ) ) {
printf ( " sig 1 matched, but shouldn't have (tx 2): " ) ;
goto end ;
}
if ( ( PacketAlertCheck ( p , 2 ) ) ) {
printf ( " sig 2 alerted (tx 2): " ) ;
goto end ;
}
p - > alerts . cnt = 0 ;
p - > flowflags & = ~ FLOW_PKT_TOSERVER ;
p - > flowflags | = FLOW_PKT_TOCLIENT ;
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_EOF , httpbuf4 , httplen4 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 4 returned % " PRId32 " , expected 0: " , r ) ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p ) ;
if ( ( PacketAlertCheck ( p , 1 ) ) ) {
printf ( " sig 1 alerted (tx 2): " ) ;
goto end ;
}
if ( ! ( PacketAlertCheck ( p , 2 ) ) ) {
printf ( " sig 2 didn't alert (tx 2): " ) ;
goto end ;
}
p - > alerts . cnt = 0 ;
HtpState * htp_state = f . alstate ;
if ( htp_state = = NULL ) {
printf ( " no http state: " ) ;
goto end ;
}
if ( list_size ( htp_state - > connp - > conn - > transactions ) ! = 2 ) {
printf ( " The http app layer doesn't have 2 transactions, but it should: " ) ;
goto end ;
}
result = 1 ;
end :
if ( det_ctx ! = NULL ) {
DetectEngineThreadCtxDeinit ( & th_v , ( void * ) det_ctx ) ;
}
if ( de_ctx ! = NULL ) {
SigGroupCleanup ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
}
StreamTcpFreeConfig ( TRUE ) ;
FLOW_DESTROY ( & f ) ;
UTHFreePacket ( p ) ;
return result ;
}
/** \test multiple http transactions and body chunks of request handling */
int DetectHttpServerBodyTest16 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
if ( ( de_ctx = DetectEngineCtxInit ( ) ) = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert icmp any any -> any any "
" (content: \" one \" ; content: \" one \" ; http_server_body; sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL ) {
printf ( " de_ctx->sig_list == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_PMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_PMATCH] == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_HSBDMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_HSBDMATCH] == NULL \n " ) ;
goto end ;
}
DetectContentData * cd = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_PMATCH ] - > ctx ;
DetectContentData * hsbd = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > ctx ;
if ( cd - > id = = hsbd - > id )
goto end ;
result = 1 ;
end :
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
int DetectHttpServerBodyTest17 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
if ( ( de_ctx = DetectEngineCtxInit ( ) ) = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert icmp any any -> any any "
" (content: \" one \" ; http_server_body; content: \" one \" ; sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL ) {
printf ( " de_ctx->sig_list == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_PMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_PMATCH] == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_HSBDMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_HSBDMATCH] == NULL \n " ) ;
goto end ;
}
DetectContentData * cd = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_PMATCH ] - > ctx ;
DetectContentData * hsbd = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > ctx ;
if ( cd - > id = = hsbd - > id )
goto end ;
result = 1 ;
end :
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
int DetectHttpServerBodyTest18 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
if ( ( de_ctx = DetectEngineCtxInit ( ) ) = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert icmp any any -> any any "
" (content: \" one \" ; content: \" one \" ; content: \" one \" ; http_server_body; content: \" one \" ; sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL ) {
printf ( " de_ctx->sig_list == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_PMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_PMATCH] == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_HSBDMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_HSBDMATCH] == NULL \n " ) ;
goto end ;
}
DetectContentData * cd = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_PMATCH ] - > ctx ;
DetectContentData * hsbd = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > ctx ;
if ( cd - > id ! = 0 | | hsbd - > id ! = 1 )
goto end ;
result = 1 ;
end :
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
int DetectHttpServerBodyTest19 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
if ( ( de_ctx = DetectEngineCtxInit ( ) ) = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert icmp any any -> any any "
" (content: \" one \" ; http_server_body; content: \" one \" ; content: \" one \" ; content: \" one \" ; sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL ) {
printf ( " de_ctx->sig_list == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_PMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_PMATCH] == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_HSBDMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_HSBDMATCH] == NULL \n " ) ;
goto end ;
}
DetectContentData * cd = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_PMATCH ] - > ctx ;
DetectContentData * hsbd = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > ctx ;
if ( cd - > id ! = 1 | | hsbd - > id ! = 0 )
goto end ;
result = 1 ;
end :
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
int DetectHttpServerBodyTest20 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
if ( ( de_ctx = DetectEngineCtxInit ( ) ) = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert icmp any any -> any any "
" (content: \" one \" ; http_server_body; "
" content: \" one \" ; content: \" one \" ; http_server_body; content: \" one \" ; sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL ) {
printf ( " de_ctx->sig_list == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_PMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_PMATCH] == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_HSBDMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_HSBDMATCH] == NULL \n " ) ;
goto end ;
}
DetectContentData * cd = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_PMATCH ] - > ctx ;
DetectContentData * hsbd1 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > ctx ;
DetectContentData * hsbd2 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > prev - > ctx ;
if ( cd - > id ! = 1 | | hsbd1 - > id ! = 0 | | hsbd2 - > id ! = 0 )
goto end ;
result = 1 ;
end :
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
int DetectHttpServerBodyTest21 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
if ( ( de_ctx = DetectEngineCtxInit ( ) ) = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert icmp any any -> any any "
" (content: \" one \" ; http_server_body; "
" content: \" one \" ; content: \" one \" ; http_server_body; content: \" two \" ; sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL ) {
printf ( " de_ctx->sig_list == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_PMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_PMATCH] == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_HSBDMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_HSBDMATCH] == NULL \n " ) ;
goto end ;
}
DetectContentData * cd = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_PMATCH ] - > ctx ;
DetectContentData * hsbd1 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > ctx ;
DetectContentData * hsbd2 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > prev - > ctx ;
if ( cd - > id ! = 2 | | hsbd1 - > id ! = 0 | | hsbd2 - > id ! = 0 )
goto end ;
result = 1 ;
end :
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
int DetectHttpServerBodyTest22 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
if ( ( de_ctx = DetectEngineCtxInit ( ) ) = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert icmp any any -> any any "
" (content: \" one \" ; content: \" two \" ; http_server_body; "
" content: \" three \" ; distance:10; http_server_body; content: \" four \" ; sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL ) {
printf ( " de_ctx->sig_list == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_PMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_PMATCH] == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_HSBDMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_HSBDMATCH] == NULL \n " ) ;
goto end ;
}
DetectContentData * cd1 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_PMATCH ] - > prev - > ctx ;
DetectContentData * cd2 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_PMATCH ] - > ctx ;
DetectContentData * hsbd1 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > prev - > ctx ;
DetectContentData * hsbd2 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > ctx ;
if ( cd1 - > flags ! = 0 | | memcmp ( cd1 - > content , " one " , cd1 - > content_len ) ! = 0 | |
cd2 - > flags ! = 0 | | memcmp ( cd2 - > content , " four " , cd2 - > content_len ) ! = 0 | |
hsbd1 - > flags ! = DETECT_CONTENT_RELATIVE_NEXT | |
memcmp ( hsbd1 - > content , " two " , hsbd1 - > content_len ) ! = 0 | |
hsbd2 - > flags ! = DETECT_CONTENT_DISTANCE | |
memcmp ( hsbd2 - > content , " three " , hsbd1 - > content_len ) ! = 0 ) {
goto end ;
}
if ( ! DETECT_CONTENT_IS_SINGLE ( cd1 ) | |
! DETECT_CONTENT_IS_SINGLE ( cd2 ) | |
DETECT_CONTENT_IS_SINGLE ( hsbd1 ) | |
DETECT_CONTENT_IS_SINGLE ( hsbd2 ) ) {
goto end ;
}
result = 1 ;
end :
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
int DetectHttpServerBodyTest23 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
if ( ( de_ctx = DetectEngineCtxInit ( ) ) = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert icmp any any -> any any "
" (content: \" one \" ; http_server_body; pcre:/two/; "
" content: \" three \" ; distance:10; http_server_body; content: \" four \" ; sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL ) {
printf ( " de_ctx->sig_list == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_PMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_PMATCH] == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_HSBDMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_HSBDMATCH] == NULL \n " ) ;
goto end ;
}
DetectPcreData * pd1 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_PMATCH ] - > prev - > ctx ;
DetectContentData * cd2 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_PMATCH ] - > ctx ;
DetectContentData * hsbd1 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > prev - > ctx ;
DetectContentData * hsbd2 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > ctx ;
if ( pd1 - > flags ! = 0 | |
cd2 - > flags ! = 0 | | memcmp ( cd2 - > content , " four " , cd2 - > content_len ) ! = 0 | |
hsbd1 - > flags ! = DETECT_CONTENT_RELATIVE_NEXT | |
memcmp ( hsbd1 - > content , " one " , hsbd1 - > content_len ) ! = 0 | |
hsbd2 - > flags ! = DETECT_CONTENT_DISTANCE | |
memcmp ( hsbd2 - > content , " three " , hsbd1 - > content_len ) ! = 0 ) {
goto end ;
}
if ( ! DETECT_CONTENT_IS_SINGLE ( cd2 ) | |
DETECT_CONTENT_IS_SINGLE ( hsbd1 ) | |
DETECT_CONTENT_IS_SINGLE ( hsbd2 ) ) {
goto end ;
}
result = 1 ;
end :
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
int DetectHttpServerBodyTest24 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
if ( ( de_ctx = DetectEngineCtxInit ( ) ) = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert icmp any any -> any any "
" (content: \" one \" ; http_server_body; pcre:/two/; "
" content: \" three \" ; distance:10; within:15; http_server_body; content: \" four \" ; sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL ) {
printf ( " de_ctx->sig_list == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_PMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_PMATCH] == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_HSBDMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_HSBDMATCH] == NULL \n " ) ;
goto end ;
}
DetectPcreData * pd1 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_PMATCH ] - > prev - > ctx ;
DetectContentData * cd2 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_PMATCH ] - > ctx ;
DetectContentData * hsbd1 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > prev - > ctx ;
DetectContentData * hsbd2 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > ctx ;
if ( pd1 - > flags ! = 0 | |
cd2 - > flags ! = 0 | | memcmp ( cd2 - > content , " four " , cd2 - > content_len ) ! = 0 | |
hsbd1 - > flags ! = DETECT_CONTENT_RELATIVE_NEXT | |
memcmp ( hsbd1 - > content , " one " , hsbd1 - > content_len ) ! = 0 | |
hsbd2 - > flags ! = ( DETECT_CONTENT_DISTANCE | DETECT_CONTENT_WITHIN ) | |
memcmp ( hsbd2 - > content , " three " , hsbd1 - > content_len ) ! = 0 ) {
goto end ;
}
if ( ! DETECT_CONTENT_IS_SINGLE ( cd2 ) | |
DETECT_CONTENT_IS_SINGLE ( hsbd1 ) | |
DETECT_CONTENT_IS_SINGLE ( hsbd2 ) ) {
goto end ;
}
result = 1 ;
end :
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
int DetectHttpServerBodyTest25 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
if ( ( de_ctx = DetectEngineCtxInit ( ) ) = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert icmp any any -> any any "
" (content: \" one \" ; http_server_body; pcre:/two/; "
" content: \" three \" ; distance:10; http_server_body; "
" content: \" four \" ; distance:10; sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL ) {
printf ( " de_ctx->sig_list == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_PMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_PMATCH] == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_HSBDMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_HSBDMATCH] == NULL \n " ) ;
goto end ;
}
DetectPcreData * pd1 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_PMATCH ] - > prev - > ctx ;
DetectContentData * cd2 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_PMATCH ] - > ctx ;
DetectContentData * hsbd1 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > prev - > ctx ;
DetectContentData * hsbd2 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > ctx ;
if ( pd1 - > flags ! = DETECT_PCRE_RELATIVE_NEXT | |
cd2 - > flags ! = DETECT_CONTENT_DISTANCE | |
memcmp ( cd2 - > content , " four " , cd2 - > content_len ) ! = 0 | |
hsbd1 - > flags ! = DETECT_CONTENT_RELATIVE_NEXT | |
memcmp ( hsbd1 - > content , " one " , hsbd1 - > content_len ) ! = 0 | |
hsbd2 - > flags ! = DETECT_CONTENT_DISTANCE | |
memcmp ( hsbd2 - > content , " three " , hsbd1 - > content_len ) ! = 0 ) {
goto end ;
}
if ( DETECT_CONTENT_IS_SINGLE ( cd2 ) | |
DETECT_CONTENT_IS_SINGLE ( hsbd1 ) | |
DETECT_CONTENT_IS_SINGLE ( hsbd2 ) ) {
goto end ;
}
result = 1 ;
end :
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
int DetectHttpServerBodyTest26 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
if ( ( de_ctx = DetectEngineCtxInit ( ) ) = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert icmp any any -> any any "
" (content: \" one \" ; offset:10; http_server_body; pcre:/two/; "
" content: \" three \" ; distance:10; http_server_body; depth:10; "
" content: \" four \" ; distance:10; sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL ) {
printf ( " de_ctx->sig_list == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_PMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_PMATCH] == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_HSBDMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_HSBDMATCH] == NULL \n " ) ;
goto end ;
}
DetectPcreData * pd1 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_PMATCH ] - > prev - > ctx ;
DetectContentData * cd2 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_PMATCH ] - > ctx ;
DetectContentData * hsbd1 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > prev - > ctx ;
DetectContentData * hsbd2 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > ctx ;
if ( pd1 - > flags ! = ( DETECT_PCRE_RELATIVE_NEXT ) | |
cd2 - > flags ! = DETECT_CONTENT_DISTANCE | |
memcmp ( cd2 - > content , " four " , cd2 - > content_len ) ! = 0 | |
hsbd1 - > flags ! = ( DETECT_CONTENT_RELATIVE_NEXT | DETECT_CONTENT_OFFSET ) | |
memcmp ( hsbd1 - > content , " one " , hsbd1 - > content_len ) ! = 0 | |
hsbd2 - > flags ! = ( DETECT_CONTENT_DISTANCE | DETECT_CONTENT_DEPTH ) | |
memcmp ( hsbd2 - > content , " three " , hsbd1 - > content_len ) ! = 0 ) {
goto end ;
}
if ( DETECT_CONTENT_IS_SINGLE ( cd2 ) | |
DETECT_CONTENT_IS_SINGLE ( hsbd1 ) | |
DETECT_CONTENT_IS_SINGLE ( hsbd2 ) ) {
goto end ;
}
result = 1 ;
end :
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
int DetectHttpServerBodyTest27 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
if ( ( de_ctx = DetectEngineCtxInit ( ) ) = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert icmp any any -> any any "
" (content: \" one \" ; offset:10; http_server_body; pcre:/two/; distance:10; "
" content: \" three \" ; distance:10; http_server_body; depth:10; "
" content: \" four \" ; distance:10; sid:1;) " ) ;
if ( de_ctx - > sig_list ! = NULL ) {
printf ( " de_ctx->sig_list != NULL \n " ) ;
goto end ;
}
result = 1 ;
end :
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
int DetectHttpServerBodyTest28 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
if ( ( de_ctx = DetectEngineCtxInit ( ) ) = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert icmp any any -> any any "
" (content: \" one \" ; http_server_body; pcre:/two/; "
" content: \" three \" ; http_server_body; depth:10; "
" content: \" four \" ; distance:10; sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL ) {
printf ( " de_ctx->sig_list == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_PMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_PMATCH] == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_HSBDMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_HSBDMATCH] == NULL \n " ) ;
goto end ;
}
DetectPcreData * pd1 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_PMATCH ] - > prev - > ctx ;
DetectContentData * cd2 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_PMATCH ] - > ctx ;
DetectContentData * hsbd1 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > prev - > ctx ;
DetectContentData * hsbd2 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > ctx ;
if ( pd1 - > flags ! = ( DETECT_PCRE_RELATIVE_NEXT ) | |
cd2 - > flags ! = DETECT_CONTENT_DISTANCE | |
memcmp ( cd2 - > content , " four " , cd2 - > content_len ) ! = 0 | |
hsbd1 - > flags ! = 0 | |
memcmp ( hsbd1 - > content , " one " , hsbd1 - > content_len ) ! = 0 | |
hsbd2 - > flags ! = DETECT_CONTENT_DEPTH | |
memcmp ( hsbd2 - > content , " three " , hsbd1 - > content_len ) ! = 0 ) {
goto end ;
}
if ( DETECT_CONTENT_IS_SINGLE ( cd2 ) | |
! DETECT_CONTENT_IS_SINGLE ( hsbd1 ) | |
DETECT_CONTENT_IS_SINGLE ( hsbd2 ) ) {
goto end ;
}
result = 1 ;
end :
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
int DetectHttpServerBodyTest29 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
if ( ( de_ctx = DetectEngineCtxInit ( ) ) = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert icmp any any -> any any "
" (content: \" one \" ; http_server_body; "
" content: \" two \" ; distance:0; http_server_body; sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL ) {
printf ( " de_ctx->sig_list == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_PMATCH ] ! = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_PMATCH] != NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_HSBDMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_HSBDMATCH] == NULL \n " ) ;
goto end ;
}
DetectContentData * hsbd1 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > prev - > ctx ;
DetectContentData * hsbd2 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > ctx ;
if ( hsbd1 - > flags ! = DETECT_CONTENT_RELATIVE_NEXT | |
memcmp ( hsbd1 - > content , " one " , hsbd1 - > content_len ) ! = 0 | |
hsbd2 - > flags ! = DETECT_CONTENT_DISTANCE | |
memcmp ( hsbd2 - > content , " two " , hsbd1 - > content_len ) ! = 0 ) {
goto end ;
}
result = 1 ;
end :
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
int DetectHttpServerBodyTest30 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
if ( ( de_ctx = DetectEngineCtxInit ( ) ) = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert icmp any any -> any any "
" (content: \" one \" ; http_server_body; "
" content: \" two \" ; within:5; http_server_body; sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL ) {
printf ( " de_ctx->sig_list == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_PMATCH ] ! = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_PMATCH] != NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_HSBDMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_HSBDMATCH] == NULL \n " ) ;
goto end ;
}
DetectContentData * hsbd1 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > prev - > ctx ;
DetectContentData * hsbd2 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > ctx ;
if ( hsbd1 - > flags ! = DETECT_CONTENT_RELATIVE_NEXT | |
memcmp ( hsbd1 - > content , " one " , hsbd1 - > content_len ) ! = 0 | |
hsbd2 - > flags ! = DETECT_CONTENT_WITHIN | |
memcmp ( hsbd2 - > content , " two " , hsbd1 - > content_len ) ! = 0 ) {
goto end ;
}
result = 1 ;
end :
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
int DetectHttpServerBodyTest31 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
if ( ( de_ctx = DetectEngineCtxInit ( ) ) = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert icmp any any -> any any "
" (content: \" one \" ; within:5; http_server_body; sid:1;) " ) ;
if ( de_ctx - > sig_list ! = NULL ) {
printf ( " de_ctx->sig_list != NULL \n " ) ;
goto end ;
}
result = 1 ;
end :
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
int DetectHttpServerBodyTest32 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
if ( ( de_ctx = DetectEngineCtxInit ( ) ) = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert icmp any any -> any any "
" (content: \" one \" ; http_server_body; within:5; sid:1;) " ) ;
if ( de_ctx - > sig_list ! = NULL ) {
printf ( " de_ctx->sig_list != NULL \n " ) ;
goto end ;
}
result = 1 ;
end :
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
int DetectHttpServerBodyTest33 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
if ( ( de_ctx = DetectEngineCtxInit ( ) ) = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert icmp any any -> any any "
" (content: \" one \" ; within:5; sid:1;) " ) ;
if ( de_ctx - > sig_list ! = NULL ) {
printf ( " de_ctx->sig_list != NULL \n " ) ;
goto end ;
}
result = 1 ;
end :
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
int DetectHttpServerBodyTest34 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
if ( ( de_ctx = DetectEngineCtxInit ( ) ) = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert icmp any any -> any any "
" (pcre:/one/S; "
" content: \" two \" ; within:5; http_server_body; sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL ) {
printf ( " de_ctx->sig_list == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_PMATCH ] ! = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_PMATCH] != NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_HSBDMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_HSBDMATCH] == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] = = NULL | |
de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > type ! = DETECT_AL_HTTP_SERVER_BODY | |
de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > prev = = NULL | |
de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > prev - > type ! = DETECT_PCRE ) {
goto end ;
}
DetectPcreData * pd1 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > prev - > ctx ;
DetectContentData * hsbd2 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > ctx ;
if ( pd1 - > flags ! = ( DETECT_PCRE_RELATIVE_NEXT | DETECT_PCRE_HTTP_SERVER_BODY ) | |
hsbd2 - > flags ! = DETECT_CONTENT_WITHIN | |
memcmp ( hsbd2 - > content , " two " , hsbd2 - > content_len ) ! = 0 ) {
goto end ;
}
result = 1 ;
end :
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
int DetectHttpServerBodyTest35 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
if ( ( de_ctx = DetectEngineCtxInit ( ) ) = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert icmp any any -> any any "
" (content: \" two \" ; http_server_body; "
" pcre:/one/SR; sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL ) {
printf ( " de_ctx->sig_list == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_PMATCH ] ! = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_PMATCH] != NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_HSBDMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_HSBDMATCH] == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] = = NULL | |
de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > type ! = DETECT_PCRE | |
de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > prev = = NULL | |
de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > prev - > type ! = DETECT_AL_HTTP_SERVER_BODY ) {
goto end ;
}
DetectContentData * hsbd1 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > prev - > ctx ;
DetectPcreData * pd2 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > ctx ;
if ( pd2 - > flags ! = ( DETECT_PCRE_RELATIVE | DETECT_PCRE_HTTP_SERVER_BODY ) | |
hsbd1 - > flags ! = DETECT_CONTENT_RELATIVE_NEXT | |
memcmp ( hsbd1 - > content , " two " , hsbd1 - > content_len ) ! = 0 ) {
goto end ;
}
result = 1 ;
end :
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
int DetectHttpServerBodyTest36 ( void )
{
DetectEngineCtx * de_ctx = NULL ;
int result = 0 ;
if ( ( de_ctx = DetectEngineCtxInit ( ) ) = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert icmp any any -> any any "
" (pcre:/one/S; "
" content: \" two \" ; distance:5; http_server_body; sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL ) {
printf ( " de_ctx->sig_list == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_PMATCH ] ! = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_PMATCH] != NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists [ DETECT_SM_LIST_HSBDMATCH ] = = NULL ) {
printf ( " de_ctx->sig_list->sm_lists[DETECT_SM_LIST_HSBDMATCH] == NULL \n " ) ;
goto end ;
}
if ( de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] = = NULL | |
de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > type ! = DETECT_AL_HTTP_SERVER_BODY | |
de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > prev = = NULL | |
de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > prev - > type ! = DETECT_PCRE ) {
goto end ;
}
DetectPcreData * pd1 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > prev - > ctx ;
DetectContentData * hsbd2 = de_ctx - > sig_list - > sm_lists_tail [ DETECT_SM_LIST_HSBDMATCH ] - > ctx ;
if ( pd1 - > flags ! = ( DETECT_PCRE_RELATIVE_NEXT | DETECT_PCRE_HTTP_SERVER_BODY ) | |
hsbd2 - > flags ! = DETECT_CONTENT_DISTANCE | |
memcmp ( hsbd2 - > content , " two " , hsbd2 - > content_len ) ! = 0 ) {
goto end ;
}
result = 1 ;
end :
SigCleanSignatures ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
return result ;
}
/**
* \ test Test that the http_server_body content matches against a http request
* which holds the content .
*/
static int DetectHttpServerBodyFileDataTest01 ( void )
{
TcpSession ssn ;
Packet * p = NULL ;
ThreadVars th_v ;
DetectEngineCtx * de_ctx = NULL ;
DetectEngineThreadCtx * det_ctx = NULL ;
HtpState * http_state = NULL ;
Flow f ;
uint8_t http_buf [ ] =
" GET /index.html HTTP/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 \r \n "
" \r \n " ;
uint32_t http_len = sizeof ( http_buf ) - 1 ;
uint8_t http_buf2 [ ] =
" HTTP/1.0 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 7 \r \n "
" \r \n "
" message " ;
uint32_t http_len2 = sizeof ( http_buf2 ) - 1 ;
int result = 0 ;
memset ( & th_v , 0 , sizeof ( th_v ) ) ;
memset ( & f , 0 , sizeof ( f ) ) ;
memset ( & ssn , 0 , sizeof ( ssn ) ) ;
p = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
FLOW_INITIALIZE ( & f ) ;
f . protoctx = ( void * ) & ssn ;
f . flags | = FLOW_IPV4 ;
p - > flow = & f ;
p - > flowflags | = FLOW_PKT_TOCLIENT ;
p - > flowflags | = FLOW_PKT_ESTABLISHED ;
p - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
f . alproto = ALPROTO_HTTP ;
StreamTcpInitConfig ( TRUE ) ;
de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert http any any -> any any "
" (msg: \" http server body test \" ; "
" file_data; content: \" message \" ; "
" sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL )
goto end ;
SigGroupBuild ( de_ctx ) ;
DetectEngineThreadCtxInit ( & th_v , ( void * ) de_ctx , ( void * ) & det_ctx ) ;
int r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER | STREAM_START | STREAM_EOF , http_buf , http_len ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_START | STREAM_EOF , http_buf2 , http_len2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
http_state = f . alstate ;
if ( http_state = = NULL ) {
printf ( " no http state: \n " ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p ) ;
if ( ! ( PacketAlertCheck ( p , 1 ) ) ) {
printf ( " sid 1 didn't match but should have: " ) ;
goto end ;
}
result = 1 ;
end :
if ( de_ctx ! = NULL )
SigGroupCleanup ( de_ctx ) ;
if ( de_ctx ! = NULL )
SigCleanSignatures ( de_ctx ) ;
if ( de_ctx ! = NULL )
DetectEngineCtxFree ( de_ctx ) ;
StreamTcpFreeConfig ( TRUE ) ;
FLOW_DESTROY ( & f ) ;
UTHFreePackets ( & p , 1 ) ;
return result ;
}
/**
* \ test Test that the http_server_body content matches against a http request
* which holds the content .
*/
static int DetectHttpServerBodyFileDataTest02 ( void )
{
TcpSession ssn ;
Packet * p1 = NULL ;
Packet * p2 = NULL ;
ThreadVars th_v ;
DetectEngineCtx * de_ctx = NULL ;
DetectEngineThreadCtx * det_ctx = NULL ;
HtpState * http_state = NULL ;
Flow f ;
uint8_t http_buf1 [ ] =
" GET /index.html HTTP/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 \r \n "
" \r \n " ;
uint32_t http_len1 = sizeof ( http_buf1 ) - 1 ;
uint8_t http_buf2 [ ] =
" HTTP/1.0 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 14 \r \n "
" \r \n "
" message " ;
uint32_t http_len2 = sizeof ( http_buf2 ) - 1 ;
uint8_t http_buf3 [ ] =
" message " ;
uint32_t http_len3 = sizeof ( http_buf3 ) - 1 ;
int result = 0 ;
memset ( & th_v , 0 , sizeof ( th_v ) ) ;
memset ( & f , 0 , sizeof ( f ) ) ;
memset ( & ssn , 0 , sizeof ( ssn ) ) ;
p1 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
p2 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
FLOW_INITIALIZE ( & f ) ;
f . protoctx = ( void * ) & ssn ;
f . flags | = FLOW_IPV4 ;
p1 - > flow = & f ;
p1 - > flowflags | = FLOW_PKT_TOCLIENT ;
p1 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p1 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
p2 - > flow = & f ;
p2 - > flowflags | = FLOW_PKT_TOCLIENT ;
p2 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p2 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
f . alproto = ALPROTO_HTTP ;
StreamTcpInitConfig ( TRUE ) ;
de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert http any any -> any any "
" (msg: \" http server body test \" ; "
" file_data; content: \" message \" ; "
" sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL )
goto end ;
SigGroupBuild ( de_ctx ) ;
DetectEngineThreadCtxInit ( & th_v , ( void * ) de_ctx , ( void * ) & det_ctx ) ;
int r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER | STREAM_START | STREAM_EOF , http_buf1 , http_len1 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_START , http_buf2 , http_len2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 2 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
http_state = f . alstate ;
if ( http_state = = NULL ) {
printf ( " no http state: " ) ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p1 ) ;
if ( ! ( PacketAlertCheck ( p1 , 1 ) ) ) {
printf ( " sid 1 didn't match on p1 but should have: " ) ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_EOF , http_buf3 , http_len3 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 3 returned % " PRId32 " , expected 0: " , r ) ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p2 ) ;
if ( PacketAlertCheck ( p2 , 1 ) ) {
printf ( " sid 1 matched on p2 but shouldn't have: " ) ;
goto end ;
}
result = 1 ;
end :
if ( de_ctx ! = NULL )
SigGroupCleanup ( de_ctx ) ;
if ( de_ctx ! = NULL )
SigCleanSignatures ( de_ctx ) ;
if ( de_ctx ! = NULL )
DetectEngineCtxFree ( de_ctx ) ;
StreamTcpFreeConfig ( TRUE ) ;
FLOW_DESTROY ( & f ) ;
UTHFreePackets ( & p1 , 1 ) ;
UTHFreePackets ( & p2 , 1 ) ;
return result ;
}
/**
* \ test Test that the http_server_body content matches against a http request
* which holds the content .
*/
static int DetectHttpServerBodyFileDataTest03 ( void )
{
TcpSession ssn ;
Packet * p1 = NULL ;
Packet * p2 = NULL ;
ThreadVars th_v ;
DetectEngineCtx * de_ctx = NULL ;
DetectEngineThreadCtx * det_ctx = NULL ;
HtpState * http_state = NULL ;
Flow f ;
uint8_t http_buf1 [ ] =
" GET /index.html HTTP/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 \r \n "
" \r \n " ;
uint32_t http_len1 = sizeof ( http_buf1 ) - 1 ;
uint8_t http_buf2 [ ] =
" HTTP/1.0 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 14 \r \n "
" \r \n "
" bigmes " ;
uint32_t http_len2 = sizeof ( http_buf2 ) - 1 ;
uint8_t http_buf3 [ ] =
" sage4u!! " ;
uint32_t http_len3 = sizeof ( http_buf3 ) - 1 ;
int result = 0 ;
memset ( & th_v , 0 , sizeof ( th_v ) ) ;
memset ( & f , 0 , sizeof ( f ) ) ;
memset ( & ssn , 0 , sizeof ( ssn ) ) ;
p1 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
p2 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
FLOW_INITIALIZE ( & f ) ;
f . protoctx = ( void * ) & ssn ;
f . flags | = FLOW_IPV4 ;
p1 - > flow = & f ;
p1 - > flowflags | = FLOW_PKT_TOCLIENT ;
p1 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p1 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
p2 - > flow = & f ;
p2 - > flowflags | = FLOW_PKT_TOCLIENT ;
p2 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p2 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
f . alproto = ALPROTO_HTTP ;
StreamTcpInitConfig ( TRUE ) ;
de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert http any any -> any any "
" (msg: \" http client body test \" ; "
" file_data; content: \" message \" ; "
" sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL )
goto end ;
SigGroupBuild ( de_ctx ) ;
DetectEngineThreadCtxInit ( & th_v , ( void * ) de_ctx , ( void * ) & det_ctx ) ;
int r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER | STREAM_START , http_buf1 , http_len1 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
http_state = f . alstate ;
if ( http_state = = NULL ) {
printf ( " no http state: " ) ;
result = 0 ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_START , http_buf2 , http_len2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p1 ) ;
if ( ( PacketAlertCheck ( p1 , 1 ) ) ) {
printf ( " sid 1 matched but shouldn't have: " ) ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_EOF , http_buf3 , http_len3 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p2 ) ;
if ( ! ( PacketAlertCheck ( p2 , 1 ) ) ) {
printf ( " sid 1 didn't match but should have: " ) ;
goto end ;
}
result = 1 ;
end :
if ( de_ctx ! = NULL )
SigGroupCleanup ( de_ctx ) ;
if ( de_ctx ! = NULL )
SigCleanSignatures ( de_ctx ) ;
if ( de_ctx ! = NULL )
DetectEngineCtxFree ( de_ctx ) ;
StreamTcpFreeConfig ( TRUE ) ;
FLOW_DESTROY ( & f ) ;
UTHFreePackets ( & p1 , 1 ) ;
UTHFreePackets ( & p2 , 1 ) ;
return result ;
}
/**
* \ test Test that the http_server_body content matches against a http request
* which holds the content .
*/
static int DetectHttpServerBodyFileDataTest04 ( void )
{
TcpSession ssn ;
Packet * p1 = NULL ;
Packet * p2 = NULL ;
ThreadVars th_v ;
DetectEngineCtx * de_ctx = NULL ;
DetectEngineThreadCtx * det_ctx = NULL ;
HtpState * http_state = NULL ;
Flow f ;
uint8_t http_buf1 [ ] =
" GET /index.html HTTP/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 \r \n "
" \r \n " ;
uint32_t http_len1 = sizeof ( http_buf1 ) - 1 ;
uint8_t http_buf2 [ ] =
" HTTP/1.0 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 14 \r \n "
" \r \n "
" bigmes " ;
uint32_t http_len2 = sizeof ( http_buf2 ) - 1 ;
uint8_t http_buf3 [ ] =
" sag " ;
uint32_t http_len3 = sizeof ( http_buf3 ) - 1 ;
uint8_t http_buf4 [ ] =
" e4u!! " ;
uint32_t http_len4 = sizeof ( http_buf4 ) - 1 ;
int result = 0 ;
memset ( & th_v , 0 , sizeof ( th_v ) ) ;
memset ( & f , 0 , sizeof ( f ) ) ;
memset ( & ssn , 0 , sizeof ( ssn ) ) ;
p1 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
p2 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
FLOW_INITIALIZE ( & f ) ;
f . protoctx = ( void * ) & ssn ;
f . flags | = FLOW_IPV4 ;
p1 - > flow = & f ;
p1 - > flowflags | = FLOW_PKT_TOCLIENT ;
p1 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p1 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
p2 - > flow = & f ;
p2 - > flowflags | = FLOW_PKT_TOCLIENT ;
p2 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p2 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
f . alproto = ALPROTO_HTTP ;
StreamTcpInitConfig ( TRUE ) ;
de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert http any any -> any any "
" (msg: \" http client body test \" ; "
" file_data; content: \" message \" ; "
" sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL )
goto end ;
SigGroupBuild ( de_ctx ) ;
DetectEngineThreadCtxInit ( & th_v , ( void * ) de_ctx , ( void * ) & det_ctx ) ;
int r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER | STREAM_START , http_buf1 , http_len1 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
http_state = f . alstate ;
if ( http_state = = NULL ) {
printf ( " no http state: " ) ;
result = 0 ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_START , http_buf2 , http_len2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p1 ) ;
if ( ( PacketAlertCheck ( p1 , 1 ) ) ) {
printf ( " sid 1 matched but shouldn't have: " ) ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_EOF , http_buf3 , http_len3 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_EOF , http_buf4 , http_len4 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p2 ) ;
if ( ! ( PacketAlertCheck ( p2 , 1 ) ) ) {
printf ( " sid 1 didn't match but should have: " ) ;
goto end ;
}
result = 1 ;
end :
if ( de_ctx ! = NULL )
SigGroupCleanup ( de_ctx ) ;
if ( de_ctx ! = NULL )
SigCleanSignatures ( de_ctx ) ;
if ( de_ctx ! = NULL )
DetectEngineCtxFree ( de_ctx ) ;
StreamTcpFreeConfig ( TRUE ) ;
FLOW_DESTROY ( & f ) ;
UTHFreePackets ( & p1 , 1 ) ;
UTHFreePackets ( & p2 , 1 ) ;
return result ;
}
/**
* \ test Test that the http_server_body content matches against a http request
* which holds the content . Case insensitve .
*/
static int DetectHttpServerBodyFileDataTest05 ( void )
{
TcpSession ssn ;
Packet * p1 = NULL ;
Packet * p2 = NULL ;
ThreadVars th_v ;
DetectEngineCtx * de_ctx = NULL ;
DetectEngineThreadCtx * det_ctx = NULL ;
HtpState * http_state = NULL ;
Flow f ;
uint8_t http_buf1 [ ] =
" GET /index.html HTTP/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 \r \n "
" \r \n " ;
uint32_t http_len1 = sizeof ( http_buf1 ) - 1 ;
uint8_t http_buf2 [ ] =
" HTTP/1.0 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 14 \r \n "
" \r \n "
" bigmes " ;
uint32_t http_len2 = sizeof ( http_buf2 ) - 1 ;
uint8_t http_buf3 [ ] =
" sag " ;
uint32_t http_len3 = sizeof ( http_buf3 ) - 1 ;
uint8_t http_buf4 [ ] =
" e4u!! " ;
uint32_t http_len4 = sizeof ( http_buf4 ) - 1 ;
int result = 0 ;
memset ( & th_v , 0 , sizeof ( th_v ) ) ;
memset ( & f , 0 , sizeof ( f ) ) ;
memset ( & ssn , 0 , sizeof ( ssn ) ) ;
p1 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
p2 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
FLOW_INITIALIZE ( & f ) ;
f . protoctx = ( void * ) & ssn ;
f . flags | = FLOW_IPV4 ;
p1 - > flow = & f ;
p1 - > flowflags | = FLOW_PKT_TOCLIENT ;
p1 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p1 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
p2 - > flow = & f ;
p2 - > flowflags | = FLOW_PKT_TOCLIENT ;
p2 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p2 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
f . alproto = ALPROTO_HTTP ;
StreamTcpInitConfig ( TRUE ) ;
de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert http any any -> any any "
" (msg: \" http client body test \" ; "
" file_data; content: \" MeSSaGE \" ; nocase; "
" sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL )
goto end ;
SigGroupBuild ( de_ctx ) ;
DetectEngineThreadCtxInit ( & th_v , ( void * ) de_ctx , ( void * ) & det_ctx ) ;
int r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER | STREAM_START , http_buf1 , http_len1 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
http_state = f . alstate ;
if ( http_state = = NULL ) {
printf ( " no http state: " ) ;
result = 0 ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_START , http_buf2 , http_len2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p1 ) ;
if ( ( PacketAlertCheck ( p1 , 1 ) ) ) {
printf ( " sid 1 matched but shouldn't have: " ) ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_EOF , http_buf3 , http_len3 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_EOF , http_buf4 , http_len4 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p2 ) ;
if ( ! ( PacketAlertCheck ( p2 , 1 ) ) ) {
printf ( " sid 1 didn't match but should have: " ) ;
goto end ;
}
result = 1 ;
end :
if ( de_ctx ! = NULL )
SigGroupCleanup ( de_ctx ) ;
if ( de_ctx ! = NULL )
SigCleanSignatures ( de_ctx ) ;
if ( de_ctx ! = NULL )
DetectEngineCtxFree ( de_ctx ) ;
StreamTcpFreeConfig ( TRUE ) ;
FLOW_DESTROY ( & f ) ;
UTHFreePackets ( & p1 , 1 ) ;
UTHFreePackets ( & p2 , 1 ) ;
return result ;
}
/**
* \ test Test that the http_server_body content matches against a http request
* which holds the content . Negated match .
*/
static int DetectHttpServerBodyFileDataTest06 ( void )
{
TcpSession ssn ;
Packet * p1 = NULL ;
Packet * p2 = NULL ;
ThreadVars th_v ;
DetectEngineCtx * de_ctx = NULL ;
DetectEngineThreadCtx * det_ctx = NULL ;
HtpState * http_state = NULL ;
Flow f ;
uint8_t http_buf1 [ ] =
" GET /index.html HTTP/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 \r \n "
" \r \n " ;
uint32_t http_len1 = sizeof ( http_buf1 ) - 1 ;
uint8_t http_buf2 [ ] =
" HTTP/1.0 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 14 \r \n "
" \r \n " ;
uint32_t http_len2 = sizeof ( http_buf2 ) - 1 ;
uint8_t http_buf3 [ ] =
" bigmessage4u!! " ;
uint32_t http_len3 = sizeof ( http_buf3 ) - 1 ;
int result = 0 ;
memset ( & th_v , 0 , sizeof ( th_v ) ) ;
memset ( & f , 0 , sizeof ( f ) ) ;
memset ( & ssn , 0 , sizeof ( ssn ) ) ;
p1 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
p2 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
FLOW_INITIALIZE ( & f ) ;
f . protoctx = ( void * ) & ssn ;
f . flags | = FLOW_IPV4 ;
p1 - > flow = & f ;
p1 - > flowflags | = FLOW_PKT_TOCLIENT ;
p1 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p1 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
p2 - > flow = & f ;
p2 - > flowflags | = FLOW_PKT_TOCLIENT ;
p2 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p2 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
f . alproto = ALPROTO_HTTP ;
StreamTcpInitConfig ( TRUE ) ;
de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert http any any -> any any "
" (msg: \" http client body test \" ; "
" file_data; content:! \" MaSSaGE \" ; nocase; "
" sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL )
goto end ;
SigGroupBuild ( de_ctx ) ;
DetectEngineThreadCtxInit ( & th_v , ( void * ) de_ctx , ( void * ) & det_ctx ) ;
int r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER | STREAM_START , http_buf1 , http_len1 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
http_state = f . alstate ;
if ( http_state = = NULL ) {
printf ( " no http state: " ) ;
result = 0 ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_START , http_buf2 , http_len2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p1 ) ;
if ( PacketAlertCheck ( p1 , 1 ) ) {
printf ( " sid 1 matched but shouldn't have (p1): " ) ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_EOF , http_buf3 , http_len3 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p2 ) ;
if ( ! ( PacketAlertCheck ( p2 , 1 ) ) ) {
printf ( " sid 1 didn't match but should have (p2): " ) ;
goto end ;
}
result = 1 ;
end :
if ( de_ctx ! = NULL )
SigGroupCleanup ( de_ctx ) ;
if ( de_ctx ! = NULL )
SigCleanSignatures ( de_ctx ) ;
if ( de_ctx ! = NULL )
DetectEngineCtxFree ( de_ctx ) ;
StreamTcpFreeConfig ( TRUE ) ;
FLOW_DESTROY ( & f ) ;
UTHFreePackets ( & p1 , 1 ) ;
UTHFreePackets ( & p2 , 1 ) ;
return result ;
}
/**
* \ test Test that the http_server_body content matches against a http request
* which holds the content . Negated match .
*/
static int DetectHttpServerBodyFileDataTest07 ( void )
{
TcpSession ssn ;
Packet * p1 = NULL ;
Packet * p2 = NULL ;
ThreadVars th_v ;
DetectEngineCtx * de_ctx = NULL ;
DetectEngineThreadCtx * det_ctx = NULL ;
HtpState * http_state = NULL ;
Flow f ;
uint8_t http_buf1 [ ] =
" GET /index.html HTTP/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 \r \n "
" \r \n " ;
uint32_t http_len1 = sizeof ( http_buf1 ) - 1 ;
uint8_t http_buf2 [ ] =
" HTTP/1.0 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 14 \r \n "
" \r \n " ;
uint32_t http_len2 = sizeof ( http_buf2 ) - 1 ;
uint8_t http_buf3 [ ] =
" bigmessage4u!! " ;
uint32_t http_len3 = sizeof ( http_buf3 ) - 1 ;
int result = 0 ;
memset ( & th_v , 0 , sizeof ( th_v ) ) ;
memset ( & f , 0 , sizeof ( f ) ) ;
memset ( & ssn , 0 , sizeof ( ssn ) ) ;
p1 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
p2 = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
FLOW_INITIALIZE ( & f ) ;
f . protoctx = ( void * ) & ssn ;
f . flags | = FLOW_IPV4 ;
p1 - > flow = & f ;
p1 - > flowflags | = FLOW_PKT_TOCLIENT ;
p1 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p1 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
p2 - > flow = & f ;
p2 - > flowflags | = FLOW_PKT_TOCLIENT ;
p2 - > flowflags | = FLOW_PKT_ESTABLISHED ;
p2 - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
f . alproto = ALPROTO_HTTP ;
StreamTcpInitConfig ( TRUE ) ;
de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert http any any -> any any "
" (msg: \" http client body test \" ; "
" file_data; content:! \" MeSSaGE \" ; nocase; "
" sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL )
goto end ;
SigGroupBuild ( de_ctx ) ;
DetectEngineThreadCtxInit ( & th_v , ( void * ) de_ctx , ( void * ) & det_ctx ) ;
int r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER | STREAM_START , http_buf1 , http_len1 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
http_state = f . alstate ;
if ( http_state = = NULL ) {
printf ( " no http state: " ) ;
result = 0 ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_START , http_buf2 , http_len2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p1 ) ;
if ( PacketAlertCheck ( p1 , 1 ) ) {
printf ( " sid 1 matched but shouldn't have (p1): " ) ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_EOF , http_buf3 , http_len3 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p2 ) ;
if ( PacketAlertCheck ( p2 , 1 ) ) {
printf ( " sid 1 matched but shouldn't have (p2): " ) ;
goto end ;
}
result = 1 ;
end :
if ( de_ctx ! = NULL )
SigGroupCleanup ( de_ctx ) ;
if ( de_ctx ! = NULL )
SigCleanSignatures ( de_ctx ) ;
if ( de_ctx ! = NULL )
DetectEngineCtxFree ( de_ctx ) ;
StreamTcpFreeConfig ( TRUE ) ;
FLOW_DESTROY ( & f ) ;
UTHFreePackets ( & p1 , 1 ) ;
UTHFreePackets ( & p2 , 1 ) ;
return result ;
}
static int DetectHttpServerBodyFileDataTest08 ( void )
{
TcpSession ssn ;
Packet * p = NULL ;
ThreadVars th_v ;
DetectEngineCtx * de_ctx = NULL ;
DetectEngineThreadCtx * det_ctx = NULL ;
HtpState * http_state = NULL ;
Flow f ;
uint8_t http_buf [ ] =
" GET /index.html HTTP/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 \r \n "
" \r \n " ;
uint32_t http_len = sizeof ( http_buf ) - 1 ;
uint8_t http_buf2 [ ] =
" HTTP/1.0 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 55 \r \n "
" \r \n "
" longbufferabcdefghijklmnopqrstuvwxyz0123456789bufferend " ;
uint32_t http_len2 = sizeof ( http_buf2 ) - 1 ;
int result = 0 ;
memset ( & th_v , 0 , sizeof ( th_v ) ) ;
memset ( & f , 0 , sizeof ( f ) ) ;
memset ( & ssn , 0 , sizeof ( ssn ) ) ;
p = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
FLOW_INITIALIZE ( & f ) ;
f . protoctx = ( void * ) & ssn ;
f . flags | = FLOW_IPV4 ;
p - > flow = & f ;
p - > flowflags | = FLOW_PKT_TOCLIENT ;
p - > flowflags | = FLOW_PKT_ESTABLISHED ;
p - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
f . alproto = ALPROTO_HTTP ;
StreamTcpInitConfig ( TRUE ) ;
de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL )
goto end ;
de_ctx - > flags | = DE_QUIET ;
de_ctx - > sig_list = SigInit ( de_ctx , " alert http any any -> any any "
" (msg: \" http server body test \" ; "
" file_data; content: \" longbufferabcdefghijklmnopqrstuvwxyz0123456789bufferend \" ; "
" sid:1;) " ) ;
if ( de_ctx - > sig_list = = NULL )
goto end ;
SigGroupBuild ( de_ctx ) ;
DetectEngineThreadCtxInit ( & th_v , ( void * ) de_ctx , ( void * ) & det_ctx ) ;
int r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER | STREAM_START | STREAM_EOF , http_buf , http_len ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_START | STREAM_EOF , http_buf2 , http_len2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
result = 0 ;
goto end ;
}
http_state = f . alstate ;
if ( http_state = = NULL ) {
printf ( " no http state: \n " ) ;
result = 0 ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p ) ;
if ( ! ( PacketAlertCheck ( p , 1 ) ) ) {
printf ( " sid 1 didn't match but should have: " ) ;
goto end ;
}
result = 1 ;
end :
if ( de_ctx ! = NULL )
SigGroupCleanup ( de_ctx ) ;
if ( de_ctx ! = NULL )
SigCleanSignatures ( de_ctx ) ;
if ( de_ctx ! = NULL )
DetectEngineCtxFree ( de_ctx ) ;
StreamTcpFreeConfig ( TRUE ) ;
FLOW_DESTROY ( & f ) ;
UTHFreePackets ( & p , 1 ) ;
return result ;
}
/** \test multiple http transactions and body chunks of request handling */
static int DetectHttpServerBodyFileDataTest09 ( void ) {
int result = 0 ;
Signature * s = NULL ;
DetectEngineThreadCtx * det_ctx = NULL ;
ThreadVars th_v ;
Flow f ;
TcpSession ssn ;
Packet * p = NULL ;
uint8_t httpbuf1 [ ] = " GET /index1.html HTTP/1.1 \r \n "
" User-Agent: Mozilla/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" Connection: keep-alive \r \n "
" Cookie: dummy1 \r \n \r \n " ;
uint32_t httplen1 = sizeof ( httpbuf1 ) - 1 ; /* minus the \0 */
uint8_t httpbuf2 [ ] = " HTTP/1.1 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 3 \r \n "
" \r \n "
" one " ;
uint32_t httplen2 = sizeof ( httpbuf2 ) - 1 ; /* minus the \0 */
uint8_t httpbuf3 [ ] = " GET /index2.html HTTP/1.1 \r \n "
" User-Agent: Firefox/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" Connection: keep-alive \r \n "
" Cookie: dummy2 \r \n \r \n " ;
uint32_t httplen3 = sizeof ( httpbuf3 ) - 1 ; /* minus the \0 */
uint8_t httpbuf4 [ ] = " HTTP/1.1 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 3 \r \n "
" \r \n "
" two " ;
uint32_t httplen4 = sizeof ( httpbuf4 ) - 1 ; /* minus the \0 */
memset ( & th_v , 0 , sizeof ( th_v ) ) ;
memset ( & f , 0 , sizeof ( f ) ) ;
memset ( & ssn , 0 , sizeof ( ssn ) ) ;
p = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
FLOW_INITIALIZE ( & f ) ;
f . protoctx = ( void * ) & ssn ;
f . proto = IPPROTO_TCP ;
f . flags | = FLOW_IPV4 ;
p - > flow = & f ;
p - > flowflags | = FLOW_PKT_TOSERVER ;
p - > flowflags | = FLOW_PKT_ESTABLISHED ;
p - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
f . alproto = ALPROTO_HTTP ;
StreamTcpInitConfig ( TRUE ) ;
DetectEngineCtx * de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL ) {
goto end ;
}
de_ctx - > flags | = DE_QUIET ;
s = DetectEngineAppendSig ( de_ctx , " alert tcp any any -> any any (content: \" GET \" ; http_method; content: \" Mozilla \" ; http_header; content: \" dummy1 \" ; http_cookie; file_data; content: \" one \" ; sid:1; rev:1;) " ) ;
if ( s = = NULL ) {
printf ( " sig parse failed: " ) ;
goto end ;
}
s = DetectEngineAppendSig ( de_ctx , " alert tcp any any -> any any (content: \" GET \" ; http_method; content: \" Firefox \" ; http_header; content: \" dummy2 \" ; http_cookie; file_data; content: \" two \" ; sid:2; rev:1;) " ) ;
if ( s = = NULL ) {
printf ( " sig2 parse failed: " ) ;
goto end ;
}
SigGroupBuild ( de_ctx ) ;
DetectEngineThreadCtxInit ( & th_v , ( void * ) de_ctx , ( void * ) & det_ctx ) ;
int r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER | STREAM_START , httpbuf1 , httplen1 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p ) ;
if ( PacketAlertCheck ( p , 1 ) ) {
printf ( " sig 1 alerted (tx 1): " ) ;
goto end ;
}
p - > alerts . cnt = 0 ;
p - > flowflags & = ~ FLOW_PKT_TOSERVER ;
p - > flowflags | = FLOW_PKT_TOCLIENT ;
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT , httpbuf2 , httplen2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 2 returned % " PRId32 " , expected 0: " , r ) ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p ) ;
if ( ! ( PacketAlertCheck ( p , 1 ) ) ) {
printf ( " sig 1 didn't alert (tx 1): " ) ;
goto end ;
}
p - > alerts . cnt = 0 ;
p - > flowflags & = ~ FLOW_PKT_TOCLIENT ;
p - > flowflags | = FLOW_PKT_TOSERVER ;
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER , httpbuf3 , httplen3 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 3 returned % " PRId32 " , expected 0: " , r ) ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p ) ;
if ( PacketAlertCheck ( p , 1 ) ) {
printf ( " sig 1 matched, but shouldn't have (tx 2): " ) ;
goto end ;
}
if ( ( PacketAlertCheck ( p , 2 ) ) ) {
printf ( " sig 2 alerted (tx 2): " ) ;
goto end ;
}
p - > alerts . cnt = 0 ;
p - > flowflags & = ~ FLOW_PKT_TOSERVER ;
p - > flowflags | = FLOW_PKT_TOCLIENT ;
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_EOF , httpbuf4 , httplen4 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 4 returned % " PRId32 " , expected 0: " , r ) ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p ) ;
if ( ( PacketAlertCheck ( p , 1 ) ) ) {
printf ( " sig 1 alerted (tx 2): " ) ;
goto end ;
}
if ( ! ( PacketAlertCheck ( p , 2 ) ) ) {
printf ( " sig 2 didn't alert (tx 2): " ) ;
goto end ;
}
p - > alerts . cnt = 0 ;
HtpState * htp_state = f . alstate ;
if ( htp_state = = NULL ) {
printf ( " no http state: " ) ;
goto end ;
}
if ( list_size ( htp_state - > connp - > conn - > transactions ) ! = 2 ) {
printf ( " The http app layer doesn't have 2 transactions, but it should: " ) ;
goto end ;
}
result = 1 ;
end :
if ( det_ctx ! = NULL ) {
DetectEngineThreadCtxDeinit ( & th_v , ( void * ) det_ctx ) ;
}
if ( de_ctx ! = NULL ) {
SigGroupCleanup ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
}
StreamTcpFreeConfig ( TRUE ) ;
FLOW_DESTROY ( & f ) ;
UTHFreePacket ( p ) ;
return result ;
}
static int DetectHttpServerBodyFileDataTest10 ( void ) {
int result = 0 ;
Signature * s = NULL ;
DetectEngineThreadCtx * det_ctx = NULL ;
ThreadVars th_v ;
Flow f ;
TcpSession ssn ;
Packet * p = NULL ;
uint8_t httpbuf1 [ ] = " GET /index1.html HTTP/1.1 \r \n "
" User-Agent: Mozilla/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" Connection: keep-alive \r \n "
" Cookie: dummy1 \r \n \r \n " ;
uint32_t httplen1 = sizeof ( httpbuf1 ) - 1 ; /* minus the \0 */
uint8_t httpbuf2 [ ] = " HTTP/1.1 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 3 \r \n "
" \r \n "
" one " ;
uint32_t httplen2 = sizeof ( httpbuf2 ) - 1 ; /* minus the \0 */
uint8_t httpbuf3 [ ] = " GET /index2.html HTTP/1.1 \r \n "
" User-Agent: Firefox/1.0 \r \n "
" Host: www.openinfosecfoundation.org \r \n "
" Connection: keep-alive \r \n "
" Cookie: dummy2 \r \n \r \n " ;
uint32_t httplen3 = sizeof ( httpbuf3 ) - 1 ; /* minus the \0 */
uint8_t httpbuf4 [ ] = " HTTP/1.1 200 ok \r \n "
" Content-Type: text/html \r \n "
" Content-Length: 3 \r \n "
" \r \n "
" two " ;
uint32_t httplen4 = sizeof ( httpbuf4 ) - 1 ; /* minus the \0 */
memset ( & th_v , 0 , sizeof ( th_v ) ) ;
memset ( & f , 0 , sizeof ( f ) ) ;
memset ( & ssn , 0 , sizeof ( ssn ) ) ;
p = UTHBuildPacket ( NULL , 0 , IPPROTO_TCP ) ;
FLOW_INITIALIZE ( & f ) ;
f . protoctx = ( void * ) & ssn ;
f . proto = IPPROTO_TCP ;
f . flags | = FLOW_IPV4 ;
p - > flow = & f ;
p - > flowflags | = FLOW_PKT_TOSERVER ;
p - > flowflags | = FLOW_PKT_ESTABLISHED ;
p - > flags | = PKT_HAS_FLOW | PKT_STREAM_EST ;
f . alproto = ALPROTO_HTTP ;
StreamTcpInitConfig ( TRUE ) ;
DetectEngineCtx * de_ctx = DetectEngineCtxInit ( ) ;
if ( de_ctx = = NULL ) {
goto end ;
}
de_ctx - > flags | = DE_QUIET ;
s = DetectEngineAppendSig ( de_ctx , " alert tcp any any -> any any (content: \" GET \" ; http_method; content: \" index1 \" ; http_uri; content: \" Mozilla \" ; http_header; content: \" dummy1 \" ; http_cookie; file_data; content: \" one \" ; sid:1; rev:1;) " ) ;
if ( s = = NULL ) {
printf ( " sig parse failed: " ) ;
goto end ;
}
s = DetectEngineAppendSig ( de_ctx , " alert tcp any any -> any any (content: \" GET \" ; http_method; content: \" index2 \" ; http_uri; content: \" Firefox \" ; http_header; content: \" dummy2 \" ; http_cookie; file_data; content: \" two \" ; sid:2; rev:1;) " ) ;
if ( s = = NULL ) {
printf ( " sig2 parse failed: " ) ;
goto end ;
}
SigGroupBuild ( de_ctx ) ;
DetectEngineThreadCtxInit ( & th_v , ( void * ) de_ctx , ( void * ) & det_ctx ) ;
int r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER | STREAM_START , httpbuf1 , httplen1 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: " , r ) ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p ) ;
if ( PacketAlertCheck ( p , 1 ) ) {
printf ( " sig 1 alerted (tx 1): " ) ;
goto end ;
}
p - > alerts . cnt = 0 ;
p - > flowflags & = ~ FLOW_PKT_TOSERVER ;
p - > flowflags | = FLOW_PKT_TOCLIENT ;
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT , httpbuf2 , httplen2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 2 returned % " PRId32 " , expected 0: " , r ) ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p ) ;
if ( ! ( PacketAlertCheck ( p , 1 ) ) ) {
printf ( " sig 1 didn't alert (tx 1): " ) ;
goto end ;
}
p - > alerts . cnt = 0 ;
p - > flowflags & = ~ FLOW_PKT_TOCLIENT ;
p - > flowflags | = FLOW_PKT_TOSERVER ;
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOSERVER , httpbuf3 , httplen3 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 3 returned % " PRId32 " , expected 0: " , r ) ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p ) ;
if ( PacketAlertCheck ( p , 1 ) ) {
printf ( " sig 1 matched, but shouldn't have (tx 2): " ) ;
goto end ;
}
if ( ( PacketAlertCheck ( p , 2 ) ) ) {
printf ( " sig 2 alerted (tx 2): " ) ;
goto end ;
}
p - > alerts . cnt = 0 ;
p - > flowflags & = ~ FLOW_PKT_TOSERVER ;
p - > flowflags | = FLOW_PKT_TOCLIENT ;
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT | STREAM_EOF , httpbuf4 , httplen4 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 4 returned % " PRId32 " , expected 0: " , r ) ;
goto end ;
}
/* do detect */
SigMatchSignatures ( & th_v , de_ctx , det_ctx , p ) ;
if ( ( PacketAlertCheck ( p , 1 ) ) ) {
printf ( " sig 1 alerted (tx 2): " ) ;
goto end ;
}
if ( ! ( PacketAlertCheck ( p , 2 ) ) ) {
printf ( " sig 2 didn't alert (tx 2): " ) ;
goto end ;
}
p - > alerts . cnt = 0 ;
HtpState * htp_state = f . alstate ;
if ( htp_state = = NULL ) {
printf ( " no http state: " ) ;
goto end ;
}
if ( list_size ( htp_state - > connp - > conn - > transactions ) ! = 2 ) {
printf ( " The http app layer doesn't have 2 transactions, but it should: " ) ;
goto end ;
}
result = 1 ;
end :
if ( det_ctx ! = NULL ) {
DetectEngineThreadCtxDeinit ( & th_v , ( void * ) det_ctx ) ;
}
if ( de_ctx ! = NULL ) {
SigGroupCleanup ( de_ctx ) ;
DetectEngineCtxFree ( de_ctx ) ;
}
StreamTcpFreeConfig ( TRUE ) ;
FLOW_DESTROY ( & f ) ;
UTHFreePacket ( p ) ;
return result ;
}
# endif /* UNITTESTS */
void DetectHttpServerBodyRegisterTests ( void )
{
# ifdef UNITTESTS
UtRegisterTest ( " DetectHttpServerBodyTest01 " , DetectHttpServerBodyTest01 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest02 " , DetectHttpServerBodyTest02 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest03 " , DetectHttpServerBodyTest03 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest04 " , DetectHttpServerBodyTest04 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest05 " , DetectHttpServerBodyTest05 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest06 " , DetectHttpServerBodyTest06 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest07 " , DetectHttpServerBodyTest07 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest08 " , DetectHttpServerBodyTest08 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest09 " , DetectHttpServerBodyTest09 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest10 " , DetectHttpServerBodyTest10 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest11 " , DetectHttpServerBodyTest11 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest12 " , DetectHttpServerBodyTest12 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest13 " , DetectHttpServerBodyTest13 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest14 " , DetectHttpServerBodyTest14 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest15 " , DetectHttpServerBodyTest15 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest16 " , DetectHttpServerBodyTest16 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest17 " , DetectHttpServerBodyTest17 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest18 " , DetectHttpServerBodyTest18 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest19 " , DetectHttpServerBodyTest19 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest20 " , DetectHttpServerBodyTest20 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest21 " , DetectHttpServerBodyTest21 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest22 " , DetectHttpServerBodyTest22 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest23 " , DetectHttpServerBodyTest23 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest24 " , DetectHttpServerBodyTest24 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest25 " , DetectHttpServerBodyTest25 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest26 " , DetectHttpServerBodyTest26 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest27 " , DetectHttpServerBodyTest27 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest28 " , DetectHttpServerBodyTest28 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest29 " , DetectHttpServerBodyTest29 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest30 " , DetectHttpServerBodyTest30 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest31 " , DetectHttpServerBodyTest31 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest32 " , DetectHttpServerBodyTest32 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest33 " , DetectHttpServerBodyTest33 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest34 " , DetectHttpServerBodyTest34 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest35 " , DetectHttpServerBodyTest35 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyTest36 " , DetectHttpServerBodyTest36 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyFileDataTest01 " , DetectHttpServerBodyFileDataTest01 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyFileDataTest02 " , DetectHttpServerBodyFileDataTest02 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyFileDataTest03 " , DetectHttpServerBodyFileDataTest03 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyFileDataTest04 " , DetectHttpServerBodyFileDataTest04 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyFileDataTest05 " , DetectHttpServerBodyFileDataTest05 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyFileDataTest06 " , DetectHttpServerBodyFileDataTest06 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyFileDataTest07 " , DetectHttpServerBodyFileDataTest07 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyFileDataTest08 " , DetectHttpServerBodyFileDataTest08 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyFileDataTest09 " , DetectHttpServerBodyFileDataTest09 , 1 ) ;
UtRegisterTest ( " DetectHttpServerBodyFileDataTest10 " , DetectHttpServerBodyFileDataTest10 , 1 ) ;
# endif /* UNITTESTS */
return ;
}
/**
* @ }
*/