目录

前言

本文介绍 Android 和 IOS 平台无法抓包问题产生原因和具体解决操作步骤,按照操作大部分问题可以解决,更加深入需要研究 Hook、Reverse,这不在本文涵盖范围内。

文中特殊符号约定:

  • Wanning 作为警告,一些特殊操作需要注意。
  • Tips 介绍信息或提示操作技巧。

第一部分 Android

BurpSuite 拦截 HTTPS 请求设置步骤

正常情况下应用和系统没有做任何限制,安装完证书并设置 Wi-Fi 代理就可以捕获 HTTP 和 HTTPS 请求。

安装证书的目的是为了能够抓取 HTTPS 包,缘由是应用发起每个请求都会先转到代理,当应用和代理建立 SSL 连接时,代理将返回证书给应用,此时应用就会拿着证书去系统里找对应证书或是证书链上签发机构的证书,找不到就认为连接可能遭到中间人攻击,停止后续数据交换。

下面以夜神模拟器 Android 5.0 系统为例给出安装步骤。

BurpSuite 设置监听地址和端口

BurpSuite 先设置好监听地址和端口,地址实际是你正在上网的网卡地址,这里我选择 All interfaces 去监听所有网卡。

BurpSuite设置监听端口和网卡.png

Tips: 也可在 Specific address 中选择目前正在使用的网卡。

这个地址就是哪张网卡在上网就是哪个地址,拿笔记本为例,通常笔记本有两张网卡,一个是无线一个是带有 RJ45 接口的网卡,使用 Windows Terminal 运行 ipconfig 命令能够查看网卡地址。

ifconfig查看网卡.png

以太网适配器就是可以插网线的网卡,无线局域网适配器则是无线网卡,这就看正在使用哪个网卡 BurpSuite 就监听哪个地址,还有一种情况是我有线无线都有地址咋办?这种情况下所有网络还是走有线网卡,以有线网卡地址为准(具体情况具体分析,请自行判断)。

Mac OS X 和其他类 Unix 系统,运行 ifconfig -a 或者 ip a 获取地址,下图以 CentOS 为例。

CentOS查看网卡.png

安装用户证书

安装证书得首先拿到公钥证书,打开 BurpSuite 找到“Proxy -> Options -> Porxy Listeners”功能,点击 import/export CA certificate 按钮导出,文件后缀改为 .crt 或 .der 方便系统识别。

BurpSuite导出证书.png

根据图片中步骤将证书拖进到设备里,完成后记住文件存放的位置。

传输证书到Android系统.png

打开“设置 -> 安全 -> 从SD卡安装”,点击刚传入的证书文件进行安装,证书名称(Certificate name)可随意设置。

Android安装用户证书.png

安装完成到“设置 -> 安全 -> 信任的凭证”验证用户证书是否存在。

检查证书安装状态.png

在“设置 -> WLAN”长按已连接的 Wi-Fi 名称,点击“修改网络”,开启“高级选项”选择“手动”填入 BurpSuite 监听地址和端口并保存:

设置Wi-Fi代理.png

至此你可以浏览 HTTPS 站点验证请求是否能够抓到。

自定义可信 CA(Customize trusted Cas)

仅安装用户证书就能抓包的时代已经过去,现摆在面前有两种防御措施:

  1. Android 7.0 及以后版本默认不信任用户证书。
  2. 开发人员可以通过定义配置文件的方式指定哪些证书可以信任。

从 Android 7.0 开始可以在应用 res/xml/ 目录下建立 network_security_config.xml 添加用户证书 custom_certificate 和 system 两个证书。

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
            <certificates src="@raw/custom_certificate" />
        </trust-anchors>
    </base-config>
</network-security-config>

<certificates src="system" /> 是信任系统证书,@raw/custom_certificate 则表明应用 res/raw/ 目录下有个名为 custom_certificate.crt 的证书,cleartextTrafficPermitted="true" 表示可以使用 HTTP 明文传输数据,一旦改为 false 就无法明文传输数据,所有请求会失败,从 Android 9 开始 false 是默认配置。

不再相信用户添加的证书,可以尝试的解决方案有:

  • 使用 Android 7.0 以下版本系统,安装用户证书。
  • 把证书安装到系统证书内。
  • 修改配置文件重新打包应用。

安装系统证书

App 总要信任系统证书,只需将证书安装为系统证书就可解决,下面给出安装实例。

  1. 导出证书

    参见安装用户证书小节导出证书,后缀名无所谓,只要内容是 X.509 证书就行。

  2. 计算证书 hash

    因为系统证书名字都是 hash.0,文件名是 hash,后缀名是 .0,所以先计算出证书 hash 最后 mv 重命名证书:

     root@iZ2ze3excf14rd7l4rsgn3Z ~]# openssl x509 -inform DER -in burpsuite -out burpsuite.pem
     root@iZ2ze3excf14rd7l4rsgn3Z ~]# openssl x509 -inform PEM -subject_hash_old -in burpsuite.pem | head -n 1 | xargs -I {} mv burpsuite.pem {}.0
     root@iZ2ze3excf14rd7l4rsgn3Z ~]# ls
     9a5ba575.0 burpsuite

    Warning: 计算证书 hash 用 -subject_hash_old 选项 而不是 -subject_hash(等同于 -hash )选项,因为 -subject_hash 使用 SHA-1 算法,-subject_hash_old 使用 OpenSSL 1.0.0 之前老算法 MD5 计算。经过测试在 Android 7 64bit 上只能使用 -subject_hash_old 系统才能识别出证书。

  3. 安装系统证书

    安装证书分实体机和模拟器两部分说明,它们操作前提条件都是要先获取 root 权限,因为系统证书存放 /system/etc/security/cacerts 目录下普通用户无权写入,没有 root 就无法移动证书到此目录下。

    实体机需要先把系统开发者选项下的 USB 调试打开,后续才能用 adb 操作。

    手机通过 USB 数据线连接至 PC,并设置 USB 为文件传输模式,就将证书复制到 Download 文件夹,对应绝对路径 /sdcard/Download。

    使用 adb shell 进入 shell,移动证书到系统证书目录,因为系统证书默认都是 644 权限和 root 所有,所以也做相同设置防止无权读取。

     PS D:\adb > ./adb shell
     haydn:/ $ su
     haydn:/ # mv /sdcard/Download/9a5ba575.0 /system/etc/security/cacerts/ 
     haydn:/ # chmod 644 /system/etc/security/cacerts/9a5ba575.0 && chown root.root /system/etc/security/cacerts/9a5ba575.0

    Tips: 如果你使用 Mgisk 获取 root 权限,手动安装系统证书显示文件系统只读,尝试 adb remount 直接 not found,更改 /default.prop 配置文件 ro.debuggable=0 为 1 无权限,挂载根分区都不行。你需要先安装用户证书,打开 Magisk 在线搜索 Move-Certificates 模块安装——有可能是到 github 下载项目需要梯子才能下载成功,重启机器自动将用户证书移到系统证书,在卸载模块后证书自动消失。这里我也提供离线安装包,可自行手动安装。

    模拟器安装证书操作有所不同——以夜神模拟器为例,首先模拟器默认以 root 启动,无需 adb root 让 adb 以 root 权限启动,但 /system 目录默认是只读无法写入,需要 adb remount 以读写权限重新挂载 /system 分区。

     PS D:\adb > ./adb remount
     remount succeeded
     PS D:\adb > ./adb push 9a5ba575.0 /system/etc/security/
     [100%] /system/etc/security/9a5ba575.0
     PS D:\adb > ./adb shell "chmod 644 /system/etc/security/cacerts/9a5ba575.0 && chown root.root /system/etc/security/cacerts/9a5ba575.0"
     PS D:\adb > ./adb shell ls -l /system/etc/security/9a5ba575.0
     -rw-r--r-- 1 root root 1375 2021-11-11 10:11 /system/etc/security/9a5ba575.0

    Tips: adb 命令存放在夜神模拟器安装目录下的 bin 目录里,你也可以去官网下载。

    不管实体机还是模拟器, 安装完毕后请查看证书是否正常显示并开启。

    验证系统证书安装状态.jpg

    全部设置完成后请重启设备,使用浏览器浏览 HTTPS 站点确保证书正常。

修改配置文件重新打包应用

除添加系统证书外,前面提到过开发者可以在 network_security_config.xml 里配置信任证书,我要是添加信任用户证书 <certificates src="user" overridePins=true />,再 apktool b 重新打包就绕过证书信任问题。

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
            <certificates src="user" overridePins=true />
        </trust-anchors>
    </base-config>
</network-security-config>

手动使用 apktools 完成反编译,签名打包步骤太麻烦,可以使用 apk-mitm 工具简化流程。

固定证书(Certificate Pinning)

通常应用为了安全还增加其他证书校验手段,当服务器返回的证书和代码中的证书不一致就不进行通信,这使得 App 只能和服务器进行通信。

详细点说是应用和服务器中间接入代理,SSL 建立连接时代理返回证书,应用成功在系统里能找到证书,此时 SSL 建立成功,但是开始传输数据前走到证书校验代码,因此还会校验一次证书,此时证书和代码里的不同,直接返回证书验证失败,后续传输数据也就无法进行。

固定证书这个技术产生可能是考虑到以往 CA 被黑,或者是通过社工让用户安装证书,但这并不是一个好的解决方案。

当安装证书后还是无法抓取 HTTPS 请求,就要猜测可能做了 Certificate Pinning,实现通常用 network_security_config.xml 和第三方库:

  • Okhttp
  • Retrofit
  • Picasso
  • Volley
  • Apache HttpClient
  • TrustKit

常见证书固定实现方式

network_security_config.xml

第一种,通过在 network_security_config.xml 里设置 pin-set 标签固定证书。

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <pin-set expiration="2018-01-01">
            <pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin>
            <!-- backup pin -->
            <pin digest="SHA-256">fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=</pin>
        </pin-set>
    </domain-config>
</network-security-config>

<domain includeSubdomains="true">example.com</domain> 是设置配置范围,example.com 和其子域名会生效,<pin-set expiration="2018-01-01"> 约束了证书固定过期时间,如果不设置这个属性就永久固定,永久带来的坏处是,域名更换证书就会产生错误无法使用应用,所以就设置了好几个 <pin> 标签备用,通常固定应用证书链上级证书,只要应用证书失效就去验证上级证书。

第三方库

第三方库涉及具体 API 使用,需要看官方文档,不在本节展开。

识别 Certificate Pinning 特征

代理日志

BurpSuite 代理日志里 TLS 握手失败。

BurpSuiteEventLog1.png

另一种是报“The client failed to negotiate a TLS connection to xxx Received fatal alert: certificate_unknown”,这是说未知证书,说明应用在系统里没找到证书。这要么说明系统证书里没找到证书,要么是证书不匹配。

BurpSuiteEventLog2.png

识别关键字

直接 apktool 反编译搜关键字,但如今应用都做过代码混淆,仅通过包名和类名无法得知是否使用证书固定。

一个较好的办法是都去搜索 Pinning、Pinner...... 常见库名或者方法关键字,现实情况是 App 可能混淆,但库使用方式上存在特征,如 okhttp 做固定肯定要写证书哈希值 sha256/XXXXX,这种一般作为参数或变量传递不会做修改或混淆。

grep -rni "<pin digest=\"\|sha256/[A-Za-z0-9\/+=]\{43,45\}"

绕过 Certficate Pinning

Hook 常见校验,更改返回结果,这些内容安装现成框架和模块就行,已经全部实现。如果发现不成功尽可能尝试多一些模块。

Xposed + JustTrustMe + SSLUnpinning

夜神模拟器 Android 5.0 安装 Xposed 可在模拟器应用商店里搜索“派大星XP国内版”关键字安装。

搜索派大星XP框架.png

俩工具安装完,打开 Xposed 选择“Root安装[推荐]”下载对应文件。

下载 XP.png

安装完手动重启模拟器。

XP安装完重启.png

安装 SSLUnpinning 后,打开 Xposed 加载 SSLUnpinning 模块, 最后进入 SSLUnpinning 点击对应 App。

1.png

至此 BurpSuite 就能抓到包。

以上演示了 SSLUnPinning 插件安装,JustTrustMe 也是类似,官方的 JustTrustMe 版本存在 bug,WebView 抓不到包,建议使用修改版

Tips: 另一点是目前 Xposed 太老,无法支持新系统版本,可能安装完成导致设备无法开机——在夜神模拟器 Android 7.0 和 Android 9.0 版本存在此问题,建议尝试 VirtualXposedMagisk+TaiChi+各种 SSL Pinning Module 组合。

LSPosed(待补充)

前面提到 XPosed 老很多设备无法使用,LSPosed 作为其分支发展的很好,还能兼容以前老的 Xposed 模块。

只是使用前需要安装 Magisk,这里给出 RedMI K40 Pro 安装参考,模拟器安装需要另查操作步骤。

Taichi + TaichiMagisk(待补充)

为什么不用 Xposed?

太极阳 = Taichi + TaichiMagisk。

  1. 安装 Mgisk 刷成 root。各个机型操作都不同请自行寻找步骤,如果是小米设备可以参考 MagiskHide 小节内容安装。

  2. 先安装太极框架 https://github.com/taichi-framework/TaiChi/releases/tag/7.0.0

  3. 之后在 Magisk 中手动安装模块

    Mgisk 安装 Taichi.jpg

    选中刚下载的 TaichiMagisk 压缩包即可完成安装。

frida

frida 分为客户端和服务端,服务端安装在移动设备上,客户端发送指令让服务端执行操作。

先安装 Python3,运行 pip install frida-tools 安装客户端。

安装 Friday 客户端.png

服务端安装需要先查架构,运行 ./adb shell getprop ro.product.cpu.abi

查询硬件架构.png

https://github.com/frida/frida/releases 下载 Android 对应 server 版本。

下载 FridaServer.png

将 frida-server-15.1.10-android-x86.xz 解压 push 到设备上。

PS D:\adb> ./adb push C:\Users\gbb\Desktop\frida-server-15.1.10-android-x86 /data/local/tmp
C:\Users\gbb\Desktop\frida-server-15.1.10-android-x86: 1 file pushed. 35.2 MB/s (47069552 bytes in 1.274s)
PS D:\adb> ./adb shell su -c chmod +x /data/local/tmp/frida-server-15.1.10-android-x86

无法 push 时就传到设备 Download 目录手动 move。

PS D:\adb> ./adb shell
haydn:/ $ su
haydn:/ # mv /sdcard/Download/ frida-server-15.1.10-android-x86 
haydn:/ # chmod +x /data/local/tmp/frida-server-15.1.10-android-x86

放入后台运行服务端。

PS D:\adb> ./adb shell su -c "/data/local/tmp/frida-server &"

服务端运行后,使用客户端命令 frida-ps -Ua 查看系统正在运行的进程。

实际绕过可以上 https://codeshare.frida.re/browse 查找各种现成 SSL Pinning Bypass Hook 代码。

Frida现成Hook代码.png

可以按照图中给出的命令运行,或直接下载下来通过 .js 运行,执行对象是 Name,通过 frida-ps -Ua 查看。

PS C:\Users\gbb\Desktop> frida -U -l xx.js Name

有时运行 frida 识别不到驱动,可能是服务没启动。

PS C:\Users\gbb> frida -U -l  frida-multiple-unpinning.js AppName
     ____
    / _  |   Frida 15.1.22 - A world-class dynamic instrumentation toolkit
   | (_| |
    > _  |   Commands:
   /_/ |_|       help      -> Displays the help system
   . . . .       object?   -> Display information about 'object'
   . . . .       exit/quit -> Exit
   . . . .
   . . . .   More info at https://frida.re/docs/home/
Waiting for USB device to appear...

一般用 adb 连接后重新运行脚本就正常。

PS D:\gbb\tools\adb> ./adb shell
* daemon not running; starting now at tcp:5037
* daemon started successfully
haydn:/ $
objection

objection 是一个对 frida、apktool 等工具做包装用于方便使用,安装它只需使用 Python3 包管理工具 pip。

PS D:\adb\ > pip install -U objection

使用 objection 首先先运行 frida-server。

PS D:\adb\ > ./adb shell su -c "/data/local/tmp/frida-server-15.1.10-android-x86 &"

如果 frida-server 有问题想杀死进程。

PS D:\adb\ > ./adb shell su -c "pkill -9 frida-server-15.1.10-android-x86"

Hook 前需要得到应用包名或者进程 PID,运行 adb shell am monitor,再打开目标应用,此处拿哔哩哔哩做示例,得出运行的包名 tv.danmaku.bili。Android 应用也可查看 AndroidManifest.xml 文件 package 属性值得到包名。

PS D:\adb\ > ./adb shell am monitor
Monitoring activity manager...  available commands:
(q)uit: finish monitoring
** Activity starting: tv.danmaku.bili
** Activity starting: tv.danmaku.bili

使用 objection -g PackgeName explore --startup-command "android sslpinning disable" 启动应用并 Hook 常见第三方库。

PS C:\Users\gbb\Desktop> objection -g tv.danmaku.bili explore --startup-command "android sslpinning disable"

具体 Hook 哪些库见 android.sslpinning.disable.txt

另一种是先启动 App,后 Hook,具体操作是使用 PID 运行 objection,PID 可以通过 frida-ps -Ua 获取。

PS C:\Users\gbb\Desktop> objection -g 1294 explore --startup-command "android sslpinning disable"

双向认证(Two Way Authentication TLS)

双向认证是指客户端和服务端都验证对方证书,整个验证流程是客户端先验服务端证书,通过后就会把本地证书发给服务器去验证,成功后才开始通信。

这在 App、Thick Client、Web 都很常见,以前挖洞 XSS 打到 Cookie,去浏览域名发现遇到双向认证无法访问 Web 应用,这种情况服务器是必须要验证证书才能得到返回资源。

双向认证失败服务器错误信息.png

所以没事多注意 BurpSuite 事件日志,遇到上述证书没发送关键字就是双向认证。

找证书

既然需要证书服务端才能信任我,那如何找证书?证书一般会随安装包一起发布,一般放在 assets、res 等资源目录下——但实际情况并不一定,最好使用 grep 递归搜索关键字,证书后缀通常以 .p12、.pfx 结尾。

拿到包里携带的 PKCS#12 证书和密码(有的证书可能是空密码)在 BurpSuite 安装就可以绕过。

BurpSuite安装证书.png

实际情况 App 混淆密码,不好通过关键词搜出来,另一个思路是 Hook KeyStore,参见 r0capture 项目导出证书。

不使用工具手动操作,过程涉及脱壳、反编译、逆向去找密码,情况复杂,暂时没有实际案例分享。

Wi-Fi 代理检测(Wi-Fi Proxy Detection)

当你绕过证书问题后,后续仍有许多情况导致无法抓包,Wi-Fi 检测时其中之一。

如开发者获取代理配置检查当前有没挂代理。只要挂了代理就走自己定义的 HTTP 客户端,或者停止请求发送,有的还会记录日志,可以多多观察。可以用 Frida Hook getHost() 和 getPort() 但比较费力,这是 Wi-Fi 导致无法抓包情况之一。

另一个原因是无线 AP 隔离,原意是杜绝客户端互相访问,避免局域网客户端之间攻击行为,所以移动设备无法向 BurpSuite 发送数据,这种情况可以尝试自己开热点测试。

如上述内容都已尝试过无法绕过,可以考虑下面解决方案。

iptables 转发流量

将 Android 设备和 BurpSuite处于同一网络下,使用 root 权限将访问任何主机的 80 和 443 端口请求转发到 BurpSuite。

adb shell su -c "iptables -t nat -A OUTPUT -p tcp -m multiport --dports 80,443 -j DNAT --to IP:PORT"

通过 iptables -L -t nat 查看到,规则已添加成功。

iptables 转发流量.png

随后打开 BurpSuite 开启透明代理“Porxy -> Options -> Edit -> Request handing -> Support invisible proxying(enable only if need)”即可抓包。

开启隐形代理.png

如果想清空规则。

adb shell su -c "iptables -t nat -F"

可以看到规则成功删除。

iptables规则清空验证.png

当前 iptables 规则缺点是只能转发请求目标的 80 和 443,一旦发起范围外的请求就不会被转发,例如 https://example.com:8080 无法转发,虽然 https 可以转,但其中 8080 不在规则内,非要转发需手动添加规则。

解决办法是使用 tcpdump 分析 App 向哪些服务器发起请求,这种方法可以搞定,但也有复杂之处,比如 App 使用多个接口,需要手动把所有功能使用一遍避免遗漏。

VPN 配合 Charles 流量转发

使用 VPN 配合 Charles Socket5 转发到 BurpSuite,整个数据走向是:“VPN -> Charles -> BurpSuite”。下面开始配置实例。

Charles 手动安装证书,前面提到过 Android 7.0 用户证书不再有用,所以需要 root 安装系统证书。通过 Charles“Help -> SSL Proxying -> Save Charles Root Certificatee”选择保存 .pem 证书。

Charles证书导出.png

之后就参照安装系统证书小节安装,证书安装完成后一定要重启,不然无法生效,在这点细节上曾浪费不少时间。

下一步设置 Charles 监听 Socks 端口,手动指定怕端口冲突勾上“Use a dynamic port”让 Charles 自动选,这两种方式都行。

设置 Charles 监听端口.png

关于 Charles Socks 设置里面还有几个复选框可以多说两句,Enable HTTP Proxying over SOCKS 复选框是说有遇到 HTTP 协议的就按照 HTTP 解析。

include default HTTP ports(80,443,8080,8443),是讲如果某个数据被 Charles 捕获到了但是它请求是不再指定端口范围内,就按照 Socks 处理而不是 HTTP,如下图 8011 端口不再范围内默认以 Socket Schema 显示,如果你添加 8011,Schema 就按照 HTTP 显示,这在后面将 Charles 数据转发给 BurpSuite 有关,由于 BurpSuite 可能无法处理 Socks 数据导致丢包。

Charles Schema 显示不正常.png

证书、代理设置完之后,需要配置 SSL 代理,这样 Charles 才会记录 HTTPS 请求而不是直接转发发给服务器,换句话说是开启 SSL 代理 HTTPS 才能显示明文,这里设置为通配符表示任意站点任意端口。

设置 SSl 代理.png

至此 Charles 全部配置完成,下面安装 VPN,这里我使用 AnXray,App 安装完新建配置选择 Socks 协议,填入对应地址、端口即可。

AnXray 配置.jpg

AnXray 有一个实用分流功能,在“设置 -> 路由设置 -> 分应用代理”可以配置哪些 App 能够走 VPN,这样防止不必要的流量转发到 Charles,在测试时不用分辨哪个是目标的请求,较为省心。

AnXray 分应用代理.jpg

VPN 设置完后,打开哔哩哔哩 App 就能抓到包。

bilibili 成功抓到包.png

光 Charles 抓到包编辑重放等操作没 BurpSuite UI 方便,可以使用 Charles 的 External Proxy Settings功能将请求转发给 BurpSuite。

Charles 请求转发.png

勾上 Use external proxy servers 启用功能,选择 HTTP、HTTPS 请求转发到 BurpSuite 监听的地址 127.0.0.1:8080——实际地址和端口根据个人设置更改。

Charles 请求转发设置.png

BurpSuite 成功收到请求。

验证 BurpSuite 收到 Charles 转发的请求.png

模拟器和 ROOT 权限检测(Emulator Detection and Root Detection)

在模拟器安装完应用无法打开或者正常使用,检查模拟器的方式太多,最好不要对抗,费时又费力,使用真机保平安。

对于 ROOT 检查是看这几个文件是否存在,存在就表示 Android 已经 Root。

/system/bin/su
/system/xbin/su
/sbin/su
/vendor/bin/su

ROOT 尝试用 Magisk 隐藏即可。或者 Hook exists() 返回值。

new File("path").exists()

综合以上问题查看,再抓不到包可能走的自定义代理,不然就是非 HTTP 协议,或是私有协议,需要 tcpdump 分析下原因。

MagiskHide

通常四大行 App 会检查 ROOT,以中国建设银行为例,系统 ROOT 后无法打开应用,点击确认后应用退出。

建行root提示错误.jpg

下载并安装 Magisk-vXX.X.apk,根据官方安装文档描述,每台设备安装情况不一样,没有统一步骤,下面以 Redmi K40 Pro 为例做出演示。

先解锁系统 BootLoader,安装 Magisk 后 Ramdisk 是 Yes。

Magisk Ramdisk.png

只需下载当前系统版本安装包提取 boot.img。版本信息通过设置查看。

Andorid 系统版本查看.jpg

下载卡刷包系统和 boot.img 提取工具,将系统压缩包内 payload.bin 和工具放在统一目录下运行。

PS D:\gbb\tools\adb> .\payload-dumper-go.exe -partitions boot payload.bin

boot.img 提取.png

提取出 boot.img 后放入设备 Download 目录,打开 Magisk 点击安装。

Magisk 安装 boot.img.png

打开 PowerShell 取出 patched的 img 到桌面。

PS D:\gbb\tools\adb> ./adb pull /storage/emulated/0/Download/magisk_patched-23000_GZNrU.img ([Environment]::GetFolderPath("Desktop"))

使用命令进入 fastboot 模式——除 adb 进入外也可重启手机长按电源+减音量键进入。

PS D:\gbb\tools\adb> ./adb reboot bootloader

手机 FASTBOOT 界面.jpg

先检查下 fastboot 能否连接设备,没有连接无法写入。

PS PS D:\gbb\tools\adb> ./fastboot devices
7585ab46        fastboot

Warning: 如果无法连接请尝试安装驱动、更换小米数据线、更换 USB2/3 端口排查。

写入 img 重启系统。

PS D:\gbb\tools\adb> ./fastboot flash boot magisk_patched-23000_GZNrU.img
Sending 'boot_b' (196608 KB)                       OKAY [  4.671s]
Writing 'boot_b'                                   OKAY [  0.266s]
Finished. Total time: 5.275s
PS D:\gbb\tools\adb> ./fastboot reboot
Rebooting                                          OKAY [  0.000s]
Finished. Total time: 0.004s

启动 ROOT 隐藏功能。

Magisk 隐藏 root.png

安装完成可以再打开 App 验证是否有问题。

App 硬编码域名

有时候抓不到包,挂代理和 VPN 没用,大概率是因为在 App 内发送请求时只发到指定域名。

只需先 Wireshark 或其他工具观察向哪个域名发送请求,记住这个域名作为特征,apktool 反编译 App,ack 找出包含这个域名的 small 文件,将其硬编码替换成 BurpSuite 代理。

此时 App 所有请求的 Domain 变成 BurpSuite 代理,可以在 Proxy -> Options -> Proxy Listeners -> Edit -> Request handding 将原有域名和端口填入,所有请求就会转发回 App 域名。

请求转发确实是转了,但是其中 Host 请求头还是 Burp 代理 IP,需要 Proxy -> Options -> Match and Replace 将 IP 替换回 App 原有域名,让整个请求头正常。

资料来源:It's all about Bypassing Android SSL Pinning and Intercepting Proxy Unaware applications.

第二部分 IOS(待补充)

IOS 与 Android 差不多,都是类似的,只是工具不同。全自动越狱使用爱思助手,越狱完成还需要安装两个 Cydia 插件,才能安装 .ipa 应用:

  1. 安装 AFC2,在 Cydia 里搜索 “Apple File Conduit 2” 安装。
  2. 安装 AppSync,在 Cydia “软件源 -> 编辑 -> 添加” 输入 https://github.com/akemin-dayo/AppSync 提供的 https://cydia.akemi.ai 源,更新完毕,搜索 AppSync Unified 安装即可。

之后参考 Exploring iOS Applications with Frida and Objection: Basic Commands for Pentesting 安装 FridaServer 端

或者直接 Cydia 安装个 SSH,使用默认密码 root 连接 root 账户,scp 传。

如果 SSH 连接不稳定,Cydia 搜索 NewTerm3 终端安装后直接手机上连接。系统中默认不会安装常用命令,可以参考 iOS:如何在iphone、ipad上安装一些常用命令行命令一文安装。

或者参考 【IOS逆向】越狱环境搭建 一文手动越狱也行。

这里把文章离线,方便观看,猎户攻防实验室-浮萍-【IOS逆向】越狱环境搭建.pdf

https://github.com/palera1n/palera1n 项目也可以对 IOS 越狱,目前支持 16。

SSL 证书验证

https://github.com/nabla-c0d3/ssl-kill-switch2

第三部分 Flutter(待补充)

https://github.com/Impact-I/reFlutter

参考资料

最近更新:

发布时间:

摆哈儿龙门阵