移动黑客技术已成为漏洞猎人工具带中不可或缺的一部分,没有人比安卓黑客 bagipro 更了解这一领域。他是目前HackerOne 平台上谷歌应用商店安全奖励计划 (Google Play Security Reward Program) 贡献排名第一的白帽黑客。他具有多年的漏洞挖掘经验。今天,我们一起学习一下他的技巧,顺便聊聊他的黑客生涯。
A:实际上这并不是我自己规划的。17岁时,我申请到一所大学,从利佩茨克州一个叫“叶列茨”的小镇搬到莫斯科。我觉得自己从大学学不到什么真正能用于实践的知识(我数学学了不少,但编程学的不多,安全更是没学过),于是我开始寻求一份全职或兼职的工作,以求学以致用。之前出于兴趣,我学了 C++并在 uTest 公司做了大概两年的测试工程师,那会只用到基础的web安全技能。之后准备了一份简历,把所有的经验都写了上去,向 headhunter.ru 投稿(我的简历名称是“C++ 程序员”!)。结果我得到了一些测试工程师的面试机会,但职位职责看起来都太简单了,觉得自己学不到什么新东西。第二天,我接到了Positive Technologies 公司的招聘电话,他们招三个职位“Unix 初级安全专员”、“初级安全专员”和“移动初级安全专员”,我说想试试 Unix 初级安全专员的岗位,但招聘人员表示想让我面试移动方向的岗位,我同意了。最终我面试了两个岗位(我觉得自己都搞砸了),不过出于某种原因,最后通过了。我在那工作了5年,主要是为公司的客户(基本上是俄罗斯的银行)执行 iOS/安卓客户端/服务器端的安全审计工作。Q:学习移动黑客技术需要具备先决条件吗?需不需要熟悉某种语言?A:肯定是熟悉的语言越多越好。至少你应该了解 Java。目前我发现很多应用(或其组成部分)都是用 Kotlin 语言编写的,但这也没关系,因为我们总是可以把它反编译为有效的 Java 语言。此外,Java 和反编译(反)混淆 Java 不同,因此你也得学会了解反编译版本。A:我推荐阅读公开发布的报告,下载受影响应用的老旧版本,并尝试重现。Q:你在学习移动黑客技术时是否有导师领路?还是都是自学的?A:刚入行时,我自学了基本的安卓黑客技术。但目前我使用的多数技术都是自己研究出来的。但我觉得研究起来并不难,挺有意思。例如,你可以下载1000款最流行的安卓应用分析WebViewClient.shouldOverrideUrlLoading在统计学上是如何使用的,找到开发人员最容易犯的错误并为所有流行和潜在的敏感方法和类重复这个过程。有时很难做到这一点,而且需要花费较长时间了解 Android Framework 的来源,因此,你可以创建两款 app,它们分别是“受害者”app和“攻击”app,并分别测试它们的不同配置情况。A:我其实寻找所有代表风险的漏洞类型。最流行的漏洞是在 WebViews 或 http 库(如 OKHttp、Retorfit)中因替换 URL 引发的令牌泄露;通过 WebViews 从所有站点窃取所有 cookie;窃取任意文件(通过向任意 URL 发送任意文件的 WebViews、内容提供商和活动,和将受保护文件复制到未受保护位置的活动);覆写任意文件(如修改原生库时可能导致用户数据损坏或任意代码执行);本地代码执行(当不存在或具有可绕过验证的应用试图通过不同应用的 ClassLoaders 编码时通常会发生这种情况,因为应用认为它们是插件;另外,安卓上常常出现 Apache CommonsCollections4 漏洞);不受保护的意图以附加的敏感数据开始(活动以接收者开始);不安全的数据存储(内部目录或公开目录中的全局可读标记)等。Q;你用手机吗?还是用 genymotion 或类似工具的虚拟设备?Q:当你查找安卓应用中的漏洞时会参照 OWASP 等清单吗?A:不用,因为我认为 OWASP 清单并未涵盖最流行的移动 bug。有很多特定于安卓和 iOS 平台的 bug,一般的清单都会缺少很多东西。另外,当你对任何计算机系统进行渗透测试时,你应该了解它的工作原理。Q:你更愿意使用 Frida 还是其它工具如 Xposed?A:我记得在 Frida 发布前就开始使用 Xposed,所以一直使用 Xposed,可能我太懒了都没学习如何使用 Frida,我对 Xposed 的功能非常满意。Q:如何才能有效地绕过安卓应用上的 SSL?你最喜欢的资源是什么?A:使用 Xposed + SSLUnpinning。有时,当实施超级棘手的 SSL pinning 时,我只是通过 apktool 反编译应用,把 https 更改为 http,重新编译并签名,并在 Charles 中创建一个重写规则,把 http 替换为 https。这样可行!Q:在查找 OWASP Top 10 漏洞时,如何对安卓 app 执行动态分析?A:我实际上在整个测试过程中会用到动态分析。可能在某些不明确/混淆的条件下,你可能不了解为何无法复现某个 bug。在这种情况下,我使用 Xposed hook app 的不同部分来分析代码执行是否如我所期。我建议结合使用所有方法来执行彻底的分析,手动审计了解 app 及其部件之间如何工作,了解它们的借口,找到潜在的易受攻击参数,查看内部和外部目录中创建了哪些文件、它们的权限是什么、网络日志是什么等。Q:如果某款 app 的webview 能够访问内部文件系统(如 file://)而我具有执行能力,那么我应该测试哪些常见的漏洞?A:WebView 是安卓中最流行的组件,我们有很多利用技术。如下是我最经常见到的东西:- 事物方代码可访问已知事物如 JavaScript 接口,从而导致执行敏感动作或访问私有数据。
- 通过 file:scheme 的 XHR 请求窃取任意文件。应该将WebSettings.setAllowUniversalAccessFromFileURLs的值直接设为 true。
- 通过 intent://scheme URIes 访问受 app 保护的组件(见https://www.mbsd.jp/Whitepaper/IntentScheme.pdf)。
- 从所有站点窃取所有 cookies。主要思想是使用 XSS 有效负载设置 cookie,将当前文档内容发送至外部服务器。之后,使用 .html 扩展名对带有 cookie 的文件进行符号链接,并强制 WebView 打开该符号链接。SQLite 数据库文件将被解析为 HTML 文档,XSS 将触发并泄露数据库中的所有数据。它适用于默认的 WebView 配置,并且应该显式启用 JavaScript(开发人员总是启用)。但这样做可能导致任意文件遭泄露,你可以通过XSS 用自己的有效负载感染这些文件。
滥用WebViewClient.shouldInterceptRequest方法窃取(任意)文件。通常,这一方法的实现会检查 url 是否以一个预定义内容开头:mycustomscheme://localfile/,之后检查对开头进行子字符串处理并返回文件内容。
访问内部深链系统。某些深链“受到保护”并由WebViewClient.shouldOverrideUrlLoading处理。这类异常访问权限(开发人员拥有)可导致产生不同的后果。
通过对DownloadListener.onDownloadStart易受攻击的实现覆写任意文件。
当URL首次来自,比如,onCreate 方法的getIntent(),第二次来自onNewIntent 的 通用型 XSS。
Q:主机验证漏洞(如 https://hackerone.com/reports/431002)仍然是常见且相关的吗?
A:当然。实际上在多数应用中我从未见到过一种良好的主机验证机制。Q:你如何确认从安卓 app 中提取的 api_keys 是敏感性质的?A:很显然,你应该了解它们为什么会在那里,通过它们找到 library/service,查看文档并分析密钥是否应该被保密或者是否可以公开披露。超级流行的 api_keys 为数不多,常见的也就那么几个,因此把它们全部记住也不难。
https://www.hackerone.com/blog/AndroidHackingMonth-qa-with-bagipro
题图:Pixabay License
本文由奇安信代码卫士编译,不代表奇安信观点。转载请注明“转自奇安信代码卫士 www.codesafe.cn”。
奇安信代码卫士 (codesafe)
国内首个专注于软件开发安全的
产品线。
点个 “在看” ,加油鸭~