本文仅作学习记录,如有侵权,请联系删除!
前言:
日常学习打卡,我还有很多头发!
1.1 内存访问和修改:
通过对客户端内存的访问,木马将有可能会得到保存在内存中的敏感信息(如登录密码,帐号等)。测试客户端内存中是否存在的敏感信息(账号、明文密码等等)
测试步骤:
需要 root 权限,可以使用 MemSpector 查看、搜索和修改客户端内存数据,如图所示。
用户名、密码等数据通常会在/dev/ashmem/dalvik-heap 内存段。
目前大多数工具都是通过 ptrace 接口修改客户端内存,可以使用 ptrace 机制本身防护。
威胁等级:
当进行敏感操作后,在内存中可以搜索到用户输入的敏感信息时为高风险,否则无风险。
安全建议:
对于内存中的信息泄露,可以通过反注入、反调试来解决。
1.2 动态注入:
代码注入主要分为静态注入和动态注入两种
静态注入:针对的是可执行文件,通过修改文件内容实现代码注入,比如修改 smali 文件二次打包。
动态注入:针对进程,通过修改寄存器、内存值等实现代码注入。
相对于静态注入,进程注入不需要改动源文件,单需要最高权限,如 Android 的 root 权限才能够进行进程注入操作。
注入原理:
将目标进程作为我们进程的子进程操作目标进程的寄存器和内存来运行我们加载 .so 文件的代码将 .so 链接到目标进程,最后让目标进程的执行流程跳转到注入的代码执行
SO注入就是将代码拷贝到目标进程中,并结合函数重定向等其他技术,最终达到监控或改变目标进程行为的目的。Android是基于Linux内核的操作系统,而在Linux下SO注入基本是基于调试API函数ptrace实现的,同样Android的SO注入也是基于ptrace函数,要完成注入还需获取root权限,可通过 ptrace 挂载等方式控制客户端代码执行流程
如果 Android 客户端没有对进程进行有效的保护,攻击者就可以向从 Native 层面向客户端进程远程加载任意 .so 链接库,从而侵入客户端进程的进程空间,以搜索、篡改敏感内存或干涉客户端的执行过程。
通过注入动态链接库,hook 客户端某些关键函数,从而获取敏感信息或者改变程序执行
注入过程如下:
0x01 获取目标进程的pid,关联目标进程;
0x02 获取并保存目标进程寄存器值;
0x03 获取目标进程的dlopen,dlsym函数的绝对地址;
0x04 获取并保存目标进程的堆栈,设置dlopen函数的相关参数,将要注入的SO的绝对路径压栈;
0x05 调用dlopen函数;
0x06 调用dlsym函数,获取SO中要执行的函数地址;
0x07 调用要执行的函数;
0x08 恢复目标进程的堆栈,恢复目标进程寄存器值,解除关联,完成SO动态库注入;
检测 LD_PRELOAD 环境变量。使用 LD_PRELOAD 环境变量,可以让进程预先加载任意so,劫持函数。如图是劫持 ls 命令__libc_init()函数的效果。
使用工具动态注入应用进程内存:
项目地址:
https://github.com/crmulliner/ddi
https://github.com/crmulliner/adbi
Android NDK,修订版 10e(2015 年 5 月):
https://developer.android.google.cn/ndk/downloads/older_releases
PS:搭建相应的环境时最好根据对应工具的开发日期来决定环境的版本,所以说不要一股脑地下载最新版,否则就会像我一样,两个小时毫无进展
adb push libs/armeabi/hijack /data/local/tmp/
adb push libs/armeabi/libexample.so /data/local/tmp/
adb push libs/armeabi/libstrmon.so /data/local/tmp
adb shell
su
cd /data/local/tmp
>/data/local/tmp/strmon.log
>/data/local/tmp/adbi_example.log
chmod 777 /data/local/tmp/strmon.log
chmod 777 hijack
# GET PID from com.android.phone
./hijack -d -p PID -l /data/local/tmp/libexample.so
./hijack -d -p PID -l /data/local/tmp/libexample.so
cat adbi_example.log
cat strmon.log
本地随机对app测试的时候发现注入失败:
威胁等级:
当客户端存在动态注入隐患时高风险,否则无风险。
安全建议:
防止应用程序被 Hook
1.3 本地端口开放检测:
通常使用 PF_UNIX、PF_INET、PF_NETLINK 等不同 domain 的 socket 来进行本地 IPC 或者远程网络通信,这些暴露的 socket 代表了潜在的本地或远程攻击面,历史上也出现过不少利用 socket 进行拒绝服务、root 提权或者远程命令执行的案例。特别是 PF_INET 类型的网络 socket,可以通过网络与 Android 应用通信,其原本用于 linux 环境下开放网络服务,由于缺乏对网络调用者身份或者本地调用者 id、permission 等细粒度的安全检查机制,在实现不当的情况下,可以突破 Android 的沙箱限制,以被攻击应用的权限执行命令,通常出现比较严重的漏洞
busybox netstat -tuanp|grep -Ei 'listen|udp*'
emmmm,这里完全不懂,先作个记录把
1.4 外部动态加载 DEX 安全风险检测:
Android 系统提供了一种类加载器 DexClassLoader,其可以在运行时动态加载并解释执行包含在 JAR 或 APK 文件内的 DEX 文件。外部动态加载 DEX 文件的安全风险源于:Anroid4.1 之前的系统版本容许 Android 应用将动态加载的 DEX 文件存储在被其他应用任意读写的目录中(如sdcard),因此不能够保护应用免遭恶意代码的注入;所加载的 DEX 易被恶意应用所替换或者代码注入,如果没有对外部所加载的 DEX 文件做完整性校验,应用将会被恶意代码注入,从而执行的是恶意代码
测试步骤:
查 看 AndroidManifest.xml 包 package 值 相 对 应 路 径 下 的 文 件 中 是 否 含 有 DexClassLoader() 函数调用
风险位置:
public DexClassLoader(String dexPath,String optimizedDirectory, String libraryPath, ClassLoader parent)[2]
1.5 so 库函数接口检测:
检测 so 库中函数是否可被其他应用调用
测试步骤:
尝试使用其他程序调用 APP 的 so 库函数
参考如下:
Android安全(三)—so注入(inject)
Android 进程注入危害与测试
App安全检测指南-V1.0.pdf
Android APP渗透测试方法大全.pdf