黑戈爾
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9

摘要:随着现在各大厂商对安全的日渐重视,好多app做了特殊处理,直接通过传统http代理的方式是抓取不到数据的,现在给大家介绍一个可以绕过这种防御机制捕获app数据的方法。
0x00 起因
最近想搞搞src,兴致满满的一通安装模拟器、配置证书、设置代理操作之后,发现burp的历史记录中空空如也。P都没抓到,刚才的热情瞬间冷却。。。。。
在网上搜了搜类似的问题,可能是app设置了强制不走代理。
顾名思义就是即使手机操作系统层面设置了http代理,app的某些请求依然不会通过代理去访问。
一般把手机设置好代理,但代理软件不打开,这时候手机浏览器访问各种网站是无法访问的,但是app却能够正常使用,这种情况一般就是app强制不走代理。
应对这种情况网上给出的解决方案是可以通过HTTP Debugger Pro+安卓虚拟机的形式来抓取https流量,我简单测试了一下发现能抓到部分请求,有些还是抓不到,可能是使用的不太对,有这方面熟悉的师傅能否给我指导一下。
接下来讨论一个其他的解决方案:DNS劫持+隐形代理
0x01 详述
需要的角色
A:客户端(手机、平板、模拟器都可以)
B:dns服务器(我使用的是linux+dnsmasq,也可以使用任何其他的dns服务器都可以)
C:隐形代理(我用的是windows+burp)
简单聊一下http代理和隐形代理
Rfc文档地址:https://www.rfc-editor.org/rfc/rfc7230
其实http代理没有其他协议那么复杂,简单点说正常http请求头里 有host、有path,他俩组合在一起才是完整的url 。
而http代理的数据包是下图左边这样的,就是原本的path字段换成了完整的url,代理服务器收到后会按照这个url去请求真正的服务端。
其实即使不这样,用原始的http请求(不设置代理的)也可以通过host+path去找到真正的服务端,这就是burp隐形代理能实现的基本原理。
关于隐形代理的描述可以参考burp官方的解释:
https://portswigger.net/burp/documentation/desktop/tools/proxy/invisible#:~:text=Burp%27s%20support%20for%20invisible%20proxying%20allows%20non-proxy-aware%20clients,makes%20HTTP%20requests%20outside%20of%20the%20browser%27s%20framework.
大概思路:
首先A、B、C三者网络要互通
- burp先开启隐形代理模式(配图)
- 配置DNS服务器,将指定(或者所有)的域名解析到burp所在的IP地址(实际就是dns劫持)。
- 客户端添加信任burp的证书。
- 客户端设置DNS为我们自己搭建的DNS服务器地址。
这样一通设置之后,启动app,app的所有请求都会发到burp的隐形代理上并能解析成功。
注意:有些情况这种方式应对,1、http dns请求的 2、直接IP通信的不用域名
以上两种情况可以再进行降维,去IP层劫持,大概就是找个路由做静态路由,在burp机器的网卡上绑定多个IP地址,比较麻烦 但是理论可行。
下面一步一步讲解怎么配置
- burp开启隐形代理
- 配置DNS服务器,将指定的域名解析到burp所在的IP地址。
我用的是dnsmasq作为dns服务器,使用任何其他的dns服务器都行
Dnsmasq安装方法我就不多说了去网上查一下就OK,配置起来比较简单,就是新建一个/etc/dnsmasq.conf文件,然后配置上如下域名解析就好
address=/.com/192.168.1.10
address=/.cn/192.168.1.10
意思就是把所有.com和.cn结尾的域名都解析到192.168.1.10这个IP上(这里的192.168.1.10要替换成实际burp监听的IP地址)
3.客户端添加信任burp的证书
- 添加证书在ios上比较简单,就常规的方法(添加完之后要在关于本机-证书信任设置-针对根证书启用安全信任中开启)。
- 安卓7以下版本也比较简单,也是常规的方法
- 安卓7以及以上版本app就不信任用户添加的证书了,需要开root权限把证书复制到特定位置
首先需要用openssl工具把burp默认的cer格式的证书转换为pem格式
openssl x509 -inform der -in demo.der -out demo.pem
然后算一下证书的哈希值
openssl x509 -subject_hash_old -in demo.pem
然后把证书文件的名字改成“算出的哈希值.0”,在这里就是改成9a5ba575.0
最后通过adb或者文件管理的形式把证书文件拷贝到/system/etc/security/cacerts/文件夹下
adb remount
adb push 9a5ba575.0 /system/etc/security/cacerts/
注意:安卓11及以上我也不会弄了,adb remount一直不成功,所以考不进去,建议大家不要用mumu x模拟器,因为他是安卓12版本,我开始用的这个一直不行,有知道原因的小伙伴可以告诉我一下解决方案。
4.客户端设置DNS为我们自己搭建的DNS服务器地址。
这个就比较简单了,在设置IP地址的地方一般都支持手动设置DNS服务器,设置成我们自己搭建的dns服务器就好。
注意:安卓虚拟机和vmware虚拟机同时装在一台windows电脑上的话容易出些bug,导致两个虚拟机之间网络不太好,所以建议还是不要同时用两种虚拟机来做。
千万不要把burp所在机器的dns改成我们自己搭建的dns服务器地址,否则会出现死循环。
0x02 开始抓包
一切调试结束后,就可以打开app,开始愉快的抓包了。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
