一、前言
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通信。
(正向代理,反向代理,透明代理的科普可以看这篇文章,很容易懂)
mitmproxy官网上也有介绍原理,这里附上好心人的翻译
对代理很了解的同学,看看下面四幅图,就能知道是咋回事了。
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-getwgetsetup.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:(刚升级了os x 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上以供下载
mitmproxy iOS
mitmproxy android
windows
BurpSuite (burpsuite的证书,随便附上)
5.iOS模拟器上安装
git cloneADVTrustStore/
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
实际上上面的操作就是给 ~/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

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”
现在我们需要的是把其修改为en_US.UTF-8
方法参考
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
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″
然后就可以正常的运行了!
第二步:在手机或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] POST200 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
卡死了,到目前还没有找到原因,希望知道的大牛告之,万分感谢
我想询问下windows下的mitmproxy您使用过吗,是怎么使用的?我现在装好了mitmproxy,但是却一直启用不了
实践环境iMac一台、华为B199(Android 4.4)手机一部,这两者都 连着同一个wifi 。 mitmproxy安装版本为 0.11.3 。 iMac的ip地址为: 192.168.0.104mitmproxy安装与设置下载mitmproxy。 推荐下载 二进制安装包 (当前版本为0.11.3),因为使用pip安装会由于墙的原因安装失败。 下载成功之后解压,便可直接点击名为“mitmproxy”的文件了。 在iMac上运行和设置mitmproxy。 由于直接点击运行是没有设置mitmproxy参数的,所以我们需要在命令行里面输入mitmproxy进行设置:Shell$ [YOUR_DOWNLOAD_PATH]/mitmproxy -b 192.168.0.104 -p 9527注意,此处的[YOUR_DOWNLOAD_PATH]为你下载mitmproxy二进制文件解压后所对应的目录,就我而言的目录就是:~/Downloads/osx-mitmproxy-0.11.3 .其中ip设置为iMac的ip,端口则按照你的个人喜好来。 初始界面如下:输入“?”便可查看帮助界面(输入“q”回到正常界面):在Android上设置代理。 按照之前的步骤将Android所连接的wifi代理ip设置为:192.168.0.1,端口设置为:9527 。 现在Android已经连上代理,iMac端便开始展示它所抓取到的包了mitmproxy常见操作mitmproxy的操作主要是通过命令行来解决的,很多操作和vi相同。 一般说来,“q”代表返回。 当mitmproxy回到抓包列表界面时,输入“q”就代表退出mitmproxy了。 清除抓包结果当你处于抓包列表界面时,觉得太多的信息让你十分恼火,直接输入大写字母C便可以清楚所有的抓包结果。 查看抓包在步骤3中我们可以看到一个黄色的指标,我们可以通过上下箭头(或者使用 “j”/”k”来上下选择)。 直接回车便可以查看指标所选定的包的详细信息:此时,我们可以使用 tab键 在“Request”和“Response”之间切换。 这是“Response”的详细信息(这是一个张图片,所以下面乱码了):当我们发现“Response”的信息比较乱的时候,我们可以选择合适的形式来展示,这个时候我们只要输入“m”便可以看到mitmproxy提供的不同展现形式,输入对应高亮的字母便可以看到相应的结果(输入“s”便可以以json形式展示):
linux中文件内容太多,屏幕不能一下全部显示出来,怎样查看被掩盖的上部分的内容?
楼上有人说了用 命令 | more 的方法显示,这种方法其实不好。 更好的方法反而是使用命令 | less 的模式(例如mitmproxy -h | less,这段命令意思就是显示mitmproxy的帮助文档,并且用less模式去读取这个文档),在less模式下你一次只能读一部分文本,但是你可以输入命令来翻页,你可以按空格键向下翻页;而按b键则向上翻页。 另外,在输入状态先输入一个斜杠,再输入文本,就可以把全文中带有该文本的地方高亮(例如输入/port就是把全文中带有port这个文本的地方标记高亮);最后使用ctrl+z退出less模式。 如果你使用more的命令当然也可以这样翻页,但是首先它也是只显示一部分内容(而不是全部),可是这个模式不能输入命令(所以不能搜索文档),最讨厌的是当你翻到底的时候命令就自动退出more模式了,所以还是less更多人用。 至于有没有一次显示所有内容的方法?我到处都找遍了也没发现(甚至找了国外的StackOverflow,以上方法就是我从那里找来的)。 可是我清晰地记得有时候浏览帮助文档一开始是可以显示完全的,只不过后来不知道为什么又不行了。 在CSDN有人说可以修改PUTTY、XSHELL等远程登录软件的lines of scrollback选项,我试过好像没什么作用就不发上来了。 如果有人知道一次完全显示的方法,请留言,谢谢。
发表评论