шаблон сопоставления iptables, за которым следуют 4 случайных значения, за которыми следует другой шаблон

Я пытаюсь создать правило iptables, которое соответствует следующему шаблону в этом пакете UDP:

0x0000:  0000 030a 0000 0000 0000 0000 0000 0800  ................
0x0010:  4500 0027 5d30 0000 6c11 232a 5164 585d  E..']0..l.#*QdX]
0x0020:  c0a8 6402 fe25 1e61 0013 b382 5341 4d50  ..d..%.a....SAMP
0x0030:  c063 ba71 e2ea 63                        .c.q..c

Шаблон |53414d50c063ba71| за которым следует случайный гекс, в данном случае |e2ea|, с последующим |63|,

Правило должно гарантировать, что после 4 |53414d50c063ba71|и что после этих 4 случайных цифр, есть |63|,

Прямо сейчас у меня есть это, но я не знаю, как изменить это соответственно:

iptables -I INPUT -p udp --dport 7777 -m string --algo kmp \
    --hex-string '|53414d50c063ba71????63|' -j DROP

???? -> Как??

Пожалуйста, помогите мне.

1 ответ

Пока смещение фиксировано, можно использовать совпадение u32 для проведения такого рода теста. Если полезная нагрузка находится в конце пакета, это означает, что пакет также должен иметь постоянный размер, чтобы u32 мог использоваться.

Зачем? Это потому, что u32 может добавлять только беззнаковые числа, поэтому невозможно сопоставить "последние 11 байтов", выраженные как "в позиции (размер пакета - 11)", с u32, потому что есть вычитание (или добавление отрицательного числа).

Таким образом, для этого конкретного примера с размером полезной нагрузки 0x37 (55), как было задано в комментарии, приведено выражение соответствия u32 (пакет, являющийся UDP, уже будет проверен сопоставлением udp ранее):

iptables -I INPUT -p udp --dport 7777 -m u32 --u32 "0x0>>0x16&0x3c@0x34=0x53414d50&&0x0>>0x16&0x3c@0x38=0xc063ba71&&0x0>>0x16&0x3c@0x3b&0xff=0x63" -j DROP

Итеративные объяснения (конечно, требуется понимание man-страницы и примеров u32):

0x0 >> 0x16 & 0x3c: настроенная длина интернет-заголовка (IHL) <=> начало заголовка UDP
0x0 >> 0x16 & 0x3c @ 8: 4 байта в начале данных UDP
0x0 >> 0x16 & 0x3c @ 0x34: 4 байта в позиции (0x34-8) = 0x2c данных UDP
0x0 >> 0x16 & 0x3c @ 0x34 = 0x53414d50: 4 байта в позиции 0x2c == 0x53414d50
&& логично и
0x0 >> 0x16 & 0x3c @ 0x38 = 0xc063ba71: 4 байта в позиции 0x30 == 0xc063ba71
0x0 >> 0x16 & 0x3c @ 0x3b: 4 байта в позиции (0x3b-8) = 0x33 данных UDP
0x0 >> 0x16 & 0x3c @ 0x3b && 0x000000ff: содержимое последнего байта из 4 байтов, начиная с позиции 0x33, что означает один байт в (здесь последней) позиции 0x36
0x0 >> 0x16 & 0x3c @ 0x3b && 0x000000ff = 0x63: байт в позиции 0x36 == 0x63

Другие вопросы по тегам