安卓应用层抓包突破

admin 2023年4月27日00:15:59评论137 views字数 2571阅读8分34秒阅读模式

0x00 Referer

个人学习笔记,肉丝大佬 r0capture 项目(安卓应用层抓包通杀脚本)中的知识点。

0x01 HTTPS中间人抓包

1.1 高版本安卓系统如何导入证书

  • magisk:Move Certificates 模块
  • AOSP编译:https://blog.csdn.net/Roland_Sun/article/details/70597573

1.2 中间人抓包方式,抓不到包如何确认问题出在哪

1.2.1 单向校验(Client 校验 Server)

  • 现象:400 bad request
  • 原因:没有将抓包工具证书放在手机中

1.2.2 双向校验(Server 校验 Client)

  • 现象:No required SSL certificate was sent
  • 原因:没有向抓包工具配置APP证书

1.2.3 SSL PINNING

告诉你证书没配置好,其实你已经配置好了

1.3 双向验证

1.3.1 什么是双向验证

单向校验基础上,服务端要校验客户端APP的证书。

1.3.2 APP双向校验的情况下如何进行中间人抓包

将客户端证书配置到抓包工具即可

1.3.3 如何获取APP的客户端证书和密码

通过HOOK证书相关类包

安卓应用层抓包突破

1.3.4 如何将客户端证书配置到抓包工具

有手就行

1.4 代理检测

1.4.1 代理检测原理

通过系统API获取代理状态

安卓应用层抓包突破

1.4.2 如何绕过代理检测

hook

1.5 证书绑定

1.5.1 什么是证书绑定

在开发时就将服务端证书一块打包到客户端里,这样在HTTPS建立时与服务端返回的证书进行一致性对比,进而识别出中间人攻击后直接在客户端侧中止连接。

1.5.2 如何绕过证书绑定

定位客户端证书绑定的代码位置,HOOK修改它的执行逻辑。

1.5.3 如何定位/绕过已知网络通信框架的证书绑定代码

思路:去熟悉各种框架的证书绑定相关API,然后编写HOOK代码。

HOOK

  • https://github.com/WooyunDota/DroidSSLUnpinning
  • objection下运行 android sslpinning disable

各种框架进行证书绑定操作的源代码:https://appmattus.medium.com/android-security-ssl-pinning-1db8acb6621e

1.5.4 如何定位/绕过未知框架的证书绑定代码

客户端证书不管隐藏的再好,也需要从磁盘读取到内存中,可通过HOOK JavaFile类构造函数检测客户端证书的读取,进一步分析调用栈,定位证书绑定代码。

0x02 VPN抓包

2.1 VPN抓包工具

Postern(安卓手机),下载地址自行搜索。

2.2 VPN抓包和中间人抓包的区别

VPN抓包本质上是在网络层抓包,也就是OSI模型里的4层,中间人抓包为7层。

2.3 VPN抓包检测

1、判断网络接口名字包含ppp0tun0

安卓应用层抓包突破

2、获取当前网络Transpoart字样

安卓应用层抓包突破

2.4 如何绕过VPN检测

HOOK

0x03 HOOK抓包

3.1 如何通过HOOK抓到HTTP包

3.1.1 原理

HTTP直接走Socket没有加解密,直接是明文,将内容dump下来即可。

3.1.2 HOOK点

java.net.SocketOutputStream.socketWrite0('java.io.FileDescriptor''[B''int''int')
java.net.SocketInputStream.socketRead0('java.io.FileDescriptor''[B''int''int''int')

Frida

安卓应用层抓包突破

3.2 如何通过HOOK抓到HTTPS明文数据

其他应用层协议+SSL框架 同理

3.2.1 原理

[HTTP明文] ---> [SSL库API] ---> [HTTPS密文]

[SSL库API]调用前这个时机,即加密前,HOOK截取HTTP明文

[HTTPS密文] ---> [SSL库API] ---> [HTTP明文]

在[SSL库API]调用后这个时机,即解密后,HOOK截取HTTP明文

综上:HOOK SSL库的某个关键API

3.2.2 如何确定SSL库的关键API

两种情况

1、使用了系统中的SSL类库

HOOK点

  • Java
// Java.androidVersion >8
com.android.org.conscryptConscryptFileDescriptorSocketsSSLOutputStream.write('[B','int','int)
com.android.org.conscrypt.ConscryptFileDescriptorSocketsSSLInputStream.read[B,'
int','int')
// Java.androidVersion <=8
com.android.org.conscrypt.OpenSSLSocketlmplsSSLOutputStream.write('
[B,'int','int')
com.android.org.conscryptOpenSSLSocketlmplSSSLInputstream.read([B,int','int')
  • Native
/system/Iib/libssl.so库中的SSL_read()和SSL_write()
说明:
JAVA 中的 SSLOutputStream.write() 和 SSLInputStream.read() 实际上就是对 libssl.so 库的 SSL_write()和SSL_read()包装调用。

2、协议使用了自我集成的SSL类库

  • 对于native库,写脚本定位APP自带SSL库的SSL_readSSL_write的偏移量,工程性质问题

    • https://mabin004.github.io/2020/07/24/%E8%87%AA%E5%8A%A8%E5%AE%9A%E4%BD%8Dwebview%E4%B8%AD%E7%9A%84SLL-read%E5%92%8CSSL-write/
    • https://nytrosecurity.com/2018/02/26/hooking-chromes-ssl-functions/
  • 对于java库,可通过frida objection批量hook SSL字样特征的类库

安卓应用层抓包突破


原文始发于微信公众号(小宝的安全学习笔记):安卓应用层抓包突破

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年4月27日00:15:59
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   安卓应用层抓包突破https://cn-sec.com/archives/1694198.html

发表评论

匿名网友 填写信息