【bb平臺刷課記】wireshark結合實例學抓包javascript
背景:本校形勢與政策課程課須要在網上觀看視頻的方式來修得學分,視頻網頁自帶「播放器不可快進+離開窗口自動暫停+看完一集解鎖下一集(即不能同時刷多集)」的神奇技能,鑑於視頻一共有十多集每集30多分鐘,廣大學子苦不堪言(此乃背景~)java
身爲技術人,固然不能容忍這種浪費時間的事情發生!時間是最寶貴的應該用來學習!學習!學習!(滑稽)因此我最初作了一個基於按鍵精靈+圖像識別的小(刷)助(課)手(器),可是明顯缺點就是課雖然能自動刷了,可是電腦要一直掛着,不能幹別的事。什麼?!長達幾個小時的刷課時間裏面不再能動電腦?!是可忍孰(叔)不可忍!web
最近偶然獲得一神器,不只能自動完成上述過程並且速度快得驚人,如此黑科技,必須得弄懂原理!心癢癢地因而乎開始了今天的分析之旅~json
----我是萌萌的分割線-----瀏覽器
首先觀察小(刷)助(課)手(器)的工做流程:服務器
圖一:打開時軟件內嵌瀏覽器會訪問網上授課系統的登陸頁面網絡
防止查水錶,暫且把登陸地址叫作 http://bb.bilbil.edu.cn/(這固然不是真的)app
圖2:輸入帳號密碼後跳轉到一個頁面webapp
我在瀏覽器模擬了一下,獲得跳轉後地址爲http://bb.bilbil.edu.cn/webapps/portal/frameset.jsp?tab_tab_group_id=_2_1jsp
圖3點擊開始觀看,等待進度條結束後,提示觀看完畢....
而後我去查看了一下,果真十幾集的視頻都解鎖完畢了(這時還不能肯定只是僅僅解鎖了,仍是真的已經觀看完了)
懷着心裏的竊喜和愧疚,我一集集地把進度條從新從0%到100%拉了一下,以防沒有觸發「觀看完畢」的服務器提交~(後面證明不必)
開始思考和分析:
根據流程走下來,破解的關鍵就在弄清楚於第三步進度條在走的時候,軟件和服務器之間發生了什麼屁眼交易。
此時就要祭出神器wireshark
Wireshark_百度百科
Wireshark(前稱Ethereal)是一個網絡封包分析軟件。網絡封包分析軟件的功能是擷取網絡封包,並儘量顯示出最爲詳細的網絡封包資料。
首先要知道,wireshark會把電腦全部的包一塊兒抓過來(qq、360、瀏覽器等)但咱們只要電腦與在線課堂的服務器之間收發的數據包。
因此第一步:用命令行ping bb.bilbil.edu.cn ,獲得在線課堂服務器的ip地址 202.103.223.101
第二步打開Wireshark開始抓包,並設置過濾條件 http && ip.addr==202.103.223.101
第三步打開刷課器,重複一遍刷課的過程,此時Wireshark窗口會顯示與202.103.223.101通訊過程當中 抓到的數據包(這裏只關心http協議的包)
若此步Wireshark窗口沒任何包那多是網卡沒選對,從新選要抓包的網卡
第4步分析數據,這裏最讓人頭疼,我會盡可能詳細講
首先這裏有個竅門,注意第1列no,是按時間順序遞增的序號,在刷課軟件操做時,每按一下操做,記錄一下當時的No號,有利於分析的時候知道哪些數據包是什麼操做觸發的,能節省不少時間。
我記錄得
操做 | 點擊登陸 | 點擊刷課 |
No | 314~4771 | ~5761 |
因此選取登陸完畢後點擊刷課以前看起,也就是從序號爲4771的包看起(節省沒必要要的時間)
看到下面有規律的數據包不斷重複,猜想正是裏面的內容能把一個一個的課刷完。分析序號5227到5245之間的包(爲一個重複週期)估計就能明瞭
包5227
POST /webapps/bb-floatMediaGuiLin-bb_bb60/execute/mediaLog?cmd=initLog&course_id=_1083_1&folderParentId=0 HTTP/1.1\r\n
關鍵看這句,post後面的是數據接收地址和一些參數,數據是 video_id=_144_1
收到回覆包5245
回覆是一段json:{"timer":0,"status":1,"videoId":"_144_1","logid":"_503659_1"} (暫時不知道做用是什麼,繼續看下一個包)
包5247
post到POST /webapps/bb-floatMediaGuiLin-bb_bb60/execute/mediaLog?cmd=videoEndPlay HTTP/1.1\r\n
數據是videolog_id=_503659_1&video_id=_144_1(這裏不正好是上一包接收到的json值嗎)
因此上一個post爲了得到videolog_id=_503659_1,而video_id=_144_1是一直知道的(應該就是標記不一樣集的視頻),
而將這兩個值POST到execute/mediaLog?cmd=videoEndPlay ,字面一看就明白了,是模擬播放完成瀏覽器給服務器發送的標誌。
重複看下一個週期的包5251~5265,只有video_id在改變,以上猜測是正確的。
至此分析結束
實戰!重放攻擊
以上都是純理論分析,好多童鞋要說,分析頂個鳥用!實在地本身動手作一次纔是王道!下面就帶你們一塊兒來實驗一下個人猜測是否正確~~
1.根據以上猜測,主要實施手段就是POST,既然是post,直接就用js代碼就能夠完成
下面貼出我本身寫的驗證代碼(懂js的童鞋看看就明白是什麼回事了)
var xml = new XMLHttpRequest(),res=''; var url = "/webapps/bb-floatMediaGuiLin-bb_bb60/execute/mediaLog?cmd=initLog&course_id=_1083_1&folderParentId=0"; xml.open('POST', url, true); xml.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xml.onreadystatechange = function () { if (xml.readyState == 4) { if (xml.status == 200) { //console.log(xml.responseText); res = eval('(' + xml.responseText + ')'); // console.log("videolog_id="+res.logid+"&video_id="+res.videoId); var url = "/webapps/bb-floatMediaGuiLin-bb_bb60/execute/mediaLog?cmd=videoEndPlay"; xml.open('POST', url, true); xml.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xml.onreadystatechange = function () { if (xml.readyState == 4) { if (xml.status == 200) { console.log(xml.responseText); }}} xml.send("videolog_id="+res.logid+"&video_id="+res.videoId); }}} xml.send("video_id=_144_1");//刷第一個視頻填_144_1,第二個視頻就填_144_2如此類推
食用方法:複製代碼,登陸好你本身的帳號,打開瀏覽器控制檯,往console裏面粘貼,回車後等待一下,刷新頁面!!刷新頁面!!刷新頁面!!再回到視頻播放頁,第一個視頻已經解鎖\播放完畢。
碼字不易,樂在分享,在技術奮鬥路上的童鞋共勉~
完結、撒花~
啓示:爲免糾紛,本文所用的ip地址和網址均爲杜撰,旨在交流技術,咱們都是好孩子~不玩火
19:53更新 一鍵刷課書籤版,右鍵-複製連接-保存爲書籤