我正在尝试创建一个与此 UDP 数据包中的以下模式匹配的 iptables 规则:
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
只要偏移量固定,就可以使用u32match 进行这种测试。如果有效载荷位于数据包末尾,则意味着数据包的大小也必须是恒定的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
迭代解释(当然,理解u32 的手册页并需要示例):
0x0 >> 0x16 & 0x3c
:已调整互联网标头长度 (IHL)<=> UDP 报头的
0x0 >> 0x16 & 0x3c @ 8
开始:UDP 数据
0x0 >> 0x16 & 0x3c @ 0x34
: 位置 (0x34-8) 处的 4 个字节 = UDP 数据的 0x2c
0x0 >> 0x16 & 0x3c @ 0x34 = 0x53414d50
: 位置 0x2c 处的 4 个字节 == 0x53414d50
&&
: 逻辑和
0x0 >> 0x16 & 0x3c @ 0x38 = 0xc063ba71
:位置 0x30 处的 4 个字节 == 0xc063ba71
0x0 >> 0x16 & 0x3c @ 0x3b
:UDP 数据的位置 (0x3b-8) = 0x33 处的 4 个字节
0x0 >> 0x16 & 0x3c @ 0x3b && 0x000000ff
:从位置 0x33 开始的 4 个字节的最后一个字节的内容,表示位置 0x36 处(此处为最后一个)的单个字节
0x0 >> 0x16 & 0x3c @ 0x3b && 0x000000ff = 0x63
:位置 0x36 处的字节 ==0x63