找回密码
 FreeOZ用户注册
查看: 4927|回复: 45
打印 上一主题 下一主题

[新技术交流] 张生和崔莺莺偷情原理详解

[复制链接]
跳转到指定楼层
1#
发表于 15-3-2010 14:56:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
[size=1em]FROM: somewhere
[size=1em]待月西厢下,迎风户半开。隔墙花影动,疑是玉人来。
[size=1em]最近推上最流行的一个关键词是”西厢计划”, 这个计划名字取得很浪漫,客户端叫做张生,对,就是西厢记里面那个翻蔷去见崔莺莺小姐的张生;显然,服务器端必然叫做崔莺莺。客户端的张生是最重要的部件,可以不依赖于服务端工作。因为西厢计划的作者只是简要的介绍了一下原理,其他报道又语焉不详,我当时就觉得很好奇,花了昨天一个晚上详细读了一下源代码,终于知道怎么回事了,觉得原理非常漂亮,所以写篇文章介绍总结一下。
[size=1em]先说大方向。大家都知道,连接被重置的本质,是因为收到了破坏连接的一个 TCP Reset 包。以前剑桥大学有人实验过,客户端和服务器都忽略 Reset, 则通信可以不受影响。但是这个方法其实只有理论价值,因为绝大多数服务器都不可能忽略 Reset 的 (比如 Linux, 需要 root 权限配置iptables, 而且这本身也把正常的 Reset 给忽略了)。只要服务器不忽略 Reset, 客户端再怎么弄都没用,因为服务器会停止发送数据,Reset 这条连接。所以,很多报道说西厢计划是忽略 Reset, 我从源代码来看应该不是这样。在我看来,西厢计划是利用了墙的一个可能的弱点–墙只在连接发起的时候把一个 TCP 连接加入监听序列,如果墙认为这个连接终止了,就会从监听序列中去掉这条记录,这样,这条连接上后续的包就不会被监听。西厢计划就是让墙“认为”这个连接终止的一个绝妙的方法。只要墙认为这个连接两端都是死老虎,墙就不会触发关键词检测,其后所有的数据,都不存在连接被重置的问题了。
[size=1em]如何让一个连接置之死地而后生,就是西厢计划那帮黑客神奇的地方了。这也不是一日之功。 首先,这帮牛人发现,墙的是一个入侵检测系统,把含有关键字的包当成一种“入侵”来对待。采取这种设计有很多好处,但缺点是入侵检测系统可能具有的问题,墙都可能有。西厢计划主页上那篇著名的论文就是讲这些七七八八的漏洞的。可以说处理这些七七八八的漏洞是非常困难的,迫使墙的设计者“拆东墙,补西墙”。这样补来补去,外表看起来好像很牛逼的墙,其实有很多本质上无法简单修补的漏洞,其中有一个致命的,就是 TCP 连接状态的判定问题。 出于入侵检测系统这种设计的局限,墙没有,也没办法准确判定一条 TCP 连接的状态,而只是根据两边收到的数据来“推测”连接的状态。而所有的关键词检测功能,都是基于“连接还活着”的这个推测的结果的。因为墙的规则是在连接发起的时候开始对这条连接的检测,在连接终止的时候停止对这条连接的检测,所以,一旦对连接的状态推测错误,把还活着的连接当成已经关闭的连接,墙就会放弃对这条连接上随后所有的包的检测,他们都会都透明的穿过墙的入侵检测。
[size=1em]上面只是想法,具体到 TCP 协议实现这一层,就要只迷惑墙,还不能触及我要通信的服务器。最理想的情况下,在任何有效通信之前,就能让墙出现错误判断,这些,就需要对 TCP 协议有深刻理解了。西厢计划的那帮黑客,居然真的去读 TCP 几百页的 RFC,还居然就发现了方法(这里我假设读者都知道 TCP 的三次握手过程和序列号每次加一的规则)。 我们都知道,三次握手的时候,在收到服务器的 SYN/ACK 的时候,客户端如果发送 ACK 并且序列号+1 就算建立连接了,但是客户端如果发送一个序列号没 +1 的 FIN (表示连接终止,但是服务器知道,这时候连接还没建立呢, FIN 这个包状态是错的,加上序列号也是错的,服务器自己一判断,就知道这个包是坏包,按照标准协议,服务器随手丢弃了这个包), 但这个包,过墙的时候,在墙看来,是表示连接终止的(墙是 ma de in china, 是比较山寨的,不维护连接状态,并且,墙并没有记下刚才服务器出去的 SYN/ACK 的序列号,所以墙不知道序列号错了)。所以,墙很高兴的理解为连接终止,舒了一口气去重置其他连接了, 而这个连接,就成了僵尸,墙不管你客户端了,而这时候,好戏才刚刚开始。
[size=1em]事实上,墙是双向检测的(或者说对每个包都检测的),因此,对服务器和客户端实现相同的对待方法,所以,墙不管客户端还不行,假如服务端有关键词传给客户端,墙还是有可能要发飙的(这里说有可能,因为我也不知道)。所以,最好的办法就是,让服务端也给墙一个终止连接的标志就好了。可是这个说起来简单,做起来难,怎么能让不受自己控制的服务器发一个自己想要的包呢? 西厢计划的那帮黑客,再次去读几百页的 RFC, 令人惊讶的发现,他们居然在 RFC 上发现了一个可以用的特性。我们上面说了,三次握手的时候,在收到 SYN/ACK 后,客户端要给服务器发送一个序列号+1 的ACK,可是,假如我不+1呢,直接发 ACK 包给服务器。 墙已经认为你客户端是死老虎了,不理你了,不知道你搞什么飞机,让这个 ACK 过了。可是服务器一看,不对啊,你给我的不是我期待的那个序列号, RFC 上说了,TCP 包如果序列号错了的话,就回复一个 Reset. 所以,服务器就回复了一个 Reset。这个 Reset 过墙的时候,墙一看乐了,服务器也终止连接了,好吧,两边都是死老虎了,我就不监听这条连接了。而至于客户端,这个服务器过来的 Reset 非常好识别,忽略就是。随后,客户端开始正确的发送 ACK, 至此,三次握手成功,真正的好戏开始,而墙则认为客户端和服务器都是死老虎,直接放过。所以,张生就这样透明的过了墙。 至于过墙以后所有的事情,《西厢记》里面都有记载,各位读者自行买书学习。
[size=1em]现在的西厢计划客户端,即“张生”模块的防连接重置的原理就是这样,服务器端,即莺莺模块的实现也是类似的。防DNS那个,不懂 DNS 协议,所以看不懂。我猜想,因为开发人员都是黑客,所以自然喜欢用最经得起折腾和高度定制的 Linux 开发。 现在看西厢计划的实现,因为依赖于 Linux 内核模块 netfilter, 在 Linux 上如鱼得水,但往其他平台的移植可能是个亟待解决的问题。 我觉得,在其他平台上,可以通过 libpcap 和 libnet ,在用户态实现相同的功能,就是有点麻烦而已,有兴趣的懂网络的可以照西厢计划原理,在家自行做出此功能;当然,全中国人民都用 Linux 最好
[size=1em]PS 1: 据说是西厢计划一个作者画的原理图:http://img.ly/DIi
PS 2: 我对 TCP 的理解仅限于课本,如果上面的对技术的理解有错,请大家指出。
PS 3: 有些漏洞,可能是设计上本质缺陷,不是那么容易修复的。
PS 4: 除了最后一个图,本文没有其他相关链接,如需相关资料,自行 Google。

评分

参与人数 3威望 +75 收起 理由
MillerYang + 35 你太有才了!
Port_1433 + 20 谢谢分享!
alphabeta + 20 谢谢分享!

查看全部评分

回复  

使用道具 举报

2#
发表于 15-3-2010 15:09:50 | 只看该作者
如果不能实现在windows上面的傻瓜化,估计也就是搞IT的会用用。
回复  

使用道具 举报

3#
 楼主| 发表于 15-3-2010 20:05:23 | 只看该作者
回复  

使用道具 举报

4#
发表于 15-3-2010 21:23:55 | 只看该作者
有意思有意思
回复  

使用道具 举报

5#
发表于 15-3-2010 21:49:21 | 只看该作者

而这,仅仅是计划公布不到1周的时间的事情,科学家写出了公式就行了,剩下的就是工程师的事情了,就像爱因斯坦不用亲自弄核反应堆一样
回复  

使用道具 举报

6#
发表于 16-3-2010 08:23:54 | 只看该作者
我有个疑问,原理都公开了,造镪的人不是可以很容易把这个漏洞堵上?
回复  

使用道具 举报

7#
 楼主| 发表于 16-3-2010 09:34:39 | 只看该作者
原帖由 四香油饼 于 16-3-2010 08:23 发表
我有个疑问,原理都公开了,造镪的人不是可以很容易把这个漏洞堵上?

2008年7月tek4小组建立:
作为个搞技术的人,我们要干点疯狂的事。如果我们不动手,我们就要被比我们差的远的坏技术人员欺负。这太丢人了。眼前就是,GFW这个东西,之前是我们不抱团,让它猖狂了。现在咱们得凑一起,想出来一个办法让它郁闷一下,不能老被欺负吧。要不,等到未来,后代会嘲笑我们这些没用的家伙,就象我们说别人“你怎么不反抗?”
之后一个月几篇显著的文章出现:译言的《如何忽略防火长城》,周曙光的《Zola教你玩:如何对抗GFW的域名劫持》,Robert Mao的《关于墙的技术讨论》 ,预言“射击墙的理论已经几乎要进入实战”。
之后tek4小组又参与了绿坝娘推倒作战,提供几份重要文档的来源。再之后GFW的实体被匿名网民进一步揭露,方滨兴浮出水面。
时至今日,经过大家的努力,GFW的实体、结构、工作方式、弱点已经全部暴露在阳光之下,穿墙方法和DDoS规划方法也已经成熟。我们作为已经解散的tek4小组的一个分支,研究实际上在很早之前就已经结束,在花费大量时间编写文档、整理文献和验证实验数据之后,终于到了展示实战方法的时候,当初人们提出的设想也在这里得到了令人满意的答复。在这一部分完成之后我们也将解散。
这就是:西厢计划




FROM:(demo@virushuo http://blog.devep.net/virushuo/2010/03/15/post_71.html
强烈推荐阅读youxu这篇原理分析的文章,写得相当好懂,读的过程中解答了我两个疑问,读完想明白了,写这里做笔记了。

一 墙是不是经过简单升级就可以对付西厢

西厢其实并没有对墙做任何事,只是巧妙的利用了TCP协议的规则。正如墙利用了三次握手的不校验这个特点(这不是漏洞,而是特点)强行插入reset包一样,西厢也利用了这个特点,让客户端和服务器发送出了墙希望看到的数据包。这里的强大之处在于,一切都是在规则之内的。所以说,如果我们从更高的角度看来,墙和西厢是一种东西,TCP协议如果进行了校验,那就不会有西厢,同样也不会有墙。如果没有墙,也不会有西厢这种用法

二 墙能用什么办法来对付西厢

TCP协议的三次握手而不校验,留下了可以被强行插入包这个弱点,产生了墙。这个地方这样处理的原因主要是为了性能。TCP是一种高性能协议,所以必须以信任为基础,不能做太多的干涉,否则性能就会大大下降。所以我们目前采用的TCP协议都不对包做什么校验。如前面所说,西厢同样利用了这个特点来获得所需要的数据包。墙如果想知道那些连接是真的断开,哪些是被西厢模拟断开,就必须维护连接状态,进行深度包检测。这样一来效率就会大大下降。众所周知,如果一个系统中存在一个点,可以令系统性能大大下降,会出现什么结果

三 其他系统是否有移植机会

从现在的情况看来,代码并不复杂。整个系统的难度其实在于对TCP协议的深入了解,对墙工作原理的深入了解。这些部分完成之后,原理并不复杂。

可以把目前的alpha版本看作一份用代码写成的论文,其中是详细的论证过程。从代码的wiki看来,原作者据说不继续开发了,不过没关系,论文写完了,其实也就不需要他们那么nb的人来写产品了。您总不指望着科学家来做产品吧?

至于最终的产品,就期待别人了。熟悉网络开发的人,估计很快就可以写出来各种版本了。期待。

不知道我说的对不对,欢迎大家讨论。


回复  

使用道具 举报

8#
发表于 16-3-2010 09:50:43 | 只看该作者
回复  

使用道具 举报

9#
发表于 16-3-2010 10:16:40 | 只看该作者
期待流氓集团全面IP过滤(白名单?)的正式运行
回复  

使用道具 举报

10#
发表于 16-3-2010 12:07:38 | 只看该作者

回复 #9 alphabeta 的帖子

会有那么一天的。
回复  

使用道具 举报

11#
 楼主| 发表于 16-3-2010 13:45:27 | 只看该作者
回复  

使用道具 举报

12#
发表于 16-3-2010 13:50:22 | 只看该作者
不懂,墙认为连接断了还转发包吗?
回复  

使用道具 举报

13#
发表于 16-3-2010 13:51:01 | 只看该作者
哦,我用硬墙的
回复  

使用道具 举报

14#
 楼主| 发表于 16-3-2010 14:11:24 | 只看该作者
原帖由 michaelchin 于 16-3-2010 13:50 发表
不懂,墙认为连接断了还转发包吗?
答案在文中
回复  

使用道具 举报

15#
发表于 16-3-2010 14:23:49 | 只看该作者
不是墙不愿意补上这洞,实际上我们说的墙和真正的防火墙是有非常大的区别,真正的防火墙是在线部署的方式,就是串接在链路上。而GFW其实一个旁路的IDS,通过reset包来进行阻断,所以它并没有像真正的防火墙一样维护一个状态表,所以可以采用西厢计划中的方式绕过。如果GFW为了补上这个洞采用串接的部署方式基本上是不可能的,目前防火墙根本无法达到这个性能要求,而且阻断策略的配置也异常的麻烦。
这个计划应该会给墙带来非常大的麻烦,除非它全部转向路由黑洞方式来处理,但这样也只能封IP不能阻断关键字。

评分

参与人数 1威望 +35 收起 理由
MillerYang + 35 难得看到你清醒的时候啊。。。

查看全部评分

回复  

使用道具 举报

16#
发表于 16-3-2010 14:24:38 | 只看该作者
终于看明白了,说那个墙呢,我还以为说所有的墙呢
回复  

使用道具 举报

17#
发表于 16-3-2010 14:26:11 | 只看该作者
人家把路游表一改,世界就清静了
回复  

使用道具 举报

18#
发表于 16-3-2010 14:32:58 | 只看该作者
路过学习一下。。。期待卡通解释版
回复  

使用道具 举报

19#
发表于 16-3-2010 14:37:10 | 只看该作者
原帖由 michaelchin 于 16-3-2010 15:23 发表
不是墙不愿意补上这洞,实际上我们说的墙和真正的防火墙是有非常大的区别,真正的防火墙是在线部署的方式,就是串接在链路上。而GFW其实一个旁路的IDS,通过reset包来进行阻断,所以它并没有像真正的防火墙一样维护一 ...

不是我写的,抄来的
回复  

使用道具 举报

20#
发表于 16-3-2010 14:37:48 | 只看该作者
我还以为技术革命呢,白白兴奋了一场
回复  

使用道具 举报

21#
发表于 16-3-2010 14:39:32 | 只看该作者
用VPN看youtube不行吗?
回复  

使用道具 举报

22#
 楼主| 发表于 16-3-2010 14:42:26 | 只看该作者
原帖由 michaelchin 于 16-3-2010 14:39 发表
用VPN看youtube不行吗?

可以的,移民之后看youtube也行的,连VPN也不用了
回复  

使用道具 举报

23#
发表于 16-3-2010 14:45:54 | 只看该作者
原帖由 coredump 于 16-3-2010 15:42 发表

可以的,移民之后看youtube也行的,连VPN也不用了

问题是我现在也没看出来youtube有啥好看的
我流量还少,基本不看
回复  

使用道具 举报

24#
发表于 16-3-2010 14:46:34 | 只看该作者
英雄能支个招怎么欺骗宽带流量统计吗?
回复  

使用道具 举报

25#
 楼主| 发表于 16-3-2010 15:17:03 | 只看该作者
原帖由 michaelchin 于 16-3-2010 14:45 发表

问题是我现在也没看出来youtube有啥好看的
我流量还少,基本不看

那就不看啊,这边很自由的,没人逼着看,我就不常看,起码从来没有逼着自己看

facebook也很少用,twitter从来不用

当然我知道如果我想用,我就可以用,这点比较重要而已

评分

参与人数 1威望 +25 收起 理由
MillerYang + 25 你太有才了!

查看全部评分

回复  

使用道具 举报

26#
 楼主| 发表于 16-3-2010 15:18:32 | 只看该作者
原帖由 michaelchin 于 16-3-2010 14:46 发表
英雄能支个招怎么欺骗宽带流量统计吗?
不去看那个数字,安慰自己流量根本没用完就行了
回复  

使用道具 举报

27#
发表于 16-3-2010 15:20:35 | 只看该作者
原帖由 coredump 于 16-3-2010 16:18 发表
不去看那个数字,安慰自己流量根本没用完就行了

俺用超了要断网的...
回复  

使用道具 举报

28#
 楼主| 发表于 16-3-2010 15:21:46 | 只看该作者
原帖由 michaelchin 于 16-3-2010 15:20 发表

俺用超了要断网的...

那就假装是因为海底光缆断裂了
回复  

使用道具 举报

29#
发表于 16-3-2010 15:23:01 | 只看该作者
原帖由 coredump 于 16-3-2010 16:21 发表

那就假装是因为海底光缆断裂了

俺是无线宽带
回复  

使用道具 举报

30#
发表于 16-3-2010 15:23:40 | 只看该作者
倒是可以假装黑子风暴
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+10, 26-4-2024 14:15 , Processed in 0.062446 second(s), 52 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表