从贴吧看的逆向网络协议过程逆向校园网客户端

以下全部来自贴吧

学校里面linux不能上网,这个是个大问题,当时影响很大,直接导致了很多不良后果,linux用户锐减就不说了,学校有很多linux服务器,在校园网上要联网做运算,很多网络实验等等根本做不了,还有就是校内的网站根本入不了网,给全校师生带来极大的不良影响。就是因为信息处的失职,当然当时的信息处处长现在已经回家看孩子去了。
你要解决这个问题,就要涉及到有些人的龌龊的事情要曝光,有些人就要捍卫自己的无知,名誉和饭碗,所以,这不是一个简单的问题。剩下的技术当然是最简单了。当时我校的开源社区还未出名,就是经此一战,名声大噪。确实也是保卫了学校使用linux的小伙伴的权益。
其实,这个事情要是真闹起来,他们根本不占理,所以他们不愿意闹,我们也就是到校长那里安静的座谈了一下,然后问题就解决了。但是!前提是你要先从技术上解决这个问题,然后才能在扯皮中彻底堵住他的嘴,要不然,他们实在不行就给校长摆困难,这个是无法实现的,那不就全扯淡了么。最后只能证明这个事情是可以解决的,只不过他们不愿意解决而已,校长让你拿方案,你要拿得出来才行。所以下面讲的就是我们拿出来的切实可行的方案。
第一部分,也是最困难的部分,也是最有意思的部分,为了保持我讲的系统性,很多都不会展开,那么各位可以通过这些关键字自己去搜索一下。
第一部分,就是把windows下的上网认证客户端要移植到linux下!
这里涉及到的技术叫做网络协议逆向,protocol inverse 和程序逆向差不多,只不过是逆向网络协议而已,有系统的方法。当时luma QQ就是逆向了QQ协议,迅雷的协议也被逆向过。

特别的,有些人认为wincap是windows专有的,其实不是他是从linux下libpcap移植过去的。谢谢。很多工具都是这样从linux或是gnu上移植过去改个名字,然后很多人就认为windows工具多好用了。呵呵--。相反,windows就没啥工具好用到可以移植到linux上,多可悲。

操作步骤大概是这样的,
现在windows上安装你的客户端,然后安装wireshark的windows版本,wireshark也是linux下的工具被移植到了windows上。然后打开wireshark监听你的查网线的那个网口,记住一定查网线!这是血的教训。要不然你是听不到回包的!
然后运行你的上网客户端,进行认证,不要进行其他操作,过上一会儿,然后到wireshark上把那些包信息存起来。然后再重新监听端口,然后再断掉认证。把包再存一份。
好了原始数据的采集工作完了,windows可以扔了,我们回到linux下。

在linux下,还是打开wireshark,把刚才那两个包的第一个包打开。然后认真的观看里面的协议。
里面会看到这些情况,就是还没开始认证的时候,会有一些路由器给你发的包,还有就是广播的包,这些会有一些简单重复的,协议并不多,2~3个吧。其实这里有些协议已经可以看出来了,比如h3c协议,他会主动的给连入的设备发一些包。上面有具体协议的版本。
然后等你认证的时候就开始一种集中的全新的协议,密集的对话,找到对话的源和目的,因为认证协议都是从你开始发出的,所以按照会话发生的source来过滤掉无用的包,过滤无用的包还是很重要的,这可以使你的逆向过程变得效率更高。
然后就是精确定位,可以搜索关键字,比如username password passwd这样的关键字,找到那个协议。
确定了协议就可以进入下一步了。去找这个协议的白皮书。任何一种网络协议都可以找到白皮书,认证协议基本上都是802.1x类协议的变种。比如锐捷的 h3c inode的pppoe的。

然后开始一些简单的学习,根据白皮书把整个协议的流程在纸上画一下把整个流程先搞懂,然后回到我们监听来的那些包。尽量的找到那些过程。适当的做一些标注。
情况一:这里如果是很常规的情况,没有做任何改动,那么基本上就是按照协议来的。
情况二:如果有些包找不到,或是传输的东西和协议里面写的不一样,那么这些就是他改造的部分。但是基本上包结构都是知道的。

 

情况一:去找一些相关协议的实现,或是已经搞好的客户端,来试一试吧,应该就能搞定了,尝试的时候一定开着wireshark,如果出现错误,先看错误的回文,错误号是多少,根据白皮书去查找错误号,再拿wireshark监听的包进行对比。找到出现错误的那个点,然后继续深入。也就是和情况二一样了。
情况二:先努力定位出到底错在哪个包上,错在什么阶段,由于什么发生的错误。比如当时我们写ruijieclient的时候发现需要整个二进制软件的md5值,我们就回到windows下把那个md5值又去回来了。后来是动态的,那么我们就把整个那个二进制包复制回来,以供校验的时候当样本。
还有就是很多特定的信息,比如版本号,客户端号什么的都可以从在windows下监听来的包构造而成。
还有我们发现认证上去之后会自动掉线,后来长时间的监听发现有心跳包,我们就把心跳包存出来,然后每隔一段时间就把这个克隆过来的二进制包发一遍就好了。
还有一些特殊的算法,这个需要定位后,结合认证程序的逆向,把那个特殊算法逆向过来,然后用C重写一下就好了,省事的话可以直接嵌入汇编就好了。当时逆向易讯客户端的时候,我们就研究那个改动的地方,我们三个人,研究了一个星期,终于测试成功了。我们把相关的代码都复印出来在纸上用笔做标注。

最开始搞的是锐捷的,我们写的是ruijieclient后来有了mentohust 就都用那个了。ruijie比较简单啦,基本上都是按照802.1x 协议来的,就是要把学校的认证服务器的地址什么的改一下就好了。
后来到了研究生去老校区,逆向的h3c 的inode ,也是比较标准的。现在这个项目还在github上叫做xdh3c还有人把他搞到openwrt上了。
然后就是家属院开始是锐捷后来改成了pppoe所以就直接标准的pppoe就好了。
然后是易讯,那个我没参见,但是逆向代码我帮了一小段。那个是pppoe改的。

开始把我们写的客户端定成非法客户端,把所有使用linux的人定成非法用户。
我们学校每年要给社会贡献很多linux的高手,都是在为国家做贡献,信息处当时够牛气吧。当时我们跟校长反应也是因为会影响本科就业和科研教学。所以,当时就解决了。
现在好了,行政问题解决了我们有多种方式了。可以通过网页认证,我们开源社区写的客户端也是官方认证的客户端了,还可以固定ip免客户端登陆。形式多样。信息处也不嚣张了。


好了,基本上讲完了。

哦,对,还有,后来网页认证了之后,我们发现有些服务器没有图形界面,当然连显示器其实都没有。
于是我们写了一个认证脚本,模拟浏览器通过网页来认证。
大概思路差不多,只不过工具不太一样。
我比较熟悉firefox,所以就用firefox举例子了,firefox有个插件叫做httpfox,打开这个插件,开始监听,然后通过网页认证。然后再等上一会儿,再退掉认证。
根据httpfox记录下来的那些http操作序列,构造agent,cookie,url然后再用python,将整个过程模拟一遍,搞定。
这个东西,我写了一个早上就搞定了,这个项目叫做xd-script 好包括上网流量查询和查成绩等等功能,后来我把它扩展了,就做了一个openyoudao,有道字典的客户端。


嗯,大概就这么多了,有问题各位可以问一下。

 

原文地址:https://www.cnblogs.com/reddusty/p/5392494.html