android测试

0x01 参考

关于安卓的流量分析、逆向审计有关渗透测试

我记得之前断断续续看了一些,现在没什么影响了,为了扩大资产面,找到更多vuln,还是要看看

https://hanjideng.gitbooks.io/android/content/ch1.html

0x02 前言

  1. 安卓基于linux内核,所以adb shell进入时,它是支持大部分linux命令的

  2. apk只是一个归档文件,包含程序必须的文件和文件夹

  3. 用作命令的所有二进制文件都位于/system/bin/system /xbin;从 Play 商店或任何其他来源安装的应用程序数据将位于/data/data;原始安装文件在/data/app

  4. 如果是真实设备的话,访问 /data/data时,需要Root且处于su模式;手机被root后权限很大。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #这是进了模拟器的shell
    ASUS_I003DD:/data/data # whoami
    root
    ASUS_I003DD:/data/data # ls
    android com.android.providers.calendar
    android.ext.services com.android.providers.contacts
    android.ext.shared com.android.providers.downloads
    com.android.backupconfirm com.android.providers.downloads.ui
    com.android.bips com.android.providers.media
    com.android.bluetoothmidiservice
  5. 安卓的每个应用程序都在自己的 Dalvik 虚拟机实例中运行,所以当其中一个应用崩溃时,不影响其它程序

  6. 安装时的权限列表,比如通讯录,截图,后台等这些权限,在android开发时必须在AndroidManifest.xml指定,否则使用某项权限时会崩溃退出

  7. 应用签名。苹果一般都很严格,所有应用需要经过Applie的证书签名,看起来更安全;但安卓是开发者自创建证书签名的,签名校验如下

    1
    2
    jarsigner -verify -certs -verbose /system/priv-app/CalendarProvider/CalendarProvider.apk
    #pc上没找到有签名的apk

    这样可以获得签署人的信息

  8. android启动流程嘛,我总结不出来

0x03 环境+工具

java+(书上是eclipse),我直接找现成的模拟器用了

但是我前面连到**模拟器了,试试命令

1
2
3
4
adb shell pm list packages #获取已安装软件包
dumpsys meminfo #获取所有应用程序及其当前内存占用的列表
adb logcat -d -f /data/local/logcats.log #读取 Android 设备事件日志的工具并保存到特定文件
df #检查文件系统及可用大小

工具

burpsuite:拦截用的

APKtool:逆向用的 https://apktool.org/

配合 dex2jar(字节码转换为jar可读文件)、jd-gui(查看jar包文件)

应用结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Classes.dex (文件)
AndroidManifest.xml (文件)
META-INF (文件夹)
resources.arsc (文件)
res (文件夹)
assets (文件夹)
lib (文件夹)

组件:
活动(Activity):用户交互的可视界面
服务(Service):开发编写的特定任务
广播接收器(Broadcast Receiver):通过 Android 系统或设备中存在的其他应用程序,监听传入的广播消息
共享首选项(Shared Preference):应用程序使用这些首选项,以便为应用程序保存小型数据集
意图(Intent):用于将两个或多个不同的 Android 组件绑定在一起
内容供应器(Content Provider):用于访问应用程序使用的结构化数据集

在linux环境中使用 unzip -l test.apk可不解压预览文件架构

0x04 逆向方法

方法一:

1
2
d2j-dex2jar.bat "test.apk" #将apk转化为jar文件
再用jd-gui打开即可

方法二:

使用APKtool将.dex文件转换为 smali 文件。

windows下有一个VTS,它提供漂亮的图像界面

它的优点在于可以将反编译后的文件再转化为apk文件

1
2
apktool d [app-name].apk #反编译
apktool b [decompiled folder name] [target-app-name].apk #重构apk

0x05 审计

a.内容供应器泄露

1
2
所有内容供应器具有唯一的统一资源标识符(URI)以便被识别和查询。 内容提供者的 URI 的命名标准惯例是以content://开始
在代码里是<provider>这种
1
java -jar apktool_2.9.3.jar d test.apk

反编译后,找到导出来的AndroidManifest.xml,或者在linux环境下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
grep –R 'content://' # -R 在每个子文件夹和文件中查找

...
smali_classes3/com/tencent/mm/opensdk/openapi/BaseWXApiImplV10.smali: const-string p1, "content://com.tencent.mm.sdk.comm.provider/createChatroom"
smali_classes3/com/tencent/mm/opensdk/openapi/BaseWXApiImplV10.smali: const-string p1, "content://com.tencent.mm.sdk.comm.provider/genTokenForOpenSdk"
smali_classes3/com/tencent/mm/opensdk/openapi/BaseWXApiImplV10.smali: const-string p1, "content://com.tencent.mm.sdk.comm.provider/joinChatroom"
smali_classes3/com/tencent/mm/opensdk/openapi/BaseWXApiImplV10.smali: const-string p1, "content://com.tencent.mm.sdk.comm.provider/addCardToWX"
...

#之后可以用
adb shell content query --uri content://com.tencent.mm.sdk.comm.provider/joinChatroom

#报错了
...
Error while accessing provider:com.tencent.mm.sdk.comm.provider
java.lang.IllegalStateException: Could not find provider: com.tencent.mm.sdk.comm.provider

这里有一个自动工具叫 Drozer,能查询和显示来自内容供应器的数据

防御措施:

在创建内容供应器时指定参数android:exported = false,或者创建一些新的权限,另一个应用程序在访问供应器之前必须请求它

b.不安全的文件存储

起因:存储了敏感数据的文件全局可读,权限问题

1
2
3
4
5
6
ASUS_I003DD:/data/data/com.android.providers.calendar # ls -l
total 16
drwxrws--x 2 u0_a6 u0_a6_cache 4096 2024-07-12 08:31 cache
drwxrws--x 2 u0_a6 u0_a6_cache 4096 2024-07-12 08:31 code_cache
drwxrwx--x 2 u0_a6 u0_a6 4096 2024-07-12 08:32 databases
drwxrwx--x 2 u0_a6 u0_a6 4096 2024-07-18 08:38 shared_prefs

防御:

指定正确的文件权限,以及一起计算密码与盐的散列来避免此漏洞

其它漏洞

主要是没有漏洞app,无法很好实操一下,比如目录遍历、SQL注入,无所谓,有web的owasp top10基础很好懂

0x06 抓包

1.被动分析:用tcpdump运行捕获所有网络数据包,保存后,再用wireshark去分析

adb shell也可以直接完成:

1
adb shell /data/local/tmp/tcpdump -i any -p -s 0 -w /mnt/sdcard/output.pcap

2.主动分析:bp随时拦截呗

代理的话,去模拟器的wifi那里设置代理为本地局域网ip,或者adb shell命令行,貌似还要导入证书,网上有教程,就不赘述了

https://yaklang.com/Yaklab/WeChatAppEx/ 这里有一个yakit的证书安装方式

我在设置里没找到安全选项,通过搜索,去wlan的偏好设置可以安装证书

好像也没用,啧

后来发现是yakit的监听ip设置为本机局域网ip即可,确实如此

总结

那么综上所述,只用关注两点,一是反编译,二是抓包,没了。

小程序

补充一个小程序中请求包数据和响应包数据均加密的情况

首先呢,反编译,完了之后找里面的js文件搜索关键字,比如aes.encrypt

AES加密

这种ECB模式不需要vi,所以只需要关注key,这里的e是要加密的明文,而o[i]是key了

看了会儿代码,我不好找这个key啊,还是得去调试,所以用 微信开发者工具打开一下,编译运行起来,缺少app.json文件,emmm,没关系

好吧,分析不了,因为我这里反编译出来的js,只有app-service.js的,其它比如app.js、aes.js都没有,难搞,这个放弃吧,可能是大神开发的,做了防御措施的

来到了web端,里面有个aestool.js,可以通过打断点,浏览器中跟踪,但这个是自定义的加解密函数了,可以跟踪找到,这个域名看了下备案,不是目标点了,就不搞了

最后是在gpt的帮助下,利用反编译的app-service.js中完成了找key的构造,结合在线AES加解密网址顺利得到的

参考

http://t.csdnimg.cn/cEbme

http://t.csdnimg.cn/kTnmK

https://www.cnblogs.com/fuchangjiang/p/17894618.html

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2023-2025 是羽泪云诶
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信