menu E4b9a6's blog
rss_feed
E4b9a6's blog
有善始者实繁,能克终者盖寡。

在Android7.0以上对APP进行抓包

作者:E4b9a6, 创建:2021-04-11, 字数:3312, 已阅:42, 最后更新:2021-04-11

这篇文章更新于 1320 天前,文中部分信息可能失效,请自行甄别无效内容。

1. 前言

Android7.0以上版本更新了安全策略,软件可以选择不信任用户证书了,这就导致抓包一些APP的HTTPS流量时无法正常捕获其数据包

如何在高Android的版本中抓包HTTPS?解决方案据查阅相关资料如下,按难度主观排序一下

  1. 使用低于7.0版本的Android系统(部分APP不支持过低的Android版本号)
  2. 使用VirtraulXposed + TrustMeAlready方法 (无需Root)
  3. 证书内置到系统证书中(需Root)
  4. 反编译APK替换证书

本文着重介绍一下第2种与第3种方法,手机以可以解锁Bootloader的小米系列为例,这里不展开讲如何Root手机,相关资源很丰富,可自行搜索

2. VirtraulXposed + TrustMeAlready

方法优点

  • 无需Root
  • 支持高版本的Android
  • 操作简单

方法缺点

  • 导入程序后有一定概率无法运行,此问题无解

2.1. 安装

相关资源

提示:TrustAleady模块启用之后可以有效禁用证书校验跟客户端SSL Pinning

下载VirtualXposed APK后直接安装,紧接着再下载TrustAleady APK,TrustAleady APK需要使用VirtualXposed进行安装

之后在模块管理中勾选TrustAleady模块并启用,如图所示

接下来就是添加需要抓包的程序,然后回到VirtualXposed设置选项并选择重启

这个方法通吃绝大部分APP,唯一的缺点是如果在VirtualXposed中导入程序后,程序无法正常运行起来

则该方法无效

3. 证书内置

如果VirtraulXposed无法运行程序,则需要考虑别的方法了

IOS抓包或者Android低版本抓包都是办法,但也有自己的局限性,例如没有IOS客户端或者应用并不支持低版本的Android系统

如果我们可以将抓包软件提供的证书从用户证书变成系统证书,就可以解决这个问题

此方法需要ROOT过的Android系统,鉴于越来越少的国内Android手机支持ROOT,国外的二手手机不失为好的考虑,或者虚拟机也是一个不错的方案

3.1. 步骤

无论是使用任何代理软件,抓取HTTPS流量的思路都是替换证书(中间人攻击),对于APP来讲,有2个难点

  1. Android7.0以上版本大部分APP默认不信任用户证书
  2. 数据安全等级严格的客户端都内置了SSL Pinning

因此,内置证书只能解决第一点,针对第二点,则需要安装第三方ExXposed+插件通过HOOK的方式来绕过SSL Pinning了

本文对SSL Pinning不展开讲,只对内置证书步骤进行分解,大致如下

  1. 下载代理软件证书
  2. 转换代理软件证书为Android内置证书格式
  3. 使用adb shell调试手机,挂载/system分区为可读(需ROOT)
  4. 将证书推送至内置证书区域
  5. 重启Android系统

3.2. 实践

以MitmProxy抓包Android APP为例子,在运行MitmWeb之后访问 http://mitm.it 并下载代理证书,如图所示

下载的证书是CER格式的,我们将其转换为PEM格式

Bash
➜  openssl x509 -inform der -in mitmproxy-ca-cert.cer -out mitmproxy-ca-cert.pem

此处如果报错"unable to load certificate 140640294299008:error:0D0680A8:asn1 encoding ...",则直接将cer更改为pem即可

接下来我们需要以这张代理的PEM证书制作Android内置证书

Bash
# 制作Android的内置证书(一)
➜  openssl x509 -inform PEM -subject_hash_old -in mitmproxy-ca-cert.pem | head -1
e5c3944b
➜  cat mitmproxy-ca-cert.pem > e5c3944b.0 
➜  openssl x509 -inform PEM -text -in mitmproxy-ca-cert.pem -out /dev/null >> e5c3944b.0
# 制作Android的内置证书(二)
➜  openssl x509 -inform PEM -subject_hash -in mitmproxy-ca-cert.pem | head -1 
82635c12
➜  cat mitmproxy-ca-cert.pem > 82635c12.0
➜  openssl x509 -inform PEM -text -in mitmproxy-ca-cert.pem -out /dev/null >> 82635c12.0

根据以上步骤我们将得到2张证书,接下来连接Android手机,使用adb将证书推送至Android内置空间中

Bash
➜  adb push 82635c12.0 /sdcard/
82635c12.0: 1 file pushed, 0 skipped. 7.6 MB/s (1322 bytes in 0.000s)
➜  adb push e5c3944b.0 /sdcard/
e5c3944b.0: 1 file pushed, 0 skipped. 5.3 MB/s (1322 bytes in 0.000s)

接下来我们使用adb shell挂载/system分区为可读,然后复制证书到系统内置证书文件夹中

Bash
➜  adb shell
polaris:/ su

# 挂载system分区,然后复制2张Android证书到系统内部,更改其权限后重启机器
:/ mount -o remount,rw /system
:/ cp /sdcard/e5c3944b.0 /system/etc/security/cacerts/
:/ cp /sdcard/82635c12.0 /system/etc/security/cacerts/

更改我们导入的证书权限,然后重启手机

Bash
:/ chmod 644 /system/etc/security/cacerts/e5c3944b.0
:/ chmod 644 /system/etc/security/cacerts/82635c12.0
:/ reboot

重启完成之后查看内置证书区域,可以看到mitmproxy的证书已经在内置证书区域中,如图所示

4. 结束

对于Android APP抓包来说没有IOS来的简单快捷,毕竟现在IOS还可以信任用户证书,APP针对反抓包的也是越来越严格,例如

  1. 强制移动数据网络访问
  2. 检测Wifi代理,如果有代理则提示网络异常
  3. 检测机器是否开启root
  4. APP打包服务端证书做SSL Pinning检测

对于抓包数据来说,没有破解不了的应用,只有破解代价高到无法承受的APP


[[replyMessage== null?"发表评论":"发表评论 @ " + replyMessage.m_author]]

account_circle
email
web_asset
textsms

评论列表([[messageResponse.total]])

还没有可以显示的留言...
gravatar
[[messageItem.m_author]] [[messageItem.m_author]]
[[messageItem.create_time]]
[[getEnviron(messageItem.m_environ)]]
[[subMessage.m_author]] [[subMessage.m_author]] @ [[subMessage.parent_message.m_author]] [[subMessage.parent_message.m_author]]
[[subMessage.create_time]]
[[getEnviron(messageItem.m_environ)]]