Android抓包ALL IN ONE

抓包软件配置

Charles

初始配置

Charles注册码

1
2
>Name: Forgo7ten.github.io
>Key: 6868255341EDC5CD3D
  1. 安装证书

    1. 菜单栏Help->SSL Proxying->Install Charles Root Certificate,保存到受信任的根证书颁发机构
    2. Save Charles Root Certificate,保存证书,配置到手机
  2. 配置访问控制设置

    1. 菜单栏Proxy->Access Control settings...
    2. 【Add】 0.0.0.0/0
    3. 点击【OK】
  3. 配置代理服务器设置

    1. 菜单栏Proxy->proxying settings...

      image-20220106211229311

  4. 配置SSL代理设置

    1. 菜单栏Proxy->SSL Proxying settings...
    2. 勾选【Enable SSL Proxying】
    3. 【Include】下添加*:443或者*:*
    4. 点击【OK】

手机代理设置 8889端口及SOCK5代理模式

菜单栏Proxy->Windows Proxy(Ctrl+shift+P):Windows抓包开关(关闭后可不抓Windows的包)

同时Proxy->proxying settings...->Windows中可取消启动时自动打开windows抓包


Charles抓包外网APP:配置External Proxy Settings设置来配置代理(可将包转发到BP,形成app->Charles->BurpSuite->Server链路

Charles添加新证书

  1. 菜单栏ProxySSL Proxy SettingsClient CertificatesAdd添加新的证书
  2. 输入指定的域名IP以及端口并导入p12格式或者pem格式的证书

之后即可将Charles伪装成使用特定证书的客户端,最终达到正常抓包的目的

Burpsuit

Burpsuit配置上游代理

(访问google)

image-20220424103048995

Burpsuit中文乱码

请求与响应报文中文乱码:字体为中文字体(如果有不带编码格式的响应需要在此修改,修改编码UTF-8

image-20220424095508443

Burpsuit插件

菜单栏Extender -》 BAppStore

  • Copy as Python-Requests ---- 一键复制成python代码
  • Non HTTP Proxy(NoPE)---- 抓取非HTTP协议的数据(有些包抓不到的时候,可以尝试,原理是用伪造的DNS服务器来抓取数据)
  • JSON Query ---- 解析json数据…

Android配置

配置系统证书

Android7.0系统证书目录:/system/etc/security/cacerts/

用户证书目录:/data/misc/user/0/cacerts-added/(可以先导入用户证书、之后移动至系统证书目录、省去重命名等步骤)

快捷配置证书脚本:move_cert.sh

计算证书hash值

需计算相应证书的hash值

openssl version查看openssl版本;在1.0以上使用-subject_hash_old、1.0以下使用-subject_hash

.cer证书

1
openssl x509 -subject_hash_old -in FiddlerRoot.cer -inform der

对于.pem证书

1
openssl x509 -subject_hash_old -in charles-proxy-ssl-proxying-certificate.pem

其中cer.pem互转

.pem证书转.cer证书

1
>openssl x509 -outform der -in demo.pem -out demo.cer

.cer证书转.pem证书

1
>openssl x509 -inform der -in demo.cer -out demo.pem

系统证书目录证书格式为.pem

重命名证书

将证书重命名为[hashcode].0

拷贝证书进入系统根证书目录

进行证书临时拷贝

1
adb push hash.0 /sdcard/

先将根目录重新挂载为可读可写目录

1
2
3
adb shell
su
mount -o rw,remount /

1
2
3
4
5
6
disable-verity
reboot
mount -o rw,remount /system

# 也可以尝试上述三个命令来挂载磁盘。
# 第一条命令用于关闭Android系统的校验分区

将证书移动到证书目录并赋予权限、修改用户和属组

1
2
3
4
mv /sdcard/hash.0 /system/etc/security/cacerts/
cd /system/etc/security/cacerts/
chmod 644 hash.0
chown root:root hash.0

重启

1
reboot

其中系统凭据能找到

1
2
Fiddler: DO_NOT_TRUST
Charles:XK72 Ltd

安卓8以上 修改system读写权限

1
2
3
4
5
6
adb root
adb disable-verity
adb reboot // 必须重启一次,不然无法生效

adb root
adb remount

未测试

安卓10以上,配置系统证书

https://github.com/NVISOsecurity/MagiskTrustUserCerts

https://github.com/Magisk-Modules-Repo/movecert

配置代理软件

adb命令代理

1
adb shell settings put global http_proxy 127.0.0.1:8888

WiFi代理(不建议)

  1. wifi修改网络
  2. 高级选项
  3. 代理:手动
  4. 设置主机和端口

Drony

Drony for Android - APK Download (apkpure.com)

  1. 右滑到设置,点击【Networks(网络)-Wifi(无线网络)】
  2. 选择【当前Wifi】
  3. 【Proxy type(代理類型)】选择【Manual(手動)】
  4. 设置【Hostname(主機名)】和【Port(端口)】
  5. 将【Filter default value(過濾默認值)】改为【4 Direct all(引導全部)】(可改可不改)
  6. 进入【Rules(規則)】
  7. 新建规则,选择【本地代理鏈全部】,【选择相应APP】,其他不选
  8. 在开始页面,将【OFF】改为【ON】,开始代理

Postern

Postern - Google Play 上的应用

安装postern

配置代理

服务器名称:随意
服务器地址:电脑局域网地址
服务器端口:8888(与fiddler等端口一致)
代理类型:HTTPS/HTTP CONNECT
保存

另为配合Charles,配置一个代理类型为SOCKS5,以捕获该类型的数据包,端口等要与电脑抓包软件相符

配置规则

匹配类型: 匹配所有地址
动作: 通过代理连接
代理/代理组:选择相应代理
勾选开启抓包
目标地址:*
保存

右侧菜单打开VPN

右侧菜单打开VPN

clash

Releases · Kr328/ClashForAndroid (github.com) cfa-2.5.11-premium-universal-release.apk

从文件中导入配置

charles.yaml

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
mixed-port: 7890

allow-lan: false

mode: global

external-controller: 127.0.0.1:9090

log-level: info

dns:
enable: true
ipv6: true
enhanced-mode: redir-host
nameserver:
- 114.114.114.114

proxies:
- name: "转发Charles"
type: socks5
server: 192.168.1.1
port: 8889

proxy-groups:

rules:

自行修改proxies下的ip地址与端口号

SocksDroid

PeterCxy/SocksDroid (github.com)

调试WebView

使用Chrome DevTools Chrome DevTools - Chrome Developers

  1. 电脑usb连接手机

  2. Chrome访问地址chrome://inspect

    image-20220106141702599

该调试方法依赖于 APP自身必须调用WebView.setWebContentsDebuggingEnabled(true);才会允许被DevTools调试

可以安装Xopsed模块 GitHub - feix760/WebViewDebugHook: Use Xposed force all webView to debug on android 4.4+

自行编写 只需要在目标APP进程中调用静态方法WebView.setWebContentsDebuggingEnabled(true);

HOOK抓包

清空~/.objection/objection.log日志文件,objection载入APP

获取加载的所有类

1
android hooking list classes

关闭objection,使用grep来过滤网络相关类。结果保存到一个文件

1
2
3
cat objection.log | grep -i HttpURLConnection >> classes.txt
cat objection.log | grep -i okhttp >> classes.txt
cat objection.log | grep -i okhttp3 >> classes.txt

在该文件 每行行首添加android hooking watch class(多行编辑)

objection载入APP时,使用-c参数选定命令文件载入

1
objection -g com.example.app explore -c "classes.txt"

可以确定APP的网络请求框架,

之后定位到APP自身的具体方法

抓包对抗

  • SSL Pinning,又称证书绑定,可以说是客户端校验服务器的进阶版:该种方式不仅校验服务器证书是否是系统中的可信凭证,在通信过程中甚至连系统内置的证书都不信任而只信任App指定的证书。一旦发现服务器证书为非指定证书即停止通信,最终导致即使将Charles证书安装到系统信任凭据中也无法生效。
  • 服务器校验客户端(双向校验):这种方式发生在HTTPS验证身份阶段,服务器在接收到客户端的公钥后,在发送session key之前先对客户端的公钥进行验证,如果不是信任的证书公钥,服务器就中止和客户端的通信。

SSL Pinning Bypass

证书绑定校验(客户端校验证书)

对于Android APP来说通常有两种方式:

  • 客户端持有证书公钥hash
  • 客户端持有证书文件

校验分为两种方式:

  • 代码校验
  • 配置校验:res/xml/network_security_config.xml

判断

抓包报错

1
2
Client closed the connection before a request was made. Possibly the SSL certificate was rejected.
You may need to configure your browser or application to trust the Charles Root Certificate. See SSL Proxying in the Help menu.

定位:objection HOOKJava.io.File.\$init,查看是否有参数为/system/etc/security/cacerts

绕过

Objection

objection提供命令来实现SSL Pinning Bypass

1
android sslpinning disable
DroidSSLUnpinning

WooyunDota/DroidSSLUnpinning: Android certificate pinning disable tools (github.com)

JustTrustMe

Fuzion24/JustTrustMe: An xposed module that disables SSL certificate checking for the purposes of auditing an app with c ert pinning (github.com):自行编译仓库代码获得最新APP

JustTrustMePlush
HOOK抓包

服务器校验客户端证书

判断

1
400 No required SSL certificate was sent

绕过

逆向分析代码 或 Frida hook获取证书密钥

KeyStore Explorer (keystore-explorer.org) 转换证书格式

将App中内置的证书导入抓包软件(charles或Burp)中,使得服务端认为自己仍旧是在与其信任的客户端进行通信,最终达到欺骗服务器的作用。

好文