前言
Palo Alto Networks PAN-OS 是美国 Palo Alto Networks 公司为其防火墙设备开发的操作系统,而 GlobalProtect 是一套网络防护软件,以提供防火墙监控及威胁预防等功能。PAN-OS 版本众多,在许多版本中, GlobalProtect portal 或 GlobalProtect gateway interfaces 都存在历史漏洞如 CVE-2020-2021(认证绕过漏洞)、CVE-2020-2034(操作系统命令注入漏洞)和CVE-2021-3064(远程代码执行漏洞),漏洞影响的版本如下:
CVE编号 | 影响版本 |
---|---|
CVE-2020-2021 | PAN-OS 9.1.* <9.1.3 PAN-OS 9.0.* <9.0.9 PAN-OS 8.1.* <8.1.15 PAN-OS 8.0.* |
CVE-2020-2034 | PAN-OS 9.1.* <9.1.3 PAN-OS 8.1.* <8.1.15 PAN-OS 9.0.* <9.0.9 PAN-OS 8.0.* PAN-OS 7.1.* |
CVE-2021-3064 | PAN-OS 8.1.*<8.1.17 |
因此,通过检测 GlobalProtect 门户的 PAN-OS 版本以确定目标是否存在漏洞变得尤为关键。但由于 GlobalProtect 门户没有明确显示其底层软件版本,因此单从外部角度来看,很难判断PAN-OS版本。本文描述 GlobalProtect 门户的 PAN-OS 版本检测方法,并编写自动化脚本实现版本检测。
检测原理
通过curl
指令向 GlobalProtect 门户发送 http 请求,发现在Response Headers中存在ETag
或Last-Modified
字段,如下:
$ curl -skI https://example.com/global-protect/login.esp
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
ETag: "6ed55e85022f"
检查ETag
的最后8个字符,我们得到了十六进制纪元时间5e85022f
,以十进制格式表示为1585775151
。接着将这个纪元时间转换为人类可读的格式:
$ date -d @1585775151
Thu 02 Apr 2020 05:05:51 CST
得到的日期便是 PAN-OS 相应版本的发布日期(或修订日期),PAN-OS 相应版本发布日期如下图所示。详细发布日期如
version-table.txt
所示。
7.0.1 Jul 3 2015
7.0.2 Aug 21 2015
7.0.3 Oct 8 2015
7.0.4 Dec 12 2015
7.0.5 Jan 30 2016
8.1.10 Aug 22 2019
8.1.11 Oct 13 2019
8.1.12 Dec 11 2019
8.1.14 Apr 2 2020
9.0.3 Jul 10 2019
9.1.1 Jan 24 2020
9.1.2 Mar 30 2020
9.1.2-h1 Apr 9 2020
9.1.3 Jun 20 2020
9.1.3-h1 Jun 26 2020
...
通过查找,我们发现该 PAN-OS 版本为8.1.14
,因此容易受到认证绕过漏洞CVE-2020-2021和远程代码执行漏洞CVE-2021-3064的攻击,因此应该进行修补。通过此方法,将得到的ETag
值与特定的 PAN-OS 版本进行了关联,从而可以判断目标是否存在被攻击的风险,从这个角度讲,此方法可以为得到全网中 GlobalProtect 的资产信息提供服务。
代码实现
-
加载 version-table.txt
文件,为后续 PAN-OS 版本检测做准备;
def load_version_table(version_table: str) -> dict:
with open(version_table, "r") as f:
entries = [line.strip().split() for line in f.readlines()]
return {
e[0]: datetime.datetime.strptime(" ".join(e[1:]), "%b %d %Y").date()
for e in entries
}
-
发送http请求得到 ETag
,再调用get_matches
函数进行匹配;
def check_date(version_table: dict, date: datetime.date) -> list:
matches = []
for n in [0, 1, -1, 2, -2]:
nearby_date = date + datetime.timedelta(n)
versions = [
version for version, date in version_table.items() if date == nearby_date
]
if not len(versions):
continue
# 当n == 0 时为精准匹配, n !== 0 时为模糊匹配
precision = "exact" if n == 0 else "approximate"
append = True
for match in matches:
if match["precision"] == precision:
append = False
if append:
matches.append(
{
"date": nearby_date,
"versions": versions,
"precision": precision
}
)
return matches
def get_matches(date_headers: dict, resp_headers: dict, version_table: dict) -> list:
matches = []
for header in date_headers.keys():
if header in resp_headers:
date = globals()[date_headers[header]](resp_headers[header])
matches.extend(check_date(version_table, date))
return matches
-
使用Pocsuite3架构编写脚本,运行结果如下:
全网测绘结果
-
quake搜索语法
app: "PaloAlto-GlobalProtect"
-
测绘结果显示,全网中使用 GlobalProtect 的独立 IP 有 116898 个,涉及服务有 1854078 条 -
在全球数据统计中,使用 GlobalProtect 最多的五个国家分别是美国(693523)、中国(119222)、德国(66272)、澳大利亚(64492)和印度(55982) -
在国内数据统计中,使用 GlobalProtect 最多的省份是台湾,服务数高达43831条;其次是北京,服务数为20384条;广东省、上海市和香港分别位居第3~5位,涉及的服务数量分别是:13676、13522、13493
参考链接
-
-
欢迎进群
-
添加管理员微信号:quake_360
备注:进群 邀请您加入 QUAKE交流群
原文始发于微信公众号(360Quake空间测绘):GlobalProtect门户的PAN-OS版本检测方法
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论