一、前言
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
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
卡死了,到目前还没有找到原因,希望知道的大牛告之,万分感谢