Featured image of post Android抓包技术

Android抓包技术

App抓包

Android6.0版本及以下可以直接抓包,Android7.0版本系统新增了证书校验,所以需要安装证书才可以抓取数据包

https://zhuanlan.zhihu.com/p/528508596

安卓APP抓包大全

1.安装证书

先将手机与电脑处于同一网段,将手机代理指向电脑burp的代理,此时即可抓包,但是只能抓http的数据包

访问burp代理地址,下载证书,并将证书后缀改为.cer,将证书上传到手机内部存储,可以通过投屏软件的文件上传功能进行上传

或者使用面具插件进行移动https://github.com/ys1231/MoveCertificate/releases/tag/v1.5.2

安装后会要求重启,重启后即可抓取https数据包

此时到手机设置,信任与凭据中即可查看安装成功的证书文件

2.不检测代理类抓包

https://mp.weixin.qq.com/s/GkBwLHxXD52cWZR1CpfBHQ

这里使用的靶场地址为:https://github.com/AndroidAppSec/vuls/releases/tag/v4.4

可以看到点击时Burp上没有显示任何流量

使用JADX进行反编译,查看当前加载的页面找到对应的实现类

1
adb shell dumpsys window | findstr CurrentFocus

查看对应的代码段,不懂直接复制问AI

2.1.iptables流量转发(需要Root权限)

设置BurpSuite为透明代理

获取目标应用的uid

1
ps -A |grep ddns.android.vuls

1
2
3
iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner u0_a220 -j DNAT --to-destination 192.168.196.252:8080

iptables -t nat -L                 //查看结果

此时再次点击成功抓取到数据包

1
iptables -t nat -F              //清除iptables规则

2.2.VPN抓包

vpn属于网络层,设置了vpn后,手机上会多一个接口,相当于加了一个虚拟网卡,所有的流量都会从这走。应用层和传输层的请求都可以拿到,即可绕过不走代理的限制。

这里使用的是Postern这款VPN工具,先设置代理在设置规则即可抓包成功

2.3.HOOK方式绕过

HttpURLConnection/okhttp框架为例,通过hook方式,修改代理设置调用的方法。

反编译目标APP代码,搜索Proxy.NO_PROXY关键字。

1
2
3
4
5
6
7
8
9
//只针对HttpURLConnection不走代理脚本

Java.perform(function(){
	var URL = Java.use("java.net.URL");
	URL.openConnection.overload('java.net.Proxy').implementation = function(a){
		console.log(a);
		return this.openConnection();
	}
})

3.代理检测类型抓包

场景:当手机设置代理时,打开APP,APP会提示检测到代理,此时APP自动退出

3.1.使用Profxifer进行路由抓包

https://mp.weixin.qq.com/s/vBo6GXQLW2Oo0nq1DVzSuw

App对抗系列—SSL证书检测对抗4

使用Proxifier+Wifi抓包,通过wifi层面进行抓包,绕过ssl证书检测

3.2.使用手机抓包工具httpcanary

4.单向认证抓包

什么是单向认证,客户端保存着服务端证书并信任该证书,https一般是单向认证,这样大多数人可以访问你的站点

4.1.TrustMeALread

4.2.Frida hook脚本

frida-ssl.js

https://codeshare.frida.re/ 这个网站存在很多通用型hook脚本

1
frida -U vuls -l .\unsslping.js

4.3.Objection-android sslpinning disable

objection 基本使用_objection使用-CSDN博客

1
2
3
4
5
6
pip install -U objection            //安装objection

###
我这里由于版本原因创建了虚拟环境
python -m venv objection-env         #创建环境
objection-env\Scripts\activate       # 进入环境Windows

1
2
3
4
objection -g vuls explore

android sslpinning disable
jobs list                  //查看运行的jobs

记录Flutter框架开发的安卓App的抓包以及Frida安装和hook使用教程_flutter抓包-CSDN博客

5.双向认证抓包

证书转换工具:可将app中获取了bks证书 需要 转换p12

https://keystore-explorer.org/downloads.html

什么是双向认证,需要2个或2个以上证书,1个或多个客户端证书,1个服务端证书,服务端保存着客户端证书并信任该证书,客户端保存这个服务端证书并信任该证书

如何获取证书:未加固的APP直接进行反编译,在包体里面查看相关证书一般证书是.p12结尾的,一般在资源文件夹内assert

或者使用Jadx反编译后找代码中的关键词之类的,1证书名后缀,2.函数方法Keystore

双向认证一般会遇到抓包时返回包是403,APP请求登录时状态码为403,但是使用Web请求该接口正常

img

5.1.使用Frida r0capture进行抓包

https://bbs.kanxue.com/thread-278142.htm#msg_header_h1_4

https://github.com/r0ysue/r0capture

1
2
解压安装包寻找是否有.p12/.fpx/.pem等文件
python3 r0capture.py -U -f com.coolapk.market -v

客户端证书导出功能:默认开启;必须以Spawm模式运行

运行脚本之前必须手动给App加上存储卡读写权限;

并不是所有App都部署了服务器验证客户端的机制,只有配置了的才会在Apk中包含客户端证书

导出后的证书位于/sdcard/Download/包名xxx.p12路径,导出多次,每一份均可用,密码默认为:r0ysue,推荐使用keystore-explorer打开查看证书。

导出证书后将证书安装到burp上,即可成功抓包

img

1
2
python3 r0capture.py -U 酷安 -v -p iqiyi.pcap
//适用于有加固无法导出APP

5.2.双向认证hook脚本

https://github.com/ReversecLabs/android-keystore-audit

📎tracer-keystore.js

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Java.perform(function () {
    function uuid(len, radix) {
        var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
        var uuid = [], i;
        radix = radix || chars.length;
 
        if (len) {
            // Compact form
            for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix];
        } else {
            // rfc4122, version 4 form
            var r;
 
            // rfc4122 requires these characters
            uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
            uuid[14] = '4';
 
            // Fill in random data. At i==19 set the high bits of clock sequence as
            // per rfc4122, sec. 4.1.5
            for (i = 0; i < 36; i++) {
                if (!uuid[i]) {
                    r = 0 | Math.random() * 16;
                    uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
                }
            }
        }
 
        return uuid.join('');
    }
 
    function storeP12(pri, p7, p12Path, p12Password) {
        var X509Certificate = Java.use("java.security.cert.X509Certificate")
        var p7X509 = Java.cast(p7, X509Certificate);
        var chain = Java.array("java.security.cert.X509Certificate", [p7X509])
        var ks = Java.use("java.security.KeyStore").getInstance("PKCS12", "BC");
        ks.load(null, null);
        ks.setKeyEntry("client", pri, Java.use('java.lang.String').$new(p12Password).toCharArray(), chain);
        try {
            var out = Java.use("java.io.FileOutputStream").$new(p12Path);
            ks.store(out, Java.use('java.lang.String').$new(p12Password).toCharArray())
        } catch (exp) {
            console.log(exp)
        }
    }
 
    //在服务器校验客户端的情形下,帮助dump客户端证书,并保存为p12的格式,证书密码为r0ysue
    Java.use("java.security.KeyStore$PrivateKeyEntry").getPrivateKey.implementation = function () {
        var result = this.getPrivateKey()
        var packageName = Java.use("android.app.ActivityThread").currentApplication().getApplicationContext().getPackageName();
        storeP12(this.getPrivateKey(), this.getCertificate(), '/sdcard/Download/' + packageName + uuid(10, 16) + '.p12', 'r0ysue');
        return result;
    }
 
    Java.use("java.security.KeyStore$PrivateKeyEntry").getCertificateChain.implementation = function () {
        var result = this.getCertificateChain()
        var packageName = Java.use("android.app.ActivityThread").currentApplication().getApplicationContext().getPackageName();
        storeP12(this.getPrivateKey(), this.getCertificate(), '/sdcard/Download/' + packageName + uuid(10, 16) + '.p12', 'r0ysue');
        return result;
    }
});

5.3.案例—某APP双向认证绕过

正常抓包,返回包无响应

img

反编译APP,查看是否加固,查看资源文件,发现存在可疑证书文件

img

360加固特征:解压后里面的dex文件一般只有1个,并且打开后目录结构是这样的

img

img

使用frida-dexdump脱壳

1
frida-dexdump -UF

img

将dex文件使用JADX打开,里面是他的核心源代码

img

使用JADX打开dex文件时,一定不要勾选**verify dex file checksum before load**

img

根据证书名称全局搜索client.bks,证书密码直接硬编码到代码中

img

1
2
3
4
5
作用加载客户端证书文件 client.bksBKS格式的密钥库),用于HTTPS双向认证mTLS)。数说明
client.bks存储客户端证书的密钥库文件需放置在assets目录下
"111111"密钥库密码用于解密证书文件
new InputStream[0]信任库的输入流数组此处未使用自定义信任证书)。
用场景适用于需要客户端和服务端双向验证的安全通信场景如金融类App

将证书文件提取出来,由于证书后缀名是bks,但是burp只支持p12结尾的,所以需要用到证书转换工具portecle

项目连接:https://github.com/scop/portecle

打开证书文件,输入证书密码,右键导出为p12格式即可

img

burp导入证书

img

img

5.3.1.假设APP不能脱壳呢

项目地址:https://github.com/ReversecLabs/android-keystore-audit

如果APP不能脱壳,我们不能直接拿到从代码中获取密钥该怎么拿到呢?这个时候就可以hook APP获取密钥

1
frida -U -f com.paopaotalk.im -l tracer-keystore.js

可以看到APP证书密钥已经被hook出来了

📎tracer-keystore.js

img

By Lsec
最后更新于 Sep 15, 2025 16:30 +0800
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计
¹鵵ҳ