@ -2487,6 +2487,644 @@ end:
return result ;
}
/*
* gzip stream
*/
static int DetectEngineHttpServerBodyTest18 ( 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 [ ] = {
' H ' , ' T ' , ' T ' , ' P ' , ' / ' , ' 1 ' , ' . ' , ' 1 ' , ' ' , ' 2 ' , ' 0 ' , ' 0 ' , ' o ' , ' k ' , 0x0d , 0x0a ,
' C ' , ' o ' , ' n ' , ' t ' , ' e ' , ' n ' , ' t ' , ' - ' , ' L ' , ' e ' , ' n ' , ' g ' , ' t ' , ' h ' , ' : ' , ' ' , ' 5 ' , ' 1 ' , 0x0d , 0x0a ,
' C ' , ' o ' , ' n ' , ' t ' , ' e ' , ' n ' , ' t ' , ' - ' , ' E ' , ' n ' , ' c ' , ' o ' , ' d ' , ' i ' , ' n ' , ' g ' , ' : ' , ' ' , ' g ' , ' z ' , ' i ' , ' p ' , 0x0d , 0x0a ,
0x0d , 0x0a ,
0x1f , 0x8b , 0x08 , 0x08 , 0x27 , 0x1e , 0xe5 , 0x51 ,
0x00 , 0x03 , 0x74 , 0x65 , 0x73 , 0x74 , 0x2e , 0x74 ,
0x78 , 0x74 , 0x00 , 0x2b , 0xc9 , 0xc8 , 0x2c , 0x56 ,
0x00 , 0xa2 , 0x44 , 0x85 , 0xb4 , 0xcc , 0x9c , 0x54 ,
0x85 , 0xcc , 0x3c , 0x20 , 0x2b , 0x29 , 0xbf , 0x42 ,
0x8f , 0x0b , 0x00 , 0xb2 , 0x7d , 0xac , 0x9b , 0x19 ,
0x00 , 0x00 , 0x00 ,
} ;
uint32_t http_len2 = sizeof ( http_buf2 ) ;
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_TOSERVER ;
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: \" file \" ; 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 , 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: \n " ) ;
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 \n " ) ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT , http_buf2 , http_len2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: \n " , 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 ;
}
/*
* deflate stream
*/
static int DetectEngineHttpServerBodyTest19 ( 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 [ ] = {
' H ' , ' T ' , ' T ' , ' P ' , ' / ' , ' 1 ' , ' . ' , ' 1 ' , ' ' , ' 2 ' , ' 0 ' , ' 0 ' , ' o ' , ' k ' , 0x0d , 0x0a ,
' C ' , ' o ' , ' n ' , ' t ' , ' e ' , ' n ' , ' t ' , ' - ' , ' L ' , ' e ' , ' n ' , ' g ' , ' t ' , ' h ' , ' : ' , ' ' , ' 2 ' , ' 4 ' , 0x0d , 0x0a ,
' C ' , ' o ' , ' n ' , ' t ' , ' e ' , ' n ' , ' t ' , ' - ' , ' E ' , ' n ' , ' c ' , ' o ' , ' d ' , ' i ' , ' n ' , ' g ' , ' : ' , ' ' , ' d ' , ' e ' , ' f ' , ' l ' , ' a ' , ' t ' , ' e ' , 0x0d , 0x0a ,
0x0d , 0x0a ,
0x2b , 0xc9 , 0xc8 , 0x2c , 0x56 ,
0x00 , 0xa2 , 0x44 , 0x85 , 0xb4 , 0xcc , 0x9c , 0x54 ,
0x85 , 0xcc , 0x3c , 0x20 , 0x2b , 0x29 , 0xbf , 0x42 ,
0x8f , 0x0b , 0x00 ,
} ;
// 0xb2, 0x7d, 0xac, 0x9b, 0x19, 0x00, 0x00, 0x00,
uint32_t http_len2 = sizeof ( http_buf2 ) ;
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_TOSERVER ;
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: \" file \" ; 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 , 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: \n " ) ;
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 \n " ) ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT , http_buf2 , http_len2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: \n " , 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 ;
}
/*
* deflate stream with gzip set as content - encoding
*/
static int DetectEngineHttpServerBodyTest20 ( 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 [ ] = {
' H ' , ' T ' , ' T ' , ' P ' , ' / ' , ' 1 ' , ' . ' , ' 1 ' , ' ' , ' 2 ' , ' 0 ' , ' 0 ' , ' o ' , ' k ' , 0x0d , 0x0a ,
' C ' , ' o ' , ' n ' , ' t ' , ' e ' , ' n ' , ' t ' , ' - ' , ' L ' , ' e ' , ' n ' , ' g ' , ' t ' , ' h ' , ' : ' , ' ' , ' 2 ' , ' 4 ' , 0x0d , 0x0a ,
' C ' , ' o ' , ' n ' , ' t ' , ' e ' , ' n ' , ' t ' , ' - ' , ' E ' , ' n ' , ' c ' , ' o ' , ' d ' , ' i ' , ' n ' , ' g ' , ' : ' , ' ' , ' g ' , ' z ' , ' i ' , ' p ' , 0x0d , 0x0a ,
0x0d , 0x0a ,
0x2b , 0xc9 , 0xc8 , 0x2c , 0x56 ,
0x00 , 0xa2 , 0x44 , 0x85 , 0xb4 , 0xcc , 0x9c , 0x54 ,
0x85 , 0xcc , 0x3c , 0x20 , 0x2b , 0x29 , 0xbf , 0x42 ,
0x8f , 0x0b , 0x00 ,
} ;
// 0xb2, 0x7d, 0xac, 0x9b, 0x19, 0x00, 0x00, 0x00,
uint32_t http_len2 = sizeof ( http_buf2 ) ;
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_TOSERVER ;
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: \" file \" ; 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 , 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: \n " ) ;
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 \n " ) ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT , http_buf2 , http_len2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: \n " , 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 " ) ;
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 ;
}
/*
* gzip stream with deflate set as content - encoding .
*/
static int DetectEngineHttpServerBodyTest21 ( 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 [ ] = {
' H ' , ' T ' , ' T ' , ' P ' , ' / ' , ' 1 ' , ' . ' , ' 1 ' , ' ' , ' 2 ' , ' 0 ' , ' 0 ' , ' o ' , ' k ' , 0x0d , 0x0a ,
' C ' , ' o ' , ' n ' , ' t ' , ' e ' , ' n ' , ' t ' , ' - ' , ' L ' , ' e ' , ' n ' , ' g ' , ' t ' , ' h ' , ' : ' , ' ' , ' 5 ' , ' 1 ' , 0x0d , 0x0a ,
' C ' , ' o ' , ' n ' , ' t ' , ' e ' , ' n ' , ' t ' , ' - ' , ' E ' , ' n ' , ' c ' , ' o ' , ' d ' , ' i ' , ' n ' , ' g ' , ' : ' , ' ' , ' d ' , ' e ' , ' f ' , ' l ' , ' a ' , ' t ' , ' e ' , 0x0d , 0x0a ,
0x0d , 0x0a ,
0x1f , 0x8b , 0x08 , 0x08 , 0x27 , 0x1e , 0xe5 , 0x51 ,
0x00 , 0x03 , 0x74 , 0x65 , 0x73 , 0x74 , 0x2e , 0x74 ,
0x78 , 0x74 , 0x00 , 0x2b , 0xc9 , 0xc8 , 0x2c , 0x56 ,
0x00 , 0xa2 , 0x44 , 0x85 , 0xb4 , 0xcc , 0x9c , 0x54 ,
0x85 , 0xcc , 0x3c , 0x20 , 0x2b , 0x29 , 0xbf , 0x42 ,
0x8f , 0x0b , 0x00 , 0xb2 , 0x7d , 0xac , 0x9b , 0x19 ,
0x00 , 0x00 , 0x00 ,
} ;
uint32_t http_len2 = sizeof ( http_buf2 ) ;
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_TOSERVER ;
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: \" file \" ; 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 , 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: \n " ) ;
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 \n " ) ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT , http_buf2 , http_len2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: \n " , 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 " ) ;
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 ;
}
/*
* gzip stream .
* We have 2 content - encoding headers . First gzip and second deflate .
*/
static int DetectEngineHttpServerBodyTest22 ( 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 [ ] = {
' H ' , ' T ' , ' T ' , ' P ' , ' / ' , ' 1 ' , ' . ' , ' 1 ' , ' ' , ' 2 ' , ' 0 ' , ' 0 ' , ' o ' , ' k ' , 0x0d , 0x0a ,
' C ' , ' o ' , ' n ' , ' t ' , ' e ' , ' n ' , ' t ' , ' - ' , ' L ' , ' e ' , ' n ' , ' g ' , ' t ' , ' h ' , ' : ' , ' ' , ' 5 ' , ' 1 ' , 0x0d , 0x0a ,
' C ' , ' o ' , ' n ' , ' t ' , ' e ' , ' n ' , ' t ' , ' - ' , ' E ' , ' n ' , ' c ' , ' o ' , ' d ' , ' i ' , ' n ' , ' g ' , ' : ' , ' ' , ' g ' , ' z ' , ' i ' , ' p ' , 0x0d , 0x0a ,
' C ' , ' o ' , ' n ' , ' t ' , ' e ' , ' n ' , ' t ' , ' - ' , ' E ' , ' n ' , ' c ' , ' o ' , ' d ' , ' i ' , ' n ' , ' g ' , ' : ' , ' ' , ' d ' , ' e ' , ' f ' , ' l ' , ' a ' , ' t ' , ' e ' , 0x0d , 0x0a ,
0x0d , 0x0a ,
0x1f , 0x8b , 0x08 , 0x08 , 0x27 , 0x1e , 0xe5 , 0x51 ,
0x00 , 0x03 , 0x74 , 0x65 , 0x73 , 0x74 , 0x2e , 0x74 ,
0x78 , 0x74 , 0x00 , 0x2b , 0xc9 , 0xc8 , 0x2c , 0x56 ,
0x00 , 0xa2 , 0x44 , 0x85 , 0xb4 , 0xcc , 0x9c , 0x54 ,
0x85 , 0xcc , 0x3c , 0x20 , 0x2b , 0x29 , 0xbf , 0x42 ,
0x8f , 0x0b , 0x00 , 0xb2 , 0x7d , 0xac , 0x9b , 0x19 ,
0x00 , 0x00 , 0x00 ,
} ;
uint32_t http_len2 = sizeof ( http_buf2 ) ;
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_TOSERVER ;
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: \" file \" ; 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 , 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: \n " ) ;
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 \n " ) ;
goto end ;
}
r = AppLayerParse ( NULL , & f , ALPROTO_HTTP , STREAM_TOCLIENT , http_buf2 , http_len2 ) ;
if ( r ! = 0 ) {
printf ( " toserver chunk 1 returned % " PRId32 " , expected 0: \n " , 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 " ) ;
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 DetectEngineHttpServerBodyFileDataTest01 ( void )
{
TcpSession ssn ;
@ -2910,6 +3548,16 @@ void DetectEngineHttpServerBodyRegisterTests(void)
DetectEngineHttpServerBodyTest16 , 1 ) ;
UtRegisterTest ( " DetectEngineHttpServerBodyTest17 " ,
DetectEngineHttpServerBodyTest17 , 1 ) ;
UtRegisterTest ( " DetectEngineHttpServerBodyTest18 " ,
DetectEngineHttpServerBodyTest18 , 1 ) ;
UtRegisterTest ( " DetectEngineHttpServerBodyTest19 " ,
DetectEngineHttpServerBodyTest19 , 1 ) ;
UtRegisterTest ( " DetectEngineHttpServerBodyTest20 " ,
DetectEngineHttpServerBodyTest20 , 1 ) ;
UtRegisterTest ( " DetectEngineHttpServerBodyTest21 " ,
DetectEngineHttpServerBodyTest21 , 1 ) ;
UtRegisterTest ( " DetectEngineHttpServerBodyTest22 " ,
DetectEngineHttpServerBodyTest22 , 1 ) ;
UtRegisterTest ( " DetectEngineHttpServerBodyFileDataTest01 " ,
DetectEngineHttpServerBodyFileDataTest01 , 1 ) ;