关于APP渗透测试的实践与思考

一、前言

移动互联网应用程序(Mobile APP,以下简称“APP”或“移动APP”)安全早已成为信息安全领域中广受关注的热点话题。作为安全检测人员,在日常测试工作中经常涉及移动APP的安全检测,在此结合相关移动APP检测标准和工作经验,从渗透测试角度,对移动APP的检测进行概要性总结说明。

二、目标分析

移动APP的安全问题与传统桌面软件有所不同。虽然现代移动操作系统(如Android和iOS)已比较注重安全防护,但如果APP开发人员在开发移动应用程序时不全面仔细地考虑安全性,APP仍可能会存在可被利用的安全漏洞,从而面临安全威胁。移动APP渗透测试目的就是充分分析和挖掘移动APP和相关系统存在的安全问题,进而帮助其进行修复,提升安全性,保护用户信息。

从业务上来看,在移动APP架构中,面临安全威胁的目标 / 路径主要有三个,它们分别是:移动APP、数据传输和服务端。

三、面临的威胁

客户端

客户端(移动APP)主要面临的威胁包括反编译、调试、篡改/重打包、输入记录、组件安全、注入和Hook、本地敏感数据泄露等。

01 反编译

对一个软件进行分析可以分为静态分析和动态分析两大部分。反编译是静态分析的一种基础手段。高级编程语言源代码经过编译变成可执行文件,反编译就是其逆过程。通过反编译和逆向,可以在没有软件源码的情况下了解其内部实现细节,进行漏洞挖掘和算法分析等。移动APP测试,常见的测试对象是Android APP和iOS APP,由于应用结构、构建工具链等差异,Android APP和iOS APP的逆向分析、反编译技术方法均不尽相同。常见的反编译工具有IDA Pro及相关Decompiler插件、Radare2 、Ghidra、JD-GUI、Smali/Baksmali、dex2jar、Hopper等等。

02 调试

调试是软硬件开发人员用于排查软件错误的一种手段,也是安全检测人员进行动态分析的一种基本方式。从调试对象来看,调试可分为硬件调试和软件调试。对于移动APP,安全检测工程师一般只需进行软件调试。软件调试又可分为源码级调试和非源码级调试。在获取不到源码的情况下,一般只能先做非源码级调试。通过调试,安全检测工程师可以动态地分析APP内部原理和行为。移动APP检测中,常见的APP调试工具有IDA Pro、GDB、LLDB、ADB、JDB和Cycript等。

03 篡改/重打包

Android和iOS应用在正式发布前需进行数字签名,在安装时系统会对APP签名进行检查,检查通过才能成功安装运行。这可在一定程度上保护APP不被篡改。但由于签名验签机制很多技术都是公开的,被研究的比较透彻,再加上不同平台的签名机制对APP限制程度各不相同,对安全性要求比较高的APP如果只依靠系统层面的签名保护进行防篡改/重打包还远远不够。渗透测试过程中,有时我们为了更好的分析APP,也需要对APP进行修改重打包,然后利用相应平台的工具进行重新签名,最后安装运行。相应的工具有:apktool、apksigner 、signapk、jarsigner和codesign等。

04 输入记录

当APP在不安全的环境中运行时,存在用户输入被记录风险。一般可能通过软硬件键盘输入设备事件或屏幕截取等方式来进行记录。根据对APP不同的安全要求,渗透测试中宜需关注这些风险。

05 组件安全

Android组件包括Activity、Broadcast Receiver、Service和Content Provider。若权限配置不当而导致组件暴露,APP就存在可能被其他应用攻击或劫持风险,进而导致认证被绕过、敏感数据被窃取等。测试过程中,一般可通过对APP进行反编译,查看AndroidManifest文件或直接扫描查找暴露的组件,分析反编译的相关组件代码,查看是否有安全漏洞并进行验证。

06 注入和Hook

注入和Hook都可对目标APP运行时行为进行修改。虽然我们常常将它们放在一起说,但其实它们的实现原理并不相同。注入是指将一段代码或一个完整的可执行模块加载到目标程序中,而Hook是指通过劫持程序执行流程来改变程序运行行为。不同平台的APP运行框架和机制不同,这也导致它们的注入和Hook方式不同,但都会通过系统或框架提供的相关机制和接口进行操作。测试人员可根据需求寻找Hook点,编写注入或Hook模块。常用的相关工具有libinject、Xposed、Cydia、fishhook和Frida等。

07 本地敏感数据泄露

APP的本地存储数据或运行日志有可能会泄露敏感或非敏感数据。一般测试人员通过泄露的数据,可以去进一步深入理解APP内部原理。测试人员可查看APP本地数据存储(特别是会关注APP是否在公共区域存储了数据)和APP运行日志内容,结合业务场景综合分析是否存在本地敏感数据泄露风险。常用工具adb、RE、SQLite和ifile等。

数据传输

APP与服务端进行的网络数据传输过程中主要面临的威胁包括数据窃听、数据篡改和数据重放等。

01 数据窃听

若APP和服务端通信过程中未对传输的数据进行机密性保护,数据就有可能会被窃听。例如,很多APP和服务端之间在不安全的传输通道中直接使用的HTTP协议进行通信,若用户名、口令以及其他重要数据未进行加密,这些数据在网络传输中的各个节点就可能会被窃听而泄露。测试人员应根据APP业务场景确认APP的敏感数据**、数据传输通道和协议,分析是否存在敏感数据泄露风险。对安全性要求比较高的APP,例如金融类APP,还要分析其加密方式(如果有)是否安全有效。常用工具有Wireshark、Burpsuite、Fiddler和Charles等。

02 数据篡改

若APP和服务端通信过程中未对传输的数据进行完整性保护,数据就有可能会被篡改,使APP更易被结合其他安全漏洞发起攻击。不同的业务场景下,数据篡改带来的风险高低也不同。测试人员可尝试对截取到的数据进行篡改后发送,观察和分析APP或服务端是否可识别出数据被篡改并作出合理反应。对安全性要求比较高的APP,比如金融类APP,还要分析其防篡改方式(如果有)是否安全有效。常用工具有Wireshark、Burpsuite、Fiddler和Charles等。

03 数据重放

重放攻击是指将之前窃听到的数据原封不动地重新发送给接收方。这种攻击通常用于身份认证、交易等过程。例如,对HTTP协议,测试人员可重复发送截取到的请求报文,并观察和分析服务端的反应。常用工具有Wireshark、Burpsuite、Fiddler和Charles等。

服务端

服务端主要面临的威胁包括不安全的中间件、认证与会话管理、访问控制、注入、应用层拒绝服务、密码算法和密钥管理等。

01 不安全的中间件

服务器为提供完整的服务所使用的各个中间件,由于未及时更新或未启用安全的配置可能引发安全漏洞,导致服务器存在遭受攻击的风险,如IIS文件名解析漏洞、Weblogic反序列化漏洞、SMB远程命令执行漏洞等,攻击者可通过这些漏洞获取服务器敏感信息、执行恶意命令,甚至获取服务器管理员权限。

02 认证与会话管理

服务器提供的身份认证和会话管理机制存在安全漏洞,如系统关键组件或应用使用弱口令,对于高安全级别的系统未采用双因子认证方式,无防止认证口令或验证码暴力破解攻击的机制,未对SessionID的生成、过期和销毁进行安全配置等,攻击者可利用这些漏洞在非授权的情况下登录系统并执行恶意操作。

03 访问控制

开发者未对用户登录系统后的操作进行进一步的访问权限控制,服务端对从客户端收到的对数据进行增、删、改、查询等操作的请求未进行鉴权处理,导致攻击者可执行超出自身账户权限的操作。

04 注入

应用运行时可能需要调用一些向前端写入内容、查询数据或执行系统命令的函数,如果用户能控制这些函数的输入,而开发者未对输入的内容进行严格的过滤,攻击者可以在前端提交恶意构造的输入,进行XSS注入、SQL注入、命令注入等攻击,从而导致服务器重要数据泄露或执行恶意命令。

05 应用层拒绝服务

服务器未对应用的最大连接数或发起请求的IP和频率进行限制,攻击者通过并发大量的请求或构造畸形的数据包,如CC攻击、Slowloris攻击,造成系统资源耗尽,导致服务器拒绝服务。

06 密码算法和密钥管理

应用使用已被证明为不安全的密码算法对重要数据的传输和存储进行加解密,如使用MD5算法对用户口令进行存储,使用DES算法对数据进行加密传输,可能导致攻击者获取密文后短时间内恢复出明文信息;应用使用不安全的方式进行密钥管理,如将系统使用的密钥明文编码在应用代码中或在服务器配置文件中明文存储,将导致攻击者轻易获取数据加解密密钥,进而得到加密数据的明文信息。

四、APP渗透测试流程

渗透测试的最终目的是帮助目标APP或系统发现并修复安全漏洞,提升APP或系统安全性。一个优秀的渗透测试工程师或团队首先要有良好的职业道德,同时也应注意保护自己,其次要有专业的技术知识、规范的测试流程和活跃的思维。下面,我们先介绍一般的APP渗透流程,然后探讨下结合APP,对服务端开展渗透测试的一些思路。

准备阶段

定义安全测试的范围,包括确认适用的安全控制点、受测方的测试目标和敏感数据。同时在开展渗透测试前,应拿到被测单位的书面盖章渗透测试授权。

信息收集

收集包括APP的环境、业务用例和架构等信息。其中:

(1)环境信息如APP的业务功能、行业分类、开发或运营组织的基本信息和工作流程等;

(2)架构信息包括APP本身(如何访问数据和资源、是否检测自身运行在root或模拟环境中等)、APP适用的操作系统及版本、与服务端的通信协议(是否使用安全传输协议、是否有其他安全防护措施等)和远程服务(APP使用哪些远程服务、这些远程服务被攻击是否会影响APP)等。

这些信息大致分为开发或运营组织的信息和APP相关技术信息两大类,一般前者可由商务人员负责去收集,后者可由技术人员收集。

应用描绘

根据前2个阶段收集的资料(亦可通过自动扫描、手动分析APP来进行相应补充),测试人员已较为全面的了解受测APP的环境、业务用例和架构等信息,并基本确定了受测APP的渗透测试入口点、收集存储的数据和可能潜在的安全漏洞,即可根据这些漏洞风险等级高低,对其进行排序,以便测试人员确定渗透测试的攻击路径,并制定相应的测试用例。

漏洞利用和测试工具开发

在此阶段,测试人员将尝试利用前一阶段发现的漏洞,对应用程序进行渗透,以验证发现的漏洞是否真实、有效,同时在漏洞验证过程中可能涉及测试工具、脚本的开发;该阶段在APP渗透测试的整个过程中是非常必要和关键的一环。

提交报告

此阶段,测试人员将已经验证后的漏洞形成报告,提交客户。报告内容至少应包括详细的漏洞名称、类型、漏洞风险分析、漏洞利用过程和结果、渗透测试过程中非授权访问的数据等。

注:不同类型安全检测除流程上会有差异外,报告内容、形式也会有差别,应根据具体情况具体分析。

五、结合APP渗透服务端

这一章节我们主要列举通过APP以渗透相关服务端的一些思路。在此,假设测试人员仅被授权对APP和相关服务端进行渗透。通常包含5个较为重要的环节,分别是:信息收集、网站/服务端渗透、APP功能分析、第三方SDK分析、账号安全和业务安全分析。

信息收集

为达成对服务端的攻击,首先应对服务端进行“定位”。对服务端定位的常用方法有反编译APP、抓包分析、APP相关信息搜索、信息汇总分析等,具体如下:

一是反编译APP。这个过程可能会涉及到对APP进行脱壳等。反编译后,在反编译代码和资源文件中,利用字符串搜索和过滤,搜集所有链接等信息。除HTTP/HTTPS链接外,还应关注是否有FTP、登录凭证(比如邮箱账号,有些APP会发Crash信息等到邮箱)等信息。字符串搜索和过滤可以通过写脚本,或在自动化工具中对扫描规则进行配置等方式来完成。

二是抓包分析。一般移动APP和服务端通信使用HTTP(S),可使用抓包工具对传输数据进行抓包分析。抓包过程中我们可以手动点击APP中各功能菜单,或利用工具触发APP各种功能,通过抓包工具过滤或定制系统等方式尽量排除非受测APP的网络通信数据干扰(有些URL可能是第三方SDK官方地址,非授权渗透测试目标,应予以过滤)。

三是APP相关信息搜索。

(1)应通过互联网广泛搜索APP相关信息,若能找到其官网,应将其相关的官网、论坛的链接都搜集整理出来,若授权许可,亦可将其纳入到渗透的目标范围内。

(2)寻找该APP的历史版本,因为若该APP当前版本的安全加固措施做得比较到位,对其进行逆向分析较为复杂,但在某个时间节点前的历史版本可能是未加固的。

(3)可能会有其他意想不到的发现。

四是信息汇总分析。通过对收集到的信息综合筛选分析,形成一个信息集,包括但不限于URL、IP、使用的第三方SDK(下面展开说)等信息。

网站/服务端渗透

这一阶段,与传统的Web渗透过程相同,测试人员通过各种嗅探工具对信息集中的URL、IP进行嗅探和漏扫,以期发现可能存在的漏洞等,并通过发现的漏洞(不管0day还是nday),尝试获取服务器的权限。因本章节重点是介绍如何结合APP做服务端渗透,所以这部分不详细展开。

APP功能分析

在信息收集阶段,测试人员已基本对APP功能有了一些了解,在这一环节,测试人员应实际试用APP,除了试用一些上传下载、聊天、留言等常用功能外,同时还应关注其相对冷门的功能,因为功能越冷门,开发人员对其的关注就越少,相应的服务端服务存在安全问题的可能性就越大。

第三方SDK做分析

在信息收集环节中我们提到若无授权,测试人员不能随便对第三方SDK官网开展渗透测试,那为何还要对第三方SDK开展分析呢?原因是很多第三方SDK客户端和服务端是配套搭建的,有些部署在SDK官方服务端,有些则部署在SDK使用方(也就是APP官方服务端)。许多SDK官方会对其进行详细的说明,包括功能、部署方式、API等等。对于服务端SDK,测试人员可以将其下载下来(若无法探测到服务端版本号,可根据收集到的APP业务上线日期进行推测,并结合经验和已搜集到的信息,从下载的SDK挑选重要的SDK),对其进行历史漏洞搜索(该工作也可在信息收集环节开展)、扫描和分析,也许会发现一些有用的漏洞(0day最好,nday也要试一试,万一没补呢?)。

账号安全和业务安全

最后,我们再谈谈账号安全和业务安全。这一环节在APP功能分析过程中也可能会涉及,其与渗透获取服务器shell权限可能没太大关系,但其从攻击者的角度来看却非常关键,因为大部分攻击者获取服务器shell权限的目的就是为了获取APP用户的数据或资料,当然也有单纯为了搞破坏和黑客炫技的情况存在。

在这一环节,测试人员要详细分析APP的账号机制和业务逻辑,随着APP官方与黑产对抗的加深,APP的业务逻辑和身份认证机制可能会做的很复杂。同时如果APP是使用用户数量大时间、上线时间比较久,存在账户安全问题(爆破、信息泄露、越权、绑定/换绑逻辑等等)的可能性相对要低很多;同理,越是成熟的业务,存在安全问题的概率就会越低,所以测试人员可以重点关注被测APP中可能存在的冷门或新上线业务。

随着移动APP安全攻防对抗逐渐加强,对其及相关服务端开展渗透测试,必然会越来越多的涉及逆向、调试、数据或流量解密等工作(虽然一些逻辑漏洞可通过分析其业务功能、流程发现,但实现漏洞利用一般还需进一步逆向和抓包分析)。渗透测试人员和团队应善于使用、定制或开发自动化工具辅助检测以节省时间和人力。

可以想象,一旦攻击者借助APP拿下了服务端,就可以反过来批量攻击APP(或用户),从而形成一个攻击闭环,且攻击者能做的事情还远不止这些!

六、结束语

以上就是笔者关于移动APP渗透测试的总结,希望能帮到大家,但限于知识和技术水平,会有许多不完善甚至不准确之处,还望多多指正。

*本文作者:极客安全MobileSecurity,转载请注明来自FreeBuf.COM