基于mitmproxy實(shí)現(xiàn)web被動(dòng)掃描代理

mitmproxy模塊提供的使用方式是使用命令行來(lái)開(kāi)一個(gè)代理,這里用python代碼調(diào)用mitmproxy的方法馋劈,開(kāi)一個(gè)代理攻锰,獲取請(qǐng)求信息晾嘶,并添加到隊(duì)列中妓雾,供后續(xù)掃描使用。

本文使用的環(huán)境:

Python 3.7.0
mitmproxy 5.2

安裝

安裝:pip install mitmproxy垒迂。依賴多械姻,國(guó)內(nèi)安裝慢,建議用國(guó)內(nèi)鏡像來(lái)安裝:pip install -i https://mirrors.aliyun.com/pypi/simple/ mitmproxy

啟動(dòng)代理

可以直接用:

from mitmproxy.tools.main import mitmdump
mitmdump(args="--listen-port=6666 -m upstream:127.0.0.1:8080 --proxyauth=root:root".split(" "))

來(lái)啟動(dòng)代理机断,args參數(shù)跟調(diào)用mitmdump命令時(shí)傳的參數(shù)一樣楷拳。因?yàn)槠鸪踉诰W(wǎng)上搜,搜到的是另一段代碼吏奸,所以沒(méi)用這種簡(jiǎn)潔的方式欢揖,用的是:

#!/usr/bin/python3
# -*-coding:utf-8-*-

import time
import queue
from multiprocessing import Process, freeze_support, Queue

from mitmproxy import proxy, options
from mitmproxy.http import HTTPFlow
from mitmproxy.tools.dump import DumpMaster


class Handler:
    """
    將請(qǐng)求加入隊(duì)列
    """
    def __init__(self, req_queue: Queue):
        self.req_queue = req_queue

    def request(self, flow: HTTPFlow):
        request_dict = {
            "method": flow.request.method,
            "url": flow.request.url,
            "headers": [(key, flow.request.headers[key]) for key in flow.request.headers],
            "cookies": [(key, flow.request.cookies[key]) for key in flow.request.cookies],
            "data": flow.request.text
        }
        try:
            print(request_dict.get("url"))
            self.req_queue.put(request_dict, timeout=2)
        except queue.Full:
            pass

    def response(self, flow: HTTPFlow):
        pass

    def responseheaders(self, flow: HTTPFlow):
       pass


def do_start_proxy(req_queue):
    opts = options.Options(listen_host="127.0.0.1", listen_port=6666)

    m = DumpMaster(opts, with_termlog=False, with_dumper=False)

    pconf = proxy.config.ProxyConfig(opts)
    m.server = proxy.server.ProxyServer(pconf)
    m.addons.add(Handler(req_queue))

    print("Proxy server listening at http://127.0.0.1:6666")
    m.run()
    # m.shutdown()


def start_proxy(req_queue):
    freeze_support()
    p = Process(target=do_start_proxy, args=(req_queue, ))
    p.start()
    return p


if __name__ == "__main__":
    req_queue = Queue(6000)
    p = start_proxy(req_queue)
    try:
        while True:
            # 從req_queue獲取請(qǐng)求,進(jìn)行處理
            time.sleep(300)
    except KeyboardInterrupt:
        p.terminate()
        p.join()

下文將以這種方式來(lái)說(shuō)明

插件編寫(xiě)

上面使用子進(jìn)程啟動(dòng)mitmproxy奋蔚,然后通過(guò)m.addons.add(Handler(req_queue))注冊(cè)插件她混,該插件將收到的請(qǐng)求信息添加到隊(duì)列中,以便后續(xù)使用泊碑。

Handler類就是插件坤按。其request方法在mitmproxy接到請(qǐng)求后調(diào)用,response方法在收到響應(yīng)后調(diào)用馒过,responseheaders方法在收到響應(yīng)頭部時(shí)就調(diào)用.(更多的回調(diào)方法參考這里)臭脓。這些回調(diào)方法,通常接收一個(gè)flow參數(shù)腹忽,可以用來(lái)獲取請(qǐng)求和響應(yīng)信息来累,使用也簡(jiǎn)單砚作,看這里就行。

注意: 不要在request()里用到flow.response嘹锁,否則會(huì)卡住

HTTPS證書(shū)

mitmproxy已經(jīng)處理好證書(shū)了偎巢。將瀏覽器代理指向mitmproxy,訪問(wèn)mitm.it兼耀,下載安裝證書(shū)就行

option配置

上面那段代碼中:

    opts = options.Options(listen_host="127.0.0.1", listen_port=6666)

    m = DumpMaster(opts, with_termlog=False, with_dumper=False)

    pconf = proxy.config.ProxyConfig(opts)
    m.server = proxy.server.ProxyServer(pconf)
    m.addons.add(Handler(req_queue))

listen_host配置代理監(jiān)聽(tīng)地址压昼,listen_port配置代理監(jiān)聽(tīng)端口。with_templog為T(mén)rue時(shí)會(huì)輸出客戶端連接瘤运、斷開(kāi)信息窍霞,如:127.0.0.1:53033: clientconnect 127.0.0.1:53034: clientconnectwith_dumper為T(mén)rue時(shí)拯坟,輸出連接信息:請(qǐng)求方法但金、URL、狀態(tài)碼等郁季。所有可配置的option冷溃,看這里

舉兩個(gè)其它的配置:

配置上流代理(mitmproxy的流量都傳到這個(gè)proxy):

opts.update(mode="upstream:127.0.0.1:1080")  # 所有接收到流量都傳到127.0.0.1:1080這個(gè)代理去
opts.update(ssl_insecure=True)  # 不驗(yàn)證上流代理給的https證書(shū)

配置代理的賬號(hào)密碼:

opts.update(proxyauth="root:root")

這句代碼要在初始化DumpMaster類后再調(diào)用梦裂。因?yàn)檫@個(gè)配置選項(xiàng)是由內(nèi)置插件ProxyAuth提供的似枕,該插件在初始化DumpMaster類時(shí)添加。

總結(jié)

感覺(jué)直接調(diào)用mitmdump函數(shù)簡(jiǎn)單些年柠。一開(kāi)始用的是網(wǎng)上給的凿歼,沒(méi)看源碼,不知道有這種方式冗恨。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末答憔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子掀抹,更是在濱河造成了極大的恐慌虐拓,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件傲武,死亡現(xiàn)場(chǎng)離奇詭異蓉驹,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)谱轨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)戒幔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人土童,你說(shuō)我怎么就攤上這事诗茎。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵敢订,是天一觀的道長(zhǎng)王污。 經(jīng)常有香客問(wèn)我,道長(zhǎng)楚午,這世上最難降的妖魔是什么昭齐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮矾柜,結(jié)果婚禮上阱驾,老公的妹妹穿的比我還像新娘。我一直安慰自己怪蔑,他們只是感情好里覆,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著缆瓣,像睡著了一般喧枷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弓坞,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天隧甚,我揣著相機(jī)與錄音,去河邊找鬼渡冻。 笑死戚扳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的菩帝。 我是一名探鬼主播咖城,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼呼奢!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起切平,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤握础,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后悴品,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體禀综,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年苔严,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了定枷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡届氢,死狀恐怖欠窒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情退子,我是刑警寧澤岖妄,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布型将,位于F島的核電站,受9級(jí)特大地震影響荐虐,放射性物質(zhì)發(fā)生泄漏七兜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一福扬、第九天 我趴在偏房一處隱蔽的房頂上張望腕铸。 院中可真熱鬧,春花似錦铛碑、人聲如沸恬惯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)酪耳。三九已至,卻和暖如春刹缝,著一層夾襖步出監(jiān)牢的瞬間碗暗,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工梢夯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留言疗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓颂砸,卻偏偏與公主長(zhǎng)得像噪奄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子人乓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359