一、App流量抓包分析
App无法直接抓包,通过抓包工具直接抓包,APP就连不上网络,自然就无法顺利获取APP的数据信息。
代理抓包的关键就是需要HTTP客户端按照要求去连接代理服务器。一般情况下我们已经在系统层面上设置了代理,HTTP客户端都是按要求去实现的,在进行HTTP请求前会先检查系统代理,如果有设置代理,客户端会直接使用完整URI去连接代理服务器。不同的平台通常会实现自己的HTTP客户端,虽然他们都按照协议要求实现了代理功能,但是并不一定在默认情况下会直接使用系统代理。
平时使用的支付宝等APP使用Fiddler或 Charles这类代理抓包软件默认情况下就无法抓取请求的,但使用Wireshark这类网卡抓包软件可以看到这些APP的流量,抓取到的流量表明这些APP使用的主要应用层协议仍然是HTTP(HTTPS),不过我们的代理抓包工具却无法捕捉到流量。
-
代理抓包原理
Fiddler 或 Charles 这类使用的代理的抓包软件与Wireshark是完全不同的(Wireshark使用的网卡数据复制,只要是经过指定网卡都会被抓取),其只能对使用代理的应用层网络协议生效,比如常见的HTTP(HTTTPS),Websocket 。
以HTTP为例:
客户端需要完成一次HTTP请求,通常需要先找到服务器,客户端会根据http请求中url的主机名(实际会使用host中的主角名)及其端口与目标主机建立tcp连接,建立连接后会将http报文发送给目标服务器。
接下来看下HTTP代理是如何运作的,我们启动Fiddler 或 Charles就是启动了一个HTTP代理服务器,这类工具会通知操作系统:“现在我在系统上创建了一个HTTP代理,IP为XXXXXX端口为XX”。如果使用的是linux,则可以手动通知操作系统
export http_proxy=ip:portexport https_proxy=$http_proxy
如果使用的是手机等移动设备,则可以在当前wifi设置处告诉系统你要使用http代理。现在我们已经告诉系统我们想要使用代理,这个时候运行在系统上的HTTP客户端再去发送请求的时候,不会再去进行DNS解析再去连接目标服务器,而是直接连接系统告诉代理所在的地址(代理的ip及端口,注意无论是http或https或其他支持代理的协议都会连接同一个端口)。然后代理服务器会与客户端建立连接,代理服务器再根据请求信息再去连接真正的服务器。
Fiddler 和 Charles不能抓包的具体原因:APP使用的HTTP客户端没有连接到代理服务器,导致我们的代理抓包软件无法正常抓包,所以我们只要想办法让客户端重新连接到代理服务器就好了。
方法1:控制DNS解析,通过修改dns的方式让客户端以为我们的代理服务器就是目标服务器。
优势:操作方便,通过修改设备的hosts可以十分方便的首先。
劣势:需要为每个需要操作的域名提前添加host;在手机等手持设备上难以修改hosts(即对移动APP这类应用很难实现)。
方法2:在网络设备上直接做流量转发,将指定终端设备上发往80及443端口的数据直接转发到代理服务器的目标端口上。
优势:可以针对连接到网络设备上的终端设备进行分别配置,而手机等终端设备不需要进行任何设备。
劣势:需要单独的硬件设备。
方法3:使用VPN将终端设备的流量转发到代理服务器。
优势:使用VPN软件不用添加其他测试。
劣势:终端上的VPN默认会直接对所有流量进行转发,要进行合理的配置可能需要额外的学习成本。
2.证书校验原理
无论Fiddler或Charles都使用中间人攻击的方式替换TLS链路证书,解密报文然后再加密发送给真实服务器。
存在代理的情况下客户端首先连接的是代理服务器(即是图中的攻击者),实际client是直接与Proxy建立的TLS通道,所以代理当然TLS通道的传输密钥然后解密报文。
由于证书的存在,client会校验证书的合法性,然后决定是否连接服务器。我们使用Fiddler或Charles抓取https前在设备中安装根证书正是为了通过client的证书校验。
证书包含以下内容:
(1)Validity也即有效期,有效期包含生效时间和失效时间,是一个时间区间;
(2) 公钥信息SubjectPublic Key Info,包括公钥的加密算法和公钥内容;
(3) 指纹信息,指纹用于验证证书的完整性,也是证书校验的关键,他保证书没有被修改过。其原理就是在发布证书时,发布者根据指纹算法(此处证书使用了SHA-1和SHA-256算法 有多个指纹是为了兼容老的客户端)计算整个证书的hash指纹【证书内容hash值使用CA私钥加密就是指纹】并和证书放在一起,client在打开证书时,自己也根据指纹算法计算一下证书的hash值,同时使用自己信任的根证书的公钥解密hash指纹计算出原始hash,如果hash值不一致,则表明证书内容被篡改过;
(4)证书的签名CertificateSignature Value和Certificate Signature Algorithm,对证书签名所使用的Hash算法和Hash值;
(5)签发该证书的CA机构Issuer;
(6)该证书是签发给哪个组织/公司信息Subject;
(7)证书版本Version、证书序列号Serial Number以及Extensions扩展信息等。
证书指纹校验过程
Client校验证书的核心其实是CA公钥解密原始指纹,CA公钥从哪里来,为了确保安全设备系统会有一批自己信任的CA公钥列表(根证书)。这些CA公钥对应的一般是权威机构或组织,然后由这些权威机构颁发证书时会使用他们自己的私钥去签名(为证书生成指纹)。这样就确保了只有权威机构颁发给各个网站的证书才会被客户端校验通过。
Filddler没有这些证书里公钥对应的私钥(CA只会把为完整颁发的证书对应的私钥给网站的所有者),所以没有办法与客户端完成TLS握手。Filddler为了完成握手只能自己为不同的站点生成证书。不过自己的生成的证书肯定是用自己的私钥签名的,客户端在自己信任的CA公钥列表找不到对应根证书,肯定是不能通过证书校验的。所以Filddler要求我们安装他的根证书到设备,这样自己签发的证书就可以通过证书校验,自己就能解密HTTPS报文了。
3.环境部署
1.电脑下载联想模拟器进行安装,再根据需求更改网络配置,以下以桥接模式为例。
2.配置模拟成手机真实情况
3.配置模拟手机root权限进行操作
4.利用drony+fidder配合抓包
步骤一:
配置fidder代理访问连接,并将证书下载。
将代理证书下载放置到kali中,将代理证书进行转换成安卓系统可识别的认证证书,这时需要借助openssl进行转换。
opensslx509 -subject_hash_old -inform der -inFiddlerRoot.cer -text
转换成功后,可以看到证书hash为e5c3944b,这时将代理证书重命名为e5c3944b.0,然后发送至安卓模拟器中。然后将证书放置到/system/etc/security/cacerts/中,前提需要获取root权限。直接利用命令操作无法进行文件移动,所以下载re文件管理器进行配置。
将文件复制到系统根证书中/system/etc/security/cacerts/
这时证书完成安装并可解密HTTPS数据。
打开系统设置——安全设置——信任的凭证——系统,可以看到证书已安装成功。
步骤2:
在模拟器上安装drony,https://files.cnblogs.com/files/lulianqi/Drony_102.apk下载。
安装完成后如下,打开默认关闭状态为off。
向右滑动进行配置,进入第三项网络配置,进行长按。
点击进入后进行网络配置编辑。
配置如下:
manual :
代理服务器地址 :
代理服务器端口 :
然后进行规则配置,默认规则选择local proxy chain all。
然后进入规则配置,默认进行无规则配置,本文以不能直接抓包的某app为例。
选择抓包应用配置规则并保存配置。
这时,所有配置已完成,返回首页开启转发。
展示效果,可以正常抓取app中的加密数据流量。
二、渗透流程
1.web渗透
参考渗透测试流程
2.APP逆向分析
工具:
apktool ,dex2jar, jd-gui,APK 改之理
检测类型:
1)应用程序数字签名检测
2)反编译检测
3)反编译so库程度检测
4)完整性校验
5)密码安全性测试
6)通讯测试
总结
综合所上,app抓包失败,不能正常建立连接解密https报文的原因就是证书校验失败,我们的根证书安装不够完全。从Android7.0以后,系统允许每个应用可以定义自己的可信CA集。有部分应用默认只会信任系统预装的CA证书,而不会信任用户安装的CA证书(或者说是应用使用的开发框架默认只信任系统证书,因为开发者通常不关心这些配置,也不会去更改他)。而在Android中用户安装的证书都是用户证书,所以无论是Filddler还是Charles我们都只是把他们的根证书安装到了用户证书,这些应用并不使用他们,所以我们的安装的证书是无效的。
原文始发于微信公众号(Matrix1024):移动APP渗透测试攻略
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论