App安全检测实践基础——工具

 

目录

Apktool

Apk反编译得到Java源代码

dex2jar

jd-gui.exe

劫持工具

使用方法:

adb工具

PYTHON2.7

drozer工具安装及使用

使用drozer对app进行测试


App安全检测实践基础——工具



apktool:简而言之就是获取资源文件,主要查看res文件下xml文件、AndroidManifest.xml和图片。

(注意:如果直接解压.apk文件,xml文件打开全部是乱码)

dex2jar:将apk反编译成Java源码(classes.dex转化成jar文件)

jd-gui:查看APK中classes.dex转化成出的jar文件,即源码文件
 


Apktool

下载地址:https://ibotpeaches.github.io/Apktool/install/

windows则下载,放置同一目录;名字一样【放置在要检测的apk里最好方便检测】

apktool.bat 不好下载可以用我这个

@echo off
setlocal
set BASENAME=apktool_
chcp 65001 2>nul >nul

set java_exe=java.exe

if defined JAVA_HOME (
set java_exe="%JAVA_HOME%\bin\java.exe"
)

rem Find the highest version .jar available in the same directory as the script
setlocal EnableDelayedExpansion
pushd "%~dp0"
if exist apktool.jar (
    set BASENAME=apktool
    goto skipversioned
)
set max=0
for /f "tokens=1* delims=-_.0" %%A in ('dir /b /a-d %BASENAME%*.jar') do if %%~B gtr !max! set max=%%~nB
:skipversioned
popd
setlocal DisableDelayedExpansion

rem Find out if the commandline is a parameterless .jar or directory, for fast unpack/repack
if "%~1"=="" goto load
if not "%~2"=="" goto load
set ATTR=%~a1
if "%ATTR:~0,1%"=="d" (
    rem Directory, rebuild
    set fastCommand=b
)
if "%ATTR:~0,1%"=="-" if "%~x1"==".apk" (
    rem APK file, unpack
    set fastCommand=d
)

:load
%java_exe% -jar -Duser.language=en -Dfile.encoding=UTF8 "%~dp0%BASENAME%%max%.jar" %fastCommand% %*

rem Pause when ran non interactively
for /f "tokens=2" %%# in ("%cmdcmdline%") do if /i "%%#" equ "/c" pause

反编译后的文件如下

将反编译后的文件重新打包

目录文件内多了一个build、dist


注意:

反编译时,可能会报bug:

Exception in thread “main” brut.androlib.AndrolibException: Could not decode 

这个问题,就是apktool.jar比较老旧的问题; apktools.jar下载官网。


Apk反编译得到Java源代码

得到classes.dex 文件

它就是java文件编译再通过dx工具打包而成的,将获取到的classes.dex放到之前解压出来的工具dex2jar文件夹内

dex2jar

下载地址:https://sourceforge.net/projects/dex2jar/files/latest/download

去执行命令在该目录下,然后生成jar文件

jd-gui.exe

下载地址:https://www.sdbeta.com/plus/download.php?open=2&id=224579&uhash=6fd792195f5c2d1cd6f23471

使用jd-gui.exe去分析生成的classes-dex2jar.jar包


劫持工具

那么在实际检测该漏洞的时候,可以利用工具逆向、扫描源代码进行分析,查看代码在关键位置是否进行了一些报警,如toast。实现的方法为直接使用一个测试的apk对目标应用进行界面覆盖,观察目标应用是否进行了报警。

https://github.com/aloswoya/android_app

在styles.xml文件中利用样式配置将界面设置为透明

使用方法

adb工具

简介

adb是Android的一个很重要的调试工具,熟练掌握后可实现很多功能,比如有些手机的解锁、ROOT就会用到adb工具

     安装过程

https://developer.android.com/studio/releases/platform-tools

由于网速的问题没下载下来,然后从其他网站上下载了一个比较旧的版本

 

设置环境变量

安装结果

       

PYTHON2.7

地址:https://www.python.org/downloads/release/python-2718/

安装结果

 

drozer工具安装及使用

        简介

drozer是一款针对Android系统的安全测试框架。

Drozer可以通过与Dalivik VM,其它应用程序的IPC端点以及底层操作系统的交互,避免正处于开发阶段,或者部署于的组织的android应用程序和设备暴露出不可接受的安全风险。

drozer提供了很多Android平台下的渗透测试exploit供你使用和分享。

对于远程漏洞,drozer能够生产shellcode帮助你部署drozer代理作为一个远程管理工具,最大化对设备的利用。

更快的Android安全评估drozer可以大大缩减Android安全评估的耗时,通过攻击测试暴露Android APP的漏洞。

基于真机的测试

drozer运行在Android模拟器和真实设备上,它不需要USB调试或其他开发即可使用。

自动化和扩展drozer有很多扩展模块,你可以找到他们进行测试以发现Android安全问题

安装过程

https://github.com/FSecureLABS/drozer/releases

   

将agent.apk 导入模拟器里

       

 

使用过程

使用drozer对app进行测试

官方直接指定的drozer支持命令及其命令说明列表如下

命令描述
run执行驱动模块
list显示可在当前会话中执行的所有drozer模块的列表。这将隐藏您没有适当权限运行的模块。
shell在代理进程的上下文中,在设备上启动交互式Linux Shell。
cd挂载特定的名称空间作为会话的根目录,以避免重复输入模块的全名。
clean删除drozer在Android设备上存储的临时文件。
contributors显示为系统中使用的drozer框架和模块做出贡献的人员列表。
echo将文本打印到控制台。
exit终止驱动程序会话。
help显示有关特定命令或模块的帮助。
load加载包含drozer命令的文件,并依次执行它们。
module从Internet查找并安装其他drozer模块。
permissions显示授予drozer代理的权限列表。
set将值存储在变量中,该变量将作为环境变量传递给drozer生成的任何Linux shell。
unset删除drozer传递给它产生的任何Linux shell的命名变量。

 

 

 

找到所要测试安卓应用程序的包名

通过app.package.list模块获取要检测的app的包名
dz> run app.package.list
com.android.providers.telephony (绉诲姩缃戠粶閰嶇疆)
com.android.providers.calendar (鏃ュ巻瀛樺偍)
com.android.providers.media (濯掍綋瀛樺偍)
com.android.wallpapercropper (com.android.wallpapercropper)
com.android.documentsui (鏂囨。)
com.android.externalstorage (澶栭儴瀛樺偍璁惧)
com.android.htmlviewer (HTML 鏌ョ湅绋嬪簭)
com.android.mms.service (MmsService)
com.android.providers.downloads (涓嬭浇绠$悊绋嬪簭)
com.android.browser (娴忚鍣?
[Errno 0] Error


使用app.package.info模块查看apk基本信息
dz> run app.package.info -a com.android.providers.downloads

Package: com.android.providers.downloads
  Application Label: 涓嬭浇绠$悊绋嬪簭
  Process Name: android.process.media
  Version: 5.1.1-500200917
  Data Directory: /data/data/com.android.providers.downloads
  APK Path: /system/priv-app/DownloadProvider/DownloadProvider.apk
  UID: 10004
  GID: [1028, 1015, 1023, 1024, 2001, 3003, 3007]
  Shared Libraries: null
  Shared User ID: android.media
  Uses Permissions:
  - android.permission.RECEIVE_BOOT_COMPLETED
  - android.permission.ACCESS_DOWNLOAD_MANAGER
  - android.permission.ACCESS_CACHE_FILESYSTEM
  - android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS
  - android.permission.ACCESS_NETWORK_STATE
  - android.permission.INTERNET
  - android.permission.WRITE_EXTERNAL_STORAGE
  - android.permission.ACCESS_ALL_DOWNLOADS
  - android.permission.UPDATE_DEVICE_STATS
  - android.permission.CONNECTIVITY_INTERNAL
  - android.permission.MODIFY_NETWORK_ACCOUNTING
  - android.permission.CLEAR_APP_CACHE
  - android.permission.WAKE_LOCK
  - android.permission.READ_EXTERNAL_STORAGE
  Defines Permissions:
  - android.permission.ACCESS_DOWNLOAD_MANAGER
  - android.permission.ACCESS_DOWNLOAD_MANAGER_ADVANCED
  - android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS
  - android.permission.DOWNLOAD_CACHE_NON_PURGEABLE
  - android.permission.DOWNLOAD_WITHOUT_NOTIFICATION
  - android.permission.ACCESS_ALL_DOWNLOADS

dz> run app.package.info -a /system/priv-app/DownloadProvider/DownloadProvider.apk
could not find the package: /system/priv-app/DownloadProvider/DownloadProvider.apk
dz> run app.package.info -a DownloadProvider.apk
could not find the package: DownloadProvider.apk
dz> run app.packag.list -f DownloadProvider.apk
unknown module: 'app.packag.list'
dz> run app.package.list -f DownloadProvider.apk
dz> run app.package.info -a com.android.providers.downloads
Package: com.android.providers.downloads
  Application Label: 涓嬭浇绠$悊绋嬪簭
  Process Name: android.process.media
  Version: 5.1.1-500200917
  Data Directory: /data/data/com.android.providers.downloads
  APK Path: /system/priv-app/DownloadProvider/DownloadProvider.apk
  UID: 10004
  GID: [1028, 1015, 1023, 1024, 2001, 3003, 3007]
  Shared Libraries: null
  Shared User ID: android.media
  Uses Permissions:
  - android.permission.RECEIVE_BOOT_COMPLETED
  - android.permission.ACCESS_DOWNLOAD_MANAGER
  - android.permission.ACCESS_CACHE_FILESYSTEM
  - android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS
  - android.permission.ACCESS_NETWORK_STATE
  - android.permission.INTERNET
  - android.permission.WRITE_EXTERNAL_STORAGE
  - android.permission.ACCESS_ALL_DOWNLOADS
  - android.permission.UPDATE_DEVICE_STATS
  - android.permission.CONNECTIVITY_INTERNAL
  - android.permission.MODIFY_NETWORK_ACCOUNTING
  - android.permission.CLEAR_APP_CACHE
  - android.permission.WAKE_LOCK
  - android.permission.READ_EXTERNAL_STORAGE
  Defines Permissions:
  - android.permission.ACCESS_DOWNLOAD_MANAGER
  - android.permission.ACCESS_DOWNLOAD_MANAGER_ADVANCED
  - android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS
  - android.permission.DOWNLOAD_CACHE_NON_PURGEABLE
  - android.permission.DOWNLOAD_WITHOUT_NOTIFICATION
  - android.permission.ACCESS_ALL_DOWNLOADS

使用app.package.attacksurface模块识别攻击面
所谓攻击面,应该就是指可export的安卓四大组件(activaty、broadcast receiver、content provider、service)

dz> run app.package.attacksurface com.android.providers.downloads
Attack Surface:
  0 activities exported
  0 broadcast receivers exported
  2 content providers exported
  1 services exported
    Shared UID (android.media)

使用app.activity.info模块查看activity组件信息
dz> run app.activity.info -a com.android.providers.downloads
Package: com.android.providers.downloads
  No matching activities.

使用app.provider.info模块查看content provider组件信息
dz> run app.provider.info -a com.android.providers.downloads
Package: com.android.providers.downloads
  Authority: downloads
    Read Permission: null
    Write Permission: null
    Content Provider: com.android.providers.downloads.DownloadProvider
    Multiprocess Allowed: False
    Grant Uri Permissions: True
    Uri Permission Patterns:
      Path: /all_downloads/
        Type: PATTERN_PREFIX
      Path: /my_downloads/
        Type: PATTERN_PREFIX
    Path Permissions:
      Path: /my_downloads
        Type: PATTERN_PREFIX
        Read Permission: android.permission.INTERNET
        Write Permission: android.permission.INTERNET
      Path: /all_downloads
        Type: PATTERN_PREFIX
        Read Permission: android.permission.ACCESS_ALL_DOWNLOADS
        Write Permission: android.permission.ACCESS_ALL_DOWNLOADS
      Path: /download
        Type: PATTERN_PREFIX
        Read Permission: android.permission.INTERNET
        Write Permission: android.permission.INTERNET
  Authority: com.android.providers.downloads.documents
    Read Permission: android.permission.MANAGE_DOCUMENTS
    Write Permission: android.permission.MANAGE_DOCUMENTS
    Content Provider: com.android.providers.downloads.DownloadStorageProvider
    Multiprocess Allowed: False
    Grant Uri Permissions: True

使用app.service.info模块查看service组件信息
dz> run app.service.info -a com.android.providers.downloads
Package: com.android.providers.downloads
  com.android.providers.downloads.DownloadIdleService
    Permission: android.permission.BIND_JOB_SERVICE

安装apk文件

源码地址:https://github.com/aloswoya/android_app

目的:方法为直接使用一个测试的APK对目标应用进行界面覆盖,观察目标应用是否进行了报警。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.uihijack"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.test.uihijack.MainActivity"
            android:exported="true"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

 

打包完成后,在测试apk开启的情况下,使用drozer来调用MainActivity:

run app.activity.start --component com.test.uihijack com.test.uihijack.MainActivity

效果图如下:

 

修复建议

测试到缺陷后,开发方需要对程序进行修复,修复方法也很简单,

就是也去判断当前应用程序是否位于栈顶 (是否显示在前面),

如果在后台了,就进行一些如toast提示、震动、通知弹窗等等,告诉用于当前应用已经在后台运行了。

 

通过在线工具进行测试
1.腾讯金刚审计系统
http://service.security.tencent.com

优点:包含了修复建议

2.阿里聚安全检测

网址: http://jaq.alibaba.com/ 
阿里聚安全下有自己的安全博客,包含一些:1.安全漏洞、2.病毒分析、3.技术研究、4.安全报告相关文档。

3.360捉虫猎手检测结果

网址: http://appscan.360.cn/ 
同样有自己的安全博客

4.爱加密

网址:http://safe.ijiami.cn/analyze
优点:在导出的报告中可以看到对当前apk的评分

5.百度MTC

网址: http://mtc.baidu.com/

 


HijackActivity-劫持工具

https://github.com/rohitshampur/droidsheep/blob/master/%20droidsheep/DroidSheep_public/src/de/trier/infsec/koch/droidsheep/activities/HijackActivity.java

或者查看https://blog.csdn.net/weixin_43650289/article/details/109105943

 


参考链接:

https://www.freebuf.com/sectool/249725.html

https://blog.csdn.net/JiaoMaGe/article/details/103023839?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-3-103023839.nonecase&utm_term=activity%20%E7%95%8C%E9%9D%A2%E5%8A%AB%E6%8C%81%E5%B7%A5%E5%85%B7&spm=1000.2123.3001.4430

https://www.52pojie.cn/thread-749955-1-1.html

https://blog.csdn.net/wizardforcel/article/details/54755814

https://blog.csdn.net/nancyfh/article/details/81196070

https://www.cnblogs.com/zhaoyixiang/p/11236458.html

http://www.mamicode.com/info-detail-2486333.html

https://www.jianshu.com/p/7c0a6da594c8

https://www.cnblogs.com/lsdb/p/9441813.html

https://blog.csdn.net/weixin_39190897/article/details/108802836

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

战神/calmness

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值