mitmproxy中libmproxy簡單介紹

wyzsk發表於2020-08-19
作者: jaffer · 2014/09/24 17:42

0x00 簡介


Mitmproxy是一個基於python的中間人代理的框架。做過滲透測試的肯定很熟悉工具burpsuite或Fiddler,這些工具能夠攔截並修改http或https的資料包,對於分析資料包互動的應用來說是非常有用的。但是這些工具都是整套給我們做好了。比如如果想自己定製一套這樣的工具,新增一些自己需要的功能的話,那麼我想,mitmproxy將是一個比較好的選擇,因為它提供了一個可供使用者呼叫的庫libmproxy(注意該庫目前只支援linux系統)。

用過kali系統的,對於mitmproxy應該不會陌生,因為這個工具已經內嵌到了kali系統裡面了。如果你是在普通的linux系統,那麼就需要自己手動安裝這個工具。

Mitmproxy專案主頁:http://mitmproxy.org/(需要翻牆)

Github:https://github.com/mitmproxy/mitmproxy

安裝以及簡單使用:http://sec.chinabyte.com/412/12771912.shtml

0x01 libmproxy介紹


一旦使用者安裝上了mitmproxy,那麼,在python的dist-packages目錄下就會有一個libmproxy的目錄。點選進去,如下圖所示。

2014090322432418732.jpg

有很多檔案,裡面最關鍵的一個檔案就是flow.py。裡面有從客戶端請求的類Request,也有從伺服器返回的可以操作的類Response。並且都實現了一些方法可以呼叫請求或回覆的資料,包括請求url,header,body,content等。具體如下:

Request的一些方法:

get_query():得到請求的url的引數,被存放成了字典。
set_query(odict):設定請求的url引數,引數是字典。
get_url():請求的url。
set_url(url):設定url的域。
get_cookies():得到請求的cookie。
headers:請求的header的字典。
content:請求的內容,如果請求時post,那麼content就是指代post的引數。
Response的一些方法如下:
Headers:返回的header的字典。
Code:返回資料包的狀態,比如200,301之類的狀態。
Httpversion:http版本。

有了上面這些簡單的方法,只要我們會python,就可以寫一些簡單的程式,比如過濾一些資料,只是提取一些有特定格式的資料包等。

0x02 一個簡單的例項


下面就來寫一個這樣的程式:抓取含有password或passwd這樣欄位的資料包,將這個資料包列印出來。

那麼分析一下,可能出現passwd或password的位置,第一,是url引數,這個我們可以透過get_url()這個方法獲取,第二個就是content,如果請求資料包文是透過post提交,那麼就需要在content裡面找到。好了,分析好了,那麼就剩下寫程式碼了。Mitmproxy官網有一個小程式,我們可以借鑑,下面是一個借鑑mitmproxy官網的程式碼的簡易的實現。

#!python
#!/usr/bin/env python
#coding=utf-8
"""
author:jaffer
time:2014-9-3 19:33
"""
from libmproxy import controller, proxy
import os
import pdb
class StickyMaster(controller.Master):
    def __init__(self, server):
        controller.Master.__init__(self, server)
    def run(self):
        try:
            return controller.Master.run(self)
        except KeyboardInterrupt:
            self.shutdown()

    def findword(self,msg):
        stringword1 = 'passwd'
        stringword2 = 'password'
        content = msg.content
        querystring = msg.get_query()
        #在url引數中查詢
        for eachp in querystring:
            if eachp[1].find(stringword1) != -1 or eachp[1].find(stringword2) != -1:
                return 1
        #在content中尋找
        if content.find(stringword1) != -1 or content.find(stringword2) != -1:
            return 1
        return 0

    def handle_request(self, msg):
        flag = self.findword(msg)
        if flag == 1:
            str = msg.get_query()
            con = msg.content
            url = msg.get_url()
            m = msg.method
            print 'method:' + m
            print '\n'
            print 'query:\n'
            for eachp in str:
                print eachp[0] + '=' + eachp[1]
                print '\n'
            print '\n'
            print 'url:' + url
            print '\n'
            print 'content:' + con
            print '------------------\n'
        msg.reply()        

    def handle_response(self, msg):
        msg.reply()

config = proxy.ProxyConfig(
    cacert = os.path.expanduser("~/.mitmproxy/mitmproxy-ca.pem")
)
server = proxy.ProxyServer(config, 8000)
m = StickyMaster(server)
m.run()

我使用手機端瀏覽器,登入人人網,使用上述程式碼截獲資料包如圖:

2014090322444687124.jpg

0x04 後記


Mitmproxy提供的libmproxy很是強大方便,對於自己需要自己定製的程式程式碼有幫助,當然上面只是一個簡單的實現,還有更多的功能需要更多的挖掘,libmproxy下面的那些內容可以繼續學習。

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章