移动应用程序渗透

移动应用程序渗透

Android系统架构与运行机制

1.应用层(System Apps)
用户接触的,应用软件方面的

2.应用架构层(Application Framework, API)
系统开发的,API方面的
例如有以下的这些管理器:
活动管理
位置管理器
包管理器
通知管理器
资源管理器…

3.系统运行库层(Native)
分为两部分,分别是C/C++程序库和Android运行时(Runtime)库

4.硬件抽象层(HAL)
~位于操作系统内核与硬件电器之间的接口层,其目的在于将硬件抽象化

5.Linux内核层(Linux Kernel)

Android运行机制

  1. 简化版:init启动 —— Zygnote进程启动—— Systemserver进程启动

  2. Init启动
    总:电源键——系统启动——bootlooder——Linux内核——init进程启动

– 在启动init进程中,会进入system/core/init/init.cpp文件的main方法中
– 创建和挂载目录
– 初始化和启动属性服务(键对值)
Linux内核——盘古,开天地,产生女娲(Zygote)

  1. Zygote进程启动(被称为孵化器,一切的开始)
    总:app_main——AndroidRuntime——Zygoteinit

– socket
– 加载了一些类
– 启动systemserver类
Zygote——女娲,造出亚当(SystemServer)

  1. SystemServer进程启动

– frameworks/base/core/java/com/android/intermal/os/Zygote,.java
– frameworks/base/core/java/com/android/intermal/os/RuntimeInit.java
– frameworks/base/core/java/com/android/server/SystemServer.java 这个是各种进程的父类
SystemServer——亚当,用肋骨造夏娃(其他进程)

Android应用渗透测试与调试

工具使用

  1. Android Debug Bridge(ADB,要添加到系统环境变量)
adb kille-server
adb start-server
adb root
# push 把文件从电脑推送到Android上
adb push
# pull 把文件从Android下载到电脑上
adb pull
adb connect
adb shell
adb install -t
# 查看日志
adb logcat
# 应用截屏
adb exec-out screencap -p > sc.png
  1. Apktool(Smali语言,打包,解包)
  2. Frida(可以把自己的脚本注入到应用程序的运行进程中)
  3. Jadx(一件反编译,反编译为Java代码;可以在GitHub上下载)
  4. Android Studio(如何写Xpose插件;logcat,找flag)
  5. Android Killer

文件格式

  1. Lib——程序依赖的native库
    一般会有三类:

– arm
– arm-v7a
– x86
根据不同的虚拟机版本,下载Xpose框架(酷安;官网),注意不同的框架是使用不同的汇编等方式的

  1. META-INF目录——存放应用程序签名和证书的目录
  2. Res目录——存放应用程序的资源
  3. AndroidMainfest.xml——应用程序的配置文件
    相当于书本的目录,上面有很多的信息
  4. Classes.dex——Dex可执行文件
  5. Resource.arsc——资源配置文件

Android应用渗透测试——客户端数据安全

安装包签名校验

如何校验

$ jarsigner -verify APK_PATH

主要提供完整性integrity的保护

$ jarsigner -verify -verbose -certs APK_PATH

使用Google提供的开发者签名进行重签名。
要读懂Java代码,Smali代码。

客户端程序保护

反编译为Java代码

使用jadx,Androidkiller(综合使用前两者,但不能同时打开同一个文件),jeb等工具进行反编译

反编译为smali代码

$ apktool d APK_PATH
$ apktool b Uncompressed_APK_PATH

如何阅读smali代码

对比Java学习

smali类型

smali对象

smali

# smali注释
.method 表示方法开始
.local 1 表示locals的寄存器数量
.line 8 表示对于的Java代码行数
invoke-XXX 表示各种方法
invoke-super(p0,p1) p0,p1表示寄存器


图:smali代码阅读示例

应用完整性校验

aoktool d APK_PATH

注意res/文件夹

Android应用渗透测试——组件安全

判断组件的可导出性

  1. 根据AndroidMainfest.xml,判断以下组件是否可以导出

使用Drozer对四大组件进行组件攻击

工具:drozer

根据PPT中的代码进行实验测试。
https://blog.csdn.net/jianglianye21/article/details/80667346

Activity

# 使用工具drozer,自动会进行DoS攻击
$ run app.activity.info -a packagename

Service

$ run app.service.info -a packagename

Broadcast Reciever(广播接收器)

e.g. 电池电量低的提示

$ run app.broadcast.info -a packagename

Content Provider

可能存在目录遍历漏洞,SQL注入漏洞

$ run app.provider.info -a packagename
# 检测SQL注入(SQLite)
$ run scanner.provider.injection -a com.mwr.example.sieve
# 检测目录遍历
$ run scanner.provider.traversal -a com.mwr.example.sieve

原理和4种拒绝服务攻击

intent本身可以在不同组件间调用

*概念补充——intent:

​ intent是Android组件之间进行交互的重要方式,主要有两大功能:

​ (1)指明当前组件先要执行的操作。比如在Activity之间穿梭。

​ (2)在不同组件之间传递数据。 比如将Activity中的数据发送到Broadcast Reveiver。

  1. intent本地DoS攻击检测
    getIntent()
    Intent.getXXXExtra()

  2. 4种拒绝服务攻击的类型

  • NullPointerException异常导致的拒绝服务
  • ClassCastException异常导致的拒绝服务
  • ClassNotFoundException异常导致的拒绝服务
  • IndexOutOfBoundsException异常导致的拒绝服务

扩展

扩:学习smali代码时,可以结合实例直接阅读学习,不建议从头开始学

扩:渗透测试的主要方向:

1.通过研读本地应用程序(黑/白盒测试)

2.通过网络抓包进行分析

扩:找到能导出的各个组件,一一确认其安全性

Android应用渗透测试——WebView

如何检测和判断[TODO ]

WebView 任意代码执行

漏洞点:addJavaScriptInterface()

WebView 密码明文存储


使用方法:Sqlite databases broswer,可以把密码明文可视化显示

WebView 域控制不严格

域校验不严格,跨过同源策略进行跨域访问
setAllowFileAccess
setAllowFileAccessFromFileURLs
setAllowUniversalAccessFromFileURL

Android应用渗透测试——敏感信息安全

CTF中可能比较重要的出题点

检查配置文件

CTF的重点检查内容
1. 检查客户端程序存储在手机中的 SharedPreferences 配置文件
2. 检查客户端程序存储在手机中的 SQLite 数据库文件
3. 检查客户端程序存储在手机中的 SharedPreferences 配置文件,在检测 SQLite 数据库文件,在私有目录及其子目录下查找以.db 结尾的数据库文件。
通常是对本目录(data/data/packagename)下的文件内容 (一般是 xml)进行检查,看是否包含敏感信息。

检查客户端程序包(APK)中是否保存有敏感信息

  1. 证书文件
  2. 逻辑js文件
  3. 图片文件
  4. 其他文件(把文件存储到SD卡,或者不是同一个package下)
  5. logcat日志(AS上使用,并且安装Xinstaller)

Android应用渗透测试——进程安全

内存访问和修改

安装插件Memspector [TODO]

通过对客户端内存的访问,有可能会得到保存在内存中的敏感信 息(如登录密码,帐号等)。测试客户端内存中是否存在的敏感信息(卡号、明文密码等等)。

本地端口开放检测

e.g. socket的一些管理缺陷,查找端口,连接端口,获取验证码信息

外部动态加载DEX安全风险

  1. 风险位置:
    public DexClassLoader(String dexPath,String optimizedDirectory, String libraryPath, ClassLoader parent)

  2. 查看 AndroidManifest.xml 包 package 值相对应路径下的文件中是否含有DexClassLoader()函数调用

Android应用渗透测试——通信安全

抓包

  1. http协议
  2. https协议
  3. 校验不严格
  4. 双向校验
  5. 其他协议

应用程序可能会有设置,防止被抓包

http协议

比较常规的,Android设置代理,BP抓包

参考教程:链接

https

抓https包需要设置证书,Android7.0以上需要把证书安装在系统上,7.0以下 [TODO]

参考链接

证书未校验

证书部分校验

https双向校验

  1. 单向认证
  2. 双向认证
    增加了服务端认证客户端的过程,添加第4步

  3. 步骤

– 找到证书导入到burp
– 寻找包里的证书库文件(敏感信息泄漏)
– 尝试证书转换


  • 找到证书库文件
  • 找到证书库密码
  • 把密码导入(尝试证书转换)

扩展-1

扩:漏洞,不是攻击点,通常都是攻击链
扩:使用Everything工具,添加到右键,方便搜索文件(Windows)
扩:证书管理工具Portecle
扩:使用所有手段都没有抓到包,该怎么办?[TODO,老师私货,重要]
使用aptables进行流量转发

iptables -t nat -A OUTPUT -p tcp -dport 目标端口 -j DANT --to burpip和端口

移动应用数据包常见加密形式

明文数据包

e.g. 参数 info整个不加密

参数值加密

e.g. 参数 info后面的值加密

POST BODY加密

e.g. post的所有数据都加密

参数序列化

Response加密

定位关键代码

静态分析

重点是:定位关键字

  1. 关键字——搜索参数[key]
    [key]:需要关注的参数
    使用双引号, “&”, “=”等字符,辅助定位

  2. 关键字——搜索接口
    以接口作为关键字全局搜索 目录、接口、双引号辅助搜索

  3. 关键字——搜索header
    用header中各种标志性的字符做关键字 全局搜索
    HOST、标志性的head字符
    e.g. okhttp/3.8.0

  4. 关键字——搜索加密算法
    AES、RSA、DES、SM(国密,2020年刚开始实行)等常见加密算法做为关键字,用双引号、/等符号辅助,精确定位

  5. 关键字——从日志中获取关键字
    Logcat中获取现成的关键字,传输的信息可能加密,但日志信息(开发时方便调试所开启的)没有加密。

  6. Javascript加密

扩展-2

  1. 使用Xpose插件:Inspeckage,直接在Xpose软件里下载

Android应用渗透测试——业务安全

  1. 二维码不校验
  2. url跳转
  3. 任意文件读取

不具体展开,和Web业务安全同样的。

如何找客户端漏洞?

都在上述的知识点中

Android应用渗透测试——应用调试

调试Smali

参考教程:

https://blog.csdn.net/hebbely/article/details/79087199

https://www.jianshu.com/p/9843e80f5ac5

调试native

  1. 找到native方法

  2. 找到.so文件

  3. IDA Pro 打开
    发现export处[TODO]

中文乱码设置:
alt + a,然后进行如下设置

  1. 使用IDA Pro进行分析

  2. push android_x86_server 到 data/local/tmp

分析点

在输入的参数(比如用户名、密码)处下断点,通过查看运行时信息(终端显示的),分析其加密方式。不仅如此,证书校验等都可以使用这个动态调试的方法。

移动应用程序渗透测试框架使用

Xposed框架

安装及配置

[TODO]

Xposed运行原理[TODO]

  1. Dalvik虚拟机在执行java层代码时如何识别JNI方法?

– 类型标识(accessFlags)

– 过程

  1. 怎样才能将java层普通方法注册成JNI方法?
  2. Xposed框架做了什么?

如何写一个Xposed插件[TODO]

  1. 打开AS在项目app目录下新建lib目录并将XposedBridgeApi-54.jar放到lib目录下 右键Add As Library将 jar包添加进依赖。

  2. 打开app目录下的build.gradle 将
    compile files(‘lib/XposedBridgeApi-54.jar’)
    更改为
    compileOnly files(‘lib/XposedBridgeApi-54.jar’)

  3. 打开项目分支src/main目录下的AndroidManifest.xml 在application标签里面添加内容

  4. 新建Hook入口类HookMain 实 现 xposed的接的IXposedHookLoadPackage 并重写方法 handleLoadPackage ,这个写法格式是固定的。

  5. 在src/main/assets下新建文件xposed_init并将HookMain类并将hook的主入口类以包名+类名的格式写进去。
    com.example.myapplication.HookMain

Frida框架[TODO]

Frida是一个动态代码执行工具包。
通过Frida你可以把一段JavaScript注入到一个进程中去,或者把一个动态库加载到另一个进程中去,并且 Frida 是跨平台的,也就是说,你可以对Windows, macOS, GNU/Linux, iOS, Android以及QNX系统上的进程进行上述操作。

Frida实验1——破解登入密码

Frida实验2——解密

扩展-1

注意:安装Frida时,一定要安装Frida tools

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据