某APP安全检测(360脱壳+算法分析+数据中转注⼊)
最近对某⼀APP进⾏安全检测,整个过程花费⼏天时间,最耗时的就是写中转脚本实现数据的⾃动加密解密过程,⽽且过程中遇到许多⼩问题,折腾了许久。
1.        360脱壳
因为APP是被加固了,要想获取更多有价值的信息或者是想更快的对数据包的加密算法进⾏分析最好的办法就是查看源码关键的加密函数,所有第⼀步就是对APP进⾏脱壳。
貌似⽹上有对360加固的脱壳程序,但是还是习惯⽤之前的⽅式脱壳:android-sdk-windows中的模拟器和ddms.
(1), 查看加固⽅式
查看APP加固⽅式,可以看到是360加固
(2) 新建模拟器
使⽤安卓SDK新建⼀个原⽣的模拟器:
然后启动我们新建的那个名字为360的模拟器(这个启动要很长时间。。)
在设置中的开发着模式中更改系统启动⽅式:
更改runtime为ART⽅式,然后重启模拟器。
(3) 脱壳
模拟器重启后使⽤adb调试⼯具安装已加固的APP到模拟器: adb install xxx.apk
然后运⾏安卓的监控程序ddms
所有的app的端⼝和⽇志信息都会显⽰在这⾥。
然后运⾏我们刚刚安装的app,⽇志就会显⽰harvey:dex file name-->/data/data/APP包名字/.jiagu/xxx.dex
会⾃动把加固的dex 解密并dump到 .jiagu ⽬录,我们直接 使⽤adb把整个jiagu⽬录全部复制⼀份到我们电脑上: adb pull
/data/data/com.baidu.app/.jiagu d:/aa/
有很多dex⽂件我们就可以反编译dex了。
2.        加密算法分析
使⽤jd-gui对dex进⾏反编译查看关键加密代码。
⼀般在进⾏对加密算法进⾏判断时,通常最简便的⽅法是直接搜索关键字:login、password、AES、DES、Sign、token、RSA等关键字。
可以看到其中⼀部分加密是AES加密,加密的偏移量IV明⽂的在字符串中。其中还有其他的算法RAS的算法:使⽤服务器的公钥加密部分数据到服务器。
代码虽然被被混淆了,但是基本的⽅法⼤概还是能看懂。
3.        动态数据分析
APP采⽤的HTTPS通信,要想捕获HTTPS的流量,需要在模拟器上安装BP或者FD的证书。
(1)        解密HTTPS数据
解密HTTPS的数据需要⽤到xposed框架和JustTrustMe插件。
现在BP监听所有IP或者内⽹IP的地址
打开测试的模拟器测试是否抓到数据包。运⾏APP查看抓包的数据:
发送的数据全加密:
返回数据全加密:
可以看到每个请求时发送的三段密⽂,三个加密算法组合验证数据。
(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,电脑客户端运⾏: adb forward tcp:8008 tcp:8008
浏览器打开本地127.0.0.1:8008
点击ON开始监听,
可以看到部分加密的数据是AES加动态的key和固定的IV进⾏加密。数据包中还有2种加密都体现在这⾥。
4.        加密解密脚本
要实现对数据包的篡改就必须对原密⽂解密然后再修改数据在加密发送服务器
知道了算法现在就通过python脚本对数据进⾏加密解密。
AES的AES/CBC/PKCS5Padding加密:
AES/CBC/PKCS5Padding解密⽤⼀个在线的吧:
这个算法解密不需要脚本,直接解密⼀次明⽂,然后是重复修改明⽂再通过加密脚本发送修改后的数据。服务器返回的数据是密⽂也是需要脚本来进⾏解密。还有其他2段的加密算法就不举例了。
原生安卓app开发5.        数据中转注⼊
因为整个APP通讯除了使⽤HTTPS加密传输,⽽且每个数据包的请求都是动态的key+iv的加密,并且还要随时更改数据包中的其他2段加密才能正常正常发送服务器才能解析。
如果要测试越权或者注⼊之类的漏洞,并且要通过注⼊获取数据的话,⼿⼯的话得累死⼈,所有要实现数据的中转。
整体流程:⾸先本地请求明⽂数据到中转服务器—》中转服务器对请求包各种加密校验—》发送服务器---》解密服务器响应—》发送客户端。
因为各种加密算法都是python脚本⽀持的,所以中转使⽤python的BaseHTTPRequestHandler来实现,发送http请求⽤urllib2来实现。⼤概代码:
这个当时被这个负载均衡IP郁闷了很久,在APP上登录⼀切正常,但是中转脚本⾛的数据⼀直提述未登录,了好久好久的问题,最后发现每隔⼀段时间⾛的IP不⼀样(IP地址不知道是什么规则,不是⽹上的那个F5的规则),
⽽且就差⼀个字符不⼀样,⼀直没有发现,导致耽误很久。然后就是IP和前⾯的cookie之前必须有个空格,MD之前感觉各种都对的,返回总是提⽰未超时,害得我⼀个⼀个字符问题。。。。
中转的脚本使⽤代理是为了⽅便我数据直接⾛BP,因为BP⾛的数据可以与服务器直接HTTPS通讯。我的python脚本不想再去搞什么HTTPS证书了,直接发送给BP,BP发送到服务器。
然后跑注⼊漏洞直接: python sqlmap.py -u “ ” 就Ok了。
最后附上⼀张测试的测试的效果图: