当前位置: 首页 > 科技观察

APP渗透测试实践与思考

时间:2023-03-13 22:42:48 科技观察

一、前言移动互联网应用程序(MobileAPP,以下简称“APP”或“手机APP”)安全一直是信息安全领域的热门话题。作为安全检查员,日常测试工作中经常涉及到手机APP的安全检查。这里结合相关的移动APP检测标准和工作经验,从渗透测试的角度,对移动APP的检测做一个大概的总结。2.目标分析移动应用的安全问题不同于传统桌面软件。尽管现代移动操作系统(如Android、iOS)更加注重安全保护,但如果APP开发者在开发移动应用时没有充分、慎重地考虑安全问题,APP中仍有可能存在可利用的安全漏洞,从而面临严重的问题.安全威胁。手机APP渗透测试的目的是全面分析和挖掘手机APP及相关系统的安全问题,进而帮助其修复、提升安全性、保护用户信息。从业务角度来看,在移动APP架构中,面临安全威胁的目标/路径主要有3个,分别是:移动APP、数据传输、服务器。三、威胁1.客户端客户端(手机APP)面临的主要威胁包括反编译、调试、篡改/重新打包、输入记录、组件安全、注入和Hook、本地敏感数据泄露等。(1)反编译分析一个软件可以分为两部分:静态分析和动态分析。反编译是静态分析的一种基本手段。高级程序设计语言的源代码被编译成可执行文件,反编译是逆过程。通过反编译和逆向工程,可以在没有源代码的情况下了解软件内部实现细节,进行漏洞挖掘和算法分析。对于手机APP测试,常见的测试对象是AndroidAPP和iOSAPP。由于应用结构和构建工具链的不同,AndroidAPP和iOSAPP的逆向分析和反编译技术和方法是不同的。常用的反编译工具有IDAPro及相关Decompiler插件、Radare2、Ghidra、JD-GUI、Smali/Baksmali、dex2jar、Hopper等。(2)调试调试是软硬件开发者排查软件错误的一种手段,以及也是安检人员进行动态分析的基本方式。从调试对象来看,调试可分为硬件调试和软件调试。对于移动应用,安全测试工程师一般只需要进行软件调试即可。软件调试可分为源码级调试和非源码级调试。如果无法获取到源码,一般只能先进行非源码级的调试。通过调试,安全测试工程师可以动态分析APP的内部原理和行为。在手机APP测试中,常见的APP调试工具有IDAPro、GDB、LLDB、ADB、JDB、Cycript。(3)篡改/重新打包Android和iOS应用在正式发布前需要进行数字签名。安装时系统会检查APP的签名,检查通过才算安装运行成功。这样可以在一定程度上保护APP不被篡改。但是,由于签名验证机制的很多技术都是公开的,并且已经研究透彻,而且不同平台的签名机制对APP的限制也不同,如果对安全性要求比较高的APP仅仅依靠签名在系统层面进行保护反对篡改/重新包装是不够的。在渗透测试的过程中,有时我们需要对APP进行修改和重新打包,以便更好的分析APP,然后使用相应平台的工具重新签名,最后安装运行。对应的工具有:apktool、apksigner、signapk、jarsigner、codesign等。(4)输入记录当APP运行在不安全的环境中时,存在用户输入被记录的风险。一般可以通过软硬件键盘输入设备事件或者截屏来记录。根据APP不同的安全需求,渗透测试时应注意这些风险。(5)组件安全Android组件包括Activity、BroadcastReceiver、Service和ContentProvider。如果权限配置不当,组件暴露,APP可能被其他应用攻击或劫持,导致鉴权绕过,敏感数据被窃取。在测试过程中,一般通过反编译APP,查看AndroidManifest文件或直接扫描找到暴露的组件,分析反编译后的相关组件代码,检查是否存在安全漏洞并进行验证。(6)注入和Hook注入和Hook都可以修改目标APP的运行时行为。虽然我们经常把它们放在一起,但是它们的实现原理并不相同。注入是指将一段代码或一个完整的可执行模块加载到目标程序中,而Hook是指通过劫持程序执行过程来改变程序的运行行为。不同平台的APP运行框架和机制不同,这也导致了它们的注入和Hook方式不同,但都是通过系统或框架提供的相关机制和接口来运行的。测试人员可以根据需求找到Hook点,编写注入或者Hook模块。常用的相关工具有libinject、Xposed、Cydia、fishhook和Frida等。(7)本地敏感数据泄露App的本地存储数据或操作日志可能会泄露敏感或非敏感数据。一般测试人员可以通过泄露的数据进一步了解APP的内部原理。测试人员可以查看APP本地数据存储(尤其要注意APP是否在公共区域存储数据)和APP运行日志内容,结合业务场景综合分析是否存在本地敏感数据泄露风险。常用工具adb、RE、SQLite、ifile等。2、数据传输APP与服务器之间的网络数据传输过程中面临的主要威胁包括数据窃听、数据篡改和数据重放。(1)数据窃听如果APP与服务器通信过程中没有对传输的数据进行保密保护,则数据可能被窃听。例如,很多APP和服务器在不安全的传输通道中直接使用HTTP协议进行通信。如果不对用户名、密码等重要数据进行加密,这些数据在网络传输中可能会被各个节点阻断。通过窃听泄露。测试人员应根据APP业务场景,确认APP的敏感数据密钥、数据传输通道和协议,分析是否存在敏感数据泄露风险。对于安全性要求比较高的应用,比如金融类应用,还需要分析加密方式(如果有的话)是否安全有效。常用的工具包括Wireshark、Burpsuite、Fiddler和Charles。(2)数据篡改如果APP与服务器通信过程中没有保护传输数据的完整性,则数据可能被篡改,使APP更容易受到攻击并结合其他安全漏洞。在不同的业务场景下,数据被篡改的风险是不同的。测试人员可以尝试对截获的数据进行篡改并发送,以观察分析APP或服务器是否能够识别数据被篡改并做出合理的响应。对于安全要求比较高的应用,比如金融类应用,还需要分析其防篡改手段(如有)是否安全有效。常用的工具包括Wireshark、Burpsuite、Fiddler和Charles。(3)数据重放重放攻击是指将先前被窃听的数据原封不动地重新发送给接收者。这种攻击通常用于身份认证和交易等过程。例如,对于HTTP协议,测试人员可以重复发送拦截到的请求报文,观察分析服务器的响应。常用的工具包括Wireshark、Burpsuite、Fiddler和Charles。3.服务器服务器面临的主要威胁包括不安全的中间件、身份验证和会话管理、访问控制、注入、应用层拒绝服务、密码算法和密钥管理。(1)不安全的中间件服务端用于提供完整服务的各种中间件可能会因未能及时更新或启用安全配置而产生安全漏洞,导致服务端受到攻击的风险,如IIS文件名解析漏洞,Weblogic反序列化漏洞、SMB远程命令执行漏洞等,攻击者可以利用这些漏洞获取服务器敏感信息,执行恶意命令,甚至获取服务器管理员权限。(2)认证和会话管理服务器提供的身份认证和会话管理机制存在安全漏洞,如关键系统组件或应用程序使用弱口令,高安全性系统不采用双因素认证方式,存在无认证密码或验证码暴力破解攻击机制不对SessionID的生成、过期、销毁进行安全配置。攻击者可以利用这些漏洞在未经授权的情况下登录系统进行恶意操作。(3)访问控制开发者未对用户登录系统后的操作进行进一步的访问控制,服务端未对客户端收到的增、删、改、改等操作请求进行鉴权处理查询数据,允许攻击者执行超出自己帐户权限的操作。(4)被注入的应用程序运行时,可能需要调用一些向前端写入内容、查询数据或执行系统命令的函数。如果用户可以控制这些功能的输入,而开发者没有严格过滤输入内容,攻击者就可以在前端提交恶意构造的输入,进行XSS注入、SQL注入、命令注入等攻击,导致服务器重要数据泄露或执行恶意命令。(5)应用层拒绝服务服务器不限制应用的最大连接数或请求的IP和频率。攻击者发送大量请求或构造畸形数据包,如CC攻击、Slowloris攻击等,造成系统资源消耗。耗尽,导致服务器拒绝服务。(6)密码算法和密钥管理应用程序使用经过验证的不安全的密码算法对重要数据的传输和存储进行加密和解密,例如使用MD5算法存储用户密码,使用DES算法对数据进行加密传输,可能会导致攻击者在获得密文后的短时间内恢复明文信息;应用程序使用不安全的方式进行密钥管理,例如在应用程序代码中将系统使用的密钥以明文方式编码,或者以明文方式存储在服务器配置文件中,都会导致攻击者很容易获得数据加密和解密密钥,进而得到加密数据的明文信息。4.APP渗透测试流程渗透测试的最终目的是帮助目标APP或系统发现并修复安全漏洞,提高APP或系统的安全性。一个优秀的渗透测试工程师或团队首先要有良好的职业道德,同时要注意自我保护,其次要有专业的技术知识、规范的测试流程和活跃的思维。下面,我们先介绍一下一般的APP渗透流程,然后再结合APP对服务端进行渗透测试的一些思路进行探讨。1.准备阶段定义安全测试的范围,包括识别适用的安全控制点、被测方的测试目标和敏感数据。同时,在进行渗透测试前,应取得被测单位盖章的书面渗透测试授权书。2.信息收集收集APP环境、业务用例、架构等信息。其中:APP业务功能、行业分类、开发或运营机构的基本信息和工作流程等环境信息;架构信息包括APP本身(如何访问数据和资源,是否检测是否运行在root或模拟环境等),APP适用的操作系统和版本,与服务器的通信协议(是否安全传输协议)使用过的,是否有其他安全保护措施等),以及远程服务(APP使用了哪些远程服务,对这些远程服务的攻击是否会对APP造成影响)等。这些信息大致可以分为两大类:开发或运营机构信息和APP相关技术信息。一般前者可以由业务人员采集,后者可以由技术人员采集。3.应用描述根据前两个阶段收集的数据(也可以辅以APP的自动扫描和人工分析),测试人员对被测环境、业务用例和架构有比较全面的了解APP,并且基本上确定了渗透测试入口点,收集和存储的数据,以及被测APP可能存在的安全漏洞后,就可以根据这些漏洞的风险等级进行排序,让测试人员确定被测APP的攻击路径渗透测试并制定相应措施。测试用例。4.漏洞利用及测试工具开发在这个阶段,测试人员会尝试利用上一阶段发现的漏洞对应用进行渗透,验证发现的漏洞是否真实有效。同时,漏洞验证过程可能涉及测试工具、脚本开发;这个阶段是整个APP渗透测试过程中非常必要和关键的一个环节。5.提交报告在此阶段,测试人员对已验证的漏洞形成报告并提交给客户。报告内容至少应包括详细的漏洞名称、类型、漏洞风险分析、漏洞利用过程及结果、渗透测试过程中的非授权访问数据等。注:不同类型的安全检查,除了程序上的差异外,在报告内容和形式上也会有差异,应根据具体情况具体分析。5、结合APP渗透服务器章节,主要列举一些通过APP渗透相关服务器的思路。这里假设测试人员只被授权渗透APP和相关服务。通常包括5个比较重要的环节,分别是:信息采集、网站/服务器渗透、APP功能分析、第三方SDK分析、账号安全和业务安全分析。1、信息收集要想对服务器进行攻击,首先要“定位”服务器。常见的定位服务器的方法有反编译APP、抓包分析、APP相关信息查找、信息汇总分析等,具体如下:一、反编译APP。这个过程可能涉及APP的解包等,反编译后,在反编译后的代码和资源文件中,使用字符串搜索和过滤,收集所有链接等信息。除了HTTP/HTTPS链接外,还要注意是否有FTP、登录凭据(比如邮箱账号,有些app会发送崩溃信息等到邮箱)等信息。可以通过编写脚本或在自动化工具中配置扫描规则来完成字符串搜索和过滤。二是抓包分析。一般手机APP与服务器端的通信使用HTTP(S),可以使用抓包工具对传输的数据进行抓包分析。在抓包过程中,我们可以手动点击APP中的功能菜单,或者使用工具触发APP的各种功能,通过抓包工具过滤或尝试排除非被测APP的网络通信数据干扰自定义系统(部分网址可能是第一个第三方SDK官方地址,非授权渗透测试目标,应过滤掉)。三是APP相关信息搜索。通过互联网广泛搜索APP相关信息。如果你能找到它的官网,你应该收集整理它的官网和论坛的链接。如果获得授权,也可以将其纳入渗透目标范围。找到APP的历史版本,因为如果APP当前版本的安全加固措施到位,逆向分析起来会比较复杂,但是某个时间点之前的历史版本可能不会加固。可能还有其他意想不到的发现。四是信息汇总分析。通过对收集到的信息进行综合筛选和分析,形成信息集,包括但不限于URL、IP、使用的第三方SDK(详见下文)等信息。2、网站/服务器渗透阶段与传统网页渗透过程相同。测试人员使用各种嗅探工具对信息集中的URL和IP进行嗅探和漏检,以期发现可能存在的漏洞等,并通过发现的漏洞(无论0day还是nday),尝试获取服务器的权限。因为本章的重点是介绍如何结合APP做服务端穿透,所以这部分就不详细展开了。3、APP功能分析在信息收集阶段,测试人员对APP功能有了基本的了解。在这个阶段,测试人员应该实际试用APP。你应该关注它相对冷门的功能,因为越是冷门的功能,开发者就越不会去关注它们,相应的服务器服务出现安全问题的可能性就越大。4.第三方SDK分析在信息收集部分,我们提到,未经授权,测试人员无法在第三方SDK官网进行渗透测试,那么为什么要分析第三方SDK呢?原因是第三方SDK有很多客户端和服务端是搭建在一起的,有的部署在官方SDK服务器上,有的部署在SDK用户端(也就是官方APP服务器)。很多SDK官方都会给出详细的说明,包括功能、部署方式、API等,对于服务端SDK,测试人员可以下载(如果检测不到服务端版本号,可以根据采集到的APP推测)业务上线日期,并结合经验和收集到的信息,从下载的SDK中选择重要的SDK),搜索历史漏洞(该工作也可以在信息收集环节进行),扫描分析,可能发现一些有用的漏洞(0day最好,nday也应该尝试,以防它不能修复它?)。5.账户安全和业务安全最后,我们来谈谈账户安全和业务安全。该环节也可能涉及到APP功能分析过程。获取servershell权限可能与渗透没有太大关系,但是从攻击者的角度来说是非常关键的,因为大多数攻击者获取的是servershell权限。目的是获取APP用户的数据或信息。当然,也有纯粹为了破坏和黑客大显身手的情况。在这个环节,测试人员要详细分析APP的账户机制和业务逻辑。随着APP官方与黑市对抗的加深,APP的业务逻辑和身份认证机制可能会变得非常复杂。同时,如果APP用户量大,上线时间长,出现账号安全问题(爆破、信息泄露、未授权访问、绑定/替换逻辑等)的可能性相对要低很多;同样,业务越成熟,出现安全问题的概率就越低,因此测试人员可以重点关注被测APP中可能存在的冷门或新上线的业务。随着手机APP安全攻防的逐渐加强,对其及相关服务器的渗透测试必然会涉及到越来越多的逆向工程、调试、数据或流量解密等过程发现,但漏洞利用一般需要进一步的逆向工程和抓包分析)。渗透测试人员和团队应该善于使用、定制或开发自动化工具来辅助检测,以节省时间和人力。可以想象,一旦攻击者借助APP将服务器拿下,他就可以依次对APP(或用户)进行批量攻击,从而形成一个攻击闭环,而攻击者能做的远不止于此!6.结语以上是笔者关于手机APP渗透测试的总结,希望对大家有所帮助,但限于知识和技术水平,会有很多不完善甚至不准确的地方,还望大家指正很多。