发信人: ilyyz()
整理人: (2000-06-14 13:07:39), 站内信件
|
涉及程序:
防火墙或者检测系统,RTSD(Real Time Scan Detecter)是典型
描述
"空位攻击"可以欺骗大多数检测系统从而使攻击包绕过防火墙
详细
"空位攻击" 可以欺骗大多数检测系统从而使攻击包绕过防火墙
请参看
http://www.cnns.net/frankie/mirror/rfcs/files/rfc793.txt关于TCP包结构的
定义。
实际上,TCP包头只有6个控制信息位(control bits): URG,ACK,PSH,RST,SYN,FI
N
URG---包含在紧急字段中的数据,很重要,不能忽略
ACK---包含在确认字段中的数据,同上重要
PSH---推送功能
RST---重置连接
SYN---使序列号同步
FIN---数据从发送端发送完毕
然而,tcp.h头文件中为 TCP包头定义的变量是u_char类型,具有1个字节的长度
(8bits),从而有两个空位。
@(#)tcp.h 8.1 (Berkeley) 6/10/93
*/
typedef u_int tcp_seq;
/*
* TCP header.
* Per RFC 793, September, 1981.
*/
struct tcphdr {
u_short th_sport; /* source port */
u_short th_dport; /* destination port */
tcp_seq th_seq; /* sequence number */
tcp_seq th_ack; /* acknowledgement number */
#if BYTE_ORDER == LITTLE_ENDIAN
u_char th_x2:4, /* (unused) */
th_off:4; /* data offset */
#endif
#if BYTE_ORDER == BIG_ENDIAN
u_char th_off:4, /* data offset */
th_x2:4; /* (unused) */
#endif
u_char th_flags;
#define TH_FIN 0x01
#define TH_SYN 0x02
#define TH_RST 0x04
#define TH_PUSH 0x08
#define TH_ACK 0x10
#define TH_URG 0x20
u_short th_win; /* window */
u_short th_sum; /* checksum */
u_short th_urp; /* urgent pointer */
};
# 还有更多....
从上面红色的代码,我们看到 th_flags 是一个 u_char的8位数据类型,但只定
义了6个信息位,还有两个空数据位:
|unused|unused|URG|ACK|PSH|RST|SYN|FIN|
而 tcp.h中TH_SYN 的值为 0x02,体现为bit就是: |0|0|0|0|0|0|1|0|
以检测SYN攻击为例,比较下面两个 if 语句(这是典型的SYN检测程序的代码,检
测净SYN的包):
i) if ( flag == TH_SYN )
ii) if ( flag & TH_SYN ) /* 按位与 */
(TH_SYN->SYN flag)
i)只有当syn位设置为1时if语句为真
即flag的值为 0x2,体现为bit形式就是: |0|0|0|0|0|0|1|0|
ii)而第二个语句是将 |0|0|0|0|0|0|1|0|的SYN常量值与 flag进行按位与操作。
只要flag的SYN位被设置为1时才为真。
在通常情况下,如果SYN被设置为1,则两个语句都为真。
但如果黑客把两个最高位(空位)设置为1,则第一个if语句为假,而第二个if语句
为真
使用第一种if语句的软件,就检测不到SYN攻击。这个包头其它几个控制位都是0
,而只有SYN位是1。
结论:检测系统代码在设置TCP包头的flags值为给定值的时候,必须把最高两位空
位清0。
解决方案
在检测系统计算flag值之前的代码,插入如下一句:
flag = flags & 0x3f;
相关站点
http://www.cnns.net/frankie/mirror/rfcs/files/rfc793.txt
-- ※ 修改:.ilyyz 于 Feb 23 17:11:15 修改本文.[FROM: 202.96.191.124] ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.96.191.124]
|
|