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

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

實現(xiàn)目標

知乎上經(jīng)常有各種爆照及釣魚貼厨相,類似「胸大是一種什么樣的體驗领曼?」, 「女生有翹臀是什么樣的體驗?」等蛮穿。其實大家關心的只有照片庶骄,是不是?

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

./get.sh 胸大

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

真的是來自知乎府适。羔飞。

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

準備工作

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

工具:Mac疟暖,裝有知乎App的iPhone手機卡儒,mitmproxy,mitmdump誓篱,grep朋贬,wget。

知識儲備:http協(xié)議窜骄,python腳本锦募,基礎的安全知識。

實現(xiàn)思路

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

第二步:replay搜索request,hook請求准验,修改request參數(shù)赎线。

第三步:獲取搜索結果后,replay回答的request糊饱,hook請求垂寥,修改request參數(shù)。

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

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

動手

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

安裝mitmproxy

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

brew install mitmproxy

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

mitmproxy

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

IP地址填你Mac系統(tǒng)當前的IP戏仓,端口默認8080疚宇,記住iPhone要和我們的Mac處于同一個局域網(wǎng)中。

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

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

記錄App Request

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

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

mitmdump -w raw

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

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

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

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

mitmproxy -r raw

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

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

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

Replay Attack

經(jīng)過之前的操作,我們有了兩個原始請求文件:searchReq,detailReq昔穴。

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

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

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

class Replacer:
    def __init__(self,dst):
        self.dst = dst
    def request(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))

def start():
    parser = argparse.ArgumentParser()
    parser.add_argument("dst", type=str)
    args = parser.parse_args()
    return Replacer(args.dst)

腳本很簡單扇雕,就是將我們輸入的關鍵字urlencode下,再替換原先的參數(shù)窥摄。

我的系統(tǒng)是python 2.xx镶奉,3.xx的encode方法調(diào)用有些差別,要注意崭放。

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

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

#!/bin/bash
#replay attack
mitmdump -dd -s "./replace_query.py $1"  -znc searchReq -w searchRsp

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

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

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

如果一切正常则拷,我們會看到一段格式規(guī)范灰蛙,結構清晰的json串。類似:

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

肉眼掃描下就可以發(fā)現(xiàn)我們的目標是https://api.zhihu.com/answers/61382005隔躲。這種url是我們進入回答頁面的url摩梧,61382005應該就是我們的detail ID號。

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

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

很簡單的正則,上面的腳本就將我們的ID號統(tǒng)統(tǒng)提取出來,并寫進answers文件笙纤。執(zhí)行下打開answers文件耗溜,看看ID有木有。

Replay Answer Request

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

先看下請求的格式:

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

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

import mitmproxy
import argparse

class Replacer:
    def __init__(self,dst):
        self.dst = dst
    def request(self,flow):
        flow.request.path=flow.request.path.replace("61382005", self.dst)  

def start():
    parser = argparse.ArgumentParser()
    parser.add_argument("dst", type=str)
    args = parser.parse_args()
    return Replacer(args.dst)

很簡單的GET請求腥椒,替換ID號即可阿宅。

接著實施replay attack:

#replay attack
while IFS= read -r p; do
    #echo "$p"
    mitmdump -dd -s "./replace_url.py $p"  -znc detailReq  -w detailRsp | grep -aoE 'http[^"]*.jpg' | xargs wget -P ./magic
done < answers

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

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

brew install wget

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

#!/bin/bash
#replay attack
mitmdump -dd -s "./replace_query.py $1"  -znc searchReq -w searchRsp

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

#replay attack
while IFS= read -r p; do
    #echo "$p"
    mitmdump -dd -s "./replace_url.py $p"  -znc detailReq  -w detailRsp | grep -aoE 'http[^"]*.jpg' | xargs wget -P ./magic
done < answers

趕緊運行腳本,發(fā)揮想象力响逢,感受下知乎愛的供養(yǎng)吧蔓腐。

安全知識總結:

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

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

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

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

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

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

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

chmod +x get.sh
./get.sh 好好學習
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子厉熟,更是在濱河造成了極大的恐慌导盅,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揍瑟,死亡現(xiàn)場離奇詭異白翻,居然都是意外死亡,警方通過查閱死者的電腦和手機绢片,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門滤馍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人杉畜,你說我怎么就攤上這事纪蜒。” “怎么了此叠?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵纯续,是天一觀的道長。 經(jīng)常有香客問我灭袁,道長猬错,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任茸歧,我火速辦了婚禮倦炒,結果婚禮上,老公的妹妹穿的比我還像新娘软瞎。我一直安慰自己逢唤,他們只是感情好,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布涤浇。 她就那樣靜靜地躺著鳖藕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪只锭。 梳的紋絲不亂的頭發(fā)上著恩,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天,我揣著相機與錄音蜻展,去河邊找鬼喉誊。 笑死,一個胖子當著我的面吹牛纵顾,可吹牛的內(nèi)容都是我干的伍茄。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼施逾,長吁一口氣:“原來是場噩夢啊……” “哼幻林!你這毒婦竟也來了贞盯?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤沪饺,失蹤者是張志新(化名)和其女友劉穎躏敢,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體整葡,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡件余,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了遭居。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啼器。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖俱萍,靈堂內(nèi)的尸體忽然破棺而出端壳,到底是詐尸還是另有隱情,我是刑警寧澤枪蘑,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布损谦,位于F島的核電站,受9級特大地震影響岳颇,放射性物質發(fā)生泄漏照捡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一话侧、第九天 我趴在偏房一處隱蔽的房頂上張望栗精。 院中可真熱鬧,春花似錦瞻鹏、人聲如沸悲立。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽薪夕。三九已至,卻和暖如春叭披,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背玩讳。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工涩蜘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人熏纯。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓同诫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親樟澜。 傳聞我的和親對象是個殘疾皇子误窖,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 開車啦叮盘!一鍵爬知乎各種爆照 這是一篇嚴肅的技術分享文章,旨在向大家介紹一些網(wǎng)絡安全方面的知識霹俺,及相關工具的使用柔吼。閑...
    其實也沒有閱讀 1,336評論 0 1
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,318評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)丙唧,斷路器愈魏,智...
    卡卡羅2017閱讀 134,714評論 18 139
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向對象的用電信息數(shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,009評論 6 13
  • 毋庸置疑,《詩經(jīng)·豳風·東山》是《詩經(jīng)》中各方面都比較出色的抒情長詩之一想际,《毛詩序》中說這篇作品是士大夫為了褒揚周...
    王家人寧閱讀 1,005評論 0 0