Hacking Team安卓浏览器攻击过程中的漏洞分析 Stage4

一、漏洞简介:

Hacking team今年爆出了针对android4.0.x-4.3.x android浏览器的漏洞攻击利用代码。该漏洞攻击代码,通过连续利用多个浏览器与内核漏洞,完成通过Javascript向虚拟内存写数据,执行代码,提升至root权限,并最终达到向目标手机中植入恶意程序的目的。

此攻击流程共分5个阶段,本人的之前的文章(Hacking Team安卓浏览器攻击过程中的漏洞分析 Stage0
Stage1Stage 2 Stage3),已对Stage0,Stage1,Stage2,Stage3进行了分析,本文主要分析最后一个阶段,Stage4的工作。

在上一篇文章最后,攻击者已经获得了向浏览器中写入任意代码并执行的权限(关闭了内存可执行保护)。本文将分析Stage4所进行的操作,攻击者通过Stage3中所使用的方法,泄漏出libc中的函数指针,并加载一个传入的动态链接库。通过此动态链接库,攻击者再向服务器端发送请求,并下载exploit和恶意apk。然后执行exploit获得root权限并以root权限安装恶意apk。

二、Stage4攻击过程:

0.概述:

Stage4的攻击过程主要分因为以下五步。

1.泄漏libc中的函数指针:

通过与Stage3相同的方法,攻击者获取了libc中的函数指针。

图1 libc中的函数指针

如图1所示,攻击者获取了libc中的system、fopen、fread、fgets、fwrite、fclose、getpid等函数,供后续操作使用。

2.获取当前进程名称和PID:

图2 获取当前进程名称和PID

如图2所示,攻击者通过读取/proc/self/cmdline文件中的内容,就可以获取本程序的程序名称,在通过调用getpid函数,就可以获取本程序的PID。获取当前进出那个名称的目的是找到“/data/data/进程名/”这个目录,用来存储动态链接库和其下载的exploit与恶意apk。

3.将下载的动态链接库写入物理存储设备:

图3 将下载的动态链接库写入物理存储设备

如图3所示,攻击者可以通过fopen、fwrite和fclose三个函数,将下载的动态链接库写入物理存储设备(此后的物理设备皆为“/data/data/进程名/”目录下)中。

4.加载并执行动态链接库:

图4 加载并执行动态链接库

如图4所示,在第一个红框中,攻击者查找此步中所需的libc中的函数指针;在第二个红框中,攻击者通过dlopen函数加载动态链接库,并通过dlsym函数导出动态链接库中的函数;在第三个红框中,攻击者向动态链接库中的函数传递参数并执行(此处的ip为服务器ip地址);在第四个红框中,攻击者删除掉存储在物理存储设备上的动态链接库文件。

图5 动态链接库的主要操作

如图5所示,动态链接库的主要功能分为两步。在第一个红框中,动态链接库将传入的参数存入全局变量中,并调用download_exec_exploit()函数,下载exploit与恶意apk,并通过exploit程序提升至root权限并安装恶意apk;在第二个红框中动态链接库在睡眠900秒后,将exploit和恶意apk删除。

图6 download_exec_exploit()函数的主要操作

如图6所示,在第一个红框中,download_exec_exploit()函数完成了对exploit和恶意apk的下载操作;在第二个红框中,download_exec_exploit()函数执行了exploit并将恶意apk作为参数传入其中,通过执行exploit达到了安装恶意apk的效果。

5.执行exploit并安装恶意apk:

(1)exploit的内核提权:

exploit的内核提权操作是通过CVE-2014-3153漏洞。该漏洞主要产生于内核的 Futex系统调用。Futex是快速用户空间mutex的意思,它是glibc中的互斥量实现的基础。由于Futex是用户空间的mutex,所以互斥量存储于用户空间中,可以被用户所修改,这就导致了用户可以通过修改互斥量的值,导致临界区的等待队列的异常。在特定情况下,临界区的等待队列会被存储到内核空间的线程栈中。所以,当攻击者在用户权限下通过Futex导致临界区的等待队列异常并精心设计线程栈的填充,就可以达到提权的目的,将线程提升至root权限,从而进行root权限的操作。(更详细的信息请自行查找有关CVE-2014-3153的文章,此处不再赘述。)

(2)exploit的恶意apk安装:

图7 恶意apk安装过程

如图7所示,exploit在提升至root权限后,会调用install_shell函数来安装恶意apk。在第一个红框中,函数将恶意apk写入到ROOT_BIN(此宏为/system/bin/ddf)文件中;在第二个红框中,函数赋予了ROOT_BIN可执行权限;在第三个红框中,函数执行createBootScript()函数,可将恶意apk设为开机启动。

图8 createBootScript()函数的主要操作

如图8所示,在createBootScript()函数中,函数会根据机器此时的不同状态,进行createRecoveryBootScript()操作或createDebuggerBootScript()操作。

图9 createRecoveryBootScript()函数的主要操作

如图9所示,当设备不在调试模式中时,程序会进入createRecoveryBootScript()函数,此函数的主要功能是判断是否存在INSTALL_REC_SCRIPT(/system/etc/install-recovery.sh)文件,如果不存在,创建此文件并写入一段脚本将目标程序设为daemon;如果存在,则将脚本添加到文件末尾处。即可完成开机自动启动恶意apk的功能。

图10 createDebuggerBootScript()函数的主要操作

如图10所示,当设备出于调试模式中时,程序会进入createDebuggerBootScript()函数时,函数会向INSTALL_SCRIPT(/system/bin/debuggerd)文件中写入一段启动目标程序的二进制指令。即可完成开机自动启动恶意apk的功能。

当程序完成恶意apk的安装与设置恶意apk的开机启动,此漏洞利用的过程基本分析完成。攻击者在之后就可以通过以root权限安装的恶意apk程序与被攻击的设备之间进行数据交互,完成所希望的恶意操作。

三、总结:

转载自:http://www.freebuf.com/vuls/84720.html    原文作者: MarcusAurelius