DIVA闯关
DIVA简介:
DIVA(该死的不安全和易受攻击的应用程序)是故意设计的存在很多漏洞的Android app。
源代码链接:https://github.com/payatu/diva-android
apk文件链接:http://payatu.com/wp-content/uploads/2016/01/diva-beta.tar.gz
闯关工具:
环境部署:
-
将adb通过USB与夜神模拟器进行通信。
要在通过USB连接的设备上使用adb,必须在设备的系统设置中启用USB调试。在搭载 Android 4.2 及更高版本的设备上,“开发者选项”屏幕默认情况下处于隐藏状态。打开夜神模拟器,点击设置->关于平板电脑,可以看到Android 版本为7.1.2,点击版本号7次,即可激活开发者模式,返回上一屏幕,开发者选项->USB调试即打开USB调试功能。 现在可以将adb连接模拟器。
从Nox/bin/目录进入命令行,输入连接命令,并验证设备是否已连接。
输入 adb connect 127.0.0.1:62001 或 adb connect 127.0.0.1:52001 即可以连接到adb 查看连接情况输入命令 adb devices
返回以下内容说明成功。
扩展:Android 11 及更高版本支持使用 adb从工作站以无线方式部署和调试应用。例如,可以将可调试应用部署到多台远程设备,而无需通过 USB 实际连接设备。这样就可以避免常见的 USB 连接问题,例如驱动程序安装方面的问题。
详情:https://developer.android.google.cn/studio/command-line/adb -
将靶场拖进模拟器,打开靶场。
开始闯关:
第一关 不安全的日志输出
产生原因:由于app代码中将敏感信息(如凭据,会话ID,财务详细信息等)通过log.e输出,所以在app的表单中输入的内容,可以在相关的日志中输出。
-
提交数据后,输入命令adb logcat查看日志
也可以进入交互式shell,输入ps | grep -i diva先找到diva的pid值(2732),再通过logcat | grep [pid]获取日志信息。
-
可以通过反编译在logActivity.class中看到代码中使用了log.e输出。
第二关 硬编码—第一部分
硬编码
- 某些需要比较字符串的值为硬编码,如:激活码
- 加密的key或者salt为硬编码,如MD5的salt
-
直接查看源码,发现vendor key的值
第三关 不安全的数据存储—第一部分
产生原因:使用了SharedPreferences类,该类是Android平台上一个轻量级的存储类,主要是用来保存一些常用的配置,本例中是用该类存储了用户名和密码,因此是具有风险的。SharedPreferences类存储的数据会以.xml的形式存储在/data/data/app的包名/shared_prefs目录下。
-
首先随意输入用户名和密码 admin/admin 点击保存
-
进入shell模式,在/data/data/jakhar.aseem.diva/shared_prefs/目录中查看jakhar.aseem.diva_preferences.xml文件,也可以输入adb pull /data/data/jakhar.aseem.diva/shared_prefs ./将文件复制出来查看
-
在InsecureDataStorage1Activity.class中可以看到产生风险的地方
第四关 不安全的数据存储—第二部分
产生原因:将敏感数据保存在本地的sqlite3数据库中,对应的数据库目录: /data/data/app的包名/databases
-
同样先输入admin/123456
-
进入/data/data/jakhar.aseem.diva/databases/目录中sqlite3查看数据库文件ids2
-
在InsecureDataStorage2Activity.class中可以看到产生风险的地方
第五关 不安全的数据存储—第三部分
产生原因:将敏感数据保存在临时文件中,对应的临时文件目录: /data/data/app的包名/
-
同样输入之后,进入/data/data/jakhar.aseem.diva/目录中查看该目录下临时文件uinfo-1464421317tmp
-
在InsecureDataStorage3Activity.class中可以看到产生风险的地方
第六关 不安全的数据存储—第四部分
产生原因:将敏感数据保存在sd卡中,对应的目录一般在: /mnt/sdcard,也可以通过logcat查看保存路径。
-
进入/mnt/sdcard/目录中查看存储sd卡的文件.unifo.txt
-
在InsecureDataStorage4Activity.class中可以看到产生风险的地方
第七关 输入校验问题—第一部分
产生原因:某些不安全控件内输入sql或其他数据库的一些语句,因为在使用前未进行检验长度和过滤等操作,从而达到欺骗服务器执行恶意代码影响到数据库的数据
-
首先输入test'和test''试探一下,test'什么也不返回,而test''正常返回
-
输入万能密码test' or '1'='1尝试,即得到了所有用户的数据
-
在SQLInjectionActivity.class中可以看到并没有对输入数据进行处理且语句直接拼接
第八关 输入校验问题—第二部分
产生原因:在处理转跳时存在漏洞,导致允许从http域跨向file域,实现跨域漏洞,在 File 域下,同源策略跨域访问则能够对私有目录文件进行访问
-
输入一段url点击可以看到访问了这个页面
-
将http协议换成File协议,查看之前存储在sd卡的账号文件
-
在InputValidation2URISchemeActivity.class中可以看到并没有对输入数据进行处理直接loadUrl
扩展:webview域控制不严格漏洞
先看Android里的WebViewActivity.java,当其他应用启动此 Activity 时, intent 中的 data 直接被当作 url 来加载(假定传进来的 url 为 file:///data/local/tmp/attack.html ),其他 APP 通过使用显式 ComponentName 或者其他类似方式就可以很轻松的启动该 WebViewActivity 并加载恶意url。解决方案:
对于不需要使用 file 协议的应用,禁用 file 协议:
对于需要使用 file 协议的应用,禁止 file 协议加载 JavaScript。
方法分析:
1、setAllowFileAccess()
使用 file 域加载的 js代码能够使用进行同源策略跨域访问,从而导致隐私信息泄露,如果不允许使用 file 协议,则不会存在上述的威胁,但同时也限制了 WebView 的功能,使其不能加载本地的 html 文件。2、setAllowFileAccessFromFileURLs()
设置为false,禁止从 file url 中加载的 js 代码读取其它本地文件,在Android 4.1前默认允许,在Android 4.1后默认禁止。3、setAllowUniversalAccessFromFileURLs()
设置为false,禁止从 file url 中加载的 js 代码可以访问其他的源(包括http、https等源)。
第九关 访问控制问题—第一部分
-
点击按钮获取到API 凭据
-
而我们的目标是不使用按钮就获取到API凭据。
查看diva-beta.apk/AndroidManifest.XML文件,查看和供应商API凭据提供相关的activity
通过观察代码发现,这个activity被intent filter所“保护”,当intent filter被activity等组件使用,这个activity可能会被外部任何应用程序所调用
-
adb启动activity组件,输入命令
$adb shell am start jakhar.aseem.diva/.APICredsActivity 或者 $adb shell am start -n jakhar.aseem.diva/.APICredsActivity -a jakhar.aseem.diva.action.VIEW_CREDS am start: 启动activity 管理工具 -a:指定action -n:指定完整 component 名 命令详情:https://developer.android.google.cn/studio/command-line/adb#am
-
之后模拟器上就弹出了之前的凭据页面
第十关 访问控制问题—第二部分
-
从题目里可得注册后才能拥有tveeter API Credentials,所以要通过不注册来获取API Credentials
-
尝试上一关的方式
结果跳到了未注册时的activity,这表明程序做了相应的措施
-
查看源码APICreds2Activity.class
可以看到,getIntent获取到上个activity传来的boolean值(2131492985),当这个值为false时才视为用户已注册,再看看上个activity,查看AccessControl2Activity.class
这个类中bool值是通过单选项来决定的,而且把值传给下个activity,这时我们可以使用–ez来传递一个boolean键值对,但是还要获取到2131099686值对应的key值是什么。
-
一般情况下使用apktool反编译的字符串文件存放在apktoo/diva-beta/res/vaules/strings.xml文件下,在反编译的情况下所有的索引值都保存在strings.xml同目录下的public.xml文件中,所以,我们现在public中查看16进制的2131099686(0x7f060026)对应的name值
然后再strings文件下查找chk_pin,最后得到key 为check_pin
-
最后adb启动activity命令,成功弹出
$adb shell am start -a jakhar.aseem.diva.action.VIEW_CREDS2 -n jakhar.aseem.diva/.APICreds2Activity --ez check_pin false
第十一关 访问控制问题—第三部分
-
由题可知,这是个私人笔记app,一开始需要设置密码才能使用,现在我们尝试不设置密码就开始使用。
-
同样查看AndroidManifest.XML文件
这里使用了ContentProvider,android:enabled表示是否能由系统初始化,android:exported表示是否能被其他应用使用,android:authorities标识这个ContentProvider,调用者可以根据这个标识来找到它,看到2个值都为true,我们就可以使用content://访问里面的数据了,查看包含content://的字符串文件apktool/diva-beta/smali/jakhar/aseem/diva/NotesProvider.smali
和我们在AndroidManifest所看到的一样
-
我们可以使用以下命令随意的访问该uri
$adb shell content query –-uri content://jakhar.aseem.diva.provider.notesprovider/notes
第十二关 硬编码—第二部分
-
查看源码Hardcode2Activity.class,这里使用了DivaJni类
点击查看 DivaJni.class
这里加载了divajni库,一般库文件都放在/lib下,在目录下找到libdivajni.so文件,linux下可以使用strings方便的查看二进制文件里的字符串
$strings libdivajni.so
-
逐个尝试,发现olsdfgad;lh成功
第十三关 输入校验问题—第三部分
-
正常输入
-
当输入超级多的数据时,程序崩溃了
-
查看logcat可以发现缓冲区溢出了
-
查看源码,可以看到这里使用的是strcpy,使用strcpy_s更加安全