一、前言
http proxy在web滲透上占據著非常重要的地位,這方面的工具也非常多,像burp suite, Fiddler,Charles簡直每個搞web的必備神器,還有歷史比較久遠的paros,webscarab等,實際上每個web漏洞掃描器都有http代理的功能。
而今天要介紹的mitmproxy代理工具,非常棒,特別是對https數據的截獲,及可擴展性,bra bra……
之所以選擇這款工具,是為了做移動APP的通信分析。我們知道使用http代理的基本條件就是網絡要互通,而很多情況下,公司的移動網絡與辦公網絡是隔離的,當然你可以用網絡共享(或者買個小度wifi或360wifi)的方法來解決隔離。(記得幾年前做移動通信分析時就遇到了網絡隔離且沒有無線網卡的尴尬情況。)
我的選擇是在vps上搭建一個http代理(剛買了vps,正可著勁的折騰呢),這時候就需要命令行的工具了,於是選擇了mitmproxy(其實我也用nginx搭建了代理,目前以查看通信為主,待熟練了,或許能用nginx-lua模塊寫個截獲重寫的模塊,悲催的是nginx不支持https,扯遠了)。
二、mitmproxy原理
mitmproxy就是代理,有篡改功能的代理。它支持兩種模式,正向代理,與透明代理,支持http通信與https通信。
(正向代理,反向代理,透明代理的科普可以看http://z00w00.blog.51cto.com/515114/1031287這篇文章,很容易懂)
mitmproxy官網上也有介紹原理,這裡附上好心人的翻譯http://www.oschina.net/translate/how-mitmproxy-works
對代理很了解的同學,看看下面四幅圖,就能知道是咋回事了。
1. http正向代理
2. https正向代理
3. http透明代理
4. https透明代理
三、mitmproxy安裝
接下來我要在vps上安裝mitmproxy了,該工具使用python編寫,現在非常多的工具都是python編寫的,都有專門的python黑客培訓機構了,話說不會python的程序員不是好程序員。
python是跨平台的,因此mitmproxy也是跨平台的。
接下來以linux(debian 7)上安裝為例,其他平台非常類似(mac上安裝包用homebrew就好)
1. 首先安裝python環境,了解python的可以不用看
#python及python依賴包apt-get install build-essential python-dev python-setuptools#安裝pip,很好的python包管理器,類似於aptitude,apt-getwget https://pypi.python.org/packages/source/p/pip/pip-1.4.1.tar.gzpython setup.py install
2. 安裝mitmproxy依賴包
sudo pip install netlib pyopenssl pyasn1 urwid pil lxml flask#下面是可選(為了解碼用)sudo pip install pyamf protobuf#下面是可選(為了測試用)sudo pip install nose pathod countershape
3. 安裝mitmproxy
sudo pip install mitmproxy
安裝成功後會在生成兩個工具/usr/local/bin/mitmproxy與/usr/local/bin/mitmdump
本人是個開源工具殺手,總會遇到問題
安裝問題解決:
如果使用pip安裝時,出現pkg_resources.DistributionNotFound:(剛升級了osx Mavericks版本就出現了這個問題),可以先更新pip
sudo easy_install --upgrade distributesudo easy_install --upgrade pip
四、CA證書的安裝
要捕獲https證書,就得解決證書認證的問題,因此需要在通信發生的客戶端安裝證書,並且設置為受信任的根證書頒布機構。下面介紹6種客戶端的安裝方法。
當我們初次運行mitmproxy或mitmdump時,
會在當前目錄下生成 ~/.mitmproxy文件夾,其中該文件下包含4個文件,這就是我們要的證書了。
mitmproxy-ca.pem 私鑰
mitmproxy-ca-cert.pem 非windows平台使用
mitmproxy-ca-cert.p12 windows上使用
mitmproxy-ca-cert.cer 與mitmproxy-ca-cert.pem相同,android上使用
1. Firefox上安裝
preferences-Advanced-Encryption-View Certificates-Import (mitmproxy-ca-cert.pem)-trust this CA to identify web sites
2. chrome上安裝
設置-高級設置-HTTPS/SSL-管理證書-受信任的根證書頒發機構-導入mitmproxy-ca-cert.pem
2. osx上安裝
雙擊mitmproxy-ca-cert.pem - always trust
3.windows7上安裝
雙擊mitmproxy-ca-cert.p12-next-next-將所有的證書放入下列存儲-受信任的根證書發布機構
4.iOS上安裝
將mitmproxy-ca-cert.pem發送到iphone郵箱裡,通過浏覽器訪問/郵件附件
我將證書放在了vps上以供下載
http://tanjiti.com/crt/mitmproxy-ca-cert.pem mitmproxy iOS
http://tanjiti.com/crt/mitmproxy-ca-cert.cer mitmproxy android
http://tanjiti.com/crt/mitmproxy-ca-cert.p12 windows
http://tanjiti.com/crt/PortSwigger.cer BurpSuite (burpsuite的證書,隨便附上)
5.iOS模擬器上安裝
git clone https://github.com/ADVTOOLS/ADVTrustStore.gitcd ADVTrustStore/
DANI-LEE-2:ADVTrustStore danqingdani$ python iosCertTrustManager.py -a ~/iostools/mitmproxy-ca-cert.pem
subject= CN = mitmproxy, O = mitmproxyImport certificate to iPhone/iPadsimulator v5.1 [y/N] yImporting to /Users/danqingdani/Library/Application Support/iPhone Simulator/5.1/Library/Keychains/TrustStore.sqlite3 Certificate added
實際上上面的操作就是給 ~/Library/Application\ Support/iPhone\ Simulator/5.1/Library/Keychains/TrustStore.sqlite3數據庫中表tsettings表中插入證書數據
6.Android上安裝
將mitmproxy-ca-cert.cer 放到sdcard根目錄下
選擇設置-安全和隱私-從存儲設備安裝證書
五、工具使用
在vps上裝好了mitmproxy代理,在客戶端也裝好了CA證書,接下來就可以使用了。
第一步:在vps上啟動mitmproxy
mitmproxy -b xxx.xxx.xxx(指定監聽的接口) -p xxx(指定端口)
果然我是開源工具殺手,運行時又報錯了。
運行錯誤問題解決:
當運行mitmproxy報錯:
Error: mitmproxy requires a UTF console environment.
Set your LANG enviroment variable to something like en_US.UTF-8
你可以先運行locale查看當前的語言環境,我的vps就是POSIX環境
root@www:/# locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
現在我們需要的是把其修改為en_US.UTF-8
方法參考http://jrs-s.net/2010/11/18/setting-locale-to-utf-8-in-debian/
vim /etc/default/localeLANG=en_US.UTF-8. locale-gen#編輯/etc/profile,與/etc/bash.bashrc,增加 export LANG=en_US.UTF-8echo "export LANG=en_US.UTF-8" >/etc/profileecho "export LANG=en_US.UTF-8" >/etc/bash.bashrc source /etc/profilesource /etc/bash.bashrc
現在再運行locale,可以看到語言修改過來了
root@www:/# locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
然後就可以正常的運行了!
第二步:在手機或PC或浏覽器上選擇使用該http代理
第三步:使用客戶端訪問,現在就可以操作通信數據了
六、常見操作
1. mitmproxy
就介紹最常用到的修改請求,並回放請求的方法吧
(1)方向鍵定位請求
(2)當黃色箭頭>>定位到指定請求時,按回車enter進入請求中
(3)按e進入編輯狀態,然後按對應的藍色字體來選擇修改的部分
可以修改query,查詢字符串;path,路徑;url ;header 請求頭;form 表單;raw body 請求正文;method 請求方法。
(4)a 增加一行,tab鍵切換編輯字段,回車enter開始編輯,esc保存,q返回上一級
(5)修改完後,按r就可以重放請求,然後查看修改結果了
2. mitmdump
別忘了,mitmproxy還有個內向的雙胞胎叫mitmdump(很像tcpdump),它是不交互版的mitmproxy。可以非實時的處理通信包。
我們可以在mitmproxy中按w,將通信數據保存到指定文件中後,然後用mitmdump來操作。接下來簡單介紹一個例子,從mitmproxy中捕獲到的數據包中,篩選出來自微博的數據包,然後重放這個數據包(其實也可以修改後再重放)
-n 表示不啟用代理, -r表示從文件中讀取數據包, -w表示將數據包存儲到文件中,-c表示重放客戶端請求包
mitmdump -nr all.data -w weibo.data "~u weibo"
mitmdump -nc weibo.data[replay] POST http://api.weibo.cn/2/client/addlog_batch?s=2edc0cfa7&gsid=4ubed3V0QehBa8KoNp4AA75J&c=android&wm=20005_0002&ua=Xiaomi-MI+2S__weibo__4.0.1__android__android4.1.1&oldwm=9975_0001&from=1040195010&skin=default&i=8764056d2&isgzip=&lang=zh_CN<< 200 OK 32B
3. mitmproxy API
開源精神最贊的是,可以像小時候玩積木一樣,用大牛們提供的各種精巧工具,搭建自己合適的武器。
mitmproxy提供了libmproxy以供調用擴展。
我們可以查看一下libmproxy的詳細說明,了解主要的API接口調用
pydoc libmproxy
官網給了一個自己編寫腳本,來操縱數據包的例子,很簡單,人人都能看懂
如下所示,就是在響應包中增加一個自定義頭
def response(context, flow): flow.response.headers["newheader"] = ["foo"]
我們可以在mitmdump 中使用這個腳本
-s表示從讀取自定義腳本來處理數據包
mitmdump -ns examples/add_header.py -r infile -w outfile
好了,就介紹到這了。
七、希望交流
我在運行mitmdump重放http響應功能時候
mitmdump -S outfile
卡死了,到目前還沒有找到原因,希望知道的大牛告之,萬分感謝