Citrix SD-WAN中心漏洞分析:认证绕过与远程代码执行链

本文详细分析了Citrix SD-WAN中心存在的多个安全漏洞,包括认证绕过和远程代码执行漏洞。通过利用CakePHP2框架的URL处理特性,攻击者可以绕过客户端证书验证,并结合路径遍历漏洞实现预认证远程代码执行。文章还提供了具体的漏洞利用脚本和修复建议。

SD-PWN第二部分:Citrix SD-WAN中心——又一次网络接管

众所周知,Citrix非常重视安全性。这是我们如何在Citrix SD-WAN平台中获得远程代码执行的故事。

公平地说,我们对Silver Peak和其他两家领先的网络公司也做了同样的事情,这些将在未来的文章中公布。我们发现的所有漏洞都允许完整的远程代码执行。这是否代表了SD-WAN整体安全性的问题?

如果您使用Citrix SD-WAN,请确保立即更新。这是一个重大漏洞,允许有人拦截流量或摧毁您的整个国际网络。

谁不喜欢蛋糕?

Citrix SD-WAN之前已被Tenable的Chris Lyne研究过。他提出了一个一直延伸到SD-WAN设备的RCE链。他的《Bug猎手的CakePHP入门》对我们帮助很大。

Citrix SD-WAN基础设施没有太大变化。它仍然运行在Apache上,使用CakePHP2作为框架。

安全审计最重要的部分之一是检查过去的工作,并验证过去的修复是否已正确实施。Tenable提出的主要漏洞是通过使用Collector端点访问诊断来绕过认证。Citrix决定通过在Apache配置(/etc/apache2/sites-enabled/talari)中添加以下访问限制来阻止此访问:

1
2
3
4
5
6
SSLCACertificateFile /home/talariuser/certificates/apnaware_cert.pem
...
<LocationMatch (?i)^/collector/>
    SSLVerifyClient require
    SSLVerifyDepth 0
</LocationMatch>

这看起来是合法的。要使用Collector端点,您必须提供由供应商签名的客户端证书。由于我们没有找到任何绕过此限制的方法,我们无法发送以/Collector/开头的请求。但CakePHP2框架如何处理URL?让我们看看CakeRequest.php中的_url函数:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
protected function _url() {
    if (!empty($_SERVER['PATH_INFO'])) {
        return $_SERVER['PATH_INFO'];
    } elseif (isset($_SERVER['REQUEST_URI']) && strpos($_SERVER['REQUEST_URI'], '://') === false) {
        $uri = $_SERVER['REQUEST_URI'];
    } elseif (isset($_SERVER['REQUEST_URI'])) {
        $qPosition = strpos($_SERVER['REQUEST_URI'], '?');
        if ($qPosition !== false && strpos($_SERVER['REQUEST_URI'], '://') > $qPosition) {
            $uri = $_SERVER['REQUEST_URI'];
        } else {
            $uri = substr($_SERVER['REQUEST_URI'], strlen(FULL_BASE_URL));
        }
    }
    ...
    return $uri;
}

简而言之,如果我们的REQUEST_URI在://之后包含?,URI的开头将被移除。这将导致Apache看待URI的方式与CakePHP分析它的方式之间存在差异,从而使我们能够绕过Collector端点的客户端证书检查。形式为aaaaaaaaaaaaaaaaa/://?/collector/diagnostics/stop_ping的URI将转换为/collector/diagnostics/stop_ping,并且既不需要客户端证书也不需要认证。

我们内部讨论过这究竟是Citrix的漏洞还是更广泛的CakePHP2漏洞。我们还没有得出结论,很想听听您的意见。

实际的CVE:

未认证路径遍历和Shell注入(stop_ping)— CVE-2020–8271

/collector/diagnostics/stop_ping端点读取文件"/tmp/pid_" . $req_id,并将其内容用于shell_exec调用。对用户提供的$req_id没有进行任何清理,这允许路径遍历。攻击者可以在任何地方放置一个用户控制内容的文件(例如,使用/collector/licensing/upload)并运行任意shell命令。

ConfigEditor认证绕过 — CVE-2020–8272

这是一个有趣的漏洞,与CakePHP如何将URI转换为端点函数参数有关。端点名称后的URI路径的每个元素都将被视为处理函数参数。如果我们有路由器定义:

1
2
Router::connect('/sdwan_center/nitro/v1/config_editor/:resource/*', 
    array('controller' => 'restApi', 'resource' => '[a-zA-Z]+', 'action' => 'configEditor'));

而我们的处理函数定义是:

1
public function configEditor($params, $auth = false, $internal = false)

$auth参数专门用于内部调用,不应从外部设置。但是,使用以下URI:

1
/sdwan_center/nitro/v1/config_editor/config_packages/test2=test2/test3/test4

将导致以下参数分配:

1
2
3
4
$resource = "config_packages"
$params = "test2=test2"
$auth = "test3"
$internal = "test4"

由于$auth参数现在被赋值,所有configEditor功能都可以在没有认证的情况下访问。

CreateAzureDeployment Shell注入 — CVE-2020–8273

在AzureDeployment/createAzureDeployment端点中,用户提供的数据被JSON编码并连接到exec调用中,使用以下代码:

1
2
3
$deploymentData = json_encode($this->request->data, JSON_UNESCAPED_SLASHES);
$cmd = "sudo python3 ".START_DEPLOY_SCRIPT." '".$deploymentData."' > /dev/null 2>&1 &";
$cmdResult = exec($cmd);

传递形式为{"loginData": "test';ping -c 5 192.168.1.1;'", "param": "1"}的参数将运行shell命令ping -c 5 192.168.1.1

RCE链

结合Collector认证绕过和stop_ping shell注入将导致预认证远程代码执行。以下是利用脚本:

RealmodeLabs/SD-PWN

结束语

我们在这篇文章中展示了Citrix SD-WAN中心中的两个认证绕过和两个shell注入漏洞。

为Citrix辩护,我们承认很难预料到CakePHP会以这种方式处理URL。这就是为什么对产品进行专门的安全审计如此重要。

如果您想在其他人之前了解下一个SD-PWN漏洞,请确保在LinkedIn上关注我们或通过contact@realmodelabs.com联系我们。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计