APP测试常见问题总结

admin 2022年1月6日01:13:34评论180 views字数 5129阅读17分5秒阅读模式

平常在进行APP测试的时候发现存在了很多问题,现在总结记录一下对应的知识,都在这遍文章下记录更新,老规矩先放一张图

image-20211206111758936

抓包

校验服务端HTTPS证书

导入Burp证书

image-20211206111913609

导出之后使用

adb push xxx.cer sdard

然后在手机设置中找到安全,选择从SD卡安装证书

image-20211206112049040

也可以开启代理,手机访问 ip:port 手动下载

image-20211206112158670

HTTPS证书绑定

只认定特定的HTTPS证书,其他证书全部拒绝连接

ROOT设备安装Xposed后安装JustTurstMe

网上文章比较多可以自己搜索

eg:https://zhuanlan.zhihu.com/p/36538699

非ROOT设备使用VirtualXposed安装JustTrustMe

网上文章比较多可以自己搜索

eg:

VirtualXposed :https://nsapps.cn/index.php/archives/23/

太极:https://bbs.pediy.com/thread-258036.htm

HTTPS双向证书绑定

HOOK对应的证书加载函数,导入burp进行抓包

KeyStore.load.overload('java.security.KeyStore$LoadStoreParameter').implementation = function (arg0) 
KeyStore.load.overload('java.io.InputStream', '[C').implementation = function (arg0, arg1)

image-20211220165122008

可以看到成功hook到证书和密码,保存并导入User options-TLS-Client TLS Certificates即可

检测代理

很多APP中会设置如下检测:

String property = System.getProperty("https.proxyHost");
String property = System.getProperty("https.proxyPort");
if(!TextUtils.isEmpty(property)){
return new Proxy(Proxy,Type.HTTP, new InetSockerAddress(Property, Integer.parseInt(property2)))
}

安装ProxyDroid

下载地址:https://proxydroid.cn.uptodown.com/android

打开之后授予root权限

image-20211206114924471

1). 对ProxyDroid进⾏配置(基本配置)

Auto Setting不勾选,我们⼿动进⾏配置。

Host:输⼊代理服务器IP。

Port:输⼊代理服务器端⼝。

Proxy Type选择代理服务器提供服务类型:我们这⾥选择HTTP。

Auto Connect为当2G/3G/WIFI⽹络开启时,⾃动开启代理服务。不勾选,我们⼿动启动,以获取最⼤灵活性。

Bypass Addresses:相当于⿊名单列表,选择排除代理的IP范围,有需要的可以⾃⼰⼿动设置。

2). 认证信息配置:

Enable Authentication:如果代理服务器需要账户、密码认证,勾选。

User:认证账户名。

Password:认证密码。

NTLM Authentication:NTLM/ NTLM2,Windows早期的⼀种认证⽅式,不⽤勾选。

3). 特征设置:

Global Proxy:⼀定要勾选,即为全局代理,代理所有App

Individual Proxy:单独代理所选App,勾选了第⼀条的不⽤管。

Bypass Mode:勾选了代表第⼆条中所选App不代理,勾选了第⼀条的不⽤管。

DNS Proxy:开启DNS代理。

4). 通知设置:

Ringtone:选择通知铃声。

Vibrate:

5). 都设置完成后,开启Proxy Switch即可。注意:如果使⽤ProxyDroid,⽆需在系统wifi处设置代理。

同理的

使用Burp透明代理模式

我们使用Burp的透明代理模式,在BurpSuite中监听80和443这两个端口,并且将其设置为透明代理模式:

image-20211206151723408

手机连接电脑,以下命令:

adb shell
su
iptables -t nat -A OUTPUT -d 0.0.0.0/0 -p tcp -j DNAT --to 172.20.10.3

逆向检测代理位置,Patch或者HOOK等

流量不通过代理

使用ProxyDroid或者Postern

ProxyDroid上文已经介绍Postern配置如下

image-20211220170123027

使用Proxifier进行绕过

此方法适用于被分析应用程序正常运行于模拟器中,整体思路如下:

安卓模拟器 网络进程 --Proxifier代理 --Burpsuite

在Proxifier中添加proxy

image-20211220182951560

对于Mac下的MuMu的配置如下:

image-20211220183120353

对于Mac下的夜神配置如下:

image-20211220191735429

其他模拟器思路类似

使用传输层协议

使用TCP或UDP

解决方法:WireShark

1). tcpdump 是⼀个运⾏在 Linux 平台的可执⾏ ELF ⽂件 https://www.androidtcpdump.com/android-tcpdump/downloads 下载⼆进制⽂件

2). 由于依赖adb,⾸先在 macOS 安装adb,命令如下:

$ brew cask install android-platform-tools

3).拥有设备root权限

$ adb push tcpdump /data/local/tmp
# adb shell
# su
# chmod 755 tcpdump
# ./tcpdump -i any -p -s 0 -w /sdcard/capture.pcap
$ adb pull /sdcard/capture.pcap /pcpath
使⽤Wireshark打开 pcap⽂件
$ wireshark /pcpath/capture.pcap

使用VPN

需要具体分析

通信数据加解密/签名

Frida

Httpdecrypt

httpdecrypt

Hook

Inspeckage

在看源码等待更新

Hook HTTP/HTTPS

使用系统中SSL库

xposed

java
java.androidVersion > 8
ConscryptFileDescriptorSocket
解释:
基于OpenSSLSocketlmpl的实现
路径:
http://aosp.opersys.com/xref/android-10.0.0_r47/xref/external/conscrypt/repackaged/common/src/main/java/com/android/org/conscrypt/ConscryptFileDescriptorSocket.java#123
理解:
android中openssl的实现,存在数据加解密的读写接口
com.android.org.conscrypt.ConscryptFileDescriptorScoket$SSLOutputStream.write('[B','int','int')
com.android.org.conscrypt.ConscryptFileDescriptorScoket$SSLIntputStream.read('[B','int','int')

java.androidVersion <= 8
    OpenSSLSocketlmpl
        解释:
            OpenSSL实现
        路径:
            http://aosp.opersys.com/xref/android-8.0.0_r51/xref/external/conscrypt/common/src/main/java/org/conscrypt/OpenSSLSocketImpl.java
        理解:
            android中openssl的实现,存在数据加解密的读写接口

        com.android.org.conscrypt.ConscryptFileDescriptorSocket$SSLOutputStream.write('[B','int','int')
        com.android.org.conscrypt.ConscryptFileDescriptorSocket$SSLInputStream.read('[B','int','int')
native
/system/lib/libssl.so库中的SSL_read()和SSL_write()
说明:
Java中的SSLOutputSteam.write()和SSLInputStream.read()实际上就是对libssl.so库的SSL_write()和SSL_read()包装调用

frida

java
java.use("com.android.org.conscrypt.ConscryptFileDescriptorSocket$SSLOutputStream").write.overload('[B','int','int').implementation
java.use("com.android.org.conscrypt.ConscryptFileDescriptorSocket$SSLInputStream").read.overload('[B','int','int').implementation
java.use("com.android.org.conscrypt.OpenSSLSocketImpl$SSLOutputStream").write.overload('[B','int','int').implementation
java.use("com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream").Read.overload('[B','int','int').implementation
native
Interceptor.attach(address['SSL_read'])
Interceptor.attach(address['SSL_write'])

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

举出一些常用的例子

1.Chrome

Android L & M libchrome.so
Android N, O & P libmonochrome.so

2.系统内置webview

使用(pm path com.google.android.webview)得到webview的路径

3.浏览器APP的webviewer

OPPO
libheytapwebview.so
华为
libhwwebviewchromium.so
小米
libmiui_chromium.so
vivo
libwebviewchromium_vivo.so

4.基于Chromium的第三方浏览器内核

腾讯系的APP
libmttwebview.so x5内核
阿里系的APP
libwebviewuc.so UC的U4内核
各种小程序
libxwalkcore.so CrossWalk内核

5.微信(使用多内核的APP)

有些APP回使用多个内核,以微信为例,同时使用了X5和CrossWalk内核
x5
com.tencent.mm.tools进程
聊天界面点开的webview、支付里的页面(长按下啦提示使用x5内核的都可以)
CrossWalk
长按下拉未提示x5
com.tencent.mm:toolsmp进程
公众号文章、搜一搜
com.tencent.mm:appbrand进程
小程序

native

1.对于native库,写脚本定位APP自带的SSL_read和SSL_write的偏移量,工程性质问题
https://mabin004.github.io/2020/07/24/自动定位webview中的SLL-read和SSL-write/
https://nytrosecurity.com/2018/02/26/hooking-chromes-ssl-functions/

FROM :ol4three.com | Author:ol4three

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月6日01:13:34
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   APP测试常见问题总结https://cn-sec.com/archives/721491.html

发表评论

匿名网友 填写信息