应用安全一直是安卓绿色联盟关注的重点之一,安卓绿色联盟也在持续通过活动和文章的方式为大家带来一些技术分享,喜欢的程序猿朋友欢迎关注我们,和我们交流哦~
| Kevin Mitnick 说没有攻不破的系统,应用尤其这样。而渗透测试则是通过去模拟黑客使用的漏洞发现技术和攻击手段,从一个攻击者可能存在的位置来进行分析,并且从这个位置有条件的主动利用安全漏洞,找到系统最脆弱的环节。那么渗透测试方法有哪些,具体分析策略如何?下面由技术专家张中文为大家进行精彩的技术解析。 |
渗透是一门比较独立和特定领域的一门技术,可清晰地分为静态分析和动态分析。
推荐分析工具:JEB
静态分析的常见类别:
获取敏感数据
可利用的代码执行
网络/本地 Socket
路径/URI/URL 校验
数据文件的权限配置
SQL 注入
密码秘钥
暗码/后门
证书校验/中间人攻击
Webview 专项
下面将针对每一项进行详细分析:
敏感数据包括:短信,联系人,位置,秘钥/口令,IMEI,浏览器历史记录,粘贴板数据,安装的 APP 列表等。不同场景下可能包含其他的敏感数据类型。
敏感数据–API/Keyword
分析思路:
追踪敏感数据流向:位于 Sdcard 的数据;写到 logcat 里的数据;数据被发送至外部的通道,如短信、网络、WIFI、WIFI(3G&4G)蓝牙、NFC 等。
随着应用的体量越来越大,插件化成为一个趋势。插件化带来很多优点,如易于升级,易于扩展等功能,但同时也带来了攻击点。除了插件,还有传统的 Java exec 的代码执行方式。
可利用的代码执行–API/Keyword
分析思路:
对于 dex 插件
查看插件的来源是否来自 SDCard,如果是直接替换;查看是否来自网络下载,可否被中间人替换。
是否校验了 dex 插件的 hash value。
对于 exec
查看参数来源是否可控;
是否来自 intent,intent 是否可控;
是否来自 localsocket,localsocket 是否有访问控制;
是否来自网络流量(C&C),流量是否可以截获并篡改。
网络 Socket/HTTP/HTTPS 是手机与外界数据交换的重要通道,手机中大量的数据都通过网络流量传输。
本地 Socket 类似网络 Socket,不同的是本地 Socket 是本地两个进程进行数据交换,不涉及到网络流量。
网络/本地 Socket–API/Keyword
分析思路
分析发送的数据是否是敏感数据;
查看是否发送到指定的 IP/端口;
是否有 Command and Control 的行为;
判断是否是后门。
是否有访问控制,如果没有访问控制或者访问控制可以被绕过则继续分析;
如果是 client,查看 server 是否存在,是否可以被仿冒;
如果是 server,查看 server 提供的功能,是否有利用价值。
应用/SDK 大量使用路径/Url 作为参数,如果不校验路径的合法性,容易导致路径遍历攻击。Android 平台最典型的路径遍历漏洞是 ZipEntry,URL 路径遍历问题与传统的 web 相同。
路径/URI/URL 校验–API/Keyword
分析思路
路径遍历问题较为普遍且涉及到众多 API,若仅仅用 API 作为关键字搜索精确度会降低。比较推荐的做法是先分析是否有利用价值,如加载一个配置文件,写一些敏感数据等;再进一步分析路径参数是否可以控制。因此,通常路径遍历漏洞需结合其他漏洞才能发挥比较大的价值。
防御方法:
通过../过滤后判断合法性
获取绝对路径后判断路径合法性
数据文件有很多类型,最典型的是 SharedPreference.xml 和 Provider.db,以及
存在 sdcard 上的配置文件等。
分析思路:
如果测试手机有 Root 权限,直接 ls -l 查看文件权限,否则查看源代码。
Android 使用 SQLite 数据库,也会遭受 SQL 注入攻击。如果暴露的 Provider 组件在 query() 中使用拼接字符串组成 SQL 语句的形式去查询数据库,容易发生 SQL 注入攻击。
SQL 注入–API/Keyword
SQL 注入示例
用 “_id’” 探测,如果应用出错,则存在注入;如果修改 projection 的内容为
"* from sqlite_master where type='table';--",SQL 语句就会变成 select "* from sqlite_master where type='table';--“,“;--” 之后的 SQL 语句就作为注释被忽略掉了。
Drozer 工具可以帮助检测和利用 SQL 注入漏洞。
应用的秘钥管理一直没有完美的解决方案,有安全意识的开发者会把重要的秘钥数据存储在 keystore 里,但也有相当多开发者将秘钥硬编码写在应用里,反编译后就可以轻易获取到。
密码秘钥– API/Keyword
案例分享:CVE-2017-2704
密钥硬编码在代码中,逆向分析可以破解出明文。
暗码通常是在拨号盘界面输入##secret_code##,就会得到很多信息。如常见的进入工程菜单的暗码,在拨号盘输入##2846579##就可以进入华为手机的工程菜单,暗码的这种特性被一些人用作后门。检测暗码可以在 AndroidManifest.xml 中搜索如下 action,找到对应的处理代码,查询是否存在后门行为。
暗码/后门– API/Keyword
代码示例:
使用暗码功能要在 AndroidManifest.xml 里声明,在组件接收到暗码消息后进行相应的处理。
Webview 作为广泛使用的一个控件,其地位足以和四大组件相媲美。Webview 让应用变得更加丰富多彩,也提供了不用来回切换界面的良好用户体验。但是便利总是需要付出一些代价,使用 Webview 付出的代价是应用的安全性变差。
Webview 专项–API/Keyword
Webview 攻击面分析
CVE-2012-6636 addJavascriptInterface 利用该漏洞执行任意 Java 对象的方法
CVE-2013-4710 openFile 同源绕过
setAllowFileAccessFromFileURLs
setAllowUniversalAccessFromFileURLs
setAllowFileAccess + setJavaScriptEnabled(true)
密码明文存储 setSavePassword (true)
地理位置泄露 setGeolocationEnabled
loadUrl (String url)
loadUrl (String url, Map additionalHttpHeaders)
loadData(String data, String mimeType, String encoding)
loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)
动态分析的常用方法:
动态调试
运行时 Hook
实时流量包抓取/分析
搭建简易 HTTP 服务器挖掘 RCE 问题
通过静态分析获取了风险点后再进行动态分析,才能确定系统是否真的有问题。
Android Studio 下载 smalidea(https://bitbucket.org/JesusFreke/smali/downloads/Android),打开 Studio,点击 File -- Settings – Plugins,即可安装成功。
Hook 框架 – Frida
Android 有很多 Hook 框架,比如大名鼎鼎的 Xposed,还有 Cydia,Frida,ADBI, Dexposed,DroidPlugin,Legend 等。这些 Hook 框架各有千秋,可以按照自己的喜好选择使用。现在给大家推荐使用的 Hook 框架是 Frida。
• 安装指导:
https://www.frida.re/docs/functions/
• 资源下载:
https://github.com/frida/frida/releases
使用示例 – Hook 应用
Part I: java script
Part II: python script
加载 Java script 脚本
在终端输入以下命令
流量分析工具 – Burp
常见的流量分析工具有 burp 和 fiddler,二者差别不大,可自由选择。
Burp 的社区版是免费的,并且满足绝大部分渗透要求。
下载链接:
https://portswigger.net/burp/communitydownload
使用示例:
HTTPS 有证书校验,如果想抓到 HTTPS 的包,就需要妥善处理证书问题。一般来讲 HTTPS 的抓包与证书的关系大致有三类:
1 不配置证书可以抓获的,这类是客户端忽略证书错误。
2 需要导入到信任证书才能抓获的,这类是客户端信任所有证书域。
3 需要 hook 才能抓获的,这类是内置服务端证书在应用内。
示例:
针对第二种情形进行处理– 配置证书
PC 端配置要点
1、打开 Burp,配置 Burp 监听本地所有的 8080 端口。
2、打开浏览器,访问 7localhost:8080,点击右上角 CA Certificate,下载 Burp 证书
3、把下载的 Burp 证书导入到 PC 上受信任的根证书。
4、把上一步导入的证书 (PortSwiggerCA) 导出,并安装到手机上。安装时要输入手机的解锁码。
手机端配置方法
1、 配置代理
如图主机名 127.0.0.1,端口 8080 跟 burp 保持一致。
2、把手机上的端口转发到 PC 端
adb reverse tcp:8080 tcp:8080,Burp 已经可以抓取手机上 HTTPS 流量包。
使用示例 – 中间人修改 JS 代码窃取信息
背景:静态分析发现 Webview 对外暴露了 Java 对象。
目的:调用对象接口,获取敏感信息。
方法:用中间人的方法修改返回包的 js 脚本
1、打开 Intercept,拦截所有流量
2、抓到请求包,拦截响应包
3、拦截到响应包,修改响应包内容,插入窃取信息的脚本。
4、用户信息被窃取
方法一:
最简易的 HTTP 服务器搭建方法只需要输入一条命令
python -m SimpleHTTPServer %PORT%
方法二:
安装 XAMPP,配置如下 3 个信息
Listen 8080
ServerName localhost:8080
DocumentRoot "E:ulnerabilitiesclone"
如果启动成功后 Apache 背景会变成绿色。
简易 HTTP 服务器在渗透测试中的应用
背景:应用对外暴露了 BROWSABLE 的 Activity,且 Activity 对外暴露了 Java 对象,此对象提供了敏感功能。
目的:利用此 Activity 启动任意应用。
方法:搭建 HTTP 服务器,在页面中嵌入攻击脚本
环境配置步骤
PC 端用 XAMPP 搭建服务器,端口配置成 8080
转发端口,把手机上的 8080 端口映射成 PC 上的 8080 端口 adb reverse tcp:8080 tcp:8080
手机端不需要配置代理
配置成功后,在手机浏览器上访问 127.0.0.1:8080 能够看到目录下的文件( E:ulnerabilitiesclone )
用静态分析的方法分析出攻击路径,构造攻击脚本。
关注安卓绿色联盟公众号,回复关键字 “走进 360”,获取完整 PPT