53 #define PARSE_REGEX "^\\s*([0-9]{1,5}(\\s*-\\s*[0-9]{1,5}\\s*)?)(,\\s*[0-9]{1,5}(\\s*-\\s*[0-9]{1,5})?\\s*)*$"
58 Flow *f, uint8_t
flags,
void *state,
void *txv,
63 static void DetectDceOpnumRegisterTests(
void);
65 static int g_dce_generic_list_id = 0;
78 "match on one or many operation numbers within the interface in a DCERPC header";
103 Flow *f, uint8_t
flags,
void *state,
void *txv,
109 return SCDcerpcOpnumMatch(txv, (
void *)
m);
112 if (SCSmbTxMatchDceOpnum(txv, (
void *)
m) != 1)
133 SCLogError(
"Error parsing dce_opnum option in "
134 "signature, option needs a value");
141 void *dod = SCDcerpcOpnumParse(arg);
143 SCLogError(
"Error parsing dce_opnum option in "
150 DetectDceOpnumFree(
de_ctx, dod);
160 SCDcerpcOpnumFree(ptr);
177 static int DetectDceOpnumTestParse10(
void)
187 DCERPCState *dcerpc_state = NULL;
190 uint8_t dcerpc_bind[] = {
191 0x05, 0x00, 0x0b, 0x03, 0x10, 0x00, 0x00, 0x00,
192 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
193 0xb8, 0x10, 0xb8, 0x10, 0x00, 0x00, 0x00, 0x00,
194 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
195 0x01, 0xd0, 0x8c, 0x33, 0x44, 0x22, 0xf1, 0x31,
196 0xaa, 0xaa, 0x90, 0x00, 0x38, 0x00, 0x10, 0x03,
197 0x01, 0x00, 0x00, 0x00, 0x04, 0x5d, 0x88, 0x8a,
198 0xeb, 0x1c, 0xc9, 0x11, 0x9f, 0xe8, 0x08, 0x00,
199 0x2b, 0x10, 0x48, 0x60, 0x02, 0x00, 0x00, 0x00,
202 uint8_t dcerpc_bindack[] = {
203 0x05, 0x00, 0x0c, 0x03, 0x10, 0x00, 0x00, 0x00,
204 0x44, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
205 0xb8, 0x10, 0xb8, 0x10, 0x65, 0x8e, 0x00, 0x00,
206 0x0d, 0x00, 0x5c, 0x50, 0x49, 0x50, 0x45, 0x5c,
207 0x77, 0x69, 0x6e, 0x72, 0x65, 0x67, 0x00, 0x6d,
208 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
209 0x04, 0x5d, 0x88, 0x8a, 0xeb, 0x1c, 0xc9, 0x11,
210 0x9f, 0xe8, 0x08, 0x00, 0x2b, 0x10, 0x48, 0x60,
211 0x02, 0x00, 0x00, 0x00,
214 uint8_t dcerpc_request1[] = {
215 0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00,
216 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
217 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
218 0x2c, 0xfd, 0xb5, 0x00, 0x40, 0xaa, 0x01, 0x00,
219 0x00, 0x00, 0x00, 0x02,
222 uint8_t dcerpc_response1[] = {
223 0x05, 0x00, 0x02, 0x03, 0x10, 0x00, 0x00, 0x00,
224 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
225 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
226 0x00, 0x00, 0x00, 0x00, 0xf6, 0x72, 0x28, 0x9c,
227 0xf0, 0x57, 0xd8, 0x11, 0xb0, 0x05, 0x00, 0x0c,
228 0x29, 0x87, 0xea, 0xe9, 0x00, 0x00, 0x00, 0x00,
231 uint8_t dcerpc_request2[] = {
232 0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00,
233 0xa4, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
234 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00,
235 0x00, 0x00, 0x00, 0x00, 0xf6, 0x72, 0x28, 0x9c,
236 0xf0, 0x57, 0xd8, 0x11, 0xb0, 0x05, 0x00, 0x0c,
237 0x29, 0x87, 0xea, 0xe9, 0x5c, 0x00, 0x5c, 0x00,
238 0xa8, 0xb9, 0x14, 0x00, 0x2e, 0x00, 0x00, 0x00,
239 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00,
240 0x53, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x54, 0x00,
241 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x45, 0x00,
242 0x5c, 0x00, 0x4d, 0x00, 0x69, 0x00, 0x63, 0x00,
243 0x72, 0x00, 0x6f, 0x00, 0x73, 0x00, 0x6f, 0x00,
244 0x66, 0x00, 0x74, 0x00, 0x5c, 0x00, 0x57, 0x00,
245 0x69, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x6f, 0x00,
246 0x77, 0x00, 0x73, 0x00, 0x5c, 0x00, 0x43, 0x00,
247 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00,
248 0x6e, 0x00, 0x74, 0x00, 0x56, 0x00, 0x65, 0x00,
249 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00,
250 0x6e, 0x00, 0x5c, 0x00, 0x52, 0x00, 0x75, 0x00,
251 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
252 0x03, 0x00, 0x00, 0x00,
255 uint8_t dcerpc_response2[] = {
256 0x05, 0x00, 0x02, 0x03, 0x10, 0x00, 0x00, 0x00,
257 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
258 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
259 0x00, 0x00, 0x00, 0x00, 0xf7, 0x72, 0x28, 0x9c,
260 0xf0, 0x57, 0xd8, 0x11, 0xb0, 0x05, 0x00, 0x0c,
261 0x29, 0x87, 0xea, 0xe9, 0x00, 0x00, 0x00, 0x00,
264 uint8_t dcerpc_request3[] = {
265 0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00,
266 0x70, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
267 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00,
268 0x00, 0x00, 0x00, 0x00, 0xf7, 0x72, 0x28, 0x9c,
269 0xf0, 0x57, 0xd8, 0x11, 0xb0, 0x05, 0x00, 0x0c,
270 0x29, 0x87, 0xea, 0xe9, 0x0c, 0x00, 0x0c, 0x00,
271 0x98, 0xda, 0x14, 0x00, 0x06, 0x00, 0x00, 0x00,
272 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
273 0x4f, 0x00, 0x73, 0x00, 0x61, 0x00, 0x33, 0x00,
274 0x32, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
275 0x18, 0x00, 0x00, 0x00, 0x4e, 0x00, 0x54, 0x00,
276 0x4f, 0x00, 0x53, 0x00, 0x41, 0x00, 0x33, 0x00,
277 0x32, 0x00, 0x2e, 0x00, 0x45, 0x00, 0x58, 0x00,
278 0x45, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
281 uint8_t dcerpc_response3[] = {
282 0x05, 0x00, 0x02, 0x03, 0x10, 0x00, 0x00, 0x00,
283 0x1c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
284 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
285 0x00, 0x00, 0x00, 0x00,
288 uint32_t dcerpc_bind_len =
sizeof(dcerpc_bind);
289 uint32_t dcerpc_bindack_len =
sizeof(dcerpc_bindack);
291 uint32_t dcerpc_request1_len =
sizeof(dcerpc_request1);
292 uint32_t dcerpc_response1_len =
sizeof(dcerpc_response1);
294 uint32_t dcerpc_request2_len =
sizeof(dcerpc_request2);
295 uint32_t dcerpc_response2_len =
sizeof(dcerpc_response2);
297 uint32_t dcerpc_request3_len =
sizeof(dcerpc_request3);
298 uint32_t dcerpc_response3_len =
sizeof(dcerpc_response3);
302 memset(&th_v, 0,
sizeof(th_v));
303 memset(&f, 0,
sizeof(f));
304 memset(&ssn, 0,
sizeof(ssn));
310 f.
proto = IPPROTO_TCP;
327 "(msg:\"DCERPC\"; dce_opnum:2,15,22; sid:1;)");
338 dcerpc_bind, dcerpc_bind_len);
340 SCLogDebug(
"AppLayerParse for dcerpc bind failed. Returned %" PRId32, r);
345 if (dcerpc_state == NULL) {
356 dcerpc_bindack, dcerpc_bindack_len);
358 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
369 dcerpc_request1, dcerpc_request1_len);
371 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
381 printf(
"sig 1 didn't match, but should have: ");
389 dcerpc_response1, dcerpc_response1_len);
391 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
401 printf(
"sig 1 did match, shouldn't have on response1: ");
407 dcerpc_request2, dcerpc_request2_len);
409 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
419 printf(
"sig 1 didn't match, but should have on request2: ");
425 dcerpc_response2, dcerpc_response2_len);
427 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
437 printf(
"sig 1 did match, shouldn't have on response2: ");
443 dcerpc_request3, dcerpc_request3_len);
445 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
455 printf(
"sig 1 didn't match, but should have on request3: ");
461 dcerpc_response3, dcerpc_response3_len);
463 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
473 printf(
"sig 1 did match, shouldn't have on response2: ");
499 static int DetectDceOpnumTestParse11(
void)
509 DCERPCState *dcerpc_state = NULL;
512 uint8_t dcerpc_request1[] = {
513 0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00,
514 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
515 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
516 0x2c, 0xfd, 0xb5, 0x00, 0x40, 0xaa, 0x01, 0x00,
517 0x00, 0x00, 0x00, 0x02,
520 uint8_t dcerpc_response1[] = {
521 0x05, 0x00, 0x02, 0x03, 0x10, 0x00, 0x00, 0x00,
522 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
523 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
524 0x00, 0x00, 0x00, 0x00, 0xf6, 0x72, 0x28, 0x9c,
525 0xf0, 0x57, 0xd8, 0x11, 0xb0, 0x05, 0x00, 0x0c,
526 0x29, 0x87, 0xea, 0xe9, 0x00, 0x00, 0x00, 0x00,
529 uint8_t dcerpc_request2[] = {
530 0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00,
531 0xa4, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
532 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00,
533 0x00, 0x00, 0x00, 0x00, 0xf6, 0x72, 0x28, 0x9c,
534 0xf0, 0x57, 0xd8, 0x11, 0xb0, 0x05, 0x00, 0x0c,
535 0x29, 0x87, 0xea, 0xe9, 0x5c, 0x00, 0x5c, 0x00,
536 0xa8, 0xb9, 0x14, 0x00, 0x2e, 0x00, 0x00, 0x00,
537 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00,
538 0x53, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x54, 0x00,
539 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x45, 0x00,
540 0x5c, 0x00, 0x4d, 0x00, 0x69, 0x00, 0x63, 0x00,
541 0x72, 0x00, 0x6f, 0x00, 0x73, 0x00, 0x6f, 0x00,
542 0x66, 0x00, 0x74, 0x00, 0x5c, 0x00, 0x57, 0x00,
543 0x69, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x6f, 0x00,
544 0x77, 0x00, 0x73, 0x00, 0x5c, 0x00, 0x43, 0x00,
545 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00,
546 0x6e, 0x00, 0x74, 0x00, 0x56, 0x00, 0x65, 0x00,
547 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00,
548 0x6e, 0x00, 0x5c, 0x00, 0x52, 0x00, 0x75, 0x00,
549 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
550 0x03, 0x00, 0x00, 0x00,
553 uint8_t dcerpc_response2[] = {
554 0x05, 0x00, 0x02, 0x03, 0x10, 0x00, 0x00, 0x00,
555 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
556 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
557 0x00, 0x00, 0x00, 0x00, 0xf7, 0x72, 0x28, 0x9c,
558 0xf0, 0x57, 0xd8, 0x11, 0xb0, 0x05, 0x00, 0x0c,
559 0x29, 0x87, 0xea, 0xe9, 0x00, 0x00, 0x00, 0x00,
562 uint8_t dcerpc_request3[] = {
563 0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00,
564 0x70, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
565 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00,
566 0x00, 0x00, 0x00, 0x00, 0xf7, 0x72, 0x28, 0x9c,
567 0xf0, 0x57, 0xd8, 0x11, 0xb0, 0x05, 0x00, 0x0c,
568 0x29, 0x87, 0xea, 0xe9, 0x0c, 0x00, 0x0c, 0x00,
569 0x98, 0xda, 0x14, 0x00, 0x06, 0x00, 0x00, 0x00,
570 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
571 0x4f, 0x00, 0x73, 0x00, 0x61, 0x00, 0x33, 0x00,
572 0x32, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
573 0x18, 0x00, 0x00, 0x00, 0x4e, 0x00, 0x54, 0x00,
574 0x4f, 0x00, 0x53, 0x00, 0x41, 0x00, 0x33, 0x00,
575 0x32, 0x00, 0x2e, 0x00, 0x45, 0x00, 0x58, 0x00,
576 0x45, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
579 uint8_t dcerpc_response3[] = {
580 0x05, 0x00, 0x02, 0x03, 0x10, 0x00, 0x00, 0x00,
581 0x1c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
582 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
583 0x00, 0x00, 0x00, 0x00,
586 uint32_t dcerpc_request1_len =
sizeof(dcerpc_request1);
587 uint32_t dcerpc_response1_len =
sizeof(dcerpc_response1);
589 uint32_t dcerpc_request2_len =
sizeof(dcerpc_request2);
590 uint32_t dcerpc_response2_len =
sizeof(dcerpc_response2);
592 uint32_t dcerpc_request3_len =
sizeof(dcerpc_request3);
593 uint32_t dcerpc_response3_len =
sizeof(dcerpc_response3);
597 memset(&th_v, 0,
sizeof(th_v));
598 memset(&f, 0,
sizeof(f));
599 memset(&ssn, 0,
sizeof(ssn));
605 f.
proto = IPPROTO_TCP;
621 "alert tcp any any -> any any "
633 dcerpc_request1, dcerpc_request1_len);
635 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
636 printf(
"AppLayerParse for dcerpcrequest1 failed. Returned %" PRId32, r);
641 if (dcerpc_state == NULL) {
643 printf(
"no dcerpc state: ");
657 dcerpc_response1, dcerpc_response1_len);
659 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
660 printf(
"AppLayerParse for dcerpcresponse1 failed. Returned %" PRId32, r);
674 dcerpc_request2, dcerpc_request2_len);
676 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
677 printf(
"AppLayerParse for dcerpcrequest2 failed. Returned %" PRId32, r);
691 dcerpc_response2, dcerpc_response2_len);
693 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
694 printf(
"AppLayerParse for dcerpcresponse2 failed. Returned %" PRId32, r);
708 dcerpc_request3, dcerpc_request3_len);
710 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
711 printf(
"AppLayerParse for dcerpc request3 failed. Returned %" PRId32, r);
725 dcerpc_response3, dcerpc_response3_len);
727 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
728 printf(
"AppLayerParse for dcerpc response3 failed. Returned %" PRId32, r);
762 static int DetectDceOpnumTestParse12(
void)
772 DCERPCState *dcerpc_state = NULL;
775 uint8_t dcerpc_bind[] = {
776 0x05, 0x00, 0x0b, 0x03, 0x10, 0x00, 0x00, 0x00,
777 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
778 0xd0, 0x16, 0xd0, 0x16, 0x00, 0x00, 0x00, 0x00,
779 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
780 0x40, 0xfd, 0x2c, 0x34, 0x6c, 0x3c, 0xce, 0x11,
781 0xa8, 0x93, 0x08, 0x00, 0x2b, 0x2e, 0x9c, 0x6d,
782 0x00, 0x00, 0x00, 0x00, 0x04, 0x5d, 0x88, 0x8a,
783 0xeb, 0x1c, 0xc9, 0x11, 0x9f, 0xe8, 0x08, 0x00,
784 0x2b, 0x10, 0x48, 0x60, 0x02, 0x00, 0x00, 0x00,
787 uint8_t dcerpc_bindack[] = {
788 0x05, 0x00, 0x0c, 0x03, 0x10, 0x00, 0x00, 0x00,
789 0x44, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
790 0xb8, 0x10, 0xb8, 0x10, 0x7d, 0xd8, 0x00, 0x00,
791 0x0d, 0x00, 0x5c, 0x70, 0x69, 0x70, 0x65, 0x5c,
792 0x6c, 0x6c, 0x73, 0x72, 0x70, 0x63, 0x00, 0x00,
793 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
794 0x04, 0x5d, 0x88, 0x8a, 0xeb, 0x1c, 0xc9, 0x11,
795 0x9f, 0xe8, 0x08, 0x00, 0x2b, 0x10, 0x48, 0x60,
796 0x02, 0x00, 0x00, 0x00,
799 uint8_t dcerpc_request1[] = {
800 0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00,
801 0x9a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
802 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00,
803 0x00, 0x00, 0x00, 0x00, 0x07, 0x9f, 0x13, 0xd9,
804 0x2d, 0x97, 0xf4, 0x4a, 0xac, 0xc2, 0xbc, 0x70,
805 0xec, 0xaa, 0x9a, 0xd3, 0x01, 0x00, 0x00, 0x00,
806 0x01, 0x00, 0x00, 0x00, 0x40, 0x80, 0x40, 0x00,
807 0x44, 0x80, 0x40, 0x00, 0x01, 0x00, 0x00, 0x00,
808 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
809 0x09, 0x00, 0x00, 0x00, 0x4d, 0x6f, 0x00, 0x4e,
810 0x61, 0x6d, 0x65, 0x00, 0x35, 0x39, 0x31, 0x63,
811 0x64, 0x30, 0x35, 0x38, 0x00, 0x00, 0x00, 0x00,
812 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
813 0x17, 0x00, 0x00, 0x00, 0xd0, 0x2e, 0x08, 0x00,
814 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
815 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
816 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
817 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
818 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
822 uint8_t dcerpc_response1[] = {
823 0x05, 0x00, 0x02, 0x03, 0x10, 0x00, 0x00, 0x00,
824 0x1c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
825 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
826 0x00, 0x00, 0x00, 0x00,
829 uint8_t dcerpc_request2[] = {
830 0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00,
831 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
832 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00,
833 0x00, 0x00, 0x00, 0x00, 0x07, 0x9f, 0x13, 0xd9,
834 0x2d, 0x97, 0xf4, 0x4a, 0xac, 0xc2, 0xbc, 0x70,
835 0xec, 0xaa, 0x9a, 0xd3, 0x09, 0x00, 0x00, 0x00,
836 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
837 0x4d, 0x6f, 0x00, 0x4e, 0x61, 0x6d, 0x65, 0x00,
838 0x35, 0x39, 0x31, 0x63, 0x64, 0x30, 0x35, 0x38,
839 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
840 0x4e, 0x6f, 0x6e, 0x65
843 uint8_t dcerpc_response2[] = {
844 0x05, 0x00, 0x02, 0x03, 0x10, 0x00, 0x00, 0x00,
845 0x8c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
846 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
847 0xd8, 0x17, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00,
848 0x58, 0x1d, 0x08, 0x00, 0xe8, 0x32, 0x08, 0x00,
849 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
850 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
851 0x4d, 0x6f, 0x00, 0x4e, 0x61, 0x6d, 0x65, 0x00,
852 0x35, 0x39, 0x31, 0x63, 0x64, 0x30, 0x35, 0x38,
853 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
854 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
855 0xd0, 0x2e, 0x08, 0x00, 0x41, 0x41, 0x41, 0x41,
856 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
857 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
858 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
859 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
860 0x41, 0x41, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00,
861 0x00, 0x00, 0x00, 0x00,
864 uint32_t dcerpc_bind_len =
sizeof(dcerpc_bind);
865 uint32_t dcerpc_bindack_len =
sizeof(dcerpc_bindack);
867 uint32_t dcerpc_request1_len =
sizeof(dcerpc_request1);
868 uint32_t dcerpc_response1_len =
sizeof(dcerpc_response1);
870 uint32_t dcerpc_request2_len =
sizeof(dcerpc_request2);
871 uint32_t dcerpc_response2_len =
sizeof(dcerpc_response2);
875 memset(&th_v, 0,
sizeof(th_v));
876 memset(&f, 0,
sizeof(f));
877 memset(&ssn, 0,
sizeof(ssn));
883 f.
proto = IPPROTO_TCP;
899 "(msg:\"DCERPC\"; dce_opnum:30, 40; sid:1;)");
907 dcerpc_bind, dcerpc_bind_len);
909 printf(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
917 if (dcerpc_state == NULL) {
918 printf(
"no dcerpc state: ");
925 printf(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
936 dcerpc_request1_len);
938 printf(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
943 if (dcerpc_state == NULL) {
944 printf(
"no dcerpc state: ");
948 if (dcerpc_state->dcerpc.dcerpcrequest.opnum != 40) {
949 printf(
"dcerpc state holding invalid opnum. Holding %d, while we are "
950 "expecting 40: ", dcerpc_state->dcerpc.dcerpcrequest.opnum);
960 printf(
"signature 1 didn't match, should have: ");
966 dcerpc_response1_len);
968 printf(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
973 if (dcerpc_state == NULL) {
974 printf(
"no dcerpc state: ");
978 if (dcerpc_state->dcerpc.dcerpcrequest.opnum != 40) {
979 printf(
"dcerpc state holding invalid opnum. Holding %d, while we are "
980 "expecting 40\n", dcerpc_state->dcerpc.dcerpcrequest.opnum);
990 printf(
"sig 1 matched on response 1, but shouldn't: ");
996 dcerpc_request2_len);
998 printf(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
1003 if (dcerpc_state == NULL) {
1004 printf(
"no dcerpc state: ");
1008 if (dcerpc_state->dcerpc.dcerpcrequest.opnum != 30) {
1009 printf(
"dcerpc state holding invalid opnum. Holding %d, while we are "
1010 "expecting 30\n", dcerpc_state->dcerpc.dcerpcrequest.opnum);
1020 printf(
"sig 1 didn't match on request 2: ");
1026 dcerpc_response2_len);
1028 printf(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
1033 if (dcerpc_state == NULL) {
1034 printf(
"no dcerpc state: ");
1038 if (dcerpc_state->dcerpc.dcerpcrequest.opnum != 30) {
1039 printf(
"dcerpc state holding invalid opnum. Holding %d, while we are "
1040 "expecting 30\n", dcerpc_state->dcerpc.dcerpcrequest.opnum);
1050 printf(
"sig 1 matched on response2, but shouldn't: ");
1076 static int DetectDceOpnumTestParse13(
void)
1086 DCERPCState *dcerpc_state = NULL;
1089 uint8_t dcerpc_request1[] = {
1090 0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00,
1091 0x9a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1092 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00,
1093 0x00, 0x00, 0x00, 0x00, 0x07, 0x9f, 0x13, 0xd9,
1094 0x2d, 0x97, 0xf4, 0x4a, 0xac, 0xc2, 0xbc, 0x70,
1095 0xec, 0xaa, 0x9a, 0xd3, 0x01, 0x00, 0x00, 0x00,
1096 0x01, 0x00, 0x00, 0x00, 0x40, 0x80, 0x40, 0x00,
1097 0x44, 0x80, 0x40, 0x00, 0x01, 0x00, 0x00, 0x00,
1098 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1099 0x09, 0x00, 0x00, 0x00, 0x4d, 0x6f, 0x00, 0x4e,
1100 0x61, 0x6d, 0x65, 0x00, 0x35, 0x39, 0x31, 0x63,
1101 0x64, 0x30, 0x35, 0x38, 0x00, 0x00, 0x00, 0x00,
1102 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1103 0x17, 0x00, 0x00, 0x00, 0xd0, 0x2e, 0x08, 0x00,
1104 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
1105 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
1106 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
1107 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
1108 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
1112 uint8_t dcerpc_response1[] = {
1113 0x05, 0x00, 0x02, 0x03, 0x10, 0x00, 0x00, 0x00,
1114 0x1c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1115 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1116 0x00, 0x00, 0x00, 0x00,
1119 uint8_t dcerpc_request2[] = {
1120 0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00,
1121 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1122 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00,
1123 0x00, 0x00, 0x00, 0x00, 0x07, 0x9f, 0x13, 0xd9,
1124 0x2d, 0x97, 0xf4, 0x4a, 0xac, 0xc2, 0xbc, 0x70,
1125 0xec, 0xaa, 0x9a, 0xd3, 0x09, 0x00, 0x00, 0x00,
1126 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
1127 0x4d, 0x6f, 0x00, 0x4e, 0x61, 0x6d, 0x65, 0x00,
1128 0x35, 0x39, 0x31, 0x63, 0x64, 0x30, 0x35, 0x38,
1129 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1130 0x4e, 0x6f, 0x6e, 0x65
1133 uint8_t dcerpc_response2[] = {
1134 0x05, 0x00, 0x02, 0x03, 0x10, 0x00, 0x00, 0x00,
1135 0x8c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1136 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1137 0xd8, 0x17, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00,
1138 0x58, 0x1d, 0x08, 0x00, 0xe8, 0x32, 0x08, 0x00,
1139 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
1140 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
1141 0x4d, 0x6f, 0x00, 0x4e, 0x61, 0x6d, 0x65, 0x00,
1142 0x35, 0x39, 0x31, 0x63, 0x64, 0x30, 0x35, 0x38,
1143 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
1144 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
1145 0xd0, 0x2e, 0x08, 0x00, 0x41, 0x41, 0x41, 0x41,
1146 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
1147 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
1148 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
1149 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
1150 0x41, 0x41, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00,
1151 0x00, 0x00, 0x00, 0x00,
1154 uint32_t dcerpc_request1_len =
sizeof(dcerpc_request1);
1155 uint32_t dcerpc_response1_len =
sizeof(dcerpc_response1);
1157 uint32_t dcerpc_request2_len =
sizeof(dcerpc_request2);
1158 uint32_t dcerpc_response2_len =
sizeof(dcerpc_response2);
1162 memset(&th_v, 0,
sizeof(th_v));
1163 memset(&f, 0,
sizeof(f));
1164 memset(&ssn, 0,
sizeof(ssn));
1170 f.
proto = IPPROTO_TCP;
1186 "alert tcp any any -> any any "
1188 "dce_opnum:30, 40; "
1198 dcerpc_request1_len);
1200 printf(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
1205 if (dcerpc_state == NULL) {
1206 printf(
"no dcerpc state: ");
1210 if (dcerpc_state->dcerpc.dcerpcrequest.opnum != 40) {
1211 printf(
"dcerpc state holding invalid opnum after request1. Holding %d, while we are "
1212 "expecting 40\n", dcerpc_state->dcerpc.dcerpcrequest.opnum);
1226 dcerpc_response1_len);
1228 printf(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
1233 if (dcerpc_state == NULL) {
1234 printf(
"no dcerpc state: ");
1238 if (dcerpc_state->dcerpc.dcerpcrequest.opnum != 40) {
1239 printf(
"dcerpc state holding invalid opnum after response1. Holding %d, while we are "
1240 "expecting 40\n", dcerpc_state->dcerpc.dcerpcrequest.opnum);
1253 printf(
"Sending Request2\n");
1255 dcerpc_request2_len);
1257 printf(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
1262 if (dcerpc_state == NULL) {
1263 printf(
"no dcerpc state: ");
1267 if (dcerpc_state->dcerpc.dcerpcrequest.opnum != 30) {
1268 printf(
"dcerpc state holding invalid opnum after request2. Holding %d, while we are "
1269 "expecting 30\n", dcerpc_state->dcerpc.dcerpcrequest.opnum);
1283 dcerpc_response2_len);
1285 printf(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
1290 if (dcerpc_state == NULL) {
1291 printf(
"no dcerpc state: ");
1295 if (dcerpc_state->dcerpc.dcerpcrequest.opnum != 30) {
1296 printf(
"dcerpc state holding invalid opnum after response2. Holding %d, while we are "
1297 "expecting 30\n", dcerpc_state->dcerpc.dcerpcrequest.opnum);
1328 static void DetectDceOpnumRegisterTests(
void)
1333 UtRegisterTest(
"DetectDceOpnumTestParse10", DetectDceOpnumTestParse10, 1);
1334 UtRegisterTest(
"DetectDceOpnumTestParse11", DetectDceOpnumTestParse11, 1);
1335 UtRegisterTest(
"DetectDceOpnumTestParse12", DetectDceOpnumTestParse12, 1);
1336 UtRegisterTest(
"DetectDceOpnumTestParse13", DetectDceOpnumTestParse13, 1);