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;
100 Flow *f, uint8_t
flags,
void *state,
void *txv,
106 return rs_dcerpc_opnum_match(txv, (
void *)
m);
109 if (rs_smb_tx_match_dce_opnum(txv, (
void *)
m) != 1)
130 SCLogError(
"Error parsing dce_opnum option in "
131 "signature, option needs a value");
138 void *dod = rs_dcerpc_opnum_parse(arg);
140 SCLogError(
"Error parsing dce_opnum option in "
147 DetectDceOpnumFree(
de_ctx, dod);
152 sm->
ctx = (
void *)dod;
162 rs_dcerpc_opnum_free(ptr);
179 static int DetectDceOpnumTestParse10(
void)
189 DCERPCState *dcerpc_state = NULL;
192 uint8_t dcerpc_bind[] = {
193 0x05, 0x00, 0x0b, 0x03, 0x10, 0x00, 0x00, 0x00,
194 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
195 0xb8, 0x10, 0xb8, 0x10, 0x00, 0x00, 0x00, 0x00,
196 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
197 0x01, 0xd0, 0x8c, 0x33, 0x44, 0x22, 0xf1, 0x31,
198 0xaa, 0xaa, 0x90, 0x00, 0x38, 0x00, 0x10, 0x03,
199 0x01, 0x00, 0x00, 0x00, 0x04, 0x5d, 0x88, 0x8a,
200 0xeb, 0x1c, 0xc9, 0x11, 0x9f, 0xe8, 0x08, 0x00,
201 0x2b, 0x10, 0x48, 0x60, 0x02, 0x00, 0x00, 0x00,
204 uint8_t dcerpc_bindack[] = {
205 0x05, 0x00, 0x0c, 0x03, 0x10, 0x00, 0x00, 0x00,
206 0x44, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
207 0xb8, 0x10, 0xb8, 0x10, 0x65, 0x8e, 0x00, 0x00,
208 0x0d, 0x00, 0x5c, 0x50, 0x49, 0x50, 0x45, 0x5c,
209 0x77, 0x69, 0x6e, 0x72, 0x65, 0x67, 0x00, 0x6d,
210 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
211 0x04, 0x5d, 0x88, 0x8a, 0xeb, 0x1c, 0xc9, 0x11,
212 0x9f, 0xe8, 0x08, 0x00, 0x2b, 0x10, 0x48, 0x60,
213 0x02, 0x00, 0x00, 0x00,
216 uint8_t dcerpc_request1[] = {
217 0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00,
218 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
219 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
220 0x2c, 0xfd, 0xb5, 0x00, 0x40, 0xaa, 0x01, 0x00,
221 0x00, 0x00, 0x00, 0x02,
224 uint8_t dcerpc_response1[] = {
225 0x05, 0x00, 0x02, 0x03, 0x10, 0x00, 0x00, 0x00,
226 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
227 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
228 0x00, 0x00, 0x00, 0x00, 0xf6, 0x72, 0x28, 0x9c,
229 0xf0, 0x57, 0xd8, 0x11, 0xb0, 0x05, 0x00, 0x0c,
230 0x29, 0x87, 0xea, 0xe9, 0x00, 0x00, 0x00, 0x00,
233 uint8_t dcerpc_request2[] = {
234 0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00,
235 0xa4, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
236 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00,
237 0x00, 0x00, 0x00, 0x00, 0xf6, 0x72, 0x28, 0x9c,
238 0xf0, 0x57, 0xd8, 0x11, 0xb0, 0x05, 0x00, 0x0c,
239 0x29, 0x87, 0xea, 0xe9, 0x5c, 0x00, 0x5c, 0x00,
240 0xa8, 0xb9, 0x14, 0x00, 0x2e, 0x00, 0x00, 0x00,
241 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00,
242 0x53, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x54, 0x00,
243 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x45, 0x00,
244 0x5c, 0x00, 0x4d, 0x00, 0x69, 0x00, 0x63, 0x00,
245 0x72, 0x00, 0x6f, 0x00, 0x73, 0x00, 0x6f, 0x00,
246 0x66, 0x00, 0x74, 0x00, 0x5c, 0x00, 0x57, 0x00,
247 0x69, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x6f, 0x00,
248 0x77, 0x00, 0x73, 0x00, 0x5c, 0x00, 0x43, 0x00,
249 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00,
250 0x6e, 0x00, 0x74, 0x00, 0x56, 0x00, 0x65, 0x00,
251 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00,
252 0x6e, 0x00, 0x5c, 0x00, 0x52, 0x00, 0x75, 0x00,
253 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
254 0x03, 0x00, 0x00, 0x00,
257 uint8_t dcerpc_response2[] = {
258 0x05, 0x00, 0x02, 0x03, 0x10, 0x00, 0x00, 0x00,
259 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
260 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
261 0x00, 0x00, 0x00, 0x00, 0xf7, 0x72, 0x28, 0x9c,
262 0xf0, 0x57, 0xd8, 0x11, 0xb0, 0x05, 0x00, 0x0c,
263 0x29, 0x87, 0xea, 0xe9, 0x00, 0x00, 0x00, 0x00,
266 uint8_t dcerpc_request3[] = {
267 0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00,
268 0x70, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
269 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00,
270 0x00, 0x00, 0x00, 0x00, 0xf7, 0x72, 0x28, 0x9c,
271 0xf0, 0x57, 0xd8, 0x11, 0xb0, 0x05, 0x00, 0x0c,
272 0x29, 0x87, 0xea, 0xe9, 0x0c, 0x00, 0x0c, 0x00,
273 0x98, 0xda, 0x14, 0x00, 0x06, 0x00, 0x00, 0x00,
274 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
275 0x4f, 0x00, 0x73, 0x00, 0x61, 0x00, 0x33, 0x00,
276 0x32, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
277 0x18, 0x00, 0x00, 0x00, 0x4e, 0x00, 0x54, 0x00,
278 0x4f, 0x00, 0x53, 0x00, 0x41, 0x00, 0x33, 0x00,
279 0x32, 0x00, 0x2e, 0x00, 0x45, 0x00, 0x58, 0x00,
280 0x45, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
283 uint8_t dcerpc_response3[] = {
284 0x05, 0x00, 0x02, 0x03, 0x10, 0x00, 0x00, 0x00,
285 0x1c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
286 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
287 0x00, 0x00, 0x00, 0x00,
290 uint32_t dcerpc_bind_len =
sizeof(dcerpc_bind);
291 uint32_t dcerpc_bindack_len =
sizeof(dcerpc_bindack);
293 uint32_t dcerpc_request1_len =
sizeof(dcerpc_request1);
294 uint32_t dcerpc_response1_len =
sizeof(dcerpc_response1);
296 uint32_t dcerpc_request2_len =
sizeof(dcerpc_request2);
297 uint32_t dcerpc_response2_len =
sizeof(dcerpc_response2);
299 uint32_t dcerpc_request3_len =
sizeof(dcerpc_request3);
300 uint32_t dcerpc_response3_len =
sizeof(dcerpc_response3);
304 memset(&th_v, 0,
sizeof(th_v));
305 memset(&f, 0,
sizeof(f));
306 memset(&ssn, 0,
sizeof(ssn));
312 f.
proto = IPPROTO_TCP;
329 "(msg:\"DCERPC\"; dce_opnum:2,15,22; sid:1;)");
340 dcerpc_bind, dcerpc_bind_len);
342 SCLogDebug(
"AppLayerParse for dcerpc bind failed. Returned %" PRId32, r);
347 if (dcerpc_state == NULL) {
358 dcerpc_bindack, dcerpc_bindack_len);
360 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
371 dcerpc_request1, dcerpc_request1_len);
373 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
383 printf(
"sig 1 didn't match, but should have: ");
391 dcerpc_response1, dcerpc_response1_len);
393 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
403 printf(
"sig 1 did match, shouldn't have on response1: ");
409 dcerpc_request2, dcerpc_request2_len);
411 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
421 printf(
"sig 1 didn't match, but should have on request2: ");
427 dcerpc_response2, dcerpc_response2_len);
429 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
439 printf(
"sig 1 did match, shouldn't have on response2: ");
445 dcerpc_request3, dcerpc_request3_len);
447 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
457 printf(
"sig 1 didn't match, but should have on request3: ");
463 dcerpc_response3, dcerpc_response3_len);
465 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
475 printf(
"sig 1 did match, shouldn't have on response2: ");
501 static int DetectDceOpnumTestParse11(
void)
511 DCERPCState *dcerpc_state = NULL;
514 uint8_t dcerpc_request1[] = {
515 0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00,
516 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
517 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
518 0x2c, 0xfd, 0xb5, 0x00, 0x40, 0xaa, 0x01, 0x00,
519 0x00, 0x00, 0x00, 0x02,
522 uint8_t dcerpc_response1[] = {
523 0x05, 0x00, 0x02, 0x03, 0x10, 0x00, 0x00, 0x00,
524 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
525 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
526 0x00, 0x00, 0x00, 0x00, 0xf6, 0x72, 0x28, 0x9c,
527 0xf0, 0x57, 0xd8, 0x11, 0xb0, 0x05, 0x00, 0x0c,
528 0x29, 0x87, 0xea, 0xe9, 0x00, 0x00, 0x00, 0x00,
531 uint8_t dcerpc_request2[] = {
532 0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00,
533 0xa4, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
534 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00,
535 0x00, 0x00, 0x00, 0x00, 0xf6, 0x72, 0x28, 0x9c,
536 0xf0, 0x57, 0xd8, 0x11, 0xb0, 0x05, 0x00, 0x0c,
537 0x29, 0x87, 0xea, 0xe9, 0x5c, 0x00, 0x5c, 0x00,
538 0xa8, 0xb9, 0x14, 0x00, 0x2e, 0x00, 0x00, 0x00,
539 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00,
540 0x53, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x54, 0x00,
541 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x45, 0x00,
542 0x5c, 0x00, 0x4d, 0x00, 0x69, 0x00, 0x63, 0x00,
543 0x72, 0x00, 0x6f, 0x00, 0x73, 0x00, 0x6f, 0x00,
544 0x66, 0x00, 0x74, 0x00, 0x5c, 0x00, 0x57, 0x00,
545 0x69, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x6f, 0x00,
546 0x77, 0x00, 0x73, 0x00, 0x5c, 0x00, 0x43, 0x00,
547 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00,
548 0x6e, 0x00, 0x74, 0x00, 0x56, 0x00, 0x65, 0x00,
549 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00,
550 0x6e, 0x00, 0x5c, 0x00, 0x52, 0x00, 0x75, 0x00,
551 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
552 0x03, 0x00, 0x00, 0x00,
555 uint8_t dcerpc_response2[] = {
556 0x05, 0x00, 0x02, 0x03, 0x10, 0x00, 0x00, 0x00,
557 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
558 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
559 0x00, 0x00, 0x00, 0x00, 0xf7, 0x72, 0x28, 0x9c,
560 0xf0, 0x57, 0xd8, 0x11, 0xb0, 0x05, 0x00, 0x0c,
561 0x29, 0x87, 0xea, 0xe9, 0x00, 0x00, 0x00, 0x00,
564 uint8_t dcerpc_request3[] = {
565 0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00,
566 0x70, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
567 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00,
568 0x00, 0x00, 0x00, 0x00, 0xf7, 0x72, 0x28, 0x9c,
569 0xf0, 0x57, 0xd8, 0x11, 0xb0, 0x05, 0x00, 0x0c,
570 0x29, 0x87, 0xea, 0xe9, 0x0c, 0x00, 0x0c, 0x00,
571 0x98, 0xda, 0x14, 0x00, 0x06, 0x00, 0x00, 0x00,
572 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
573 0x4f, 0x00, 0x73, 0x00, 0x61, 0x00, 0x33, 0x00,
574 0x32, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
575 0x18, 0x00, 0x00, 0x00, 0x4e, 0x00, 0x54, 0x00,
576 0x4f, 0x00, 0x53, 0x00, 0x41, 0x00, 0x33, 0x00,
577 0x32, 0x00, 0x2e, 0x00, 0x45, 0x00, 0x58, 0x00,
578 0x45, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
581 uint8_t dcerpc_response3[] = {
582 0x05, 0x00, 0x02, 0x03, 0x10, 0x00, 0x00, 0x00,
583 0x1c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
584 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
585 0x00, 0x00, 0x00, 0x00,
588 uint32_t dcerpc_request1_len =
sizeof(dcerpc_request1);
589 uint32_t dcerpc_response1_len =
sizeof(dcerpc_response1);
591 uint32_t dcerpc_request2_len =
sizeof(dcerpc_request2);
592 uint32_t dcerpc_response2_len =
sizeof(dcerpc_response2);
594 uint32_t dcerpc_request3_len =
sizeof(dcerpc_request3);
595 uint32_t dcerpc_response3_len =
sizeof(dcerpc_response3);
599 memset(&th_v, 0,
sizeof(th_v));
600 memset(&f, 0,
sizeof(f));
601 memset(&ssn, 0,
sizeof(ssn));
607 f.
proto = IPPROTO_TCP;
623 "alert tcp any any -> any any "
635 dcerpc_request1, dcerpc_request1_len);
637 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
638 printf(
"AppLayerParse for dcerpcrequest1 failed. Returned %" PRId32, r);
643 if (dcerpc_state == NULL) {
645 printf(
"no dcerpc state: ");
659 dcerpc_response1, dcerpc_response1_len);
661 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
662 printf(
"AppLayerParse for dcerpcresponse1 failed. Returned %" PRId32, r);
676 dcerpc_request2, dcerpc_request2_len);
678 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
679 printf(
"AppLayerParse for dcerpcrequest2 failed. Returned %" PRId32, r);
693 dcerpc_response2, dcerpc_response2_len);
695 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
696 printf(
"AppLayerParse for dcerpcresponse2 failed. Returned %" PRId32, r);
710 dcerpc_request3, dcerpc_request3_len);
712 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
713 printf(
"AppLayerParse for dcerpc request3 failed. Returned %" PRId32, r);
727 dcerpc_response3, dcerpc_response3_len);
729 SCLogDebug(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
730 printf(
"AppLayerParse for dcerpc response3 failed. Returned %" PRId32, r);
764 static int DetectDceOpnumTestParse12(
void)
774 DCERPCState *dcerpc_state = NULL;
777 uint8_t dcerpc_bind[] = {
778 0x05, 0x00, 0x0b, 0x03, 0x10, 0x00, 0x00, 0x00,
779 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
780 0xd0, 0x16, 0xd0, 0x16, 0x00, 0x00, 0x00, 0x00,
781 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
782 0x40, 0xfd, 0x2c, 0x34, 0x6c, 0x3c, 0xce, 0x11,
783 0xa8, 0x93, 0x08, 0x00, 0x2b, 0x2e, 0x9c, 0x6d,
784 0x00, 0x00, 0x00, 0x00, 0x04, 0x5d, 0x88, 0x8a,
785 0xeb, 0x1c, 0xc9, 0x11, 0x9f, 0xe8, 0x08, 0x00,
786 0x2b, 0x10, 0x48, 0x60, 0x02, 0x00, 0x00, 0x00,
789 uint8_t dcerpc_bindack[] = {
790 0x05, 0x00, 0x0c, 0x03, 0x10, 0x00, 0x00, 0x00,
791 0x44, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
792 0xb8, 0x10, 0xb8, 0x10, 0x7d, 0xd8, 0x00, 0x00,
793 0x0d, 0x00, 0x5c, 0x70, 0x69, 0x70, 0x65, 0x5c,
794 0x6c, 0x6c, 0x73, 0x72, 0x70, 0x63, 0x00, 0x00,
795 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
796 0x04, 0x5d, 0x88, 0x8a, 0xeb, 0x1c, 0xc9, 0x11,
797 0x9f, 0xe8, 0x08, 0x00, 0x2b, 0x10, 0x48, 0x60,
798 0x02, 0x00, 0x00, 0x00,
801 uint8_t dcerpc_request1[] = {
802 0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00,
803 0x9a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
804 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00,
805 0x00, 0x00, 0x00, 0x00, 0x07, 0x9f, 0x13, 0xd9,
806 0x2d, 0x97, 0xf4, 0x4a, 0xac, 0xc2, 0xbc, 0x70,
807 0xec, 0xaa, 0x9a, 0xd3, 0x01, 0x00, 0x00, 0x00,
808 0x01, 0x00, 0x00, 0x00, 0x40, 0x80, 0x40, 0x00,
809 0x44, 0x80, 0x40, 0x00, 0x01, 0x00, 0x00, 0x00,
810 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
811 0x09, 0x00, 0x00, 0x00, 0x4d, 0x6f, 0x00, 0x4e,
812 0x61, 0x6d, 0x65, 0x00, 0x35, 0x39, 0x31, 0x63,
813 0x64, 0x30, 0x35, 0x38, 0x00, 0x00, 0x00, 0x00,
814 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
815 0x17, 0x00, 0x00, 0x00, 0xd0, 0x2e, 0x08, 0x00,
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,
819 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
820 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
824 uint8_t dcerpc_response1[] = {
825 0x05, 0x00, 0x02, 0x03, 0x10, 0x00, 0x00, 0x00,
826 0x1c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
827 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
828 0x00, 0x00, 0x00, 0x00,
831 uint8_t dcerpc_request2[] = {
832 0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00,
833 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
834 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00,
835 0x00, 0x00, 0x00, 0x00, 0x07, 0x9f, 0x13, 0xd9,
836 0x2d, 0x97, 0xf4, 0x4a, 0xac, 0xc2, 0xbc, 0x70,
837 0xec, 0xaa, 0x9a, 0xd3, 0x09, 0x00, 0x00, 0x00,
838 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
839 0x4d, 0x6f, 0x00, 0x4e, 0x61, 0x6d, 0x65, 0x00,
840 0x35, 0x39, 0x31, 0x63, 0x64, 0x30, 0x35, 0x38,
841 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
842 0x4e, 0x6f, 0x6e, 0x65
845 uint8_t dcerpc_response2[] = {
846 0x05, 0x00, 0x02, 0x03, 0x10, 0x00, 0x00, 0x00,
847 0x8c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
848 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
849 0xd8, 0x17, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00,
850 0x58, 0x1d, 0x08, 0x00, 0xe8, 0x32, 0x08, 0x00,
851 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
852 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
853 0x4d, 0x6f, 0x00, 0x4e, 0x61, 0x6d, 0x65, 0x00,
854 0x35, 0x39, 0x31, 0x63, 0x64, 0x30, 0x35, 0x38,
855 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
856 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
857 0xd0, 0x2e, 0x08, 0x00, 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, 0x41, 0x41, 0x41, 0x41,
861 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
862 0x41, 0x41, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00,
863 0x00, 0x00, 0x00, 0x00,
866 uint32_t dcerpc_bind_len =
sizeof(dcerpc_bind);
867 uint32_t dcerpc_bindack_len =
sizeof(dcerpc_bindack);
869 uint32_t dcerpc_request1_len =
sizeof(dcerpc_request1);
870 uint32_t dcerpc_response1_len =
sizeof(dcerpc_response1);
872 uint32_t dcerpc_request2_len =
sizeof(dcerpc_request2);
873 uint32_t dcerpc_response2_len =
sizeof(dcerpc_response2);
877 memset(&th_v, 0,
sizeof(th_v));
878 memset(&f, 0,
sizeof(f));
879 memset(&ssn, 0,
sizeof(ssn));
885 f.
proto = IPPROTO_TCP;
901 "(msg:\"DCERPC\"; dce_opnum:30, 40; sid:1;)");
909 dcerpc_bind, dcerpc_bind_len);
911 printf(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
919 if (dcerpc_state == NULL) {
920 printf(
"no dcerpc state: ");
927 printf(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
938 dcerpc_request1_len);
940 printf(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
945 if (dcerpc_state == NULL) {
946 printf(
"no dcerpc state: ");
950 if (dcerpc_state->dcerpc.dcerpcrequest.opnum != 40) {
951 printf(
"dcerpc state holding invalid opnum. Holding %d, while we are "
952 "expecting 40: ", dcerpc_state->dcerpc.dcerpcrequest.opnum);
962 printf(
"signature 1 didn't match, should have: ");
968 dcerpc_response1_len);
970 printf(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
975 if (dcerpc_state == NULL) {
976 printf(
"no dcerpc state: ");
980 if (dcerpc_state->dcerpc.dcerpcrequest.opnum != 40) {
981 printf(
"dcerpc state holding invalid opnum. Holding %d, while we are "
982 "expecting 40\n", dcerpc_state->dcerpc.dcerpcrequest.opnum);
992 printf(
"sig 1 matched on response 1, but shouldn't: ");
998 dcerpc_request2_len);
1000 printf(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
1005 if (dcerpc_state == NULL) {
1006 printf(
"no dcerpc state: ");
1010 if (dcerpc_state->dcerpc.dcerpcrequest.opnum != 30) {
1011 printf(
"dcerpc state holding invalid opnum. Holding %d, while we are "
1012 "expecting 30\n", dcerpc_state->dcerpc.dcerpcrequest.opnum);
1022 printf(
"sig 1 didn't match on request 2: ");
1028 dcerpc_response2_len);
1030 printf(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
1035 if (dcerpc_state == NULL) {
1036 printf(
"no dcerpc state: ");
1040 if (dcerpc_state->dcerpc.dcerpcrequest.opnum != 30) {
1041 printf(
"dcerpc state holding invalid opnum. Holding %d, while we are "
1042 "expecting 30\n", dcerpc_state->dcerpc.dcerpcrequest.opnum);
1052 printf(
"sig 1 matched on response2, but shouldn't: ");
1078 static int DetectDceOpnumTestParse13(
void)
1088 DCERPCState *dcerpc_state = NULL;
1091 uint8_t dcerpc_request1[] = {
1092 0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00,
1093 0x9a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1094 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00,
1095 0x00, 0x00, 0x00, 0x00, 0x07, 0x9f, 0x13, 0xd9,
1096 0x2d, 0x97, 0xf4, 0x4a, 0xac, 0xc2, 0xbc, 0x70,
1097 0xec, 0xaa, 0x9a, 0xd3, 0x01, 0x00, 0x00, 0x00,
1098 0x01, 0x00, 0x00, 0x00, 0x40, 0x80, 0x40, 0x00,
1099 0x44, 0x80, 0x40, 0x00, 0x01, 0x00, 0x00, 0x00,
1100 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1101 0x09, 0x00, 0x00, 0x00, 0x4d, 0x6f, 0x00, 0x4e,
1102 0x61, 0x6d, 0x65, 0x00, 0x35, 0x39, 0x31, 0x63,
1103 0x64, 0x30, 0x35, 0x38, 0x00, 0x00, 0x00, 0x00,
1104 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1105 0x17, 0x00, 0x00, 0x00, 0xd0, 0x2e, 0x08, 0x00,
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,
1109 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
1110 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
1114 uint8_t dcerpc_response1[] = {
1115 0x05, 0x00, 0x02, 0x03, 0x10, 0x00, 0x00, 0x00,
1116 0x1c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1117 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1118 0x00, 0x00, 0x00, 0x00,
1121 uint8_t dcerpc_request2[] = {
1122 0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00,
1123 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1124 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00,
1125 0x00, 0x00, 0x00, 0x00, 0x07, 0x9f, 0x13, 0xd9,
1126 0x2d, 0x97, 0xf4, 0x4a, 0xac, 0xc2, 0xbc, 0x70,
1127 0xec, 0xaa, 0x9a, 0xd3, 0x09, 0x00, 0x00, 0x00,
1128 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
1129 0x4d, 0x6f, 0x00, 0x4e, 0x61, 0x6d, 0x65, 0x00,
1130 0x35, 0x39, 0x31, 0x63, 0x64, 0x30, 0x35, 0x38,
1131 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1132 0x4e, 0x6f, 0x6e, 0x65
1135 uint8_t dcerpc_response2[] = {
1136 0x05, 0x00, 0x02, 0x03, 0x10, 0x00, 0x00, 0x00,
1137 0x8c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1138 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1139 0xd8, 0x17, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00,
1140 0x58, 0x1d, 0x08, 0x00, 0xe8, 0x32, 0x08, 0x00,
1141 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
1142 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
1143 0x4d, 0x6f, 0x00, 0x4e, 0x61, 0x6d, 0x65, 0x00,
1144 0x35, 0x39, 0x31, 0x63, 0x64, 0x30, 0x35, 0x38,
1145 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
1146 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
1147 0xd0, 0x2e, 0x08, 0x00, 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, 0x41, 0x41, 0x41, 0x41,
1151 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
1152 0x41, 0x41, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00,
1153 0x00, 0x00, 0x00, 0x00,
1156 uint32_t dcerpc_request1_len =
sizeof(dcerpc_request1);
1157 uint32_t dcerpc_response1_len =
sizeof(dcerpc_response1);
1159 uint32_t dcerpc_request2_len =
sizeof(dcerpc_request2);
1160 uint32_t dcerpc_response2_len =
sizeof(dcerpc_response2);
1164 memset(&th_v, 0,
sizeof(th_v));
1165 memset(&f, 0,
sizeof(f));
1166 memset(&ssn, 0,
sizeof(ssn));
1172 f.
proto = IPPROTO_TCP;
1188 "alert tcp any any -> any any "
1190 "dce_opnum:30, 40; "
1200 dcerpc_request1_len);
1202 printf(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
1207 if (dcerpc_state == NULL) {
1208 printf(
"no dcerpc state: ");
1212 if (dcerpc_state->dcerpc.dcerpcrequest.opnum != 40) {
1213 printf(
"dcerpc state holding invalid opnum after request1. Holding %d, while we are "
1214 "expecting 40\n", dcerpc_state->dcerpc.dcerpcrequest.opnum);
1228 dcerpc_response1_len);
1230 printf(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
1235 if (dcerpc_state == NULL) {
1236 printf(
"no dcerpc state: ");
1240 if (dcerpc_state->dcerpc.dcerpcrequest.opnum != 40) {
1241 printf(
"dcerpc state holding invalid opnum after response1. Holding %d, while we are "
1242 "expecting 40\n", dcerpc_state->dcerpc.dcerpcrequest.opnum);
1255 printf(
"Sending Request2\n");
1257 dcerpc_request2_len);
1259 printf(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
1264 if (dcerpc_state == NULL) {
1265 printf(
"no dcerpc state: ");
1269 if (dcerpc_state->dcerpc.dcerpcrequest.opnum != 30) {
1270 printf(
"dcerpc state holding invalid opnum after request2. Holding %d, while we are "
1271 "expecting 30\n", dcerpc_state->dcerpc.dcerpcrequest.opnum);
1285 dcerpc_response2_len);
1287 printf(
"AppLayerParse for dcerpc failed. Returned %" PRId32, r);
1292 if (dcerpc_state == NULL) {
1293 printf(
"no dcerpc state: ");
1297 if (dcerpc_state->dcerpc.dcerpcrequest.opnum != 30) {
1298 printf(
"dcerpc state holding invalid opnum after response2. Holding %d, while we are "
1299 "expecting 30\n", dcerpc_state->dcerpc.dcerpcrequest.opnum);
1330 static void DetectDceOpnumRegisterTests(
void)
1335 UtRegisterTest(
"DetectDceOpnumTestParse10", DetectDceOpnumTestParse10, 1);
1336 UtRegisterTest(
"DetectDceOpnumTestParse11", DetectDceOpnumTestParse11, 1);
1337 UtRegisterTest(
"DetectDceOpnumTestParse12", DetectDceOpnumTestParse12, 1);
1338 UtRegisterTest(
"DetectDceOpnumTestParse13", DetectDceOpnumTestParse13, 1);