欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CVE-2019-0708漏洞分析

程序员文章站 2022-04-28 14:15:22
...

CVE-2019-0708漏洞分析

注:仅供学习用途,利用于非法行为者与本文作者无关

第一章 CVE-2019-0708漏洞说明

§1.1 漏洞概述

2019年5月14日,微软发布了针对远程桌面服务的关键远程执行代码漏洞CVE-2019-0708的补丁,该漏洞影响某些旧版本的windows。攻击者一旦成功触发该漏洞,便可以在目标系统上执行任意代码,该漏洞的触发无需任何用户交互操作。这意味着,存在漏洞的计算机只要联网,无需任何操作,就可能遭遇黑客远程攻击,运行恶意代码。其方式与2017年的 WannaCry恶意软件的传播方式类似.成功利用此漏洞的攻击者可以在目标系统完成安装应用程序,查看、更改或删除数据,创建完全访问权限的新账户等操作。

§1.2 影响范围

该漏洞影响旧版本的Windows系统,包括:
Windows 7 、 Windows Server 2008 R2 、 Windows Server 2008 、Windows 2003 、 Windows XP。
Windows 8 和 Windows 10及之后版本不受此漏洞影响。

§1.3 影响方式

CVE-2019-0708漏洞利用方式是通过远程桌面端口3389,RDP协议进行攻击。该漏洞是通过检查用户的身份认证,导致可以绕过认证,不用任何的交互,直接通过rdp协议进行连接发送恶意代码执行命令到服务器中去。如果被攻击者利用,会导致服务器入侵,中病毒,像WannaCry 永恒之蓝漏洞一样大规模的感染。
若要利用此漏洞,攻击者需要通过 RDP 向目标系统远程桌面服务发送经特殊设计的请求。

§1.4 漏洞评级

CVE-2019-0708:高危。

第二章 漏洞攻击复现

§2.1 所用工具及平台
1、环境设置
攻击机:Kali Linux (ip:192.168.1.109)
靶机:Windows 7 旗舰版 (ip:192.168.1.106)
利用工具:MSF框架,VMware 15.5
POC:https://github.com/n1xbyte/CVE-2019-0708
2、靶机环境配置
首先我们需要安装Windows 7系统,这里我选择使用VMware 15.5来搭建靶机。
(1)开启3389端口,允许远程桌面连接,同时修改高级共享设置,开启公用文件夹共享。
CVE-2019-0708漏洞分析
CVE-2019-0708漏洞分析
CVE-2019-0708漏洞分析
§2.2 攻击步骤

1、更新应用、和MSF框架。
CVE-2019-0708漏洞分析
CVE-2019-0708漏洞分析
2、确认被攻击机是否开启3389端口
nmap 192.168.1.106
CVE-2019-0708漏洞分析
由红圈部分可以发现存在可以利用端口。

3、在确认开启了3389端口后执行msf框架进行漏洞扫描
(1)使用msfconsole进入metasploit-framework
CVE-2019-0708漏洞分析
(2)进入后使用reload_all重新加载所有模块
CVE-2019-0708漏洞分析
(3)输入search 0708寻找可利用的工具,可以找到如下工具进行探测
CVE-2019-0708漏洞分析
(4)输入 use auxiliary/scanner/rdp/cve_2019_0708_bluekeep启用0708RDP攻击模块
使用 show options 查看相关信息和设置。
CVE-2019-0708漏洞分析
(5)设置参数并进行探测
设置rhost为目标主机IP 192.168.1.106
可以发现存在可利用漏洞(虽然无法验证)
CVE-2019-0708漏洞分析
(6)输入exit退出工具,返回命令行
4、开始攻击
(1)kali内默认没有pip3,先安装pip3,再安装impacket库(虽然不知道为何我的kali默认附带了pip3)
输入apt-git python3-pip安装pip3
CVE-2019-0708漏洞分析
输入pip3 install impacket 安装impacket库
CVE-2019-0708漏洞分析
(2)下载POC
从github下载开源代码,然后进入CVE-2019-0708目录
CVE-2019-0708漏洞分析
(3)进行攻击
CVE-2019-0708漏洞分析
5、攻击结果
我们可以再靶机上看到已经蓝屏,攻击成功。
CVE-2019-0708漏洞分析
第三章 漏洞分析

§3.1 整体分析

在查阅相关资料后发现,其发生错误的部分在termdd.sys,属于UAF堆溢出,利用double free来获取shell。接下来的具体分析步骤就是按照资料上的流程进行。

§3.2 具体分析步骤

反编译termdd.sys查看其源码,分析crash的问题。将本次蓝屏的crash信息dump下来,并用windbg做analyze查看具体出错的部分。
CVE-2019-0708漏洞分析
可以看到是termdd!_IcaFreeChannel调用nt!ExDeleteResourceLite发生崩溃。
在free的时候崩溃,那么很有可能就是double free了。在IcaRebindVirtualChannels和IcaBindVirtualChannels中我们都可以看到IcaFindChannelByName函数,我们看看这个函数:
CVE-2019-0708漏洞分析
通过这一行,可以发现free的地址是8a998878
接下来查看channel name发现是MS_T120
CVE-2019-0708漏洞分析
进一步发现有一个IcaCreateChannel函数,很可能是用于创建Channel,申请内存的函数,跟进去又发现一个IcaAllocateChannel。
CVE-2019-0708漏洞分析
可以看到有一个IcaCreateChannel函数,很可能是用于创建Channel,申请内存的函数,跟进去又发现一个IcaAllocateChannel。
CVE-2019-0708漏洞分析
之后下两个记录断点,可以查看ExAllocatePoolWithTag的返回值,和_IcaFreeChannel的参数。然后再次执行poc发送payload
CVE-2019-0708漏洞分析
能够发现针对0x88f6e1a8执行了两次free,能够判断是一个标准的UAF漏洞,以上面为基础,再下一个断点,看看是否同一个channel绑定了两个ID
CVE-2019-0708漏洞分析
首先来确定0x88fd5738这个地址是不是MS_T120
CVE-2019-0708漏洞分析
CVE-2019-0708漏洞分析
再看看termdd!_IcaBindChannel的栈,针对的都是88fd5738这个地址,但是我们看到第3个参数第一次是0x1f,而第二次是3,就说明channel绑定了两个ID,导致存在两个引用,所以修复的时候就强制指定为0x1f,不管绑定多少次,ID都会是1f。
由于是doublefree,其实就是一个uaf利用思路,我们再第二次free的时候向上回溯。
CVE-2019-0708漏洞分析
发现IcaChannelInputInternal有虚函数调用,可以从这里劫持控制流。
CVE-2019-0708漏洞分析
要控制channel的数据,必须得再其第一次free了之后占位,我们申请同样大小的内存,我们看看申请的大小是0xc8。
CVE-2019-0708漏洞分析
所以只要控制channel内存的0xc8偏移,劫持v12虚函数指针。 目前大部分的exp都是做内核堆喷射,但是win7在这个地址上面是没有DEP的,所以直接喷内核shellcode就可以了,而且win7的Non-paged Pool的起始地址固定,容易命中。执行exp后查看堆喷射的shellcode。
CVE-2019-0708漏洞分析
第四章 安全建议

§4.1 应对办法

1、在受影响版本的系统上启用网络级身份验证(NLA);启用NLA后,攻击者需要使用目标系统上的有效账户对远程桌面服务进行身份验证,才能成功利用该漏洞。
2、关闭3389端口或添加相应防火墙安全策略限制对3389端口的访问
3、升级操作系统至Windows 8及其以上版本。对于这些版本的Windows系统并不存在CVE-2019-0708漏洞。
4、通过微软官网发布的漏洞补丁进行修复。
oWindows 7、Windows Server 2008和Windows Server 2008 R2:及时安装官方安全补丁。
oWindows 2003及Windows XP:及时更新系统版本或安装官方补丁。
5、安装正规公司的云防火墙,国内大部分安全厂商都针对该漏洞进行了更新。