一鍵爬知乎各種爆照(Blog)

開車啦!一鍵爬知乎各種爆照

這是一篇嚴肅的技術分享文章,旨在向大家介紹一些網絡安全方面的知識,及相關工具的使用。閑話少說,直接進入正題。

實現目標

知乎上經常有各種爆照及釣魚貼,類似「胸大是一種什么樣的體驗?」, 「女生有翹臀是什么樣的體驗?」等。其實大家關心的只有照片,是不是?

我們的目標是在終端輸入:

./get.sh胸大

就能從知乎將胸大(或者其他關鍵詞)相關的話題回答中的圖片,一鍵下載到本地的文件夾中。我試著跑了下腳本,有好多讓人看了就臉紅??的照片:

真的是來自知乎。。

著急的同學可以直接在我的公眾號(MrPeakTech)回復z,獲取可運行的腳本。

準備工作

技術手段:中間人攻擊,replay attack。

工具:Mac,裝有知乎App的iPhone手機,mitmproxy,mitmdump,grep,wget。

知識儲備:http協議,python腳本,基礎的安全知識。

實現思路

第一步:使用mitmdump記錄知乎App的搜索request,和進入回答的request。

第二步:replay搜索request,hook請求,修改request參數。

第三步:獲取搜索結果后,replay回答的request,hook請求,修改request參數。

第四步:使用正則提取回答response中的圖片url。

第五步:使用wget將圖片下載到指定文件夾。

動手

這次我們的主角是mitmproxy和mitmdump。之前我寫過一篇文章介紹如何使用mitmproxy做https抓包。這次要使用到更高階一點的功能:replay attack。建議先看下我之前那篇文章。

安裝mitmproxy

沒有安裝mitmproxy的同學可以先通過brew安裝下:

brewinstallmitmproxy

安裝好之后,在終端啟動mitmproxy:

mitmproxy

接下來需要在iPhone上設置http代理:

IP地址填你Mac系統當前的IP,端口默認8080,記住iPhone要和我們的Mac處于同一個局域網中。

如果是第一次使用mitmproxy,需要在iPhone上安裝CA證書,打開iPhone Safari,輸入地址:mitm.it,在下圖中點擊Apple安裝證書。

這樣就配置完畢了,下面我們來記錄知乎App的request。

記錄App Request

首先我們先打開知乎App,進入搜索界面:

接著啟動mitmdump,來記錄手機端的https請求,在終端輸入:

mitmdump-wraw

回車之后,手機端的請求就都會寫進raw文件了。

下面在App端輸入關鍵字「胸大」,點擊搜索,翻頁(想要結果多點,可以多翻幾頁)。

這樣我們在終端可以看到如下三個被捕捉請求。

有時候我們會捕捉到多余的請求,需要手動刪除下,可以先退出mitmdump,然后再終端輸入:

mitmproxy-rraw

進入請求的編輯界面,按d可以刪除我們不想要的請求,編輯完之后,按w會提示保持到文件,我將請求保持到searchReq文件:

在重復上面的操作,在App端點擊進入回答的操作,將單個回答的request保存到文件detailReq。

到這里我們就記錄完畢原始請求了!

Replay Attack

經過之前的操作,我們有了兩個原始請求文件:searchReq,detailReq。

接下來回放search請求,回放的時候我們還需要hook一個python腳本來修改請求參數。先看下search請求的格式,通過mitmproxy可以查看詳情:

GEThttps://api.zhihu.com/search?excerpt_len=75&q=%E8%83%B8%E5%A4%A7&t=content

這是個非常簡單的GET請求,參數格式也一目了然。而且幸運的是知乎的后臺即沒有做參數的簽名,也沒有加時間戳來防replay attack。看上去我們只需要替換q=xxx這個參數值即可。所以寫段簡單的python腳本來替換吧:

classReplacer:def__init__(self,dst):self.dst=dstdefrequest(self,flow):flow.request.path=flow.request.path.replace("%25E8%2583%25B8%25E5%25A4%25A7",urllib.quote_plus(urllib.quote_plus(self.dst)))flow.request.path=flow.request.path.replace("%E8%83%B8%E5%A4%A7",urllib.quote_plus(self.dst))defstart():parser=argparse.ArgumentParser()parser.add_argument("dst",type=str)args=parser.parse_args()returnReplacer(args.dst)

腳本很簡單,就是將我們輸入的關鍵字urlencode下,再替換原先的參數。

我的系統是python 2.xx,3.xx的encode方法調用有些差別,要注意。

這里有點奇怪的是知乎搜索翻頁的接口,將關鍵字連續urlencode了兩次,不知道有神馬講究在里面。不過不管啦,我們繼續。

寫好腳本(replace_query.py)之后,再寫個bash腳本來實施replay attack。這個腳本也是我們的關鍵執行腳本get.sh:

#!/bin/bash

#replay attackmitmdump-dd-s"./replace_query.py $1"-zncsearchReq-wsearchRsp

參數我就不一一解釋啦,大家自己看mitmproxy的官方文檔,總之這段腳本會回放存在searchReq當中的搜索請求,并執行replace_query.py當中的替換方法,最后將請求的結果存放在searchRsp文件當中。

大家可以先執行這段腳本,看看searchRsp有沒有我們想要的請求結果。

chmod+xget.sh./get.sh胸大

如果一切正常,我們會看到一段格式規范,結構清晰的json串。類似:

{"data":[{"content":{"excerpt":"也要表現出來(基本上胸大的人.在大胸的對比下腰都是細的,腰圍和胸圍一樣大的大胸……那種應該不是大胸吧.只是大胸圍而已)很多大胸妹子的誤區都是喜歡穿寬松的上衣.配合含胸.以為自己","url":"https://api.zhihu.com/answers/61382005"},

肉眼掃描下就可以發現我們的目標是https://api.zhihu.com/answers/61382005。這種url是我們進入回答頁面的url,61382005應該就是我們的detail ID號。

接下來我們需要使用grep,寫個簡單的正則提取出這些ID號。走你:

#extract answer urlcatsearchRsp|grep-aoE'https[^"]*(answers)[^"]*'|sed's/\\//g' | grep -oE '[0-9]+'? > answers

很簡單的正則,上面的腳本就將我們的ID號統統提取出來,并寫進answers文件。執行下打開answers文件,看看ID有木有。

Replay Answer Request

接下來我們按同樣的步驟回放下進入回答的請求。

先看下請求的格式:

GET https://api.zhihu.com/answers/61382005

也是個光禿禿的url,替換ID號就OK拉。上腳本(replace_url.py):

importmitmproxyimportargparseclassReplacer:def__init__(self,dst):self.dst=dstdefrequest(self,flow):flow.request.path=flow.request.path.replace("61382005",self.dst)defstart():parser=argparse.ArgumentParser()parser.add_argument("dst",type=str)args=parser.parse_args()returnReplacer(args.dst)

很簡單的GET請求,替換ID號即可。

接著實施replay attack:

#replay attackwhileIFS=read-rp;do#echo "$p"mitmdump-dd-s"./replace_url.py $p"-zncdetailReq-wdetailRsp|grep-aoE'http[^"]*.jpg' | xargs wget -P ./magicdone < answers

這段bash腳本將之前保存在answers文件中的ID號,一行行讀取出來,再通過mitmdump進行replay,并通過replace_url.py替換ID號,最后將結果經過grep過濾,xargs傳遞給wget來下載,最后文件都會下載到magic目錄下。

沒有下載wget的同學,可以先通過brew安裝下:

brewinstallwget

到這里所有的工作就完成啦,所以我們有了最后的get.sh:

#!/bin/bash

#replay attackmitmdump-dd-s"./replace_query.py $1"-zncsearchReq-wsearchRsp#extract answer urlcatsearchRsp|grep-aoE'https[^"]*(answers)[^"]*'|sed's/\\//g' | grep -oE '[0-9]+'? > answers#replay attackwhileIFS=read-rp;do#echo "$p"mitmdump-dd-s"./replace_url.py $p"-zncdetailReq-wdetailRsp|grep-aoE'http[^"]*.jpg' | xargs wget -P ./magicdone < answers

趕緊運行腳本,發揮想象力,感受下知乎愛的供養吧。

安全知識總結:

這里只是給大家提供個思路,我相信還有很多App都有類似的問題,在安全方面投入太少。

這個小工具之所以能成功,是由于:

知乎App的客戶端沒有做ssl pinning,所以可以通過中間人攻擊分析請求。

知乎Server端也沒有針對replay attack做任何防范。

大家做App還是要多注意下安全方面的東西,即使上了https,也要做多做一層加密保護。安全方面的工作,做得再多也為過。

我這個腳本對應的賬號有可能會被停了,如果失效,可以照著上面的步驟自己做一個:)

最后,溫馨提示:在公眾號恢復消息z,可以下載腳本。使用方式:

chmod+xget.sh./get.sh好好學習

歡迎關注公眾號:MrPeakTech

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 這是一篇嚴肅的技術分享文章,旨在向大家介紹一些網絡安全方面的知識,及相關工具的使用。閑話少說,直接進入正題。 實現...
    MrPeak閱讀 2,544評論 10 17
  • 簡介 用簡單的話來定義tcpdump,就是:dump the traffic on a network,根據使用者...
    保川閱讀 5,981評論 1 13
  • 一:LoadRunner常見問題整理1.LR 腳本為空的解決方法:1.去掉ie設置中的第三方支持取消掉2.在系統屬...
    0100閱讀 4,211評論 0 11
  • 春風可知道? 在他未曾到過的遠方, 有一顆楊柳, 在默默祈禱期待, 他的到來。 楊柳可明白? 在她未曾了解的遠方,...
    瑾怡軒閱讀 107評論 0 1
  • 尊敬的老師,各位家長你們好,我是倪灝的媽媽。 孩子初入小學,作為家長我是既期待又擔心,期待他在新環...
    香香愛倪灝閱讀 282評論 0 0