以下全部來自貼吧
學校裡面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,有道字典的客戶端。
嗯,大概就這麼多了,有問題各位可以問一下。