mitmproxy——中間人攻擊的神器
一、前言
http proxy在web滲透上占據(jù)著非常重要的地位,這方面的工具也非常多,像burp suite, Fiddler,Charles簡(jiǎn)直每個(gè)搞web的必備神器,還有歷史比較久遠(yuǎn)的paros,webscarab等,實(shí)際上每個(gè)web漏洞掃描器都有http代理的功能。
而今天要介紹的mitmproxy代理工具,非常棒,特別是對(duì)https數(shù)據(jù)的截獲,及可擴(kuò)展性,bra bra……
之所以選擇這款工具,是為了做移動(dòng)APP的通信分析。我們知道使用http代理的基本條件就是網(wǎng)絡(luò)要互通,而很多情況下,公司的移動(dòng)網(wǎng)絡(luò)與辦公網(wǎng)絡(luò)是隔離的,當(dāng)然你可以用網(wǎng)絡(luò)共享(或者買個(gè)小度wifi或360wifi)的方法來(lái)解決隔離。(記得幾年前做移動(dòng)通信分析時(shí)就遇到了網(wǎng)絡(luò)隔離且沒(méi)有無(wú)線網(wǎng)卡的尷尬情況。)
我的選擇是在vps上搭建一個(gè)http代理(剛買了vps,正可著勁的折騰呢),這時(shí)候就需要命令行的工具了,于是選擇了mitmproxy(其實(shí)我也用nginx搭建了代理,目前以查看通信為主,待熟練了,或許能用nginx-lua模塊寫(xiě)個(gè)截獲重寫(xiě)的模塊,悲催的是nginx不支持https,扯遠(yuǎn)了)。
二、mitmproxy原理
mitmproxy就是代理,有篡改功能的代理。它支持兩種模式,正向代理,與透明代理,支持http通信與https通信。
(正向代理,反向代理,透明代理的科普可以看http://z00w00.blog.51cto.com/515114/1031287這篇文章,很容易懂)
mitmproxy官網(wǎng)上也有介紹原理,這里附上好心人的翻譯http://www.oschina.net/translate/how-mitmproxy-works
對(duì)代理很了解的同學(xué),看看下面四幅圖,就能知道是咋回事了。
1. http正向代理

2. https正向代理

3. http透明代理

4. https透明代理

三、mitmproxy安裝
接下來(lái)我要在vps上安裝mitmproxy了,該工具使用python編寫(xiě),現(xiàn)在非常多的工具都是python編寫(xiě)的,都有專門的python黑客培訓(xùn)機(jī)構(gòu)了,話說(shuō)不會(huì)python的程序員不是好程序員。
python是跨平臺(tái)的,因此mitmproxy也是跨平臺(tái)的。
接下來(lái)以linux(debian 7)上安裝為例,其他平臺(tái)非常類似(mac上安裝包用homebrew就好)
1. 首先安裝python環(huán)境,了解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#下面是可選(為了測(cè)試用)sudo pip install nose pathod countershape
3. 安裝mitmproxy
sudo pip install mitmproxy
安裝成功后會(huì)在生成兩個(gè)工具/usr/local/bin/mitmproxy與/usr/local/bin/mitmdump
本人是個(gè)開(kāi)源工具殺手,總會(huì)遇到問(wèn)題
安裝問(wèn)題解決:
如果使用pip安裝時(shí),出現(xiàn)pkg_resources.DistributionNotFound:(剛升級(jí)了os x Mavericks版本就出現(xiàn)了這個(gè)問(wèn)題),可以先更新pip
sudo easy_install --upgrade distributesudo easy_install --upgrade pip
四、CA證書(shū)的安裝
要捕獲https證書(shū),就得解決證書(shū)認(rèn)證的問(wèn)題,因此需要在通信發(fā)生的客戶端安裝證書(shū),并且設(shè)置為受信任的根證書(shū)頒布機(jī)構(gòu)。下面介紹6種客戶端的安裝方法。
當(dāng)我們初次運(yùn)行mitmproxy或mitmdump時(shí),
會(huì)在當(dāng)前目錄下生成 ~/.mitmproxy文件夾,其中該文件下包含4個(gè)文件,這就是我們要的證書(shū)了。
mitmproxy-ca.pem 私鑰
mitmproxy-ca-cert.pem 非windows平臺(tái)使用
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上安裝
設(shè)置-高級(jí)設(shè)置-HTTPS/SSL-管理證書(shū)-受信任的根證書(shū)頒發(fā)機(jī)構(gòu)-導(dǎo)入mitmproxy-ca-cert.pem
2. osx上安裝
雙擊mitmproxy-ca-cert.pem - always trust
3.windows7上安裝
雙擊mitmproxy-ca-cert.p12-next-next-將所有的證書(shū)放入下列存儲(chǔ)-受信任的根證書(shū)發(fā)布機(jī)構(gòu)
4.iOS上安裝
將mitmproxy-ca-cert.pem發(fā)送到iphone郵箱里,通過(guò)瀏覽器訪問(wèn)/郵件附件
我將證書(shū)放在了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的證書(shū),隨便附上)
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/iPad simulator v5.1 [y/N] yImporting to /Users/danqingdani/Library/Application Support/iPhone Simulator/5.1/Library/Keychains/TrustStore.sqlite3 Certificate added
實(shí)際上上面的操作就是給 ~/Library/Application\ Support/iPhone\ Simulator/5.1/Library/Keychains/TrustStore.sqlite3 數(shù)據(jù)庫(kù)中表tsettings表中插入證書(shū)數(shù)據(jù)
6.Android上安裝
將mitmproxy-ca-cert.cer 放到sdcard根目錄下
選擇設(shè)置-安全和隱私-從存儲(chǔ)設(shè)備安裝證書(shū)
五、工具使用
在vps上裝好了mitmproxy代理,在客戶端也裝好了CA證書(shū),接下來(lái)就可以使用了。
第一步:在vps上啟動(dòng)mitmproxy
mitmproxy -b xxx.xxx.xxx(指定監(jiān)聽(tīng)的接口) -p xxx(指定端口)
果然我是開(kāi)源工具殺手,運(yùn)行時(shí)又報(bào)錯(cuò)了。
運(yùn)行錯(cuò)誤問(wèn)題解決:
當(dāng)運(yùn)行mitmproxy報(bào)錯(cuò):
Error: mitmproxy requires a UTF console environment.
Set your LANG enviroment variable to something like en_US.UTF-8
你可以先運(yùn)行l(wèi)ocale查看當(dāng)前的語(yǔ)言環(huán)境,我的vps就是POSIX環(huán)境
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=
現(xiàn)在我們需要的是把其修改為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
現(xiàn)在再運(yùn)行l(wèi)ocale,可以看到語(yǔ)言修改過(guò)來(lái)了
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=
然后就可以正常的運(yùn)行了!
第二步:在手機(jī)或PC或?yàn)g覽器上選擇使用該http代理
第三步:使用客戶端訪問(wèn),現(xiàn)在就可以操作通信數(shù)據(jù)了
六、常見(jiàn)操作
1. mitmproxy
就介紹最常用到的修改請(qǐng)求,并回放請(qǐng)求的方法吧
(1)方向鍵定位請(qǐng)求
(2)當(dāng)黃色箭頭>>定位到指定請(qǐng)求時(shí),按回車enter進(jìn)入請(qǐng)求中

(3)按e進(jìn)入編輯狀態(tài),然后按對(duì)應(yīng)的藍(lán)色字體來(lái)選擇修改的部分

可以修改query,查詢字符串;path,路徑;url ;header 請(qǐng)求頭;form 表單;raw body 請(qǐng)求正文;method 請(qǐng)求方法。
(4)a 增加一行,tab鍵切換編輯字段,回車enter開(kāi)始編輯,esc保存,q返回上一級(jí)
(5)修改完后,按r就可以重放請(qǐng)求,然后查看修改結(jié)果了
2. mitmdump
別忘了,mitmproxy還有個(gè)內(nèi)向的雙胞胎叫mitmdump(很像tcpdump),它是不交互版的mitmproxy??梢苑菍?shí)時(shí)的處理通信包。
我們可以在mitmproxy中按w,將通信數(shù)據(jù)保存到指定文件中后,然后用mitmdump來(lái)操作。接下來(lái)簡(jiǎn)單介紹一個(gè)例子,從mitmproxy中捕獲到的數(shù)據(jù)包中,篩選出來(lái)自微博的數(shù)據(jù)包,然后重放這個(gè)數(shù)據(jù)包(其實(shí)也可以修改后再重放)
-n 表示不啟用代理, -r表示從文件中讀取數(shù)據(jù)包, -w表示將數(shù)據(jù)包存儲(chǔ)到文件中,-c表示重放客戶端請(qǐng)求包
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
開(kāi)源精神最贊的是,可以像小時(shí)候玩積木一樣,用大牛們提供的各種精巧工具,搭建自己合適的武器。
mitmproxy提供了libmproxy以供調(diào)用擴(kuò)展。
我們可以查看一下libmproxy的詳細(xì)說(shuō)明,了解主要的API接口調(diào)用
pydoc libmproxy
官網(wǎng)給了一個(gè)自己編寫(xiě)腳本,來(lái)操縱數(shù)據(jù)包的例子,很簡(jiǎn)單,人人都能看懂
如下所示,就是在響應(yīng)包中增加一個(gè)自定義頭
def response(context, flow): flow.response.headers["newheader"] = ["foo"]
我們可以在mitmdump 中使用這個(gè)腳本
-s表示從讀取自定義腳本來(lái)處理數(shù)據(jù)包
mitmdump -ns examples/add_header.py -r infile -w outfile
好了,就介紹到這了。
七、希望交流
我在運(yùn)行mitmdump重放http響應(yīng)功能時(shí)候
mitmdump -S outfile
卡死了,到目前還沒(méi)有找到原因,希望知道的大牛告之,萬(wàn)分感謝















 
 
 

 
 
 
 