<
app和小程序安全测试
>
上一篇

CDN的查询与绕过
下一篇

flask框架ssti ctf利用小结
抓包思路小结

0x01 前言

随着智能手机的发展,越来越多的程序和业务都开通了或者只开通了移动端,所以掌握一手app和小程序的安全测试还是很有必要的。

在平时的测试过程中,往往会面临抓不到请求包的情况,没有请求包,看不了接口逻辑等,那就干瞪眼了。

这篇文章主要记录和分享平时抓不到包的解决手段。

抓到包但是看不懂的通信加密情况暂不做讲解,这一部分需要逆向app或者对小程序进行解包来获取加密方式然后在解密。

0x02 模拟器

市面上有很多模拟器,总是有这个app在这个模拟器上打不开,另外一个可以打开的情况。需要下载安装多个模拟器,导致测试时相当繁琐。这里仅使用夜神模拟器,其他的如网易UU、雷神等可自行研究对比。

模拟器优点:

随便搞,没顾虑

随便调整参数,如内核版本,屏幕大小,有无root等

虽然夜神只支持这三个版本,但也可以应对大多数检测了。

image-20200914200948082

模拟器缺点:

不能启动不支持模拟器启动的应用

以下是经常在模拟器上遇到的问题。

原因可能有多种,模拟器检测,版本检测等

解决方案:

1、换低版本的app。(可能会引出新的问题:无法正常使用,打开后强制升级等)

2、换真机进行测试(换真机后也可能遇到其他问题,这一部分放到后面再说)

原因:各类原因都可能存在,需要从log观察其发生了什么错误。

原因:

1、走的websockket,这个用bp等代理工具就能抓到

2、不走http或者https协议

1、使用了双向认证

2、使用了流量加密

抓包方法:代理软件抓包,这个就不在细讲了,基本操作

0x03 模拟器或真机非root和越狱抓包

在进行测试时候还优先进行真机测试,在非root的情况下,有以下方法。

走VPN代理,抓取数据。

android

在android下有两款软件package capture和HttpCanary

App走代理,会自动取消请求,无法获取数据

使用package capture 走VPN,可以在本机上抓到,但是无法同步到bp,抓到到的包存在乱码问题

image-20200914201327538

image-20200914201343093

image-20200914201358766

可以看到,部分存在ssl认证的包抓取无内容,大部分抓到的包都是乱码

更换另外一种软件HttpCanary,效果还可以。但是这个软件是收费的,低版本不好用,高版本需要破解。

image-20200914201436934

image-20200914201447547

虽然打开还是部分乱码,有请求小程序的包,也可以看到具体传输数据的包。

IOS

在ios下可以使用Stream

导入证书后,添加到根证书。

image-20200914201607002

image-20200914201620710

0x04 手机ROOT情况下的抓包解决方案

真机暂未root,所以这里使用模拟器进行相关测试,由于模拟器的局限性和不确定性,可能会导致不同的问题,所以有条件还是真机最好。

Tcpdump+wireshark

tcpdump是linux下的抓包工具,在android中没有,需要下载对应的工具。下载地址

然后通过adb放到对应的目录:

adb push tcpdump /data/local/

可能会遇到无法push的情况,其实是没有权限,可以授权后重试:

adb shell

su

chmod 777 /data/local

修改权限:

chmod 777 /data/local/tcpdump

执行抓包命令:

tcpdump -i any -p -vv -s 0 -w capture.pcap

执行抓包的时候会提示

tcpdump: any: You don't have permission to capture on that device (socket: Operation not permitted)

是因为该命令只能在root用户下操作

先用su命令,再重试tcpdump命令

启动抓包后会在当前目录创建一个capture.pacp的文件

最后使用wireshark打开过滤分析即可

image-20200914202300997

0x05 Android下修改app源码

如果apk未做校检,或者可以绕过apk自校检,那么可以修改apk源码,然后重新打包,以达到让apk信任用户证书,抓取数据包的目的。

在AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config"
    ... >
    ...
    </application>
</manifest>
配置文件:res/xml/network_security_config.xml

<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" overridePins="true" /> <!--信任系统证书-->
            <certificates src="user" overridePins="true" /> <!--信任用户证书-->
        </trust-anchors>
    </base-config>
</network-security-config>

0x06 Android下将用户证书导为系统证书

系统证书的目录是:/system/etc/security/cacerts/

每个证书的命名规则为:.

Certificate_Hash表示证书文件的hash值,Number是为了防止证书文件的hash值一致而增加的后缀;

证书的hash值可以由命令计算出来,在终端输入openssl x509 -subject_hash_old -in ,其中Certificate_File为证书路径,将证书重命名为hash.0放入系统证书目录,之后你就可以正常抓包了。

0x07 双向认证解决方案

当我们在抓包的过程中遇到这种情况,那么可能就遇到双向认证了。

image-20200914202958623

过双向认证的方法如下

解包,寻找客户端的key,导入bp或者手机端抓包工具,重新对数据包进行拦截发送。

找到apk包中的证书文件

image-20200914203033641

反编译根据调用逻辑找key

image-20200914203119051

找到后导入BP中即可

image-20200914203143595

image-20200914203152978

0x08 SSL Pinning

SSL Pinning是一种防止中间人攻击(MITM)的技术,主要的机制是在客户端发起请求->收到服务器发来的证书这一步之后,对收到的证书进行校验,如果收到的证书不被客户端所信任,就直接断开连接不继续请求。

使用Xposed或兼容Xposed的框架+JustTrustMe

JustTrustMe这个Xposed模块,它所做的事情就是将各种已知的的HTTP请求库中用于校验证书的API都进行Hook,使无论是否是可信证书的情况,校验结果返回都为正常状态,从而实现绕过证书检查的效果。

上面一些导入根证书的方法也可以绕过部分的sslpinning

0x09 其他思路

在APP内抓包,可以在APP里面找到处理网络请求和响应的函数,然后用Frida做HOOK,转发参数到接受抓包的地方,如果不需要修改的话,直接转发就行了;如果需要修改的话,可以在代码里面再加入一些交互逻辑应该也能实现。

或者下载电脑测试版微信,测试版拥有小程序的功能,可以直接配置进行抓包。

Top
Foot