某APP安全检测 (360脱壳+算法分析+数据中转注入)

https://www.t00ls.net/articles-45803.html

   最近对某一APP进行安全检测,整个过程花费几天时间,最耗时的就是写中转脚本实现数据的自动加密解密过程,而且过程中遇到许多小问题,折腾了许久。

1.        360脱壳
    因为APP是被加固了,要想获取更多有价值的信息或者是想更快的对数据包的加密算法进行分析最好的办法就是查看源码关键的加密函数,所有第一步就是对APP进行脱壳。
貌似网上有对360加固的脱壳程序,但是还是习惯用之前的方式脱壳:android-sdk-windows中的模拟器和ddms.
(1), 查看加固方式
查看APP加固方式,可以看到是360加固

某APP安全检测 (360脱壳+算法分析+数据中转注入)


(2) 新建模拟器
使用安卓SDK新建一个原生的模拟器:
某APP安全检测 (360脱壳+算法分析+数据中转注入)

然后启动我们新建的那个名字为360的模拟器(这个启动要很长时间。。)
在设置中的开发着模式中更改系统启动方式:
某APP安全检测 (360脱壳+算法分析+数据中转注入)


更改runtime为ART方式,然后重启模拟器。

某APP安全检测 (360脱壳+算法分析+数据中转注入)


(3) 脱壳
模拟器重启后使用adb调试工具安装已加固的APP到模拟器: adb install xxx.apk
然后运行安卓的监控程序ddms
某APP安全检测 (360脱壳+算法分析+数据中转注入)

所有的app的端口和日志信息都会显示在这里。
某APP安全检测 (360脱壳+算法分析+数据中转注入)


然后运行我们刚刚安装的app,日志就会显示harvey:dex file name-->/data/data/APP包名字/.jiagu/xxx.dex
某APP安全检测 (360脱壳+算法分析+数据中转注入)

会自动把加固的dex 解密并dump到 .jiagu 目录,我们直接 使用adb把整个jiagu目录全部复制一份到我们电脑上: adb pull /data/data/com.baidu.com.app/.jiagu d:/aa/
有很多dex文件我们就可以反编译dex了。
某APP安全检测 (360脱壳+算法分析+数据中转注入)


2.        加密算法分析
使用jd-gui对dex进行反编译查看关键加密代码。
某APP安全检测 (360脱壳+算法分析+数据中转注入)

一般在进行对加密算法进行判断时,通常最简便的方法是直接搜索关键字:login、password、AES、DES、Sign、token、RSA等关键字。
某APP安全检测 (360脱壳+算法分析+数据中转注入)

可以看到其中一部分加密是AES加密,加密的偏移量IV明文的在字符串中。其中还有其他的算法RAS的算法:使用服务器的公钥加密部分数据到服务器。
某APP安全检测 (360脱壳+算法分析+数据中转注入)

代码虽然被被混淆了,但是基本的方法大概还是能看懂。

3.        动态数据分析
APP采用的HTTPS通信,要想捕获HTTPS的流量,需要在模拟器上安装BP或者FD的证书。
(1)        解密HTTPS数据
解密HTTPS的数据需要用到xposed框架和JustTrustMe插件。
某APP安全检测 (360脱壳+算法分析+数据中转注入)


现在BP监听所有IP或者内网IP的地址
某APP安全检测 (360脱壳+算法分析+数据中转注入)


打开测试的模拟器测试是否抓到数据包。运行APP查看抓包的数据:
发送的数据全加密:
某APP安全检测 (360脱壳+算法分析+数据中转注入)

返回数据全加密:
某APP安全检测 (360脱壳+算法分析+数据中转注入)


可以看到每个请求时发送的三段密文,三个加密算法组合验证数据。

(2)        动态分析通信数据
之前静态分析加密算法只知道大概的算法,没有具体验证加密信息,这里通过动态的分析可以明确加密算法和key。
使用inspeckage插件对APP的相关函数方法进行hook(具体什么功能我也说不清楚,能看到很多有用的信息)。
大概的功能有:
功能一:获取APP基本信息
【1】权限:请求权限(Requested Permissions)、自定义权限(APP Permissions)
【2】组件:导出和非导出的组件(Activity、Service、Broadcast Receiver、Content Provider)
【3】共享库(Shared Libraries)
【4】标志位:Debuggable,Allow Backup
【5】其他:UID,GIDs,Package等

功能二:实时查看应用程序的行为
【1】Shared Preferences(日志和文件)
【2】Serialization(序列化)
【3】Crypto(加密)、Hash
【4】SQLite数据库
【5】HTTP、WebView、IPC等
【6】Hooks(自定义HOOK)

功能三:其他操作

【1】开启任意Activity组件(导出和非导出)
【2】调用Provider组件(导出和非导出)
【3】开启、停止、重启应用程序

大概用法:
运行inspeckage打开要监视的APP。
某APP安全检测 (360脱壳+算法分析+数据中转注入)

点击启动APP,电脑客户端运行: adb forward tcp:8008 tcp:8008
浏览器打开本地127.0.0.1:8008
某APP安全检测 (360脱壳+算法分析+数据中转注入)

点击ON开始监听,
某APP安全检测 (360脱壳+算法分析+数据中转注入)

可以看到部分加密的数据是AES加动态的key和固定的IV进行加密。数据包中还有2种加密都体现在这里。

4.        加密解密脚本
要实现对数据包的篡改就必须对原密文解密然后再修改数据在加密发送服务器
知道了算法现在就通过python脚本对数据进行加密解密。
AES的AES/CBC/PKCS5Padding加密:
某APP安全检测 (360脱壳+算法分析+数据中转注入)

AES/CBC/PKCS5Padding解密用一个在线的吧:http://www.seacha.com/tools/aes.html
某APP安全检测 (360脱壳+算法分析+数据中转注入)

这个算法解密不需要脚本,直接解密一次明文,然后是重复修改明文再通过加密脚本发送修改后的数据。服务器返回的数据是密文也是需要脚本来进行解密。还有其他2段的加密算法就不举例了。

5.        数据中转注入
因为整个APP通讯除了使用HTTPS加密传输,而且每个数据包的请求都是动态的key+iv的加密,并且还要随时更改数据包中的其他2段加密才能正常正常发送服务器才能解析。
如果要测试越权或者注入之类的漏洞,并且要通过注入获取数据的话,手工的话得累死人,所有要实现数据的中转。
整体流程:首先本地请求明文数据到中转服务器—》中转服务器对请求包各种加密校验—》发送服务器---》解密服务器响应—》发送客户端。
因为各种加密算法都是python脚本支持的,所以中转使用python的BaseHTTPRequestHandler来实现,发送http请求用urllib2来实现。
大概代码:
某APP安全检测 (360脱壳+算法分析+数据中转注入)


某APP安全检测 (360脱壳+算法分析+数据中转注入)

这个当时被这个负载均衡IP郁闷了很久,在APP上登录一切正常,但是中转脚本走的数据一直提述未登录,找了好久好久的问题,最后发现每隔一段时间走的IP不一样(IP地址不知道是什么规则,不是网上的那个F5的规则),
而且就差一个字符不一样,一直没有发现,导致耽误很久。然后就是IP和前面的cookie之前必须有个空格,MD之前感觉各种都对的,返回总是提示未超时,害得我一个一个字符找问题。。。。
中转的脚本使用代理是为了方便我数据直接走BP,因为BP走的数据可以与服务器直接HTTPS通讯。我的python脚本不想再去搞什么HTTPS证书了,直接发送给BP,BP发送到服务器。
然后跑注入漏洞直接: python sqlmap.py -u “http://192.168.0.10/id=1” 就Ok了。

最后附上一张测试的测试的效果图:
某APP安全检测 (360脱壳+算法分析+数据中转注入)